低成本高精度隔离变送电路设计:从PWM到模拟信号的工程实践
1. 项目背景与核心需求最近在做一个工业仪表的项目里面有个功能模块需要把单片机输出的模拟信号经过电气隔离后高精度地变送到另一个系统里去。这个需求在工控、医疗、测试测量领域太常见了说白了就是“信号在这边但设备在那边两边还不能直接通电”得找个靠谱的“信使”把数据无损地送过去。以前干这种活儿图省事就直接用现成的隔离放大器模块比如ADI的ADuM系列或者TI的ISO系列。东西是真好用精度高、性能稳但那个价格也是真“感人”一片动辄几十上百块对于成本敏感的项目来说压力不小。后来市面上也出过一些集成的隔离变送芯片或者模块价格是下来了一些但要么供货周期长要么型号突然停产用在产品里总觉得心里不踏实。被供应链卡过几次脖子之后我就琢磨着能不能自己设计一个既便宜又可靠性能还不错的隔离变送电路核心目标就三个高线性度误差小、低成本、易采购。琢磨来琢磨去思路回到了手头最丰富的资源上——单片机。现在主流的MCU像STM32、GD32这些片上的定时器都能轻松输出16位分辨率的PWM信号。既然数字量可以直接由MCU精确控制何必再绕个弯子先经过DAC转换成模拟量再去隔离呢直接隔离PWM这个数字信号在接收侧把它还原成模拟电压不就行了这个想法成了整个设计的起点也引出了一系列有趣的问题和迭代。2. 设计思路演进与方案选型2.1 初代方案PWM隔离 MOS开关 RC滤波最直接的想法就是“数字隔离模拟重建”。具体电路框图是这样的MCU的PWM信号 - 高速光耦隔离 - MOS管开关 - 低通滤波 - 电压缓冲 - 输出。电路原理详解单片机产生一个占空比可调的PWM波比如0-3.3V的方波。这个信号通过一个高速光耦如6N137进行电气隔离。光耦输出侧由一个N沟道MOS管如2N7002作为开关。这里有个细节光耦输出一般是集电极开路上拉到一个电压。为了让MOS管可靠导通和关断并且不超出其栅源极最大电压通常±20V需要用两个电阻对驱动电压进行分压。比如我用隔离DC-DC模块产生了一个24V的隔离电源用两个电阻分压得到大概5V左右的电平去驱动MOS管的栅极。MOS管的漏极接一个高精度的电压基准VREF比如2.5V的REF5025源极接地。这样当PWM为高时光耦导通MOS管栅极为低电平MOS管关闭输出点漏极被上拉电阻拉到VREF当PWM为低时光耦截止MOS管栅极为高电平MOS管导通输出点被拉到接近0V。于是在MOS管的漏极我们就得到了一个幅度在0V到VREF之间切换的PWM方波。接下来是关键的一步低通滤波。一个简单的RC滤波器或者为了更好的纹波抑制用二阶有源滤波接在MOS管漏极后面。滤波器的截止频率要远低于PWM的频率。根据信号平均原理滤波器输出的直流电压就等于PWM方波的平均值即Vout Duty_Cycle * VREF。最后由于RC滤波器的输出阻抗较高带载能力差还需要一个电压跟随器比如用一颗普通的运放LM358进行缓冲得到低阻抗的最终输出。实测与问题暴露搭好电路一测线性度大概只有1%。也就是说我让单片机输出从0%到100%的占空比最终输出的电压并不是一条完美的直线而是有偏差。用示波器和万用表仔细分析各个节点的波形发现了三个主要“凶手”运放的下轨问题我用的LM358是单电源供电只有隔离的24V和地。虽然它是“轨到轨”输出但实际测试发现当输出接近0V时并不能真正达到0V可能有几个毫伏到十几毫伏的残余电压。这在输出低电平时引入了固定的偏移误差。光耦的延时与非线性即使是高速光耦其导通和关断时间也存在微小的不对称性并且这个时间会随着温度、器件批次有变化。这导致隔离后的PWM信号占空比与原始信号相比产生了误差。MOS管的导通电阻Rds_on当MOS管导通时它的源极和漏极之间并不是理想的短路存在一个很小的电阻Rds_on。这意味着当它试图把输出点拉到0V时实际上会有一个I_load * Rds_on的压降导致低电平并非真正的0V。这个压降随着负载电流变化是非线性的误差源。2.2 灵光一现用运放状态切换实现理想开关为了解决MOS管残压的问题我想到一个巧妙的办法能不能不用MOS管当开关而是让运放自己来切换状态直接输出0V或VREF设计的电路如图2思路示意图。光耦输出直接连接到运放还是LM358的同相输入端A点。反相输入端接VREF。当光耦截止时A点被上拉电阻拉到高电平比如24V远高于VREF此时运放作为比较器输出饱和到低电平接近0V。当光耦导通时A点被拉低到地0V低于VREF此时运放作为电压跟随器因为输出通过反馈连接到反相输入端输出应为VREF。理论上这个电路非常优雅运放输出要么是0V比较器状态要么是VREF跟随器状态完全避开了MOS管的导通压降问题。电路也简化了少了好几个元件。现实打击与原理深挖然而实测结果令人沮丧线性度反而更差了只有3%。用示波器看A点的波形我懵了理论上它应该在V和0V之间切换但实际波形在每次光耦导通的瞬间会出现一个向下的、接近0V的“豁口”。这个“豁口”持续时间固定严重侵蚀了高电平的时间相当于引入了一个固定的占空比损失。苦思冥想后问题根源锁定在运放的一个关键参数压摆率Slew Rate, SR。压摆率描述了运放输出电压变化的最大速率单位是V/μs。LM358的压摆率典型值只有0.5V/μs左右。过程是这样的假设之前光耦截止运放输出为0V。当PWM边沿到来光耦突然导通A点被瞬间拉低到0V。但是运放的输出端由于压摆率限制无法从0V瞬间跳变到VREF。在跳变开始的极短时间内运放输出仍然维持在0V附近。由于运放接成了跟随器负反馈它的反相输入端接VREF和输出端是连在一起的。当输出端还是0V时反相输入端也被“拖”在0V附近这就意味着运放的两个输入端同相0V反相0V电压几乎相等运放处于线性放大区。然而由于反相输入端实际是通过一个电阻连到VREF2.5V的0V的电压形成了一个巨大的误差。运放“想要”立刻纠正这个误差把输出拉到VREF但受限于低下的压摆率这个纠正过程需要时间。在这段“爬升时间”里A点同相端的电压被输出端“绑架”也一直停留在低电平直到运放输出慢慢上升到接近VREF电路才进入稳定的跟随状态。这段固定的“爬升时间”就是波形上那个该死的“豁口”。注意这个案例是理解运放动态特性的绝佳教材。在涉及快速开关或状态切换的电路中不能只看直流增益和带宽压摆率往往成为性能瓶颈。寻找高SR、单电源、低成本的运放在当时并不容易因此这个看似巧妙的方案被无奈放弃。2.3 回归与优化MOS对管与数字芯片的妙用重新回到第一个方案的思路上目标明确改善线性度。针对之前三个问题光耦速度 - 换用更快的型号如6N137。MOS管残压 - 不用单管切换对地改用一对MOS管P-MOS和N-MOS组成互补开关分别将输出连接到VREF和GND。这样无论输出高电平还是低电平都是通过一个导通的MOS管直接连接到电源轨理论上可以得到非常接近VREF和0V的电压。运放下轨 - 把运放从开关位置挪到最后只做滤波后的缓冲器。这样运放始终工作在线性区处理的是直流或低频信号压摆率和输出下轨的问题就被绕开了。按照这个思路画出了图4。实验效果确实提升明显。但遇到了一个新问题小功率的P-MOS管在常用型号里选择少价格也不如N-MOS友好增加了采购和BOM成本。盯着这个MOS对管电路看了半天越看越觉得眼熟……这不就是一个CMOS反相器非门的典型输出级结构吗一个P-MOS负责上拉至VDD一个N-MOS负责下拉至GND。恍然大悟我们何必自己去搭分立元件呢直接用现成的CMOS逻辑门电路不就好了吗数字芯片的模拟妙用CMOS逻辑门比如74HC04六反相器当它的电源电压Vcc接在VREF上时它的输入输出特性就变成了一个以VREF为幅度的理想开关。输入高电平来自光耦时输出低电平接近0V输入低电平时输出高电平接近VREF。而且HC系列CMOS电路的导通电阻很低带载能力比小信号MOS管强得多。这里有几个关键选型点必须用HC系列不能用LS系列LS是TTL工艺输出电平不是满幅的高电平达不到Vcc低电平也不是0V会引入误差。HC是CMOS工艺输出可以非常接近电源轨。检查工作电压74HC04的数据手册标明其工作电压范围是2V到6V。我们的VREF是2.5V正好落在范围内完美。并联降低阻抗一颗反相器的输出阻抗虽然已经很低但为了追求极致可以将芯片内的多个门电路并联使用输入端接在一起输出端接在一起这样总输出阻抗会成倍降低。我用了六反相器中的六个门全部并联。最终电路定型为MCU PWM - 6N137高速光耦 - 74HC04 (六门并联Vcc接VREF) - 二阶有源低通滤波器 - LM358电压缓冲器。3. 核心电路实现与参数设计3.1 电路架构与信号链分析最终的完整电路原理图可以分解为以下几个核心部分PWM生成与设置在单片机端使用一个16位定时器产生PWM。分辨率设置为2^1665536级。PWM频率的选择是个权衡频率太高光耦和逻辑门的延时占整个周期的比例增大可能引入误差频率太低则后级滤波器设计困难纹波大动态响应慢。对于工业变送通常是慢变信号我选择10kHz左右的频率。这样一个周期100μs即使有200ns的延时占空比误差也只有0.2%在可接受范围。隔离与电平转换6N137光耦是关键。它的典型传播延迟在75ns左右而且上升沿和下降沿的延迟时间比较对称这对保持占空比精度至关重要。光耦输入侧需要限流电阻根据其LED正向压降和驱动电流计算。输出侧是集电极开路需要上拉电阻到驱动电压。这里我犯过一个错误最初想当然地用24V分压得到5V去驱动74HC04。但74HC04的输入高电平阈值约是0.7*Vcc1.75VVcc2.5V时用5V驱动虽然也能工作但超过了其电源电压Vcc2.5V多余的电流会通过输入保护二极管泄放到VREF基准源里导致基准电压轻微上升引入系统误差。后来将分压电阻比例调整使驱动电压在2.5V左右问题解决。模拟开关与幅值基准74HC04在这里扮演了“理想模拟开关”的角色。其电源引脚接在精密电压基准源VREF上例如使用TI的REF50252.5V初始精度0.05%温漂3ppm/°C。这样逻辑高电平的输出值就直接等于VREF的精度。并联六个门极大地降低了输出阻抗实测在2.5V下单门导通电阻约100欧姆并联后小于20欧姆对于后级滤波器的高输入阻抗来说影响微乎其微。滤波与重建这是一个二阶有源低通滤波器Sallen-Key拓扑运放仍使用LM358。截止频率f_c设计为PWM频率的1/10到1/20即500Hz到1kHz。计算公式为f_c 1 / (2π * √(R1*R2*C1*C2))。选择适当的R、C值并让R1R2R C1C2C可以简化计算。滤波器将PWM方波中的高频分量滤除只留下直流平均值。其输出V_filter Duty_Cycle * VREF。缓冲输出滤波器输出端接一个LM358构成的电压跟随器。它的作用有两个一是提供极低的输出阻抗增强带载能力二是隔离后级负载对滤波器网络的影响保证滤波器的频率特性不被改变。虽然LM358有输入偏置电流和失调电压但对于2.5V满量程、千分之二精度的系统其误差在可接受范围内。若追求极限性能可换用OP07等精密运放但需注意OP07需要双电源供电。3.2 关键器件选型与计算电压基准VREF精度和温漂直接决定系统绝对精度。选用REF5025IDGKR2.5V。其初始误差最大±0.05%±1.25mV温漂3ppm/°C。假设工作温度变化40°C温漂引入误差为2.5V * 3ppm/°C * 40°C 0.3mV。总误差约1.55mV相对于2.5V满量程误差约为0.062%。低通滤波器设计目标截止频率f_c 800Hz。选择电容C1C20.01μF常用容值精度可选5%或1%。计算电阻R 1 / (2π * f_c * C) 1 / (2 * 3.1416 * 800 * 1e-8) ≈ 19.9kΩ。选取标称值20kΩ的1%精度金属膜电阻。此时在10kHz的PWM频率下衰减为(800/10000)^2 0.0064即-44dB纹波抑制效果很好。延时误差分析光耦6N137传播延迟t_pd1 ≈ 75ns (典型值查阅数据手册)。74HC04在2.5V Vcc下的传播延迟t_pd2 ≈ 100ns (典型值查阅数据手册)。总延迟 t_total ≈ t_pd1 t_pd2 175ns。在10kHz PWM周期T100,000ns下延迟引入的占空比误差为Δt / T 175ns / 100,000ns 0.175%。关键点由于光耦和逻辑门的上升、下降延迟基本对称这个延迟对占空比的影响是固定偏移而不是非线性误差。它可以通过软件校准轻松消除在单片机输出占空比时预先补偿这个固定的时间偏移。校准后此项误差可降为0。3.3 PCB布局与布线要点这种混合信号数字PWM、高速光耦、精密模拟电路的PCB布局至关重要处理不好会前功尽弃。地平面分割与单点连接这是最重要的原则。将PCB地平面划分为“数字地”和“模拟地”。数字地包含单片机、光耦输入侧模拟地包含VREF基准、滤波电路、输出缓冲。两个地之间用一根0欧姆电阻或磁珠在一点连接通常选择在隔离DC-DC模块的输出电容接地处。这样可以防止数字噪声通过地线污染敏感的模拟部分。电源去耦每个IC的电源引脚附近都必须放置去耦电容。74HC04的Vcc接VREF对地加一个0.1μF的陶瓷电容和一个1-10μF的钽电容。LM358的电源引脚同样处理。VREF基准芯片的输出端除了数据手册推荐容值的电容外最好再并联一个0.1μF陶瓷电容以滤除高频噪声。信号路径最短化从74HC04输出到滤波器输入的走线要尽可能短而粗减少寄生电感和电阻。滤波器的电阻电容应紧靠运放放置。模拟部分的走线应远离任何数字信号线尤其是PWM和光耦驱动线。隔离屏障清晰光耦下方本体下方的PCB区域应进行“开槽”处理即挖空底层和所有内层的铜箔形成一个物理隔离带以增加隔离耐压和减少寄生电容耦合。光耦输入和输出的走线分居隔离带两侧绝对不能交叉或平行靠近。4. 调试过程、问题排查与性能优化4.1 调试步骤实录分级调试电源先行首先不接MCU确保所有电源正常。测量隔离DC-DC输出是否为稳定的24V。测量VREF基准输出是否为精确的2.5V。测量给74HC04供电的VREF网络电压是否纯净用示波器交流耦合档看纹波。数字通路验证断开后级模拟部分可以移除滤波运放。MCU输出一个50%占空比的PWM。用示波器依次测量MCU引脚确认PWM波形正常频率、幅值正确。光耦输入侧确认LED电流合适波形无畸变。光耦输出侧集电极确认有反相的PWM波形幅值约为2.5V驱动电压已调整正确观察上升/下降沿是否陡峭测量高、低电平值。74HC04输出端同样确认有PWM波形幅值严格等于VREF如2.500V和0V。这是关键测试点高电平必须精准等于基准电压。模拟部分调试接上滤波和缓冲电路。先不接负载。用示波器观察滤波器输入点即74HC04输出的PWM波形。观察滤波器输出点运放同相端的波形应该是一个带有微小纹波的直流电压。纹波大小与滤波器截止频率和PWM频率有关。观察最终输出点缓冲器输出的波形应该是一个极其平滑的直流电压纹波进一步减小。改变MCU的PWM占空比从0%到100%用高精度数字万用表测量最终输出电压。记录输入占空比或码值与输出电压的对应关系。4.2 典型问题与解决方案速查表问题现象可能原因排查步骤与解决方案输出电压为0或极低且不随PWM变化1. 光耦未工作2. 74HC04电源VREF未接通3. 后级运放电路故障1. 检查光耦输入侧限流电阻和LED正向压降测量输入电流。2. 测量74HC04的Vcc引脚14脚对地电压是否为VREF。3. 断开后级单独测量74HC04输出是否有PWM波形。输出电压始终接近VREF满量程1. 光耦输入信号反相可能MCU配置错误2. 74HC04输入端接错应接光耦输出1. 检查MCU PWM输出极性设置。2. 用示波器对比MCU输出和光耦输出波形应为反相关系。输出电压线性度差非线性误差大1. 驱动电压过高导致基准负载已解决2. 滤波器设计不当纹波过大影响测量3. 运放缓冲器存在失调电压1. 确认驱动74HC04的电平略高于其Vcc即可如2.7V。2. 用示波器观察滤波器输出纹波增大滤波电容或降低PWM频率。3. 测量运放输入输出端的直流电压差即失调电压若过大则更换运放。输出噪声大纹波明显1. 电源去耦不足2. 地线布局不合理数字噪声串扰3. 滤波器截止频率过高1. 检查所有IC的电源引脚旁路电容是否焊接良好容值是否正确。2. 检查地平面分割确保数字和模拟地单点连接。3. 用示波器测量VREF上的噪声确认基准源是否干净。4. 重新计算并降低滤波器截止频率。系统精度随温度漂移1. VREF基准温漂2. 电阻、电容温漂3. 光耦、逻辑门延时温漂1. 选用低温漂基准如3ppm/°C。2. 滤波和分压电阻使用低温漂金属膜电阻50ppm/°C或更好。3. 延时温漂引入的是固定占空比偏移可通过在单片机端进行温度补偿校准来消除。4.3 性能极限与优化方向经过电阻分压修正和仔细布局后实测系统的线性度达到了0.2%千分之二。进一步分析误差来源主要误差源LM358电压跟随器的输入失调电压典型值±2mV和温漂。这直接叠加在输出上成为系统的主要非线性误差相对于2.5V满量程2mV即0.08%。在滤波器输出端运放同相输入端直接测量线性度可达0.05%万分之五印证了误差主要来自缓冲级。优化方案更换缓冲运放使用OP07等精密、低失调、低温漂的双电源运放可将此项误差降低一个数量级。代价是需要增加负电源电路稍复杂。软件校准虽然LM358的失调是固定的但可以通过两点校准零点、满点在单片机软件中修正完全消除固定失调误差。温漂则需要温度传感器和查表法进行补偿。选用更精准的基准REF5025的0.05%初始精度和3ppm温漂已足够好。对于更高要求可选用基准电压源如LTZ1000顶级或采用更高位的Σ-Δ ADC直接测量输出电压进行闭环修正复杂度高。动态响应权衡系统的带宽由低通滤波器决定本例约800Hz。这意味着输出信号对输入PWM占空比变化的响应会有延迟。对于慢变过程如温度、压力足够用。若需要更快响应可以提高PWM频率并相应调整滤波器截止频率但需重新评估延时带来的占空比误差是否可接受。5. 设计总结与心得感悟这个自制的隔离变送电路最终成本可以控制在十几元人民币含隔离电源线性度达到0.2%足以满足大多数工业场合的通用需求。更重要的是它由完全通用、易于采购的器件构成避免了专用芯片的供应风险。回顾整个设计过程踩过的坑和获得的经验比最终那个千分之二的指标更有价值第一敬畏运放的动态特性。第二次尝试的失败是吃了“只考虑直流忽略动态”的亏。压摆率SR、建立时间Settling Time、过载恢复时间这些参数在开关、脉冲或大信号跳变的应用中往往比带宽和增益更重要。阅读数据手册时不能只看第一页的“广告参数”。第二“单电源”和“轨到轨”要打折扣看。很多宣称“轨到轨”输出的运放在接近电源轨特别是负电源轨即0V时性能会急剧下降输出电流能力变弱线性度变差。LM358在接近0V时实际输出可能离地还有几十毫伏。设计时一定要留有余量或者像本设计一样让运放避开这个尴尬的工作区间。第三数字芯片是隐藏的模拟利器。74HC04在这个电路里扮演了一个近乎理想的单刀双掷模拟开关角色其导通电阻、开关速度、通道一致性往往比许多专门的模拟开关芯片还要好价格却便宜得多。这种“跨界”思维常常能带来成本和性能的双重惊喜。类似的DAC可以用PWM滤波实现电压比较可以用逻辑门施密特触发器实现。第四混合信号布局是成败关键。再精妙的电路设计如果PCB画得一塌糊涂性能也会惨不忍睹。地平面分割、电源去耦、敏感走线这些老生常谈的规则必须不折不扣地执行。调试时一半以上的问题最终都能在PCB上找到原因。最后仪器是设计的眼睛。在这个项目中如果没有一台带宽足够的示波器去捕捉那个微小的“豁口”没有一台高精度的万用表去测量微伏级的变化所有的分析和优化都将无从谈起。理论计算指引方向但最终的性能边界和问题根源必须靠实测数据来揭示和验证。这个电路方案我已经成功用在好几个需要低成本、高可靠性隔离模拟信号传输的项目中至今运行稳定。它也许不是性能最高的但一定是性价比和可制造性非常均衡的一个选择。希望这个详细的拆解和心路历程能给遇到类似问题的朋友一些切实的参考。