转换扫描(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 覆盖。
总结
- 转换模式:决定是**“点一下动一下”还是“根本停不下来”**。
- 扫描模式:决定是**“只测一个”还是“测一串”**。