做第一个光电计数器时,我把光敏电阻的电压变化先送进一级同相放大器,再把放大后的信号交给单片机ADC。直到后来想省一个引脚,才把另一枚运放直接当成比较器用:给阈值,输出高低电平,触发计数。结果发现,“能用”和“好用”之间隔着一整条经验,尤其是开环输出、共模范围、迟滞这几个概念,几乎每一项都把我按在地上摩擦过。这篇“运算放大器基础1”就来把“运放用作比较器”这件事讲透,适合刚接触运放、或者想用一个双运放芯片同时干放大和比较两件事的朋友。我会从最底层的开环原理讲起,给一个可以直接在面包板上复现的低电量报警电路,再分享我实测中踩到过的坑和迟滞设计的具体计算。
1. 同一块硅片,两种人格:开环才是比较器的真相
1.1 从运放模型推导“比较”的本质
很多人学运放,第一节课就是“虚短虚断”,于是潜意识里觉得运放一定要接负反馈才行。其实那是线性应用的条件,不是运放的物理本质。运放本身做的事情非常简单:把两个输入端的电压差放大到输出。
理想运放的输出表达式是:
Vout = A_OL × (V+ - V-)这里的A_OL是开环增益。普通通用运放的直流开环增益通常在100dB到120dB之间,也就是十万倍到百万倍。假设供电电压是5V,开环增益取十万倍,那只要输入端存在 5V / 100000 = 50µV 的电压差,输出就已经被推到电源轨饱和了。
换句话说,一旦去掉负反馈,运放在绝大多数情况下根本没有机会工作在“线性放大区”,它只会做一件事:判断V+和V-谁大,然后输出直接顶到正电源或负电源附近。这正是比较器需要的功能。
所以“运放用作比较器”不是某种邪门用法,而是开环状态下运放的默认人格。只是我们平时习惯用负反馈把这种人格压制住了。
1.2 虚短的条件被拿掉后,会发生什么
负反馈下的运放,输出会通过反馈网络反作用于输入端,想方设法让V+和V-逼近相等,这个状态才叫“虚短”。当我把反馈电阻拿掉,或者故意不接负反馈,V+和V-之间失去这种“自我修正”机制,差多少就是多少,只要差几微伏,输出就会跑到一边去。
这里有一个初学者容易搞混的点:运放用作比较器,输出并不等于“标准的数字高电平”,而是等于当前供电下的饱和输出电压。对非轨到轨运放来说,这个饱和电压可能离电源还有一段距离。这一点我在后面第3部分会专门展开,这里先记住:比较器输出“高”是物理上的饱和高电压,不是IEEE定义的标准逻辑电平。
可以用下面这张表来理解两种工作状态的区别:
| 对比项 | 线性放大器 | 开环比较器 |
|---|---|---|
| 反馈形式 | 深度负反馈 | 无负反馈(或正反馈) |
| 输入关系 | V+ ≈ V-,虚短成立 | V+ 与 V- 被拉开 |
| 输出状态 | 线性区内连续变化 | 饱和在电源轨附近 |
| 典型用途 | 信号调理、滤波、跟随 | 过压/欠压判断、波形整形、阈值触发 |
| 主要风险 | 稳定性、带宽 | 输出摆幅、速度、输入共模限制 |
我个人的体会是,不要把“比较器”想象成运放的一个额外功能,而是要把“开环”这件事本身当成运放的基础属性去理解。很多电路的异常现象,比如输出抖个不停、高电平不够高、翻转慢,只要回到“开环增益极大、输出只能饱和”这个模型,都能解释得通。
2. 从电池电压到LED灯:一个能直接复现的低电量报警电路
2.1 需求、器件选型与连接关系
这一节我们做一个具体的项目:检测3.7V锂电池,当电池电压低于3.5V时点亮LED提醒充电,电压正常时LED熄灭。
有人会说,这种需求直接用比较器芯片不就行了吗?没错,但教学目的不一样。这里用LM358,是因为它几乎是每个电子爱好者手里都有的器件,而且它里面有两个运放,一个用来做比较器,另一个还能留着下节课做线性放大,非常适合“基础1”这个定位。
器件清单如下:
| 器件 | 参数 | 数量 |
|---|---|---|
| 运放 | LM358(双运放) | 1片 |
| 基准源 | TLV431(1.24V) | 1只 |
| 电阻 | 150kΩ | 1只 |
| 电阻 | 82kΩ | 1只 |
| 电阻 | 1kΩ | 1只 |
| 电阻 | 330Ω | 1只 |
| 电容 | 100nF | 2只 |
| LED | 红色,正向压降约2V | 1只 |
| 电池或直流电源 | 3.0V~4.2V模拟电池 | 1路 |
电路连接的核心思路是把电池电压分压后送到V+端,把固定参考电压送到V-端。具体是这样接的:
- 电池正极 VCC 经过150kΩ接到运放V+引脚,V+引脚再经过82kΩ接地,形成1:0.353的分压网络。
- 电池正极经过1kΩ接到TLV431的阴极,TLV431的阴极直接连到运放V-引脚,TLV431阳极接地。TLV431会把阴极稳定在1.24V。
- 运放输出引脚接LED限流电阻330Ω到LED阳极,LED阴极接到运放输出引脚——注意,是LED放在电源和输出之间,不是输出串LED到地。
- VCC和GND之间放一个100nF去耦电容,TLV431阴极也放一个100nF到地。
这里选择了TLV431而不是更常见的TL431,原因很关键:TLV431参考电压是1.24V,可以在3.0V这么低的供电下正常工作;而TL431的参考电压是2.5V,在3.7V电池供电下,LM358输入端共模范围最高大约只有VCC减1.5V,2.5V已经超出范围了。如果手头只有TL431,建议把整个电路用5V供电,别用电池直接供。
2.2 阈值计算:为什么必须用固定基准,而不是两路分压
我最开始想过一个“省事”方案:两组分压电阻都从电池电压上取,一组给V+,一组给V-,只要电阻比不同,就能判断过压欠压。但仔细一算就知道有问题。
两组分压都正比于电池电压,最终比较的是两个比例,而不是绝对电压。比如一组分压比是0.5,另一组是0.4,只要电池电压从4.2V一路掉到2V,输出翻转点永远是电池电压的某个固定比例,电压绝对值从4.2V掉到2V时,虽然比例没变,但实际电压早就不对了。低电量报警要的是“低于3.5V这个绝对电压就报警”,所以必须有一个不随电池电压变化的固定基准。
TLV431在这里的作用就是提供一个绝对值1.24V的参考,它不跟着电池电压跑。然后我们通过电阻分压,把电池电压3.5V映射到1.24V。
分压比计算:
分压比 = V_ref / V_threshold = 1.24V / 3.5V ≈ 0.3543选R1(上端)=150kΩ,R2(下端)=82kΩ,实际分压比是:
R2 / (R1 + R2) = 82 / (150 + 82) = 0.3534实际翻转阈值:
V_threshold = V_ref × (R1 + R2) / R2 = 1.24 × 232 / 82 ≈ 3.506V误差只有6mV左右,完全够用。TLV431阴极串联电阻1kΩ,在电池电压3.7V时,TLV431工作电流约 (3.7-1.24)/1000 = 2.46mA,在3.2V时也有约1.96mA,都处在TLV431正常工作区间内。
LED限流电阻取330Ω,按电池3.7V、LED正向压降2V、LM358输出低电平约0.15V来算:
I_LED ≈ (3.7 - 2.0 - 0.15) / 330 ≈ 4.7mA这亮度在室内看得很清楚,也不会把运放输出级压垮。
2.3 面包板调测:用可调电源模拟电池放电
搭建完成后,先用直流稳压电源模拟电池,别直接上真实锂电池,不然反复放电太折腾。我从3.8V开始,慢慢往下调,同时用万用表盯着运放输出引脚。
在3.8V时,V+端电压 = 3.8 × 82/232 ≈ 1.343V,高于V-端的1.24V,输出为高,LED灭。继续把电压降到3.5V附近,V+端电压掉到约1.24V附近,输出开始翻转,LED点亮。实际受电阻误差影响,翻转点可能在3.42V到3.58V之间,这是正常的。如果要求更高精度,把上端电阻换成100k电位器串联,或者选1%精度的电阻。
测量记录大致像这样:
| 电池电压 | V+端电压 | V-端电压 | 运放输出 | LED状态 |
|---|---|---|---|---|
| 3.80V | 1.343V | 1.24V | 高(约3.1V) | 灭 |
| 3.60V | 1.272V | 1.24V | 高 | 灭 |
| 3.50V | 1.237V | 1.24V | 低 | 亮 |
| 3.20V | 1.131V | 1.24V | 低 | 亮 |
这组数据里已经能看到一个细节:电池电压3.8V时,LM358输出高电平只有3.1V左右,而不是3.8V。这就是下一节要说的第一只坑。
3. 我在实测中被坑到的四件事:输出摆幅、共模范围、速度与驱动
3.1 输出高电平到不了VCC,才是通用运放的真实面貌
第一次搭完电路,我盯着万用表有点怀疑人生:电池电压3.8V,运放输出高电平按理说该接近3.8V,结果只有3.1V。我把表笔换到芯片供电端确认没接错,又把输出空载,依然只有3.1V左右。
这就是通用运放和“数字芯片”思维最大的冲突点。LM358的输出级是双极型晶体管推挽结构,并不是CMOS轨到轨输出。在正电源附近,它的高电平输出会受到输出级饱和压降的限制,典型就是VCC减去0.7V到1.5V,具体看负载电流。负载电流越大,损失越多。
排查过程是这样的:先怀疑LED接错,断开LED再测输出,高电平从3.1V变成3.2V左右,说明负载确实有影响,但问题根源不在LED。然后去看数据手册的输出电压特性曲线,才发现这个“VCC-1.5V”的坑。
如果你的下一级是3.3V单片机的GPIO,问题还不大,3.1V还能被识别成高电平。但如果下一级是另一个比较器、CMOS逻辑门或需要接近供电轨的电路,就要小心了。解决方案有三条:
- 换用轨到轨输出的运放,比如MCP6002、OPA340这类CMOS运放;
- 在输出端加一级晶体管做电平转换;
- 或者干脆换真比较器,后面第5部分会细说。
3.2 输入共模范围:不是所有输入电压都允许出现在引脚上
第二个坑更隐蔽。LM358的输入共模电压范围是0到VCC-1.5V左右。表面意思就是:两个输入端子的电压都应该落在这个范围里,运放才能正常工作。
在一个3.7V供电的系统里,LM358的共模范围上限大概是2.2V。这就是为什么前面的电路里我不能随便用TL431的2.5V做参考,因为2.5V已经超出了LM358的共模范围。当某个输入超过这个范围,运放可能出现意想不到的行为,比如输入级饱和、输出反转、甚至旧型号还会出现相位反转。
所以当你要比较一个接近正电源的信号时,别直接怼到输入端,最好先分压成范围内的电压。这听起来多此一举,但能在后面帮你省掉一晚上的排查时间。
另外还有一个差分输入电压问题。线性应用时V+和V-靠虚短维持得很近,但比较器应用里两个输入大概率会差出好几伏,甚至一个接近地、一个接近电源。很多运放的差分输入电压是有上限的,超出后内部保护二极管会导通,恢复时间变长,严重时还会触发闩锁。通用运放的datasheet里通常会标“Differential Input Voltage”这一项,用之前务必翻一下。
3.3 压摆率和传播延迟:为什么会慢到怀疑人生
低速阈值检测无所谓,但一旦把运放当比较器用在高频信号上,就会遇到第三个坑——速度。
运放内部为了负反馈稳定性,普遍做了主极点补偿,说白了就是内部有一个专门“拖慢”信号的电容。这个设计让线性放大不容易自激振荡,但代价是开环状态下输出翻转速度被限制得很死。
LM358的压摆率典型值是0.5V/µs。什么意思?假设我这一节电路的输出需要从低电平0.15V翻到高电平3.1V,电压变化约3V,理论最短时间也要:
t = ΔV / SR = 3.0V / 0.5V/µs = 6µs这还只是理想情况。实际比较器应用还要看输入过驱动电压,过驱动越小,翻转越慢。换句话说,运放当比较器,在处理100kHz以上的方波整形、PWM反馈或过零检测时,基本不太行。真比较器的传播延迟通常在几百纳秒到几微秒,而且datasheet会直接给出“过驱动1mV、5mV、10mV下的响应时间”,方便你设计。
如果你的项目只是“电池电压低于阈值点个灯”,1kHz都嫌快,那运放完全够用。如果后面要做电机编码器倍频计数,请直接看向比较器芯片。
3.4 输出驱动能力与输入偏置电流:两个容易被忽略的小账
第四坑不痛不痒,但会影响长期可靠性。运放的输出级能拉电流也能灌电流,但这不意味着你可以拿它当功率驱动。LM358输出短路电流上限大约30mA到60mA,实际长时间输出大电流时,输出电压会明显塌陷,芯片温度也上去了。我的习惯是LED电流控制在5mA以内,驱动MOS管或继电器必须加晶体管,别直接接在输出上。
还有一个不算坑、但特别影响精度的参数:输入偏置电流。LM358不是低偏置器件,最大输入偏置电流可能到250nA。如果你用高阻值的分压网络和反馈电阻,偏置电流会在电阻上形成附加压降,把阈值推偏。
比如后一节要加迟滞电阻,如果直接拿150k和82k去算反馈电阻,算出来可能需要好几兆欧。几兆欧电阻流过250nA偏置电流,会产生几百毫伏的误差,这对比较器电路来说非常致命。所以我在做迟滞验证时,会故意把分压电阻整体缩小十倍,后面会看到具体处理方式。
4. 迟滞比较器:正反馈把抖动摇铃变成干脆的一跳
4.1 先看没有迟滞时发生了什么
如果你在实际项目里把前面那个低电量报警电路接到有纹波的电源上,会发现一个尴尬现象:LED在阈值附近不是干脆地点亮,而是先闪几下再稳定,甚至持续微亮。
原因是比较器的翻转只有一个阈值,理论上输入只要在Vth附近有微小噪声,输出就会来回翻转。真实世界没有理想的“缓慢平滑跨过阈值”,多半是带着纹波、毛刺、甚至开关电源的尖峰在过线。每次过线,输出就跟着抖一次。
解决思路不是把信号弄干净,而是反过来给比较器“加两个阈值”:一个用于从低到高,一个用于从高到低。这两个阈值之间留出一个回差区间,只要噪声幅度小于回差,输出就不会乱跳。这就是迟滞比较器,也常被叫做施密特触发器形态的比较器。
4.2 迟滞电阻的参数推导与实例取值
在设计迟滞后,原来的低电量报警电路要加一个正反馈电阻:从比较器输出端接到V+输入端。
先回顾原来不带迟滞的参数:
- 参考电压 V_ref = 1.24V
- 分压比 r = R2/(R1+R2) = 0.3534
- 翻转阈值 V_th = 3.506V
- V+节点对地的等效内阻 R_th = R1 ∥ R2 = 150k ∥ 82k ≈ 53.0kΩ
为了让后面反馈电阻不至于大到被偏置电流干扰,我把分压电阻整体缩小十倍,改成R1=15kΩ、R2=8.2kΩ,分压比不变,仍是0.3534,但此时的等效内阻:
R_th = 15k ∥ 8.2k ≈ 5.30kΩ定义反馈系数:
α = R_th / (R_th + R_f)加上正反馈后,V+节点的电压不再是单纯的分压值,还要算上输出通过反馈电阻拉来的影响:
V_node ≈ r × V_bat × (1 - α) + V_out × α当 V_node = V_ref 时,比较器翻转。从输出高电平状态翻转到低电平的下限阈值,以及从低电平回到高电平的上限阈值,可以这样近似估算:
V_low = (V_ref - V_OH × α) / (r × (1 - α)) V_high = (V_ref - V_OL × α) / (r × (1 - α))以LM358实测输出高约3.2V、输出低约0.15V为参考,我希望下限阈值在3.4V附近,上限阈值在3.57V附近。反推反馈系数α约0.019,于是:
R_f = R_th × (1 - α) / α ≈ 5.30k × 51 ≈ 270kΩ取标准值270kΩ。V+端输出的上拉/下拉作用大约让低阈值落在3.4V上下,高阈值落在3.57V上下,回差约170mV,已经足够吸收大多数电源纹波。
画重点:这组数值不是死参数。不同供电电压、不同负载下,运放的实际V_OH和V_OL不一样,两个阈值会不对称地移动。所以接好电阻后不要只看计算值,一定要实测一次翻转点。
4.3 要不要用示波器验证阈值?这里有简单方法
验证迟滞效果最直观的办法是给电路输入一个低频三角波。把函数发生器输出设为0V到4.2V、频率1Hz左右,接到电路的VCC端,前提是你的函数发生器能提供几十毫安电流。没有函数发生器也没关系,用可调电源慢慢往上拧和往下拧,记录LED点亮和熄灭时对应的电压就行。
有示波器时,可以看到输出波形从高跳低的位置和从低跳高的位置不在同一个输入电压上,这就是迟滞窗口。我实测的结果是,从高到低大约在电池电压3.38V时触发,从低到高大约在3.55V时恢复,比理论值略低,原因是LM358的V_OH实际没有到3.2V那么乐观,加上电阻误差,略偏下是意料之中的。
给个实用建议:如果LED在阈值附近仍有轻微抖动,优先检查电源去耦电容,再检查反馈电阻是不是被输入偏置电流影响。只要回差窗口够宽,绝大多数抖动都能被“吃掉”。
5. 什么时候该把运放换成正牌比较器
5.1 运放与比较器的关键差异对照
前面所有内容都在教你怎么把运放当比较器用,这一节反过来泼冷水:能把电路跑起来,不等于它适合量产或高速场景。真比较器在物理结构上是为开环应用优化的,和运放不是一回事。
| 对比项 | 通用运放(LM358) | 真比较器(LM393) |
|---|---|---|
| 输出结构 | 推挽输出,可直接源/灌电流 | 多数是集电极开路/漏极开路 |
| 输出高电平 | 受内部饱和压降限制 | 取决于外部上拉电阻接的电压 |
| 响应速度 | 受主极点补偿限制,慢 | 专为开环响应优化,快 |
| 差分输入承受能力 | 通常有限制 | 可承受接近电源轨的差分电压 |
| 输入共模范围 | 需要严格确认 | 通常设计得比较宽 |
| 静态功耗 | 中等 | 常见低功耗型号远低于通用运放 |
| 是否需要上拉电阻 | 不需要 | 集电极开路必需,但可以自由选择逻辑电平 |
最典型的是LM393:同是双路,但输出是集电极开路,必须外接一个上拉电阻才能输出高电平。好处是这个上拉电阻可以接到3.3V、5V或者其他逻辑电压,让输出直接匹配你的MCU电平,不会出现LM358那种“高电平只有3.1V”的问题。代价是输出不能主动向外部推电流,LED这类负载这样接:电源正极→LED→限流电阻→比较器输出,输出拉低时点亮。
5.2 三个典型场景,直接换比较器更省心
第一个场景是高速信号整形。比如电机编码器输出、转速传感器出来的脉冲不太干净,需要转成规整的方波进单片机计数器。运放当比较器动辄几十微秒的翻转延迟,在这个场景下会让计数严重丢脉冲。这里应该用LM393或者响应更快的轨到轨比较器。
第二个场景是窗口比较器,也就是判断“电压是否在A和B之间”。这本质上需要两个阈值,也就是两路比较器。这时候用LM393这种双比较器比用两个运放更合适,因为它的集电极开路输出还能方便地做线与逻辑,把两路结果直接合并成一个中断信号。
第三个场景是低功耗电池设备。你在文档里会看到一些“纳米功耗比较器”,比如TLV3691、MAX9117这类,静态电流可以低到几百纳安,专门用来在休眠状态下监测电压。通用运放做比较器,静态电流再小也是百微安级别,放在纽扣电池设备里根本耗不起。
5.3 如果坚持用运放做比较器,选型时记住三条
当然也有不少场景是用运放做比较器完全没问题的,尤其是低速阈值判断、LED指示、继电器控制这类对速度不敏感、对功耗要求不高的场合。真遇到必须用运放的情况,选型时盯住三件事:
- 优先选轨到轨输出、轨到轨输入的CMOS运放,比如MCP6002、TLV6002、OPA340,它们能让输出电平和逻辑电平更好兼容;
- 查一下差分输入电压上限,确保信号在开环状态下差出好几伏时不会损坏芯片;
- 只要分压或反馈回路总阻抗高于几十千欧,就优先选低输入偏置电流的CMOS运放,避免偏置电流在电阻网络上制造额外误差。
我在实际项目里的选择标准很简单:需要输出精确“0V/VCC”的电平,或者需要高频翻转,或者要低功耗,直接上真比较器;只是做一个不追求速度的阈值指示,手头有多余的运放那就大胆用。搞清楚这层边界,比背住某些“禁止把运放当比较器”的教条更有用。
最后分享一个个人的小习惯:无论用运放还是真比较器,电源引脚旁一定要放一颗100nF陶瓷电容,去耦电容和芯片的距离尽量控制在5毫米以内。阈值时刻电路最容易受电源噪声影响,这个电容往往比在输入端加一堆滤波都管用。这个基础系列后面我会继续拆解比较器的输入保护、高速设计和常见振荡原因,如果你在实测中也遇到阈值漂移或输出抖动,欢迎把数据和现象一起发来,大家讨论起来比单看书效率高得多。