STM32-ADC模数转换概述
STM32-单通道采集实例
STM32-多通道采集实例
一.ADC转换 的概述
1.ADC的概念
Analog-to-Digital Converter的缩写。
指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。
2. ADC的作用
采集传感器的数据,测量输入电压,检查电池电量剩余,监测温湿度等。
典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。
3.ADC的性能指标
量程:能测量的电压范围
分辨率:ADC的分辨率通常以输出二进制数的位数表示,位数越多,分辨率越高,一般来说分辨率越高,转化时间越长。
转化时间:模拟输入电压在允许的最大变化范围内,从转换开始到获得稳定的数字量输出所需要的时间称为转换时间
4.ADC功能框图
(1)电压输入范围
V REF- ≤ V IN ≤ V REF+
V REF-:连接地. V REF+:连接电源3.3v. V IN:输入的电压
(2)输入通道
每个ADC 有16个外部通道。另外还有两个内部 ADC 源 和 V BAT 通道挂在 ADC1上
(3)转换顺序
<1>规则通道组:正常通道组,在main.c的while循环里面运行,中规中矩
规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则组转换的总数应写入ADC_SQR1寄存器的L[3:0]中.
<2>注入通道组:中断
注入组和它的转换顺序在ADC_JSQR寄存器中选择。注入组里转化的总数应写入ADC_JSQR寄存器的L[1:0]中.
(4)转换时间
<1>ADC时钟:最大值为36MHZ,但是;连接在84MHZ总线上,所以一般使用4分频或者6分频
<2>ADC总转换时间:Tconv = 采样时间(最少3个PCLK2周期) + 12个周期(转换时间)
(6)中断类型
<1>转换结束中断
规则通道和注入通道的数据转换结束后,都可以产生中断
<2>模拟看门狗中断
当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断
<3>溢出中断
如果发生 DMA传输数据丢失,会置位 ADC 状态寄存器 ADC_SR的 OVR位,如果同时使能了溢出中断,那在转换结束后会产生一个溢出中断。
<4>DMA 请求
规则和注入通道转换结束后,除了产生中断外,还可以产生 DMA请求,把转换好的数据直接存储在内存里面。
(7).触发源:软件触发,外部事件触发
5.ADC工作模式
二.单通道采集实验
1.实验要求:
利用ADC采集FSM4中电位器的数据
2.cubemx创建工程
(1)ADC接口配置
(2)配置ADC
(3)RCC时钟配置,USART1串口配置
3.步骤<使用普通函数查询数据>:
mian.c的while(1)中
//打开ADC
HAL_ADC_Start(&hadc1);
//轮询判断是否接收到数据
if(HAL_ADC_PollForConversion(&hadc1, 100)==HAL_OK){
//接收到电压值
value=HAL_ADC_GetValue(&hadc1);
printf("电压为:%d\n",value);
}
HAL_Delay(1000);
4.实验现象
补充实验:中断接收数据
1.
2.mian.c中
(1)全局变量
uint32_t value;
(2)while()循环中
HAL_ADC_Start_IT(&hadc1);
HAL_Delay(1000);
(3).it.c中找到回调函数,adc.c中重写
extern uint32_t value;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){
if(hadc->Instance==ADC1){
value=HAL_ADC_GetValue(&hadc1);
printf("µçѹΪ:%d",value);
}
}
实验结果与上面实验一致,但中断使运行效率提高
三.多通道采集实验
1.实验要求
利用ADC采集电位器及STM32内部温度传感器的数据
2.cubemx创建工程
(1)ADC设置(两个通道同时采集)
(2)RCC,串口
(3)ADC配置
3.步骤:
与上述的实验相似,只是for循环接收消息
uint32_t adc_value = 0;
uint8_t i;
在while循环里面:
HAL_ADC_Start(&hadc1);
for(i =0; i<2 ; i++){
if (HAL_ADC_PollForConversion( &hadc1, 100) == HAL_OK){
adc_value = HAL_ADC_GetValue(& hadc1);
printf("adc_value = %d\n",adc_value);
HAL_Delay(300);
}
}
4.运行结果