ADC原理与电压采集实验
144.6.1 ADC简单理论实验
一、ADC
1.1 实验演示
- ADC(Analog to Digital Converter,模数转换器)把连续变化的模拟电压转换为单片机可处理的整数;DAC(Digital to Analog Converter,数模转换器)完成相反方向的转换。
- 实验通过串口显示 ADC 原始值和换算电压。演示中可将通道接到
3.3 V或GND作为已知电压参照:接3.3 V时结果应接近满量程,接地时结果应接近0 V。 - 光敏电阻模块输出的是随光照变化的模拟电压,ADC 读取的是这一路电压而不是光本身。该数值可用于环境亮度检测和自动点灯。
- 视频演示的四路结果依次是:通道 1 接光敏模块模拟输出,通道 2 接开发板
3.3 V,通道 3 接开发板GND,通道 4 接开发板3.3 V。视频本节只演示现象和讲解原理,没有现场编写 ADC 程序;PA1PA4 与 ADC1 通道 14 的对应关系在下一节配置界面中得到确认。
光敏模块 VCC ----------------------> STM32 3.3 V (给模块供电)
光敏模块 GND ----------------------> STM32 GND (建立共同电压参考)
光敏模块 AO ----------------------> PA1/ADC1_IN1 (通道1:测光敏输出)
STM32 3.3 V ----------------------> PA2/ADC1_IN2 (通道2:满量程参照)
STM32 GND ----------------------> PA3/ADC1_IN3 (通道3:零点参照)
STM32 3.3 V ----------------------> PA4/ADC1_IN4 (通道4:满量程参照)
VCC是模块电源,GND是所有电压共同的零点,AO才是送入 ADC 的模拟信号。模块若还带DO引脚,DO是比较器输出的数字高低电平,不属于本次 ADC 电压采集。- 视频中通道 2、4 接 3.3 V,作用是验证 ADC 满量程;通道 3 接 GND,作用是验证零点。这三路不是给 ADC 引脚“供电”,而是让 ADC 测量三个已知电压。接线或拔线前应先断电,避免杜邦线误碰相邻引脚造成短路。
- 光敏分压电路的典型接法如下,
ADC_INx为 ADC 输入引脚,例如PA0/ADC1_IN0:
VDDA / 3.3 V
|
R_FIXED
|
+-------> ADC_INx
|
R_LDR
光敏电阻
|
VSSA / GND
- ADC 从两个电阻的中点测量电压:
$ V_{ADC}=V_{DDA}\times\frac{R_{LDR}}{R_{FIXED}+R_{LDR}} $
- 常见光敏电阻在光照增强时阻值减小。因此在图示连接中,光越强,
R_LDR越小,V_ADC越低;遮光后电压升高。若两个电阻的位置互换,电压变化方向也会相反,应以实际分压电路和测得电压为准。 - 接线时将
3.3 V供电、GND公共参考地、AO或分压中点这三件事分开理解。传感器地与 STM32 的VSSA/GND必须相连;ADC 输入电压不能超过VSSA~VDDA,不能把 5 V 信号直接接到 3.3 V MCU 的 ADC 引脚。
1.2 理论部分
- 光强、声音、气压和传感器输出电压可以连续变化,属于模拟量。数字信号只能取有限个离散值,便于存储、计算和传输。
- ADC 将输入电压范围划分为有限个区间,并用整数码值表示所在区间,这个过程称为量化。分辨率描述可区分的最小电压间隔,不代表总测量误差;参考电压、传感器、噪声、布线和信号源阻抗都会影响实际读数。
1.2.1 片子介绍
- STM32F103ZET6 有
ADC1、ADC2、ADC3三个 ADC 控制器;STM32F103C8T6 有ADC1和ADC2。ADC 控制器与串口、定时器、DMA 一样,都是芯片内部外设模块。 - 一个 ADC 控制器可按顺序转换多个通道,控制器数量不等于一次只能读取几路电压。实际可用通道还要核对芯片型号、封装引脚和外设复用情况。
ADC1的常用外部通道映射为IN0~IN7 -> PA0~PA7、IN8~IN9 -> PB0~PB1、IN10~IN15 -> PC0~PC5;IN16为内部温度传感器,IN17为内部参考电压VREFINT。
1.2.2 三个ADC控制器
- ADC1、ADC2、ADC3 是独立外设控制器。控制器中可配置规则组和注入组:规则组用于普通的按顺序转换,注入组用于需要插入处理的高优先级转换。
- 单次转换模式由一次触发完成一次转换或一个设定序列;连续转换模式完成一次后自动开始下一次;扫描模式按 Rank 顺序转换多个通道。
- 单通道低频读取可使用轮询;多通道连续或高频采样通常使用 DMA,将各次转换结果自动搬运到数组中,避免下一次结果覆盖
DR数据寄存器中尚未读取的值。
1.2.2.1 采样时间
- 12 位 ADC 的核心转换时间由采样时间和固定的 12.5 个 ADC 时钟周期组成:
$ T_{conv}=\frac{N_{sample}+12.5}{f_{ADC}} $
- STM32F1 的 ADC 时钟不能超过 14 MHz。当
f_ADC=14 MHz、采样时间为 1.5 个周期时,转换时间约为:
$ T_{conv}=\frac{1.5+12.5}{14\ \text{MHz}}=1\ \mu s $
- 较长采样时间能让内部采样保持电容更充分地跟随输入电压,适合光敏分压、电位器等慢变化且可能具有较高输出阻抗的信号。该时间不包含函数调用、串口发送和主循环的耗时。
1.2.2.2 采样精度
- STM32F103 的 ADC 分辨率是 12 位,不是 12 个档位,而是:
$ 2^{12}=4096 $
- 因此原始码值范围是
0~4095,共有 4096 种可能。VDDA=3.3 V时,一个理想量化步长约为:
$ V_{LSB}=\frac{V_{DDA}}{4096}=\frac{3.3}{4096}\ \text{V}\approx0.806\ \text{mV} $
- 显示电压时,端点换算可写为:
float voltage = vdda * raw / 4095.0f;
- 该式让
raw=4095对应VDDA。使用/4096.0f表示一个 LSB 的理想步长,最大码值会略小于VDDA。vdda应取实际模拟电源电压,不能在精度要求较高时默认它恒为 3.3 V。
1.2.2.3 左右对齐
- ADC 的有效结果只有 12 位,而数据寄存器可按 16 位读取,因此可选择左右对齐:
右对齐:0000 D11 D10 ... D0
左对齐:D11 D10 ... D0 0000
- 右对齐可直接得到
0~4095的整数值;后续工程配置中的ADC_DATAALIGN_RIGHT就表示右对齐。左对齐不改变测量结果,只是将相同的 12 位数据左移 4 位,适合只取高位进行快速处理的场景。