前言
学已至此,stm32 引脚的基本使用只剩下了本期主角 ADC 即模数转换器,即将连续变化的模拟信号转换为离散的数字信号的器件,可以说是真实世界与在数字世界中沟通的桥梁。
ADC 最早用于对无线信号向数字信号转换。如电视信号,长短播电台发射接收等。
总之为什么 ADC 如此重要实际物联网的概念的落脚点正是各个独立的设备通过如温度、湿度等传感器对信息进行采集并加以处理,最终进行传播。
需要了解的几个概念:
分辨率 :变现了信号的分辨能力,一般有8位、10位、12位、16位,位数越多,表示分辨率越高,当然恢复模拟信号时也会更精确。
精度 :模拟值和真实值之间的最大误差值。
转换速率 :数字量与模拟量之间转换的时间。
本篇博客设计一个简单测量电压实验,认识 ADC 的基本使用。
实验内容 :ADC 中断方式采集底版上的电压值转换为数字量。
1、查底板原理图
可以看到连接的引脚为 PC3 ,因此需要查找 PC3 对应的 ADC 编号
2、查 stm32 数据手册
使用 ADC 1、2 或者 3 的 13号输入都可以完成要求
继续查看有关 ADC 特征的描述,可以知道在 3.3 V 时,最大频率为 36 MHz 而稳定采样频率为 30 MHz
3、配置
如上文查找选择配置勾选 ADC1 的 IN13
考虑时钟频率进行如下计算:
转换时间(TCONV)=采样时间(TSMPL)+逐次逼近时间(TSAR)
单ADC最大转换速率为2.4 MSPS
PCLK2=90MHz
ADC_Clock=90/分频系数
采样时间:至少位3个clock
最终使得 12 bit 最低转换速率满足 (90MHz / 分频系数) / (12+3) < 2.4MHz
即分频系数 > 2.5 因此配置分频系数为 4
具体更改如图所示:注意开启连续采样,否则采样一次将会结束采样工作
其余参数:根据需求自行调整即可如 DMA 方式采集信息、多通道采样时的转换通道数量以及顺序等,本文不做进一步描述,简单了解 ADC 的使用,采样逻辑自行设计,即可触类旁通嘛!
开启 ADC 中断后,配置完生成代码
4、应用代码编写
main.c 中:
添加 ADC 转换值的全局变量
实现 ADC 的中断回调函数,即每当 ADC 完成采集即会调用该函数,因此在此处获取采集值即可(另外有另一种采集思路,即不使用中断方式时可以轮询方式采集,轮询是否采样完成采样完成即可输出,再进行下一次采样)
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{
ADC_ConvValue= HAL_ADC_GetValue(AdcHandle);
}
循环中增加打印操作显示采集到的信息,4096为12位采样,即2的12次方
printf("ADC value=%.03f V \n\r",ADC_ConvValue/4096.0 *3.3);
HAL_Delay(500);
adc.c 中:
开启 ADC 中断采集
编写完成下载测试,正常运行采集任务