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)
作者:二月红.