Skip to content

ADC

ADC 的全称是 Analog-to-Digital Converter,中文叫 模数转换器。

简单来说,它是单片机的**“眼睛”或“耳朵”**。它的作用是:把现实世界中连续变化的模拟量(Analog),翻译成单片机能听懂的数字量(Digital)。

1. 为什么要用 ADC?

单片机(比如你的 STM32)是一个纯数字的芯片,它只认识 01(低电平和高电平)。

但是现实世界是复杂的:

  • 温度不是只有“冷”和“热”,还有 25.5°C。
  • 声音不是只有“响”和“静”,有各种波形。
  • 光线不是只有“亮”和“暗”,有各种亮度。
  • 电池电压会随着使用慢慢下降,而不是突然从 3.3V 变到 0V。

这些连续变化的信号就是模拟信号。单片机要想知道“现在的电压具体是多少伏”,就必须通过 ADC 这个“翻译官”把电压变成一个整数。

2. ADC 是怎么工作的?(核心三要素)

把 ADC 想象成一把尺子,用来量电压的高度。

(1) 分辨率 (Resolution) —— 尺子的刻度有多细?

这是 ADC 最重要的参数,通常用**“位 (Bit)”**来表示。STM32 的 ADC 通常是 12位 (12-bit)

  • 12位的意思是:它把 0V 到 3.3V 之间的电压,切成了 212=40962^{12} = 4096 份。
  • ADC 读出来的结果是一个 0 ~ 4095 之间的整数。
    • 0 代表 0V。
    • 4095 代表 3.3V(最大电压)。

比喻:如果你用一把只有厘米刻度的尺子(低分辨率)量身高,你只能说是 170cm。如果你用一把有毫米刻度的尺子(高分辨率),你能读出 170.5cm。位数越高,读得越准。

(2) 参考电压 (Vref) —— 尺子的最大长度是多少?

这是 ADC 能测量的最大范围。在 STM32 系统中,通常参考电压就是电源电压 3.3V

  • 如果输入电压超过 3.3V,ADC 的读数就会“爆表”,一直卡在最大值 4095(甚至可能烧坏引脚)。

(3) 采样率 (Sampling Rate) —— 量得有多快?

电压可能在不停地变。ADC 不是一直盯着看,而是每隔一小段时间“拍一张照片”。

  • 如果你一秒钟测 1000 次,你就更能捕捉到电压快速抖动的细节。

3. 最关键的公式(怎么换算?)

你在代码里读到的 ADC 值(比如 HAL_ADC_GetValue 返回的值)是一个 0~4095 的整数。你需要把它换算成实际的电压值。

公式:

U=20484095×3.3V1.65V\text{U}= \frac{2048}{4095} \times 3.3\text{V} \approx 1.65\text{V}

举个例子:

假设你用 STM32 测一个电池电压,读出来的 ADC 值是 2048。 说明现在的电压刚好是量程的一半。


4. 总结

  • ADC 是什么? 一个把电压(模拟量)变成数字(整数)的硬件外设。
  • STM32 的 ADC 特点: 它是 12 位的,所以读出来的数在 0 到 4095 之间。
  • 作用: 用来读传感器数据(光敏电阻、热敏电阻、电位器旋钮、电池电量等)。

如果你在之前的输入捕获里是在“数时间”,那么在 ADC 里你就是在“数电压强度”。