Skip to content

转换扫描(Conversion Scanning)

  • 转换模式 (Conversion Mode):管的是**“做几次?”**(做完停下,还是死循环做?)
  • 扫描模式 (Scan Mode):管的是**“做几个?”**(只做一个通道,还是把所有通道轮一遍?)

我们可以把 ADC 想象成一个**“老师”,把 ADC 的通道(Channel)想象成“学生”**。

1. 转换模式:单次 vs 连续(做几次?)

这是关于时间的设置。

A. 单次转换模式 (Single Conversion)

  • 逻辑:老师点名,点完一个学生,下班回家
  • 过程:你命令它“开始” -> 它转换一次 -> 停机(你需要再次命令它才会动)。
  • 场景:检测电池电量。因为电量掉得很慢,几分钟测一次就行,没必要一直测,省电。

B. 连续转换模式 (Continuous Conversion)

  • 逻辑:老师点名,点完一个学生,立刻重新开始再点这个学生,死循环,永不休息。
  • 过程:你命令它“开始” -> 它转换一次 -> 只要不喊停,它立刻自动开始下一次转换。
  • 场景:示波器。你需要每时每刻盯着电压的变化,不能停。

2. 扫描模式:开启 vs 关闭(做几个?)

这是关于数量(或者说范围)的设置。

A. 非扫描模式 (Scan Mode Disabled)

  • 逻辑:老师只盯着某一个指定的学生(比如通道 1)。
  • 过程:不管你是单次还是连续,我都只读通道 1 的数据。通道 2、3、4 我都不管。
  • 场景:你的设备只接了一个传感器。

B. 扫描模式 (Scan Mode Enabled)

  • 逻辑:老师拿出一张名单(序列),上面写着通道 1、通道 2、通道 5。老师会挨个点名
  • 过程:启动后,先转换通道 1,紧接着自动转换通道 2,再转换通道 5... 这一轮全部搞定后,才算结束。
  • 场景:你的遥控车上有 3 个电位器,分别控制速度、方向、油门。你需要一次性把它们都读一遍。

3. 四种组合(终极理解)

我们在配置 ADC 时,实际上是把上面两个模式组合起来用。这就有了四种玩法:

组合方式形象比喻实际场景
单次 + 非扫描只看一个人,看一眼就走偶尔测一下电池电压
连续 + 非扫描盯着一个人看,死死盯着不放实时监测麦克风声音(只接了一个麦克风)
单次 + 扫描按名单把全班点一次名,点完就下班开机自检,把所有传感器检查一遍,然后待机
连续 + 扫描按名单把全班点名,点完最后一紧接着回头从第一个继续点四轴飞行器,需要极快速度不断轮询所有电机和陀螺仪的数据

4. 一个巨大的“坑”

如果你开启了扫描模式(一次测多个通道),有一个必须注意的问题:

STM32 的常规 ADC 只有一个数据寄存器(口袋)。

  • 如果你开启扫描模式(测 CH1, CH2, CH3)。
  • ADC 测完 CH1,把数据放进口袋。
  • 紧接着,ADC 测完 CH2,它会把 CH1 的数据扔掉(覆盖),把 CH2 放进口袋。
  • 以此类推...
  • 当你最后去读口袋时,你只能读到最后一个通道的数据,前面的全丢了!

解决办法:DMA(搬运工) 只要开启扫描模式,通常必须配合 DMA。 DMA 的作用是:ADC 每测完一个(比如 CH1),DMA 立刻把数据搬运到内存数组里存好,防止被 CH2 覆盖。

总结

  • 转换模式:决定是**“点一下动一下”还是“根本停不下来”**。
  • 扫描模式:决定是**“只测一个”还是“测一串”**。