
最近在搞一个电容式液位检测的小项目传感器本身就是一个平板电容极板间距变化后容量跟着变然后需要把这种 pF 级别的电容变化转换成可读取的电压信号。翻了一圈手头的库存最后还是选了 LM358原因很直接便宜、双运放、单电源能跑搭一个简单的容抗变换电路就能完事。这篇文章就把整个搭建过程从头到尾捋一遍包括电路为什么这样设计、关键参数怎么算、实际接线顺序以及我在调试阶段踩过的几个坑和排查思路。适合刚接触运放和传感器的读者也适合想快速搭一个电容测量前端的老手当作参考。需要先说明一点电容传感器的测量电路和常见的电阻式传感器不一样它没有一个稳定的直流通路必须靠交变信号激励。整套电路的核心思路就是把“电容变化”变成“交流信号幅度变化”再整成直流电压输出。我采用的方案是用 LM358 的一半做多谐振荡器产生一个固定频率的方波激励信号另一半做反相放大器待测电容作为输入阻抗配合一个大阻值反馈电阻让输出幅度随着电容线性变化最后经过峰值检波和电压跟随得到可以直接接 ADC 或万用表的直流电压。1. 项目立项与整体设计思路为什么电容测量要用运放1.1 电容传感器到底在测什么电容传感器和热敏电阻、光敏电阻这类器件不太一样。电阻传感器阻值变化后你给它加个恒定电流或恒定电压就能得到线性的电压信号处理起来很直接。但电容本身是隔直的你拿万用表电阻档去量传感器两端永远是开路。要让电容“说话”必须给它一个交变信号通过容抗这个物理量来感知电容大小。容抗公式是 Zc 1 /2πfC频率固定时容抗和电容量成反比。所以整个测量前端本质上就是一台“交变信号发生器 阻抗-电压变换器”。明白了这个原理你就会知道为什么不能直接拿 LM358 去“放大电容”。运放只能放大电压或电流信号不能直接放大电容。必须先把电容变化转换成电压变化再谈放大。也正因为如此整个电路的设计重心就落在两件事上一是产生稳定频率和幅度的交变激励源二是把待测电容引起的阻抗变化精确地转换成电压信号。后面所有的模块都是围绕这两件事展开的。1.2 为什么选LM358而不选更高级的运放可能有朋友会问测量电容这么精细的活是不是得上 AD8628 这种斩波稳零运放才靠谱实际并非如此。电容传感器的输出信号是交流激励下的幅度信号不是低频缓慢变化的小信号所以 LM358 在直流指标上的不足并没有想象中那么致命。LM358 的输入失调电压典型值为 2mV输入偏置电流典型值为 20nA 到 250nA这个指标放在高阻抗电路里确实会带来零点漂移但可以通过平衡电阻和调零电路消掉大部分影响。LM358 最香的地方是单电源供电、内部有两个独立运放、静态电流小、输出电压范围接近正电源轨。用在这里一颗芯片就能同时完成“振荡器”和“放大器”两个功能这在面包板上调试时特别省事。相比之下NE5532 噪声虽然低、带宽也宽但对单电源和低电压工作并不友好正负电源的供电方式在小项目里就得额外加负压电路成本马上上去了。OP07 精度高但同样需要双电源而且只有一个运放板上还得再塞一个做激励源。不过必须承认 LM358 有两个硬伤增益带宽积只有 1.1MHz 左右压摆率只有 0.6V/μs 左右。如果激励频率取得太高或者放大增益要求很大会明显感到输出波形“软掉”。所以设计时频率和增益要一起考虑而不是单独调某一个参数。这正是很多新手栽跟头的地方后面第 4 节我会详细展开。1.3 整体方案选定容抗变换峰值检波我最终确定的方案是U1A 搭多谐振荡器产生方波激励U1B 搭反相放大器做容抗-电压变换然后用一个二极管和一个电容做峰值检波最后再用一个跟随器缓冲输出。这个方案有几个好处第一全部用 LM358 内部两个运放完成不用额外加比较器芯片第二反相放大器的输出幅度和待测电容近似成正比物理关系清晰校验方便第三峰值检波后的直流电平可以直接接单片机 ADC 或数字万用表不需要额外的高频处理电路。这个拓扑本质上属于“电容-电压变换”的经典路子。相比之下还有两种常见方案一是把待测电容作为多谐振荡器的定时电容让频率随电容变化再用频率计测量。这种方案线性度不错但需要一个稳定的频率测量手段而且频率变化范围比较有限。另一种是用恒流源给电容充电通过测量充电时间反推容量。这种方案适合较大容值的电容对 pF 级别的小电容来说充电时间太短很难测准。综合来看容抗变换法对 pF 级微小电容最友好也最适合 LM358 这个小带宽双运放。2. 电路模块逐一拆解激励、放大、检波与输出2.1 激励信号源LM358构建多谐振荡器先看激励源这一级。LM358 工作在开环状态时输入端的微小差分电压就能把输出推到正轨或负轨所以可以直接当作比较器用。我在同相输入端接了一个由 R1、R2 组成的分压网络把阈值设定在两个固定的电压值之间反相输入端通过 R3 和 C1 接积分电容。电路上电后运放输出跳到高电平C1 通过 R3 缓慢充电当 C1 电压充到同相端高阈值时输出翻转为低电平C1 又开始放电直到放到低阈值以下输出再翻回高电平。如此反复就形成了方波振荡。这个振荡器的工作频率可以近似用 f 1 /2.2 × R3 × C1来估算。需要特别提醒的是LM358 输出高电平不是 VCC而是约 VCC - 1.5V低电平也不是 0V而是约 20mV 到 50mV。计算阈值电压时不能直接拿 VCC 值去套要实测输出高电平值。我实际做的时候5V 供电下输出高电平只有 3.6V 左右这个幅度对后续放大级来说是可以接受的但对阈值计算影响挺大如果你按照 5V 去算频率算出来会偏不少。还有一点激励信号的幅度稳定性直接影响最终测量精度。如果激励幅度随供电电压波动那么后面放大器的输出也会跟着波动。所以条件允许的话最好在供电端加一个 LDO 稳压器或者至少用好一点的锂电池供电不要直接用开关电源开关电源的高频纹波很容易串进这个高阻抗测量回路。2.2 反相放大级把电容变成电压的关键反相放大级是整个系统的心脏待测电容 Cx 接在反相输入端和信号源之间反馈电阻 Rf 从输出端接回反相输入端。因为运放工作时同相输入端接地它会把反相输入端强制“虚地”也就是电位近似等于同相端所以流过 Cx 的电流就是 Vin / Zc这个电流全部流过 Rf在 Rf 上产生的压降就是输出电压。用公式表达就是 Vout -Vin × Rf / Zc -Vin × Rf × 2πfCx。可以看到当频率 f 和反馈电阻 Rf 固定时输出电压和电容 Cx 成正比这正是我们需要的线性关系。这里有一个设计上的直觉误区很多人以为放大倍数只取决于 Rf 和输入电阻的比值但在交流激励下输入电阻变成了容抗也就是说频率和电容值共同决定输入侧的等效阻抗。频率越高容抗越小同样的 Cx 能产生更大的电流输出幅度更大灵敏度更高。但频率也不能无限提高因为 LM358 的增益带宽积只有 1.1MHz。如果我们需要的闭环增益是 A那么最高可用激励频率大概是 1.1MHz / A。假如设计增益是 10 倍激励频率就不能超过 110kHz如果增益到 100 倍激励频率就不能超过 11kHz。否则运放的实际增益会急剧下降电路完全不按算好的倍数工作。Rf 的取值也很讲究。反馈电阻越大同样的电容电流能产生更大的输出电压灵敏度越高。但 LM358 的输入偏置电流会流经 Rf在 Rf 上产生一个额外的压降造成输出零点偏移。偏置电流 100nA 时10MΩ 的反馈电阻上就能产生 1V 的直流偏移这个值非常可观会把输出电压顶出轨。所以不能为了灵敏度无限加大 Rf通常建议控制在 1MΩ 到 10MΩ 之间超过这个范围就要考虑换更低偏置电流的运放了。2.3 峰值检波和电压跟随让信号变得可读可用反相放大级出来的信号还是交流方波幅度在伏特级但频率可能有几 kHz 到几十 kHz直接用万用表读的话读出来的是有效值而且不同万用表带宽差异很大读数很不稳定。最简单的办法是加一级峰值检波一个串联二极管加一个并联电容。交流信号的正半周通过二极管给电容充电达到信号峰值负半周二极管截止电容通过后级负载缓慢放电。这样电容上的电压就停留在信号峰值的附近。检波级的第一个坑是二极管压降。1N4148 的正向导通压降约 0.6V对于小信号来说这个压降直接抵消掉一部分幅度而且它不是线性关系会造成明显的非线性误差。我用的方法是把振荡器输出幅度设计得尽量大让检波前的信号峰值在 2V 以上这样二极管压降的影响占比就小多了。如果想要更好的线性度可以用两个二极管做全波整流或者换成锗二极管、肖特基二极管正向压降更低。检波后电容上的电压不能直接给 ADC 用因为检波电容的输出阻抗很高外接负载稍微重一点电荷就会被拉走电压下跌严重。这里就轮到电压跟随器出场了。LM358 的另一半接成电压跟随器输出端直接接回反相输入端同相输入端接检波电容。因为运放输入阻抗极高几乎不从检波电容吸取电流所以电容上保持的峰值电压能长时间稳定而输出端阻抗极低可以轻松驱动万用表或单片机 ADC。2.4 可选的扩展模块加法器、差分放大和恒流源如果你需要的不是绝对电压值而是相对于某个基准的偏移量可以在跟随器后面再接一个加法器。比如检波输出范围是 1.0V 到 2.5V而你希望输出范围变成 0V 到 1.5V可以用加法器叠加一个 -1.0V 的偏置电压。LM358 单电源条件下生成负压比较麻烦也可以改用差分放大器的思路用两个同型号传感器一个做测量臂、一个做参考臂把两者差值放大。这样不仅抵消了电源波动和偏置漂移还能让信号以差分形式输出抗干扰能力提高不少。另一个经典的电容测量方案是恒流源法。用 LM358 配合 MOS 管或者三极管可以构成 Howland 恒流源给待测电容恒流充电然后测量电容电压上升到某个阈值的时间。这个方法在测量 uF 级别的大电容时很准因为充电时间放大了容易测。但对于 pF 级别的小电容充电时间在微秒级用单片机计时会非常吃力所以我最后放弃了这个方案。如果你只是测量相对变化较大、容值不低于 nF 级的电容传感器恒流源法确实比容抗变换法更省事不需要高频激励源和检波电路。这里顺便回答一个很多人问过的问题两级运放能不能先同相放大、再反相放大当然可以但要注意直流耦合时的失调电压会被两级放大叠加。假如第一级失调是 5mV放大 20 倍后变成 100mV第二级再放大 5 倍就变成 500mV这个直流成分直接压掉了一大半动态范围。所以需要放大倍数较大时最好级间加隔直电容用交流耦合串联放大把直流失调挡在第一级之后。3. 手把手实操元器件、参数计算与接线调试3.1 元件清单和选型要点这个项目用到的元件数量不多我列一个完整的清单方便直接照着下单。序号元件型号/规格数量备注1运放LM358DIP-8封装1片也可以用 LM358N别买成单运放的 LM358 贴片单封装2电阻10kΩ、100kΩ、1MΩ、2MΩ若干反馈电阻建议用精密电阻至少 1% 精度3电位器10kΩ 多圈电位器1个用于调零和调整阈值4电容100nF 聚丙烯膜电容1个激励振荡器的定时电容优先选 C0G/NP0 材质5电容10uF/16V 电解电容2个电源滤波用6二极管1N41481个峰值检波用7电容22nF 瓷片电容1个峰值检波存储电容8电容100nF 陶瓷电容2个电源去耦9待测电容10pF-100pF 可调电容1个用来模拟电容传感器也可以用自制的平板电容10电源5V 直流稳压源1个建议使用 LDO比如 AMS1117-5.011面包板、杜邦线—若干面包板接线方便调试选型上特别要注意反馈电阻 Rf。因为 pF 级别的电容容抗非常大想要输出足够的电压反馈电阻必须做到 1MΩ 级别或以上。普通 1/4W 碳膜电阻在高压下噪声稍大但用于这个精度要求不高的项目问题不大。有条件的话用金属膜电阻温漂和噪声都更小。定时电容 C1 和检波电容也尽量选 C0G 或 NPO 介质千万不能用普通的 Y5V 瓷片电容那种电容本身就是“电容值随温度和电压剧烈变化”用来做定时基准温度一漂整个激励频率就跟着漂。3.2 关键参数计算增益、频率和偏置怎么定我采用的参数是电源 5V激励频率约 5kHz反馈电阻 Rf 为 2MΩ激励方波的正半周幅度设计在 1V 左右。这样做的原因是在 5kHz 激励频率下10pF 电容的容抗约为 3.18MΩ流过 1V 激励信号的电流约为 0.31μA这个电流流过 2MΩ 反馈电阻输出电压约为 0.62V。如果把待测电容范围定为 10pF 到 60pF那么输出电压大约从 0.62V 变化到 3.77V刚好落在 5V 单电源的输出安全范围内。容抗公式用起来很简单但实际计算时建议直接用这个简化式输出电压峰值 ≈ 激励电压 × 2π × 频率 × 待测电容 × 反馈电阻。代入数值Vout ≈ 1 × 2 × 3.14 × 5000 × 60e-12 × 2e6 ≈ 3.77V。这个公式的关键在于激励电压和频率必须取实际振荡器输出的测量值而不是 5V 的理论值。我实测 LM358 在 5V 供电下输出方波高电平只有 3.6V问题在于放大器级输入端的交流耦合电容会隔掉直流分量那么实际参与放大的信号幅度是方波从 -1.8V 到 1.8V 的摆动也就是 1.8V而不是我预设的 1V。这一点做计算时最容易疏漏一定要用示波器实际看波形再定参数。增益带宽积的校核方法是这样的LM358 的 GBW 典型值为 1.1MHz在 5kHz 激励频率下理论上最大可用闭环增益为 1.1MHz / 5kHz 220 倍。我设计的最大增益发生在 60pF 时增益 输出 / 输入 ≈ 3.77 / 1.8 ≈ 2.1 倍远低于 220 倍所以带宽完全够用。如果你把频率提高到 100kHz最大可用增益降到 11 倍此时设计增益超过 11 倍的部分就会被运放带宽限制吃掉输出幅度达不到理论值。这也是为什么建议激励频率不要一味往高调的原因。3.3 面包板搭建顺序与三步调试法搭建顺序我强烈建议分模块来不要一股脑把所有线都接完再上电。第一步先只搭 U1A 的多谐振荡器接好电源后先用示波器测输出端确认方波频率和幅度符合预期。第二步再把 U1B 的反相放大器和待测电容接上用示波器观测放大输出用手按住和松开待测电容观察波形幅度有没有明显变化。第三部接上检波和跟随级用万用表测最终输出电压。这样分段调试的好处是出问题时可以立刻锁定到底是哪一级引入的故障。接线细节上有几个容易踩的坑LM358 的 DIP-8 封装4 脚接 GND8 脚接 VCC这个千万不能接反接反芯片会迅速发热烧毁。反相放大器的同相输入端不是直接接地而是通过一个 10kΩ 到 100kΩ 的电阻接地这个电阻用来匹配输入偏置电流也是调零的关键点。待测电容传感器如果引线较长要用屏蔽线屏蔽层单端接地否则手靠近传感器时读数会疯狂跳变。连接好以后按以下步骤检查静态工作点上电后第一件事是测 LM358 的 8 脚和 4 脚之间电压确认是 5V 左右。然后测 U1A 同相输入端和反相输入端电压两者应该非常接近因为闭环状态下运放在做“虚短”。如果两个输入端电压差超过 50mV说明运放没有正常工作或者外部元件接错。最后测跟随器输出端电压这个电压应该和检波电容电压几乎一致如果明显偏低说明负载太重或跟随器接线错误。3.4 仿真先行Proteus与CircuitJS验证技巧实物搭建之前强烈建议先用仿真工具把电路验证一遍。我最常用的两个工具是 Proteus 和 CircuitJS。Proteus 里有现成的 LM358 模型可以比较真实地模拟输出饱和、失调等参数适合完整带 STM32 模拟量的仿真工程。CircuitJS 则轻量得多直接用浏览器就能跑适合快速验证电路拓扑是否正确。在 CircuitJS 里设置运放时有个常见困惑默认的运放模型增益不是无穷大这会导致算好的增益和仿真结果对不上。我在使用时的做法是点击运放元件查看属性设置把开环增益 Aol 调到一个很大的值比如 1e6再把输入失调电压尽量调小就可以近似成理想运放。需要注意的是CircuitJS 里的运放模型默认支持双电源你要检查电源配置正负两端如果不把负电源接上单电源应用里相当于负电压轨为 0运放输出范围会自动限制在 0V 以上和实物 LM358 的行为比较接近。Proteus 仿真时反而要注意别把模型想得太完美。Proteus 的 LM358 模型会把输出饱和压降模拟出来也会把偏置电流模拟出来所以仿真结果和实物测试的差异会比 CircuitJS 更小。我通常在 Proteus 里直接用信号发生器作为激励源来代替多谐振荡器先把放大和检波各级调通确认输出电压范围和线性度满足需求后再把多谐振荡器接回来做完整联调。这样可以把“振荡器自身是否工作”和“放大检波是否工作”之间的问题隔离调试效率高很多。4. 常见问题排查与工程经验整理4.1 偏置电流导致的零点漂移我实际测试时遇到最明显的一个问题就是传感器电容取下后也就是输入悬空输出电压竟然不是 0V而是有接近 1.2V 的直流电压。一开始我还以为是芯片质量问题后来查了 LM358 的数据手册才反应过来这是输入偏置电流流过反馈电阻导致的典型现象。LM358 的输入偏置电流典型值在 20nA 到 250nA 之间这个电流从输入端流入经过 2MΩ 反馈电阻时会产生 0.04V 到 0.5V 的直流压降。我测试时用的是多圈电位器微调同相端接地电阻把反相端和同相端的外接电阻匹配到相近的阻值让两路偏置电流产生的电压近似相等互相抵消零点漂移明显降下来了。如果你发现调零电阻也摆不平漂移另一个思路是减小反馈电阻。反馈电阻降到 1MΩ 后偏置电流造成的偏移会减半但灵敏度也减半。这时候可以适当提高激励频率来补回灵敏度。不过在提高频率前一定要重新校核增益带宽积否则会掉进下一个坑。4.2 增益带宽积和压摆率把波形“压扁”有一次我把激励频率提到 50kHz想获得更高的灵敏度结果示波器看到反相放大级的输出方波变得非常圆润幅度也比理论值低了一大截。这就是增益带宽积不够和压摆率限制同时作用的表现。在 50kHz 时如果设计增益为 20 倍LM358 的最大可能增益已经降到 1.1MHz / 50kHz 22 倍看起来够用但 LM358 在接近增益极限时确实会有明显增益下降。最关键的是压摆率只有 0.6V/μs方波信号从低到高需要跨越 2V理论上就要 2 / 0.6 ≈ 3.3μs而 50kHz 的半个周期只有 10μs上升沿占掉了三分之一的时间波形必然失真。解决思路有三个一是降低频率回落到 10kHz 以内让运放工作在舒适区二是降低单级增益把放大分散到两级每级增益不超过 10 倍三是换用压摆率更高的运放比如 NE5532 的压摆率有 9V/μs带宽也大得多。如果必须坚持用 LM358最推荐第一个方案因为整个项目的测量带宽其实很低峰值检波输出是直流电平完全没必要把激励频率推到几 kHz 以上。4.3 检波纹波大、读数跳变怎么处理检波级最常见的症状是万用表读数在小数点后两位来回跳示波器观察检波电容两端有比较大的纹波。原因是检波电容选得太小。峰值检波的工作方式是信号正半周通过二极管给电容充电在信号负半周电容需要维持电压给后级供能如果电容容量太小在负半周期间电压就会跌落很多形成锯齿状纹波。增加检波电容容量能有效减小纹波但电容太大又会让充电时间常数变大输出电压对电容变化的响应变慢。我的经验是先用超高频示波器检查一下纹波频率和激励频率是否一致。如果纹波频率等于激励频率说明电容容量不足如果纹波频率是激励频率的整数倍可能还存在整流不充分的问题。对于 5kHz 激励22nF 的检波电容加上 100kΩ 后级负载时间常数是 2.2ms约等于 11 个激励周期纹波应该控制在几毫伏以内。如果还是跳得厉害检查一下检波二极管的极性是否接反二极管接反时输出电压不是正峰值而是负电压接反后读数大概率为零或负值很容易发现。4.4 单电源运放的输出“不到零”问题LM358 在单电源下不能输出真正 0V这是一个结构性问题。它的输出级是 NPN 达林顿管结构低电平饱和压降一般在 20mV 到 50mV 之间所以输出最低也就到几十毫伏不可能到 0V。如果你的系统要求输入 0V 时输出也必须是 0V单靠 LM358 做不到。解决办法有几种一是在 ADC 采样后做软件零点扣除这是最省事的二是在检波输出和跟随器之间加一个偏置电阻网络把零点抬高或压低三是在跟随器输出端用加法器叠加一个负偏置把几十毫伏的残压抵消掉。我实际项目里采用软件校准的方式上电后先让传感器处于零位状态采集一次零点电压存起来后续每次采样都把这个值减掉。这个方法不但解决了 LM358 的残压问题还顺便校掉了偏置电流引起的零点漂移一举两得。4.5 常见问题速查表故障现象可能原因处理办法无输出电源接反或芯片损坏检查 8 脚电压更换芯片无输出振荡器未起振检查 C1、R3 是否接好用示波器测试 U1A 输出端输出电压始终为 VCC 附近待测电容短路或 Rf 接错断开待测电容测量 Rf 阻值读数跳变严重检波电容容量太小增大检波电容至 100nF读数受手靠近影响传感器引线过长且无屏蔽换用屏蔽线屏蔽层单端接地高频率下幅度下降明显增益带宽积不够或压摆率受限降低激励频率或减小单级增益零点偏移大输入偏置电流流过 Rf匹配同相端接地电阻、减小 Rf输出最低只能到几十毫伏LM358 单电源输出饱和压降软件扣零点或增加负偏置我个人在实际调试中体会最深的其实是“先让电路动起来再谈精度”。电容传感器测量电路这种高阻抗前端干扰源非常多如果一开始就追求完美线性度和超高灵敏度你会发现所有问题混在一起根本无从下手。先把激励频率控制在 5kHz 以内用可调电容模拟传感器让电路输出一个稳定的直流电压然后再逐步调整参数去满足量程和精度要求。整个过程最忌讳的就是用万用表去量 pF 级电容的变化万用表测不出来是正常的它能反映的是整个电路的最终输出电压而中间各级的波形必须靠示波器才能看清。