DO 和 AO 到底怎么选:比较器替你决定了什么

经典三问

Q: 传感器里的比较器是什么?

A: 它把模拟输入与可调参考电压比较,再输出高或低两种状态。

Q: 为什么要在 DO 和 AO 之间做选择?

A: DO 读取简单、响应直接;AO 保留更多原始信息,但需要 ADC、标定和软件判断。

Q: DO/AO 选择常见使用场景?

A: 已知黑白阈值的循迹优先 DO,需要测量趋势或重新设阈值时优先 AO。


同一块循迹模块上,DO 和 AO 常常挨在一起。看着 AO 多出来的一根线,很容易把它理解成"DO 的高级版":既然模拟值更完整,那我是不是应该一开始就把 8 路 AO 全接进 ADC?

做完前面两组实验,答案没有那么整齐。8 路 DO 已经能让小车低速沿线走;两路 AO 的曲线却可能长期趴在 500 以下,黑线经过才一下冲到接近 4095。多读到了数字,不代表多读到了可用的细节。

选择 DO 还是 AO,先别问"哪一个更高级",先问一句更不客气的话:这个场景到底需要模块替我做判断,还是需要我自己保留判断前的证据?

两根线背后,不是同一份数据

模块前半段都在做同一件事:红外发射,接收端看反射光,得到一条随距离、材质、环境光和安装高度变化的电压。

AO 把这条电压直接交给 STM32。DO 则让它先经过模块的比较器:

text 复制代码
反射光 -> 传感头电压
                |
                +--> AO:把电压交给 MCU
                |
                +--> 比较器 + 电位器 -> DO:交给 MCU 一个 0 或 1

电位器不是"灵敏度魔法旋钮"。它本质上在改变比较器的阈值:AO 电压跨过这条线,DO 就翻转。DO 因此少了一段连续信息,也少了 MCU 自己选 ADC 时钟、采样时间、滤波窗口和业务阈值的工作。

当前循迹小车,先选 DO

对一辆沿黑线走的低速小车,眼前要解决的问题是"线在哪边",不是做一张反射率实验报告。车头排好 8 路模块,电位器调到白底稳定为 0、黑线稳定为 1,STM32 每 10ms 收到一排状态:

text 复制代码
00011000  线在中间
00110000  稍微偏右
11000000  线已经偏得很远
00000000  丢线,按上一次方向寻找
11111111  全黑,停车

这时 DO 已经给足了循迹需要的事实。程序不必等 ADC 转换,不必先处理八个 0 到 4095 的数,也不必猜"438 和 462 的差异是黑线边缘还是环境光变了"。它只需要把黑线出现的位置映射成左右轮固定差速。

所以当前这辆循迹小车的选择很明确:先用 DO。

我先用 DO,是因为它把因果链缩短了:

text 复制代码
黑线位置 -> 8 路 0/1 -> 差速 -> 轮子转向

链条短,哪一环错了也更容易找。模块指示灯不对,先调电位器;OLED 的掩码不对,查 DO 接线和电平约定;左右目标速度反了,查电机方向。不要刚起步就把"赛道材质""ADC 采样""平均滤波""差速控制"全混成一团。

DO 少用了什么,也替你承担了什么

DO 当然不是免费午餐。模块替你做比较,意味着阈值被锁在模块电位器附近,而不是留给 MCU 运行时慢慢计算。

场景 DO 的表现 AO 的表现
黑白反差明显、低速循迹 调好电位器后直接给位置 能读到数值,但常常没有额外收益
赛道材质、环境光变化 可能需要逐个重新调电位器 可以看到变化量,再决定阈值或标定
边缘需要更细的位置 只有"过阈值/没过阈值" 可以比较两路或多路原始变化
调试模块是否饱和 只知道 DO 翻没翻 曲线能显示一直偏低或突然顶到 4095
MCU 资源 GPIO 读取即可 需要 ADC 通道、采样时间和调度;多路时还会涉及扫描/DMA

"资源更少"不是说 DO 不占引脚。8 个 DO 仍然需要 8 个 GPIO。它少的是 ADC 通道、转换等待、扫描顺序、数据处理和后续多路 DMA 的复杂度。对当前小车,省下来的不只是外设,还有第一次排错时不必同时面对的变量。

那条难看的 AO 曲线,反而帮你做了选择

两路 AO 实验里,非黑线区域大多低于 500,压到黑线后瞬间接近满量程。这个结果不是"实验失败后只能删掉",它正好说明了为什么选择要看场景。

赛道材质会影响红外反射。黑线的涂层、白底的纸面反光、表面是否发亮、模块离地高度,都会改变 AO 的分布。模块自身的发射功率、接收器响应和放大电路也不可能无限精细。当前条件下,主要是赛道把读数推成了"低区 + 饱和区",模块本身不够精细又让中间那一小段更不可靠。AO 给出的不是一条宽阔平滑的灰度坡。

既然这样,把这些原始值送进两轮控制,并不会自动让转向更细腻。它更可能把高度变化、赛道反光和两块模块的个体差异一起送进去。DO 的比较器反倒做了一个很适合当前任务的裁剪:过线就算黑,没过线就算白。

这也是一个工程判断:当原始数据没有提供足够有效的中间信息时,保留全部原始数据不一定比使用一个稳定的阈值判断更聪明。

AO 在什么时候值得重新拿出来

AO 不适合被扔进"没用"的抽屉。出现下面这些情况时,它会重新变得值得:

  • 想知道 DO 为什么在边界处来回翻转,而不是只看见它翻了;
  • 想比较左右模块在同一块赛道上的差异;
  • 想做启动标定,让阈值根据当前白底/黑线范围调整;
  • 传感器本来就没有板载比较器,例如光敏分压、模拟温度、电位器;
  • 想把连续变化画成曲线,观察供电波动、安装高度和环境光怎样影响读数。

AO 的第一价值通常在观察阶段:先把藏在 DO 后面的变化画出来,再决定要不要拿去控制。把两路 ADC 的数值画成曲线,就是为了这一点。

软件电位器

有人会说:"模块电位器阈值不方便,那我读 AO,再在代码里写 value > 1800,不就更高级了吗?"

它只是把阈值从一颗电位器挪到了一个整数常量。如果没有记录白底、黑线、边界和环境变化下的原始范围,1800 同样会在换一块赛道后失效。AO 真正给你的不是一个更漂亮的 if,而是让你有机会看见阈值应该从哪里来。

同理,给 AO 套一个 8 点平均也不保证结果可靠。当前曲线若已经被材质推到低区和饱和区,平均只能让它更平滑,不能凭空制造中间灰度;模块高度不一致、供电波动、输入电压越过 ADC 范围的问题,更不会因为平均就消失。

最后橘猫说

面对一个新模块,我会按当前任务按这个顺序决定:

text 复制代码
任务只需要稳定的二元判断?
    是 -> 优先试 DO,先调好电位器并验证黑白状态
    否 -> 看 AO 是否提供足够范围且电压能安全接入 ADC

DO 在真实场地不稳定?
    是 -> 先看 AO 曲线,确认是赛道、安装、供电还是阈值问题
    否 -> 不为"更多数据"而强行迁移 AO

需要多路连续采样?
    是 -> 再考虑 ADC 扫描、DMA、标定和数据处理

这条路线不是规定所有项目最终都回到 DO。它只是阻止一个很常见的误会:看到 AO 就默认应该把所有信号送进 ADC,看到数字模块就默认它不够专业。

DO 是模块替你守住阈值后的结论,AO 是阈值之前的证据。当前循迹小车先拿 DO 把线走稳;只有当"0 或 1"开始遮住真正的问题时,再把 AO 接回来。

相关推荐
硅基手札1 小时前
【I2C 技术系列 01】I2C 电气特性与物理层
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
番茄灭世神4 小时前
PN学堂GD32教程第12篇——SPI与Nor Flash
c语言·stm32·单片机·嵌入式·gd32·总线协议
逐光者9335 小时前
STM32项目——秒表
stm32·单片机·嵌入式硬件
硅基手札16 小时前
【串口技术系列文档 10】低功耗与唤醒机制
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
逐光者93316 小时前
STM32——SPI 屏 · Flash · 高速
java·前端·stm32
雨田言炎18 小时前
STM32之SysTick--系统定时器(内容简单但重要,附件有程序源码)
stm32·单片机·嵌入式硬件
FakeOccupational21 小时前
【电路笔记 STM32】Cortex-M7 UART 中断模式(串口接收中断+串口空闲中断)
笔记·stm32·单片机
小李不想当小白21 小时前
USART串口协议(STM32标准库学习笔记)
经验分享·笔记·stm32·单片机·嵌入式硬件·学习
小何好运暴富开心幸福1 天前
嵌入式历史与生态
stm32·单片机·mcu