STM32:ADC(模数转换器)开发基础

思路:理解ADC(模数转换器)的基本工作原理—-A/D转换函数编写—-参数配置(ADC参数配置)—-编写代码【含例题】—-烧入开发板

一、理解ADC(模数转换器)的基本工作原理
1.什么是ADC呢?

先理解两个量:模拟量和数字量 

模拟量: 指在时间数值上都连续变化的物理量,可以是电压、温度、压力、速度等。

数字量:指在时间上和数量上都离散的物理量,在数字量中以数字的形式表示

ADC:(Analog to Digital Converter)即模数转换器,用于实现模拟信号数字信号的转换,最终展现数字信号。 【拟量—>字量】

提问!:由模拟量向数字量转换的是模数转换器,那么由数字信号向模拟信号转换的又称作什么呢?】【字量—>拟量】[答案文末揭晓!(。・∀・)ノ]

在学习STM32中,我们一般采用逐次逼近型的ADC

2.ADC转换的过程和四个技术指标:

(1)A/D转换一般要经过采样、保持、量化、编码四个过程,如下图(以逐次逼近型为例):

 

(2)A/D转换的四个技术指标分别是:量程转换位数分辨率转换时间

量程:指ADC所能输入模拟信号的类型和电压范围,即参考电压。(信号类型包括单极性、双极性)

转换位数:量化过程中的量化位数(A/D转换后输出的结果用n位进制数来表示)

   例:12位的ADC的输出值为0~4095(2的12次方:4096)

分辨率:ADC能分辨的最小变化量(大于才响应);计算公式:分辨率=量程/(2的N次方)。

例1: 0-5V量程,求10位ADC的分辨率(最小变化量): 5÷1024=0.0049V,(2的10次方=1024)

若此时电压模拟量为0.0048V,因0.0048V<0.0049V,所以ADC不响应。(大于才响应!!!)

例2:参考电压为6V,采用8位的A/D转换器,求ADC的分辨率:6÷256=0.0234v,(参考电压即量程,2的8次方=256) 

 转换时间:ADC完成一次完整的A/D转换所需的全部时间。

二、A/D转换函数编写(基于HAL库函数)

A/D转换常用的函数有:查询、中断、DMA三种方式【重点:查询和中断

1.选择中断且非阻塞式的A/D转换:

非阻塞式(IT);Start(开启);Callback(回调);GetValue(读取)

uint16_t ADC_Value=0;//定义变量,接收A/D转换结果
HAL_ADC_Start_IT(&hadc);
//启动ADC转换,非阻塞式,(&hadc)表示具体启动的ADC脚,根据题目配置

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef*hadc1)//调用中断回调函数
 {
 ADC0_Value=HAL_ADC_GetValue(&hadc);//读取相应A/D转换结果
 }

2. 选择查询且阻塞式的A/D转换:

Start(开启);PollForConversion(转换);GetValue(读取)

uint16_t ADC_Value=0;//定义变量,接收A/D转换结果
HAL_ADC_Start(&hadc);
//启动A/D转换,阻塞式,(&hadc)表示具体启动的ADC脚,根据题目配置

  if(HAL_OK==HAL_ADC_PollForConversion(&hadc,10))//转换过程,10表示超时时间
    {
      ADC0_Value=HAL_ADC_GetValue(&hadc);//读取A/D转换结果
    }

以上就是A/D转换函数的编写啦,让我们再详细了解一下ADC在我们STM32配置中的相关信息吧! 

*在STM32F103芯片中有3个12位逐次逼近型模数转换器:ADC1、ADC2、ADC3,具有18个测量通道,可测量16个外部和2个内部信号源(内部温度和内部参考电压【只能连接到ADC1】);L151C8芯片只有一个ADC模数转换器。

*每个通道的A/D转换模式可选择单次、连续、扫描或间断执行。

*A/D转换结果分别由2种存储方式:左对齐、右对齐。

【以上就是ADC的基本工作原理和A/D转换函数的编写啦,下面我们根据例题来展示!(。・∀・)ノ】(贯穿后面的参数配置、代码编写)

本章例题:[1]将ADC_IN0设置为12位的ADC,右对齐。

                [2]使用查询的方式,每隔0.5秒采样一次ADC的数据。

                [3]将每次读取到的ADC采样值转换为对应电压值,发送到上位机(通过串口发送)。

                [4]LED2作为采样指示灯,在ADC转换过程中点亮,其余时间熄灭。 

三、参数配置(ADC参数配置

【例题使用:STM32F103版本】(以下是略快版本) 例题涉及串口,详细可参考文章【STM32:串口数据收发基础】重点(5):ADC参数配置

1.新建项目:

2.选择版本:

3.SYS参数配置:

4.RCC参数配置:

 

5.重点:ADC参数配置

 (1)按照题意:[1]将ADC_IN0设置为12位的ADC,右对齐:

 

(2)按照题意[3]:将每次读取到的ADC采样值转换为电压值,发送到上位机(通过串口发送),因此还要配置串口(USART1):

(3)按照题意[4]:LED2作为采样指示灯,在ADC转换过程中点亮,其余时间熄灭。配置LED2灯 

 

6.系统时钟配置

7.项目管理

 

8.Code Generator 勾选:

 

9.配置完成并打开:

 

四、编写代码 【含例题】

按照例题:[1]将ADC_IN0设置为12位的ADC,右对齐。

                  [2] 使用查询的方式,每隔0.5秒采样一次ADC的数据。

                  [3]将每次读取到的ADC采样值转换位对应电压值,发送到上位机(通过串口发送)。

                  [4]LED2作为采样指示灯,在ADC转换过程中点亮,其余时间熄灭。

1.在开始我们可以先宏定义所需要的:

#include "stdio.h" //输入输出函数声明,scanf()和printf();
#define LED2_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET)
#define LED2_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET)
//LED2为采样指示灯

uint16_t ADC_Value=0,ADC_Volt=0;
//定义变量,接收A/D转换结果;Volt:电压
uint8_t str_buff[64];
//8位的缓冲区

2.编写查询函数:

3.编写发送函数,发送到上位机:

4.在主函数(while语句中)调用,每0.5秒采样一次数据:while循环语句

这道题目就写道这里啦 

五、烧入开发板 

感谢大家的观看啦,祝大家平平安安、万事顺遂(*^_^*)!

 

 对滴!答案就是:数模转换器 (DAC)

 

 

 

 

 

 

作者:二月红.

物联沃分享整理
物联沃-IOTWORD物联网 » STM32:ADC(模数转换器)开发基础

发表回复