STM32F1系列微控制器ADC模数转换器详解
STM32F1系列微控制器ADC模数转换器详解
一、ADC模数转换器
ADC(Analog-Digital Converter)即模拟-数字转换器,能够将引脚上连续变化的模拟电压转换为内存中存储的数字变量。STM32F1系列的ADC是12位逐次逼近型,转换时间为1us,频率为1MHz。输入电压范围为0-3.3V,转换结果在0到2^12-1之间,可以测量16个GPIO和两个内部信号源(温度传感器和内部参考电压)。STM32F1的ADC包含规则组和注入组两个转换单元,其中注入组用于紧急事件。此外,还配备了模拟看门狗以自动监测输入电压范围。
二、ADC的电路结构
1、逐次逼近型ADC
逐次逼近型ADC的工作原理是通过比较器和二分法来逐次逼近输入模拟值。具体来说,比较器会将输入的模拟电压与一个参考电压进行比较,根据比较结果逐步逼近真实值。例如,如果最大值为255(1111 1111),则首先比较255对应的电压,如果输入电压小于255,则比较127(0111 1111),依此类推,直到确定每一位的值。这个过程由时钟信号驱动,每次转换完成后会触发EOC(End of Conversion)信号。
2、STM32中的ADC电路结构
在STM32中,ADC电路结构主要包括16个GPIO口和两个内部信号源(温度传感器和参考电压),通过模拟多路开关进入ADC模数转换器。ADC模数转换器采用逐次逼近型电路结构,由时钟驱动,最大频率为14MHz。转换完成后,数据会被存储在规则组或注入组数据寄存器中,这些寄存器分别是16位和4*16位。规则组在使用多个ADC转换时需要使用DMA,否则只会保留最后一个ADC转换的结果。最后,规则组、注入组和模拟看门狗的转换结果都会通过ADC中断端口输出,并有各自的标志位。
3、STM33的ADC逻辑框图
(此处应有逻辑框图,但原文中未提供具体图片)
三、ADC配置要点
1、转换模式选择
在ADC中,可以通过控制量来选择转换模式,主要有单次模式和连续模式、扫描模式和非扫描模式,组合起来有四种模式:
2、数据对齐方式
数据对齐方式有左对齐和右对齐两种。一般情况下使用右对齐,这样读出来的值和实际值相同。值得注意的是,左对齐可以只读取高位,虽然会损失部分精度,但只需要读取一个字节。
3、转换时间
转换时间由采样时间和ADC转换时间共同构成。由于是12位ADC,大约需要12.5个ADC转换周期。采样时间越长,越能滤除毛刺信号。
4、ADC校准
在初始化时通常会对ADC进行校准,这是一个自动化过程,通过四条标准库代码执行。其原理是在电容上增加修正值来进行校准。这里的电容用于保存采样的电压,在保持阶段使用。
四、代码示例
本次实验将PA0口(ADC1的通道1)连接到一个滑动变阻器,用于测量电压值。以下是实验的主要步骤:
- 打开ADC和GPIO的时钟
- 配置ADC的预分频系数
- 初始化GPIO
- 配置数据选择器,选择ADC的通道
- 配置ADC的模数转换部分
- 使能ADC并进行校准
为了节省篇幅,完整的代码已上传至GitHub仓库:
STM32F103c8t6_learning/GPIO_std/STM32f1_ADC
请注意,HAL库的更新正在进行中,建议关注项目动态。
参考资料
- ADC模数转换器 - 哔哩哔哩
- AD单通道&AD多通道 - 哔哩哔哩