一、ADC模数转换器
ADC的全称 Analog-Digital Converter 模拟-数字转换器,他可以用来将引脚上连续变换的模拟电压转换为内存中存储的数字变量。
ADC有两个重要指标,分辨率和频率。 STM32的ADC是 12位 逐次逼近型,1us转换时间,也就是1M HZ的频率。
输入电压的范围为0-3.3V , 转换结果在0 ~ 2^12 - 1 , 可以测量16个GPIO和两个内部信号源是温度传感器和内部参考电压。
规则组和注入组两个转换单元,注入组是用于紧急事件的。
同时还有模拟看门狗自动监测输入电压范围。
二、ADC的电路结构
1、逐次逼近型ADC
图中左边是模拟信号的选择,和ADC地址和锁存地址的信号,通过一个选择开关,进入比较器,这个比较器的逻辑是由二分法来逐次逼近输入模拟值,简单点讲就是1111 1111是255,将他对应的电压输入比较器,如果比他小,那么输入0111 1111是127,如果大了就输入0101 1111,再比较,每一次确定左边的一位,从而逐次逼近真实值,ADC精度有多高就比较几次。
图上面是时钟信号,和开始信号,转换完8位,即一个数据后置起EOC。
最下面时供电和参考电压,一般参考电压接供电,对应接就行。
2、STM32中的ADC电路结构
在结构图中,中间一部分就是ADC转换的主要部分,由最多16个GPIO口和两个内部信号源,温度传感器和参考电压构成18个输入,分别通过一个模拟多路开关,进入ADC模数转换器,这个模数转换器和上面的逐次逼近型电路结构相同。同时注意ADC模数转换器是由时钟驱动的右边有一个ADC预分频器,他的最大频率为14MHZ,分频时要注意分屏值。
当ADC转换完后会到规则组 / 注入组数据寄存器,分别是16位和4*16位的,规则组如果是使用多个ADC转换时需要使用DMA,不然只会留下最后一个ADC转换的结果。最后规则组、注入组和模拟看门狗通向最上面的ADC中断端口,都有自己的标志位。
图下面是触发源的选择。
3、STM32的ADC逻辑框图
三、ADC配置要点
1、转换模式选择
在ADC中,我们根据两个控制量来控制转换模式,单次模式和连续模式 、 扫描模式和非扫描模式,他们一起组合有四种模式。
2、数据对齐方式
左对齐和右对齐,我们一般右对齐,这样读出来的值和实际值相同。值得注意的是左对齐可以只读高位,虽然损失了部分精度,但是只用读一个字节。
3、转换时间
转换时间只要由采样时间和ADC转换时间共同构成,转换时间因为12位,大约为12.5个ADC转换周期,采用周期我们有参数来配置,采样时间越长,越能略掉毛刺信号。
4、ADC校准
一般在初始化的时候我们都会对ADC进行校准,这是一个自动化的程序,由四条标准库代码来执行就行,其原理是校准的时候对电容增加修正值,来进行ADC校准。
这里的电容是将采样的电压通过一个电容保存起来,在保持阶段使用的。
四、代码
本次实验仅仅将PA0口,ADC1的通道一接入一个滑动变阻器,来测量点位的电压值。①打开ADC 和 GPIO的时钟。②配置ADC的预分频系数。 ③初始化GPIO。④波动数据选择器,选择ADC的通道。 ⑤配置ADC的模数转换部分。⑥使能ADC并校准。
为了节省文章篇幅,代码已经放在github仓库里了。hal库的暂未更新,请耐心等待。
STM32F103c8t6_learning/GPIO_std/STM32f1_ADC at main · Jiang-kun02/STM32F103c8t6_learning · GitHub
参考
[7-1] ADC模数转换器_哔哩哔哩_bilibili
[7-2] AD单通道&AD多通道_哔哩哔哩_bilibili