尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

比较器迟滞全解析:从原理到实战,彻底解决输出抖动问题

比较器迟滞全解析:从原理到实战,彻底解决输出抖动问题 排故排到凌晨两点我终于承认板子上的过流保护一直在“抖”。LM393加一个简单的电阻分压网络输入信号带着几十毫伏的纹波经过比较器阈值附近时输出竟然在毫秒级时间内来回跳了好几轮。继电器没有完全吸合就释放线圈发烫负载该断却没有断干净。最后在同相端加了一个几百千欧的反馈电阻问题消失。这个电阻做的不是别的事就是引入了比较器迟滞Comparator Hysteresis——通过正反馈让比较器拥有两个不同的翻转阈值一个管“开启”一个管“关闭”中间隔开一段安全距离。这东西看着简单实际调起来门道不少。这篇不打算复述教科书而是把原理、计算、仿真、实测到软件替代方案整条链路讲透重点放在普通文档里不会写的那些坑。无论你是在调过流保护、低压报警、温度阈值检测还是传感器信号整形应该都能直接抄作业。1. 一个典型的“半夜拆板”场景输出在阈值附近反复翻转1.1 从过流保护抖动说起先说那个让我加班的电路。12V直流负载回路里串了一颗1mΩ的采样电阻电流信号经过放大后送到LM393的反相输入端同相输入端接一个LR电阻基准。正常工况下采样电压远低于基准比较器输出高电平后级继电器不动作一旦过流采样电压越过基准输出翻低继电器吸合切断负载。听起来逻辑很完整但实际带载测试时继电器像触电一样乱跳。拿示波器看输出脚输出不是干净的单次跳变而是在几百微秒内连续翻转了七八次最后才停在某个状态。继电器线圈在吸合与释放的临界点来回震荡触点不断通断电弧把簧片烧得发黑。这种问题太典型了。给比较器提供一个缓慢爬升的输入信号等它到阈值附近时任何一点纹波都会导致输出反复横跳。我们把这种现象叫抖动chattering解决抖动最标准的手段就是给比较器加上迟滞。1.2 为什么无迟滞的比较器“天生爱抖”要理解迟滞先要明白比较器为什么抖。比较器的本质就是一个开环放大器同相端和反相端的压差哪怕只有几毫伏输出就会冲到正饱和或负饱和。问题在于输入信号不会瞬间跨越阈值它总有一个爬升过程。如果输入信号带着20mV峰峰值的噪声在前沿缓慢上升那么它会在阈值附近来回穿越多次每次穿越都会导致输出翻转。举个例子输入信号斜率是10mV/ms噪声纹波20mV那么在阈值附近逗留的时间大约有2ms。这2ms里噪声随便来几个毛刺输出就被打得到处乱跳。无迟滞的比较器就像一个灵敏度调到极致的声控灯环境里一有风吹草动就亮、就灭、就亮、就灭。同时比较器的响应速度非常快LM393的传输延迟大约1μs左右高速比较器甚至能做到几百纳秒。这意味着它完全有能力在2ms窗口内完成几十次翻转从外部看就是继电器抖动、报警器乱响或者数字电路里采到一长串毛刺。2. 迟滞的本质用正反馈给比较器加一道“门闩”2.1 一个电阻改变一切反相滞回比较器怎么工作比较器加迟滞不需要复杂电路普通做法是从输出端引一个电阻回到同相输入端构成正反馈。以反相滞回比较器为例。输入信号Vin接反相输入端同相输入端接两条支路一条是参考电压Vref通过电阻R2接入另一条是比较器输出Vout通过反馈电阻R1接入。当输出分别为高电平VOH和低电平VOL时同相端的电压被反馈电阻“推”向两个不同的电平输出高电平时同相端阈值被抬高为 VTH_H (Vref × R2 VOH × R1) / (R1 R2)输出低电平时同相端阈值被压低为 VTH_L (Vref × R2 VOL × R1) / (R1 R2)也就是说比较器现在有两个翻转阈值而不是一个。迟滞宽度ΔV就是两者之差ΔV VTH_H - VTH_L (VOH - VOL) × R1 / (R1 R2)这个公式很关键。它说明迟滞宽度只由比较器输出摆幅和外部分压电阻决定和Vref本身的数值无关。Vref决定的是两个翻转阈值的绝对位置R1和R2的比值决定的是回差宽度。2.2 “门闩”的直觉为什么翻过去之后阈值跟着搬家迟滞的物理直觉并不难理解我用门闩来类比比较器翻转到某个状态后阈值会跟着跳到另一个位置输入信号必须越过“新的阈值”才能翻回来而不是像无迟滞那样回到原来的位置。回到过流保护的场景。没有迟滞时过流阈值是5.0V输入在5.0V和5.1V之间来回摆输出就跟着来回跳。加迟滞后输入上升到5.1V让输出翻低切断此时比较器的翻转阈值立刻变成4.9V输入即使跌回5.0V输出也不会动必须继续跌到4.9V以下才会解除保护。那个0.2V的回差就是一道门闩把噪声锁在外面。需要提一句的是如果你见过施密特触发器比如74HC14它的内部结构本质上就是带有迟滞的比较器只不过输入输出都是数字电平。理解了比较器迟滞再看施密特触发器阈值的那些表格参数VT、VT−会感觉一切都对上了。3. 定量设计回差设多大才能既抗噪又不过度迟钝3.1 回差取值的三条经验准则迟滞宽度设多大是设计里最让人纠结的地方。设小了噪声照样能穿过去设大了系统恢复变得迟钝——低压报警可能要到电压回升很多才解除反而误事。我在实际项目里通常按三条准则来定**第一回差至少是输入端等效噪声峰峰值的2到3倍。**比如你的输入信号经过整形后还有20mV噪声那回差至少设到40mV到60mV。这是底线低于这个值迟滞形同虚设。**第二回差对应的物理量必须落在系统允许的“恢复余量”内。**假设电池电压低于10.8V报警切断高于11.2V才允许恢复那么换算到比较器输入端回差就不能超过10.8V到11.2V之间的差值。回差太大可能导致系统已经恢复健康但保护就是不解除。**第三回差不能造成控制逻辑的“死区”。**某些场景下输出翻转后系统行为变化会反过来影响输入——比如继电器断开后采样电压消失。这时候回差必须足够大避免输出翻转后阈值又跟着输入信号一起变化形成连续振荡。3.2 一个可以直接抄的算例3.3V系统低压报警做一个小算例完整走一遍计算。假设我用推挽输出比较器供电3.3VVOH≈3.3V、VOL≈0V。要监控一个低压信号低于2.8V时触发报警高于2.9V时解除报警回差是0.1V。把0.1V和3.3V代入公式ΔV (VOH - VOL) × R1/(R1R2) 3.3 × R1/(R1R2) 0.1V解得 R1/(R1R2) ≈ 0.0303。选反馈电阻R1 4.7kΩ则 R2 R1 × (1 - 0.0303) / 0.0303 ≈ 4.7k × 32 ≈ 150kΩ。实际取标称值150kΩ回差精度足够。接下来确认Vref基准。注意加迟滞之前比较器的理论翻转点就是Vref加入反馈后两个翻转阈值会以Vref为中心上下分布所以平均阈值等于Vref。要让翻转阈值分别为2.8V和2.9V那么Vref应设在2.85V左右用TL431或电阻分压产生即可。如果使用的是LM393这类开漏输出比较器低电平VOL不是0要根据数据手册取典型值比如灌电流较小、上拉10k时VOL约0.3V。输出摆幅就变成VOH-VOL大约3.0V重新算一遍电阻组合。这一步很多人会忽略后面实测部分再展开。3.3 回差设置的常见翻车点回差设得太大和太小现象不同但都隐蔽。回差太小输出偶尔还是会抖只是抖动次数减少。你以为是滤波电容不够加了几百μF电容信号变慢了但抖动依旧——其实不是电容问题是迟滞宽度比噪声还小。回差太大报警恢复异常。我曾经做过一个高温报警电路设计成85℃报警、80℃恢复回差5℃。结果传感器位置周围热惯性大实际温度已经回落到72℃才解除报警折腾了好几天最后发现是回差对应的阈值换算错了反馈电阻取值把回差放大到了13℃。所以定回差之前务必把所有阈值换算到比较器输入端算清楚回差对应实际物理量是几度、几伏、几安再结合系统恢复条件确定最终值。4. 仿真先行在LTspice里搭一个滞回比较器实验台4.1 电路搭建和激励源设置计算完成后我会习惯性地先在LTspice里跑一遍仿真确认阈值和回差符合预期。搭一个简单的反相滞回比较器比较器用LTspice自带的LT1721模型轨到轨输出VCC设3.3V。元件参数用上一个算例的Vref2.85VR14.7kΩR2150kΩ输入端加一个缓慢的三角波作为测试信号。激励源可以直接用PULSE电压源产生三角波V1 IN 0 PULSE(0 3.3 0 1m 1m 2m 4m)这表示0到3.3V1ms上升、1ms下降周期4ms。这样输入信号会在2ms和3ms附近先后穿过两个翻转阈值可以从瞬态波形上直观读出两个翻转点。如果觉得上升太慢想看更明显的阈值平台可以把上升时间改成5ms、周期改成20ms。4.2 从瞬态波形和直流扫描里读出迟滞宽度瞬态仿真跑8ms查看V(output)和V(in)波形。当输入上升穿过VTH_H时输出翻低输入下降穿过VTH_L时输出翻高。用光标分别量出翻转瞬间的输入电压两者之差就是实测回差。仿真结果和理论值通常非常接近因为LTspice里的模型没有温度漂移、偏置电流这些现实问题。要更直观地观察迟滞特性可以用直流扫描。在LTspice里分别做正向扫描和反向扫描.dc V1 0 3.3 2m .dc V1 3.3 0 -2m然后把两条扫描曲线叠加在同一张图里就能看到典型的滞回曲线——正向扫描和反向扫描翻转点错开中间那段回差清清楚楚。需要注意比较器仿真有时会出现“只翻一次”的假象因为直流扫描的初始点和最终状态会互相影响。遇到这种情况可以在比较器输出端并联一个到地的1MΩ电阻、或者给电源设置合理的上升时间通常能解决。4.3 参数边界情况实验仿真最大的价值是可以快速测试极端参数。我在实际项目中经常把R1从4.7k改成10k看看回差是否从0.1V变成0.19V再把R1改成1k确认回差只有20mV时输出是否还能保持稳定。这些边界实验不用动烙铁几秒钟就能做完能帮你提前发现哪些参数区间会导致性能下降。另一个值得仿真的场景是在输入叠加一个高频噪声源——串联一个小信号源输出一个几十mV的正弦波。没有迟滞的比较器会在三角波接近阈值时输出一串毛刺加上迟滞后毛刺完全消失。这个对比非常直观建议你亲自动手跑一次比看十篇文字都管用。5. 面包板实测LM393开漏输出、上拉电阻与“跟预期不一样”的地方5.1 开漏输出计算迟滞时千万别忘了上拉电阻仿真理想实物调试才是真正长经验的地方。LM393是很多人的入门比较器便宜、皮实、随处能买到但它有个特殊性输出是开漏结构内部只是一个晶体管把输出拉到地不能主动输出高电平外部必须接上拉电阻输出高电平的实际数值完全由上拉电压决定。这就直接影响了迟滞计算。如果你参照推挽输出的公式把VOH当成比较器供电电压3.3V来计算大概率会得到偏大的回差——因为LM393的VOL并不是0V而是内部晶体管饱和导通时的压降。轻负载下约0.2V到0.4V灌电流增大时还会更高。正确做法是VOH用上拉电阻所接的电压比如3.3VVOL查数据手册根据实际灌电流取典型值比如0.3V。输出摆幅VOH-VOL按3.0V算。还是上面那个0.1V回差的目标R1/(R1R2)就不再是0.0303而是0.0333电阻取值需要同步调整。这一步看起来差得不多但当你把回差要求做到几十毫伏时0.1V的误差足以让整个阈值系统跑偏。5.2 实测中常见的偏差来源与对策面包板实测时有一个特别容易忽略的点反馈电阻R1的取值不能太大。比较器同相端存在输入电容和寄生电容R1过大会导致输出翻转后同相端电压不能立即稳定到新阈值而是要经过一个RC爬升过程。如果输入信号刚好在这个窗口内再次穿越旧阈值就可能造成二次翻转迟滞等于失效。我试过用1MΩ的反馈电阻结果输出波形边缘出现了一个很窄的毛刺就是这个原因。另一个偏差来源是输入偏置电流。LM393的输入偏置电流典型值几百纳安看起来不大但乘以R2的150kΩ就有几十毫伏的压降直接改变实际翻转阈值。解决方法是尽量把R1、R2的总阻值控制在百千欧以内或者换用偏置电流更低的比较器。如果电路里必须用大电阻来省功耗就要把偏置电流带来的误差纳入阈值预算。实测下来还有几个我踩过的坑值得提上拉电阻和反馈电阻不能混用概念。上拉电阻决定输出高电平反馈电阻决定回差大小两者都会影响输出节点但职责不同。我把feedback电阻当成上拉电阻用结果输出高电平根本上不去。信号源内阻过高时输入信号会被分压阈值整体偏移。建议在比较器输入端直接并联一个0.1μF电容对高频噪声有好处但要注意这个电容会减缓信号爬升速度回差仍然要留够。比较器输出翻转瞬间正反馈会让同相端产生一个很陡的阶跃这个阶跃可能通过寄生电容耦合到反相输入端。在面包板上摆线过长时尤其明显。紧凑布局、反馈线尽量短是成本最低的解法。5.3 用示波器量迟滞宽度的实操方法调试时怎么确认迟滞加对了我的方法很直接把信号源调成低频三角波比如0.5Hz、幅度覆盖整个阈值区间接比较器输入端。示波器CH1测输入CH2测输出用输出下降沿触发在输入波形上读出翻转瞬间的电压再用输出上升沿触发再读一次翻转电压。两次读数的差值就是实际迟滞宽度。如果示波器有X-Y模式可以直接把CH1接X轴、CH2接Y轴屏幕上会显示经典的回滞曲线——两个翻转点之间的横向距离就是回差。对于长期跑产线的工程师来说这个画面能帮你几秒钟判断电路是否正常比逐根读光标快得多。6. 不换硬件也能迟滞片内比较器与软件双层阈值6.1 单片机片内比较器的可编程迟滞如果你用的是带模拟比较器的单片机硬件迟滞可以直接通过寄存器配置不用外接电阻。以CM0系列里常见的COMP外设为例HAL库配置大致是COMP_HandleTypeDef hcomp; hcomp.Instance COMP1; hcomp.Init.InputPlus COMP_INPUT_PLUS_IO1; hcomp.Init.InputMinus COMP_INPUT_MINUS_DAC1; hcomp.Init.Hysteresis COMP_HYSTERESIS_HIGH; HAL_COMP_Init(hcomp);这里Hysteresis字段可以选无、低、中、高几档具体回差数值要查数据手册。这类内置迟滞适合中等精度场景但有一个限制档位固定可调范围有限。如果你需要精确的0.1V回差可能还是外部电阻方案更可控。6.2 ADC软件迟滞最灵活的抗抖方案再往通用里走一步直接用ADC采样加上软件迟滞。很多嵌入式场景根本不需要模拟比较器用MCU内置ADC读到的数值在代码里维护一套双阈值逻辑就能解决抖动而且阈值随时可改不用改硬件。核心逻辑非常简单维护一个状态标志当前状态是“未触发”时只有采样值超过高阈值才置位当前状态是“已触发”时只有采样值低于低阈值才复位。代码结构如下static uint8_t triggered 0; if (triggered) { if (adc_value threshold_low) { triggered 0; /* 回到正常 */ } } else { if (adc_value threshold_high) { triggered 1; /* 进入保护 */ } } if (triggered) { activate_protection(); }这个方法的好处是阈值完全由软件定义支持在线整定。使用时要特别注意ADC采样本身也可能受噪声影响如果采样结果毛刺很大建议先做软件滤波比如连续采四次取中值再做迟滞判断。否则迟滞看起来生效了实际上噪声已经把你采样到的数值震得来回穿越阈值。6.3 选择策略硬件迟滞、软件迟滞还是混合用硬件还是软件迟滞没有标准答案但有几个场景可以快速判断需要微秒级响应比如过流保护、短路保护必须走硬件比较器因为ADC采样加软件判断通常要几十微秒甚至更慢。系统里本来就有MCU做控制阈值还需要经常调整软件迟滞几乎是零成本方案改个宏定义就能生效。对于安全性要求高的电路我更愿意混合处理硬件比较器负责快速切断解决“响应不够快”的硬需求软件迟滞负责恢复判断解决“阈值整定不够灵活”的软需求。这样两边各取所长整体可靠性也更高。最后说一个我自己的习惯凡是接口上带有模拟量输入的开关量输出不管是保护电路、报警电路还是状态检测我都会默认把迟滞这一项列进设计清单而不是等调出问题再加。回差大小宁可按经验往大了取一点也要给噪声留足余量但阈值恢复条件必须同步确认不能为了抗噪牺牲系统正常的恢复能力。一条导线、一个电阻就能解决的问题实在不值得用几个晚上的连续加班来换。
返回列表