ADC原理与电压采集实验

Tutorial: 电子电路 Category: 嵌入式 Published: 2026-08-29 08:09:36 Views: 0 Likes: 0 Comments: 0

144.6.1 ADC简单理论实验

一、ADC

1.1 实验演示

  • ADC(Analog to Digital Converter,模数转换器)把连续变化的模拟电压转换为单片机可处理的整数;DAC(Digital to Analog Converter,数模转换器)完成相反方向的转换。
  • 实验通过串口显示 ADC 原始值和换算电压。演示中可将通道接到 3.3 VGND 作为已知电压参照:接 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 有 ADC1ADC2ADC3 三个 ADC 控制器;STM32F103C8T6 有 ADC1ADC2。ADC 控制器与串口、定时器、DMA 一样,都是芯片内部外设模块。
  • 一个 ADC 控制器可按顺序转换多个通道,控制器数量不等于一次只能读取几路电压。实际可用通道还要核对芯片型号、封装引脚和外设复用情况。
  • ADC1 的常用外部通道映射为 IN0~IN7 -> PA0~PA7IN8~IN9 -> PB0~PB1IN10~IN15 -> PC0~PC5IN16 为内部温度传感器,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 的理想步长,最大码值会略小于 VDDAvdda 应取实际模拟电源电压,不能在精度要求较高时默认它恒为 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 位,适合只取高位进行快速处理的场景。