做嵌入式硬件这些年,我发现自己手里最离不开的器件,除了电阻电容,就是比较器。一个电压比较器,本质上就是把两个模拟电压放在一起比大小,然后输出一个干脆的数字电平。看起来很简单,可真正拿它做工程的时候,你会发现它脾气不小:输入信号在阈值附近跳来跳去,输出跟着抖成一团;参考电压带点纹波,阈值也跟着漂;开漏输出忘了接上拉,逻辑电平直接不对。这篇文章就把这些坑和解决方案一次性讲透,适合刚接触模拟电路、需要做传感器阈值检测/过零检测/窗口报警的工程师,也适合想重新梳理比较器选型细节的老手。
1. 从运放思维到比较器思维:先搞清楚它和普通运放的区别
1.1 开环工作的本质
比较器的内部结构,简单说就是一个高增益的差分放大器,但通常工作在开环状态。也就是说,反馈回路没有刻意接成闭环,只要同相输入端的电压比反相输入端高一点点,输出就会迅速冲向高电平;反过来,输出就冲向低电平。这个“一点点”可以做得很小,因为开环增益动辄几十甚至上百dB,几毫伏的差异就足以让输出“撞上”电源轨。
我之前见过不少刚入门的朋友,第一反应是“这不就是个运放吗?我直接用运放比大小行不行?”结果踩坑了。普通运放按照设计是工作在闭环负反馈状态,用“虚短”的概念去分析线性放大;一旦把它接成开环比较器,很多运放的输入级保护电路会限制差分输入电压范围,输入电压差过大时反而可能损坏或者出现相位反转。更麻烦的是,普通运放的输出级通常为了低失真做了很多补偿,压摆率不高,响应速度远不如专用比较器。所以,如果只是低速的粗略判断,临时用运放顶一下勉强可以,但必须确认数据手册里允许输入差动电压达到电源轨;如果是正经做阈值检测,还是要选专用比较器。
专用比较器的输出级往往设计成饱和输出,好处是翻转干脆,并且支持开集/开漏结构,方便做电平转换和逻辑门驱动。理解了这一点,你就会明白为什么同样一个“比大小”的功能,专用比较器在速度、噪声容限和接口灵活性上都有明显优势。
1.2 读数据手册必须盯住的六个参数
很多工程师选比较器只看“工作电压”和“输出类型”,等到调不出来才回头翻手册。我建议从上手的第一天就养成习惯:数据手册拿过来,先把下面这六个参数圈出来。
| 参数 | 含义 | 工程影响 |
|---|---|---|
| 输入失调电压 Vos | 比较器两输入端等效的电压误差 | 决定了理论阈值和实际翻转点的误差,Vos过大时阈值不准 |
| 迟滞电压 | 比较器内部或外部引入的正反馈量 | 抑制噪声导致误翻转,没有迟滞的系统在阈值附近会抖动 |
| 传播延迟 | 输入越过阈值到输出翻转的时间 | 决定比较器能处理多快的信号,高速检测必须关注 |
| 共模输入范围 | 两个输入端允许的电压范围 | 超出范围后输出可能锁定或反转,很多低压比较器不是轨到轨输入 |
| 输出结构 | 推挽、开漏或开集 | 决定是否需要上拉电阻,以及能否做电平转换和线与逻辑 |
| 电源电流 | 静态电流/工作电流 | 电池供电场景尤其重要,影响整机功耗 |
以经典的LM393为例,工作电压范围很宽,电源电压从2V到36V都能跑,输入失调电压通常在1mV量级,关键的是它内部是开集输出,输出管只能把节点拉低,不能主动推高,所以必须接上拉电阻。很多人第一次用LM393时觉得“这个输出怎么一直低”,其实就是忘记接上拉了。后续选型时,如果对功耗敏感,可以看TLV7011这类低功耗单通道比较器;如果对速度敏感,LM311、TLV3501这类高速器件会更合适。选型不是越贵越好,而是把功耗、速度、共模范围、输出结构这几项放在项目需求里排个优先级。
2. 为什么你的比较器会乱跳:迟滞设计计算与实测经验
2.1 没有迟滞的灾难
比较器最常见的故障现象,是输出在阈值附近疯狂抖动。你用它检测一个缓慢上升的温度信号,结果到设定温度附近,输出不是一个清晰的翻转,而是一连串毛刺。原因是现实的信号都带噪声,如果信号在阈值线附近来回穿越,比较器就会反复翻转。
我曾调试过一个水箱液位报警电路,用的比较器阈值设在2.0V,液位信号缓慢变化,到2.0V附近时输出屏幕上全是脉冲。一开始我以为传感器坏了,后来用示波器看阈值点附近的波形才发现,信号叠加了大约几毫伏的工频噪声和电源纹波,导致输入在阈值附近来回波动。这种情况下,光靠加大输入滤波电容也有用,但会拖慢响应,最佳方案是加迟滞。
所谓迟滞,就是让比较器“上门限”和“下门限”不一样。信号越过上门限后,输出翻转,但下次要触发翻转,必须回到比上门限更低的下门限。这样,噪声只要不超过一个迟滞窗口,就不会引起误触发。简单理解,相当于给比较器在旁边画了一条“死区”,死区内的噪声都被吞掉。
2.2 外部正反馈迟滞的公式和计算
很多比较器自带少量内部迟滞,大概只有几毫伏到十几毫伏,用来改善高速噪声效果有限;在实际工程里,大多数情况要用外部正反馈做一个可调的迟滞窗口。
常见电路是把比较器输出通过一个反馈电阻RF接到同相输入端,同时参考电压VREF也通过一个电阻R1接到同相输入端,反相输入端接输入信号。这样同相端电压就等于VREF与输出电平的加权平均。定义R1接VREF到同相端,RF接输出到同相端,则同相端电压可以写成:
V+ = (VREF × RF + VOUT × R1) / (R1 + RF)
比较器在同相端电压等于输入电压的瞬间翻转。输出高电平时,VOUT = VOH,对应的上门限是:
VTH = (VREF × RF + VOH × R1) / (R1 + RF)
输出低电平时,VOUT = VOL,对应的下门限是:
VTL = (VREF × RF + VOL × R1) / (R1 + RF)
迟滞宽度就是:
VHYST = VTH - VTL = (VOH - VOL) × R1 / (R1 + RF)
如果比较器输出接近轨到轨,VOH ≈ VCC,VOL ≈ 0,那么公式可以简化成:
VTH ≈ (VREF × RF + VCC × R1) / (R1 + RF) VTL ≈ VREF × RF / (R1 + RF)
举个例子。假设VCC=5V,VREF=2.5V,R1=10kΩ,RF=100kΩ,则:
VTH = (2.5 × 100k + 5 × 10k) / 110k ≈ 2.727V VTL = (2.5 × 100k) / 110k ≈ 2.273V 迟滞宽度 VHYST ≈ 0.454V
也就是说,输入信号要升到2.727V比较器才输出翻转,之后要跌到2.273V以下才会再翻回来,中间这段就是死区。对噪声幅度小于0.45V的应用来说,输出不会再乱跳。
这里有个经验值:迟滞窗口一般取信号噪声峰峰值的1.5到2倍以上,留出余量,但也不要取得太大,否则真正需要检测的微小变化会被“吃掉”。比如做一个0.1℃精度级别的温度报警,温度变化引起的电压变化可能只有几毫伏,迟滞窗口就不能设置成几百毫伏,否则报警精度完全没法看。在精度和抗干扰之间,需要按实际信号幅度去平衡。
2.3 迟滞设计中的两个细节
第一,使用内部迟滞较小的比较器时,不要完全依赖数据手册给的几毫伏内部迟滞,那一般只是避免自激用的,对工业现场的强噪声远远不够。第二,调整迟滞时,优先改变RF和R1的比例,而不是同时大幅度改两者,否则参考电压也会跟着漂。我习惯先固定R1为10kΩ量级,然后根据需要的迟滞窗口反推出RF。R1取值太小会白白增加电源电流,R1取值太大则容易引入噪声,10kΩ到100kΩ之间通常比较顺手。
3. 三个常用电路,直接把比较器用起来
3.1 过零检测电路
过零检测是交流信号处理里的经典应用,用来检测正弦波什么时候从负到正或者从正到负。最简单的做法是把正弦信号接到比较器的反相输入端,同相输入端接地(单电源供电时改接到分压参考点),输出就能产生一个方波,同步于信号过零。
但直接接地做单电源过零检测有个问题:信号负半周会低于地,超过输入共模范围,可能导致输出异常。我常用的办法是先把信号通过电容隔直,然后加一个偏置电阻把信号抬高到电源电压的一半,再用比较器检测相对该偏置点的穿越。这种情况下,参考电压不再是0V,而是VCC/2的偏置电压,比较器输出翻转的“零”其实是交流信号经过电平平移后的直流点。
别忘了迟滞。很多过零检测电路没有迟滞,结果输出在零点附近一堆毛刺,因为交流信号在零点附近斜率虽然大,但叠加的开关噪声照样能让比较器来回翻转。给比较器加几毫伏到几十毫伏的迟滞,输出就会干净很多。需要关注的是,大迟滞会带来过零点的相位偏移,如果后面要做锁相环或者过零触发,迟滞太大会增加相位误差,这时候要折中取舍。
3.2 窗口比较器
窗口比较器用来判断输入电压是否位于某个区间内。比如电池电压是否在3.0V到4.2V之间,温度是否在20℃到60℃之间,这类“上下限”判断用比较器最顺手。
电路需要用两个比较器,一个负责上限,一个负责下限。用LM393这类双比较器可以一颗搞定。参考电压用两个电阻分压产生上限阈值VH和下限阈值VL,输入信号VIN同时接到两个比较器的输入端,其中一个比较器判断VIN是否高于上限,另一个判断VIN是否低于下限。两个开漏输出可以直接接在一起,构成“线与”逻辑。
如果希望输入在窗口内时输出高电平,可以在两个开漏输出并联点接上拉电阻。因为窗口内时两个比较器都满足输出状态,开漏输出都不导通,上拉电阻把输出拉高;超出窗口时至少有一个输出导通,把输出拉低。这里容易犯的错误是没有仔细检查两个阈值之间的顺序,VH和VL接反了,窗口逻辑完全没有;更严重的是当VIN在上限和下限之间很窄的区域时,两个比较器可能因为各自阈值附近的噪声同时抖动,所以窗口比较器的阈值设计最好也带上迟滞。
3.3 温度或光照阈值报警电路
比较器最接地气的用法之一,就是和传感器配合做报警。以热敏电阻温度检测为例,NTC热敏电阻的阻值随温度升高而降低,把它和一个固定电阻串联分压,电压就会随温度变化。用一个比较器把这个电压和参考电压比较,就能实现“温度超过某个值就报警”。
这个场景里有个细节:NTC的电阻曲线是高度非线性的,在不同的温度点上,同样的温度变化引起的电压变化量不同。如果你只是在常温下标定了一个阈值,到高温段可能完全不准。我一般在选分压电阻时会先算好传感器在目标温度点的电阻值,再反推参考电压,把阈值点设在响应最灵敏的那一段。另外,热敏电阻自热效应也要注意,流过它的电流太大会因为自热把温度测高,一般限制在几十微安到几百微安。
报警动作如果直接驱动蜂鸣器或继电器,比较器输出抖动造成的后果会更明显,蜂鸣器会发出断断续续的声音,继电器触点会反复吸放。所以这个应用我强烈建议加迟滞,并且把输出一路接到三极管/MOS管驱动蜂鸣器时,要在感性负载上并联续流二极管,避免关断瞬间的反向电动势打到输出管。
4. 输出级结构:开漏、推挽与电平转换
4.1 开漏输出为什么要接上拉电阻
LM393这类比较器是开集/开漏输出,内部输出管只有拉低能力,没有主动拉高能力。要让输出产生高电平,必须在上面的电源和输出引脚之间接一个上拉电阻。很多刚到手的工程师第一次通电,看到输出对地只有不到0.1V,以为芯片坏了,其实是因为没有接上拉。
开漏输出的好处恰恰在于这种“只拉低不拉高”的特性。你可以把上拉电阻接到3.3V,而比较器本身用5V供电,这样输出电平就自动变成3.3V逻辑,可以直接接STM32、ESP32这类3.3V MCU的IO口。如果比较器是推挽输出,输出高电平一般等于VCC,在VCC=5V时直接接3.3V MCU会有超压风险,需要额外的电平转换电路。所以很多混合电压系统里,工程师都偏爱开漏输出比较器。
多个开漏输出还可以直接并联,只要有一个输出低,公共节点就是低;所有输出都呈高阻时,上拉电阻把节点拉高。这就是“线与”逻辑。窗口比较器正好利用了这一点,省掉了额外逻辑门。
4.2 上拉电阻阻值怎么选
上拉电阻太小,这个电阻上的电流会变大,功耗上升,而且比较器输出管灌电流可能超过额定值;上拉电阻太大,输出低到高电平的上升时间会变长,频率高时波形就变成圆角,逻辑可靠性变差。
上升时间的粗略估算用RC充电模型:t ≈ 0.847 × R × C。这里的C是输出节点的总负载电容,包括比较器输出脚寄生电容、走线电容、下一级输入电容,以及探头电容。假设节点电容C=50pF,要求上升时间小于1μs,那么:
R ≤ 1μs / (0.847 × 50pF) ≈ 23.6kΩ
所以10kΩ通常能满足不少低速场景。如果节点电容很大,比如驱动一根较长的屏蔽线或者多个负载,C可能达到200pF,同样的1μs上升时间限制下,R要小于5.9kΩ,这时候就得换成4.7kΩ或更低。反过来,如果是超低功耗应用,输出频率很低,可以选100kΩ甚至1MΩ,但要注意抗干扰能力下降,高阻节点更容易拾取噪声。
最小电阻则受输出管的额定灌电流限制。以LM393为例,输出拉低时灌电流标称大约20mA,如果上拉电阻为1kΩ、上拉电源5V,输出低电平灌电流约5mA,没问题;但如果上拉电阻用100Ω,灌电流按5V/100Ω = 50mA计算,远超额定值,芯片就吃力了。所以最关键的还是要看上拉电源电压和电阻值算出的电流不要超过手册中的最大灌电流。
4.3 驱动负载和电平转换的实战细节
如果比较器输出要驱动LED,不能简单地把LED串电阻接在输出和地之间,因为开漏输出低电平时会把LED两端都拉成低,LED不会亮。正确做法是:LED一端接上拉电源,另一端通过限流电阻接比较器输出。当输出为低时,电流从LED流经电阻进入输出管,LED亮;输出为高阻时,LED阳极和阴极等电位,LED灭。
如果输出要驱动继电器,最好经过一颗三极管或MOS管,不要直接让比较器输出管去灌继电器线圈的大电流。继电器线圈在断电时会产生反向电动势,需要在继电器线圈两端并联一颗续流二极管,否则反向电压可能击穿芯片输出级。
在用开漏输出做不同电压域之间的电平时,还要注意比较器的输出管耐压值。上拉电源电压不要超过输出管允许的最大VCE或最大漏级电压,否则输出管会击穿。LM393这个系列通常允许较高的上拉电压,但不同型号不一样,拿到芯片先看一眼手册“Output Voltage”或者“Maximum Output Voltage”那一栏。
5. 从原理图到PCB:别在布局布线阶段把性能毁掉
5.1 参考电压的噪声是隐形杀手
很多人把比较器阈值设得很准,但实际板上跑起来还是乱跳,排查到最后发现是参考电压引脚上的噪声在作怪。阈值电压来自电源分压,如果分压节点上没有就近滤波电容,电源上的开关噪声就会直接耦合到参考端,等效成阈值的抖动。
解决方法很简单:在参考电压脚附近放一颗100nF的陶瓷电容到地,如果对纹波更敏感,再并联一颗1μF到10μF的电容。分压电阻的阻值也不要选得太大,否则节点阻抗很高,一点空间耦合噪声就足以让参考电压漂移很多。我见过有人用1MΩ分压电阻为了省电,结果输出波形满是毛刺,后来换成100kΩ加100nF电容,问题立刻消失。
5.2 输入走线和反馈路径的布局要点
比较器的输入阻抗很高,但也因此对噪声更敏感。输入走线要尽量短,并且远离电感、变压器、MOS管开关节点等强干扰源。如果输入信号来自PCB外部,最好在输入到地之间加一个小电容做滤波,电容大小取决于信号最高频率,不要盲目加大到完全滤掉信号本身。
迟滞反馈电阻的位置也很有讲究。它连接输出和同相输入端,相当于一个高速反馈路径,应该尽量靠近比较器引脚,不要让反馈线上绕一个大圈,否则会引入寄生电感,甚至造成比较器额外振荡。输出走线同样不要与输入走线平行太长,否则输出跳变时通过寄生电容耦合回输入,形成正反馈,让比较器在翻转瞬间产生毛刺。
高速比较器的布局更严格:电源引脚要每个引脚都放100nF去耦电容,电容要尽量靠近芯片;输入差分信号如果来自传感器,信号回路线也要单独规划;地平面要连续,不要有缝隙跨过。慢速比较器相对宽松,但基本的“星型接地”和“就近去耦”仍然不可省。
6. 常见问题与排查技巧实录
6.1 典型问题汇总
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 输出一直为低 | 开漏输出未接上拉电阻 | 检查上拉电阻是否焊接、上拉电源是否到达 |
| 输出一直为高 | 输入信号或者参考电平接错、阈值设置超出信号范围 | 用万用表逐点量输入和参考电压 |
| 输出频繁抖动 | 输入信号噪声过大、参考电压纹波大、没有迟滞 | 示波器看阈值点波形,增加迟滞和电容滤波 |
| 输入电压明明很高,输出却不变 | 输入共模范围超出手册限制 | 查手册共模输入范围,做电平平移 |
| 信号一变快,输出波形变得很圆 | 上拉电阻太大、负载电容太大 | 减小上拉电阻,改善输出驱动 |
| 多个通道互相干扰 | 未使用的比较器输入悬空 | 未用通道输入端固定到地或电源 |
6.2 用示波器排查的实操步骤
遇到比较器输出异常,我的第一动作不是改电路,而是先拿示波器把关键节点的波形都看了:
第一步,量参考电压波形。看这个电压是不是稳定在设定值,纹波有多大。不要只看万用表的直流值,要切到交流耦合看高频噪声。
第二步,量输入引脚波形。看输入信号是不是真的像理论分析那样,围绕阈值附近变化,顺便观察输入上有没有叠加的高频毛刺。
第三步,量输出波形。如果输出抖动,把时间轴拉宽,看抖动是持续的,还是只在信号过阈值瞬间出现。还可以用示波器的余晖模式,能直观看到阈值点附近的概率密度分布。
第四步,把探头改成接地弹簧短接地的接法,消除地线环路带来的额外噪声。这些操作做完,问题基本能定位到是参考噪声、输入噪声、还是输出接口问题。
6.3 几个让我印象深刻的小细节
用LM393这类老芯片时,输入共模范围并不是满轨的。常见型号的共模输入范围大概是VCC-2V左右,也就是说,如果你用3.3V供电,输入电压超过1.3V附近就已经很危险了,未必能正常工作。我第一次用它做电池电压检测时,VCC=3.3V,电池电压3.0V,怎么调都翻转不对,后来一查手册才反应过来。不是芯片坏了,是我让它干了超出设计范围的工作。
另外,部分老式比较器在输入超过共模范围后可能出现相位反转,也就是说本来应该输出高电平,结果输出低电平。如果应用环境里输入有可能超出电源范围,一定要选数据手册里明确写了“无相位反转”的型号。
最后一个细节:多通道比较器里没用到的那个通道,千万不要悬空。悬空输入会让内部电路处于不稳定状态,轻则功耗增加,重则通过电源和衬底干扰正在用的通道。我一般直接把这个通道的输入都接到地,或者接到电源,不让它来回振荡。这个习惯救过我很多次。
比较器这个“小东西”,原理不难,但工程细节非常多。先搞懂开环和迟滞,再弄明白输出级结构,选型、布线、调试就会顺很多。希望这些踩坑经验能帮你少走弯路。