1. 方案来源:为什么工业现场总绕不开4-20mA
做工业电子、仪器仪表或者现场设备改造的工程师,对4-20mA电流环应该都不陌生。温度变送器、压力变送器、液位计、阀门定位器,甚至不少PLC的模拟量输入模块,底层信号标准都是4-20mA。搞了这么多年嵌入式,我越来越觉得这个模拟信号标准真的很难被替代,原因不复杂:电流信号抗干扰能力强,线损不会直接导致测量误差,而且4mA的零点还能给两线制仪表提供静态工作电流,断线了马上就能发现,故障诊断也方便。
但问题来了——单片机和DSP并不直接输出4-20mA。MCU出来的是数字量,要么走DAC转成电压,再经过V/I转换电路变成电流;要么干脆用PWM加滤波,把占空比变成直流电压,再做电压转电流。DAC方案看着正规,但有个很现实的问题:工业级、带隔离的模拟输出通道,成本实在压不下来。隔离DAC、隔离电源模块、精密基准源,一套下来少说几十块,对于量产型产品来说,这颗成本压力很具体。于是不少人开始琢磨:能不能用便宜的PWM加光耦,来实现一个便宜但精度够用的隔离型4-20mA输出?
我把这套方案完整做了一遍,从原理验证到样板调试,前后差不多花了两周时间。这篇文章把整个设计思路、关键参数计算、以及调试中踩过的坑一次性讲清楚,能给准备用低成本方案做模拟量输出的朋友省不少弯路。
2. 低成本隔离4-20mA输出的整体设计拆解
2.1 为什么用PWM而不是DAC
先聊清楚选型逻辑。DAC当然精度高、纹波小、响应快,数据手册翻出来性能指标都很漂亮,但放到实际量产环境里,问题就出来了。首先是成本,哪怕是几块钱的国产DAC,加上外围的基准、运放、隔离器件,整体成本就上去了。其次是隔离结构,如果需要隔离,你得先选隔离式DAC,或者用数字隔离器把SPI/IIC信号隔离,再驱动非隔离的DAC,两级结构一出来,BOM就复杂了。
PWM方案的本质,是用MCU自带的PWM外设生成占空比可调的方波,再用低通滤波器把方波的平均值提取出来,等效成一个直流电压。MCU的PWM外设成本为零,滤波器只需要电阻和电容,整个模拟前端就是运放加晶体管,成本非常可控。而且PWM的分辨率并不低:一个16位定时器,跑在72MHz,输出频率20kHz左右的PWM,理论上能实现约11位的有效分辨率,配合校准之后,达到0.1%的精度是可行的。
有人说PWM响应慢,低通滤波器需要时间稳定,这确实是个约束。但工业过程控制本身就是慢变量,温度、压力、液位这些物理量变化以秒甚至分钟为单位,几百毫秒的稳定时间完全可以接受。用PWM做4-20mA输出,本质上是在成本和响应速度之间做了一个合理取舍。
2.2 光耦在系统里扮演的角色
光耦在这个方案里的作用,不是简单地用数字脉冲去跨隔离带,而是要把整个模拟通路都隔离掉。输入端的PWM信号经过光耦传输到隔离侧后,再经过滤波变成直流电压,最后转换电流。这样的好处是,隔离两侧的电源和地完全独立,现场侧的干扰不会通过信号通路串进控制侧的系统地。
这里要特别提醒一点:光耦本身有传输延迟,不同批次、不同温度下延迟不一致,PWM的上升沿和下降沿经过光耦后会发生不同程度的偏移,等效出来就是占空比失真。所以光耦不能随便选,普通的低速光耦像TLP521,上升沿下降沿都有好几微秒,20kHz PWM一个周期才50微秒,失真占比太高,不太适合。最好选高速数字光耦,比如6N137或者国产的亿光、冠西这类响应时间在百纳秒级别的器件。
2.3 整体架构与信号流向
整套系统的信号流向是这样的:MCU输出PWM,经过光耦隔离传到隔离侧,光耦输出的是同频率、近似同占空比的方波,再用二阶低通滤波器把方波变成平滑的直流电压,最后用一个压控恒流源电路,把电压线性映射成4-20mA电流,驱动外部负载。
这个架构的优点很明显:隔离侧不需要MCU、不需要DAC、不需要复杂的数字逻辑,就是一个纯模拟电路,可靠性反而更高。现场侧只要提供一个隔离电源(比如B0505S这类模块),就能独立完成信号调理和电流输出。我实际搭出来的电路,在24V供电情况下,带载能力能做到750欧姆,足够覆盖大多数PLC模拟量输入模块的输入阻抗。
3. 关键细节解析与核心参数计算
3.1 光耦选型与驱动电路设计
光耦选型是整个方案里最容易埋雷的地方。如果只用TLP521做20kHz PWM传输,你会发现输出波形已经完全变了样:上升沿变得平缓,占空比失真明显,滤波后的电压跟理论值偏差可能达到1%-2%。这个误差靠软件校准可以修一部分,但温漂没法修,因为光耦的传输延迟随温度变化很大。
我的建议是:
- 光耦选高速型,响应时间tPLH/tPHL都在1微秒以内
- 输出端加上拉电阻,阻值根据光耦的CTR和工作电流确定
- 输入端串联限流电阻,保证IF在5-10mA范围
以6N137为例,输入端串一个330欧姆电阻接到MCU引脚,MCU高电平3.3V时,IF大约5mA左右,输出端上拉电阻取4.7k到5V,输出波形就是标准方波。这里有个细节:6N137是集电极开路输出,必须加上拉电阻,否则输出根本拉不高。
如果是5V供电的MCU,限流电阻可以取220欧姆,IF大约10mA。驱动能力上,单片机的GPIO推挽输出完全能驱动光耦,不需要额外的三极管缓冲。
3.2 二阶低通滤波器设计与截止频率计算
PWM信号经过光耦后,还是方波,必须滤波才能变成直流。滤波器的阶数、截止频率,直接影响最终的纹波水平和建立时间。
我用的是RC二阶低通滤波器,两个电阻两个电容。以20kHz PWM、占空比50%输出为例来算:方波经过一阶RC滤波后,纹波幅值大约为Vpp的1/πfRC,要在满载20mA档位上做到纹波小于4微安,需要把纹波电压压到微伏级别,一阶滤波很难达到;二阶滤波器的衰减斜率是-40dB/decade,高频纹波压制效果要好得多。
截止频率f=1/(2π√(R1R2C1C2)),我实际取R1=R2=10kΩ,C1=C2=100nF,算下来截止频率约159Hz。对于20kHz PWM,二次谐波在40kHz,衰减量(40kHz/159Hz)的两倍对数比,大约衰减50dB,输出电压纹波被压到0.3%以内。如果要求高,可以把电容加大到220nF,纹波更低,不过建立时间会变长。实测下来,在满载变化时,输出稳定到0.1%精度大约需要100毫秒左右,工业场景完全能接受。
有个经验值可以参考:PWM频率选20kHz以上,截止频率选在PWM频率的1/100到1/50之间,这样纹波和响应时间都能兼顾。
3.3 V/I转换电路与电阻取值逻辑
滤波得到的直流电压,最终要变成4-20mA的电流。这个环节我推荐用经典运放加晶体管的压控恒流源结构,相比专门的集成V/I转换芯片(比如AD694、XTR117),成本低很多,性能也够用。
核心原理是用运放强制让采样电阻两端的电压等于输入电压。采样电阻R_sense串联在输出回路里,流过它的电流就是输出电流,运放通过调整晶体管的基极电流,让R_sense上的压降和输入电压相等。输入电压0.4V对应4mA,输入电压2V对应20mA。
这个电路有几个关键参数要算清楚:
- 采样电阻R_sense,决定转换增益,I=V_in/R_sense,R_sense取100Ω,那么0.4V对应4mA、2V对应20mA
- 运放的供电电压Vs,至少要比最大输出电压高2-3V,因为晶体管有饱和压降、采样电阻有压降
- 晶体管的耗散功率,24V供电、20mA输出时,如果负载150Ω,晶体管上的压降约21V,耗散功率0.42W,需要选TO-252封装的小功率三极管
电阻精度直接影响电流精度,R_sense建议用0.1%精度、25ppm温漂的精密电阻,不要用普通5%的贴片电阻。我用的是1206封装的精密电阻,实测温漂控制在0.05%以内。
4. 完整电路原理与实现过程
4.1 电路各环节的信号变换计算
整条信号链路可以用一张表理清楚:
| 环节 | 输入 | 输出 | 关键关系 |
|---|---|---|---|
| MCU PWM | 占空比D | 方波,幅值3.3V/5V | 平均值=V_H*D |
| 光耦隔离 | 方波 | 方波,幅值5V | 延迟引入微小占空比误差 |
| 二阶低通滤波 | 方波 | 直流电压V_f | V_f ≈ 5V × D |
| V/I转换 | V_f | 电流I_out | I_out = V_f / R_sense |
举个例子,要输出12mA,输出电流对应的输入电压就是1.2V,对应PWM占空比就是1.2/5=24%。整个链路的传递函数是线性的,校准起来非常方便。
实际做的时候我遇到过一个问题:光耦输出上拉到5V,但MCU的PWM高电平是3.3V,滤波后的电压最大值就不是5V而是3.3V。这也行,只是把映射关系整体平移了,但要注意留给PWM满占空比到满量程之间的余量。我后来把光耦输出上拉电源改成5V,用5V作为滤波基准,这样PWM从0到100%对应0到5V,映射关系更清晰。
4.2 基于STM32的PWM配置要点
以STM32F103为例,PWM配置的关键参数是定时器时钟、预分频、自动重载值。我配置的PWM频率20kHz,定时器时钟72MHz,预分频PSC=2,自动重载值ARR=1200,这样实际PWM频率=72MHz/(3×1201)≈19.98kHz,接近20kHz。
占空比寄存器CCR的调节范围是0到1200,对应0到100%占空比。如果要输出4-20mA对应的占空比区间,先算滤波电压:4mA对应0.4V,20mA对应2V,在5V基准下,占空比范围就是8%到40%,对应CCR范围是96到480。
MCU端设置PWM模式为PWM1,极性选择高电平有效,GPIO配置为复用推挽输出。光耦输入端并联了一个100Ω的电阻,这个电阻的作用是加快光耦输入端的关断速度,让下降沿更陡峭,改善占空比失真。
4.3 PCB布局与布线注意事项
PCB布局决定模拟性能。我画板子的时候踩过一个坑:滤波电阻电容离光耦输出太远,中间隔了一条数字信号线,导致输出纹波里多了不少尖峰脉冲。后来重新布局,严格按照信号流向排列器件,滤波电容靠近光耦输出引脚,模拟地单点接地,效果立刻改善。
几个实用的布局原则:
- 光耦放在隔离带正中间,两侧分别对应数字区和模拟区
- 滤波电阻电容贴近光耦输出端,走线短而粗
- 采样电阻和运放的反馈网络远离开关电源和电感
- 模拟地单点连接,不要在滤波器和V/I转换之间形成地环路
- 输出级晶体管和采样电阻附近开通风窗,辅助散热
5. 常见问题与排查技巧实录
5.1 输出电流非线性与校准方法
最常见的问题就是输出电流和理论值对不上,而且不是成比例地偏,是中间段偏、两端准的S形曲线。这种非线性通常来自光耦传输延迟引起的占空比失真。PWM占空比小时,光耦延迟占的比例大;占空比大时,占空比失真方向相反,导致中间段偏。
排查思路是先分段测量:分别设置占空比10%、30%、50%、70%、90%,用万用表精确测量输出电流和PWM占空比的实际关系。描点画出来后,会看到一条轻微弯曲的曲线。这时候用两点校准只能修增益和零点,中间段的误差修不掉。解决办法是分段线性校准,把整个量程分成4段或8段,每段单独算增益和偏移,在MCU里用查表加插值的方式修正。实测8段校准后,非线性误差可以压缩到0.1%以内。
5.2 输出纹波超标与滤波参数优化
用示波器测输出电流时,如果看到明显的周期性纹波,峰值达到几十微安甚至更大,问题基本出在滤波环节。先排查LC滤波器的截止频率是否合理,PWM频率是否太低。如果用的是20kHz PWM,截止频率却设到了1kHz,那纹波衰减远远不够。
解决办法是降低截止频率,比如从1kHz降到200Hz,或者在末端再加一级RC滤波。不过要注意,截止频率降太多,输出建立时间会变长。实测如果只靠滤波器把纹波压到极低,动态响应会比较慢,建议纹波目标设成满量程的0.1%,也就是20微安以内,这样响应和纹波能同时满足。另外,光耦输出端的电源如果纹波大,也会耦合到滤波后的直流电压里,建议光耦输出上拉电源用LDO单独稳压。
5.3 带载能力不足与电源裕量调整
输出电流带不动大负载,表现为接到PLC模块后电流上不去,或者输出端电压被拉低,通常有两个原因。一是电源电压不够,24V供电串接一个750Ω的PLC输入电阻后,负载压降就有15V,加上采样电阻压降2V和晶体管的压降,运放供电余量不足。
解决方法是提高供电电压到28V-30V,或者降低采样电阻值以减小压降。采样电阻100Ω时满载压降2V,如果改成50Ω,压降就变成1V,对低压供电场景很有帮助。另一个原因是运放输出范围不够,无法驱动晶体管进入线性放大区,可以选择轨到轨输出运放,比如LM358在单电源下输出到不了轨,选TLV2372或者MCP6002这类运放就很稳。
5.4 温度漂移与精度保持策略
4-20mA输出对温漂比较敏感。光耦的CTR随温度变化,晶体管的Vbe随温度变化,采样电阻的阻值也随温度变化,三级叠加,很容易出现温度每升10度,输出电流偏个几十微安的情况。
我的做法是拆开来看:光耦CTR变化影响的是前级电压,可以通过校准来修正;晶体管的Vbe漂移,在运放反馈环路里会被自动抑制,因为运放在闭环控制V(R_sense),晶体管的Vbe在环路之外不影响输出电流;真正需要关注的是采样电阻的温度系数。所以采样电阻一定选低温漂的,至少25ppm,最好选10ppm的金属膜或精密合金电阻。如果要做宽温度范围的产品,建议在软件里加一个温度补偿表,用板载NTC或DS18B20测量环境温度,查表修正PWM占空比。
6. 方案优势与适用场景边界
6.1 成本与性能的平衡点分析
这套方案的硬件成本我很认真算过:高速光耦6N137大约1块多,运放用LM358五毛钱左右,精密采样电阻一两块,普通电阻电容加起来不到一块,稳压芯片和隔离电源模块三四块,散件加起来不超过10块钱,算上PCB和焊接,整个隔离模拟输出通道的物料成本控制在15元以内完全没问题。而用隔离DAC加精密运放的方案,光隔离DAC就要30块钱以上,加上隔离电源模块,总成本翻倍。
当然,成本换来的代价是精度和响应速度的折中。DAC方案能做到16位分辨率、微秒级响应,PWM方案的有效分辨率在12位左右,响应在百毫秒级。对温度、压力、液位这类慢变量,PWM方案的性能完全够用,但如果是伺服控制、变频器这类需要快速响应的场景,还是老老实实选DAC。
6.2 适合应用的工控场景
这套方案的典型适用场景,我在实际项目里验证过几类:
- 传感器变送器:把温度、湿度、压力传感器的数字信号,转成标准的4-20mA电流环信号传给PLC
- 工业设备改造:老设备只有数字IO,需要模拟量输出时,用PWM加光耦的方案扩展模拟通道
- 教学实验平台:低成本实现隔离模拟量输出,让学生理解PWM、滤波、V/I转换的完整链路
- 远程数据采集:在数据采集终端里输出隔离的4-20mA信号,驱动指示仪表或执行机构
需要提醒的是,如果要求本安防爆认证或者精度达到0.05%以上,这套低成本方案不太合适,需要走正规的隔离放大器和精密DAC路线。
6.3 后续可以做的功能扩展方向
这套方案还可以沿着几个方向扩展。一是把输出从单路扩展到多路,利用MCU多路PWM加多路光耦,同时输出多路4-20mA信号,适合多通道变送器。二是增加HART协议调制解调功能,HART就是在4-20mA电流上叠加FSK数字信号,频率1.2kHz和2.2kHz,现有的模拟链路只要在输入端叠加正弦信号,输出端加一个解调电路就能实现。三是增加自诊断功能,利用MCU的ADC监控输出电流,把采样电阻的电压实时回读,判断输出是否超出量程或断线。
最后分享点个人实操体会
这套方案我前后做了三轮迭代,第一版直接用普通光耦TLP521,结果精度惨不忍睹;第二版换高速光耦,改了滤波结构,精度上去不少,但温漂还是不对;第三版把采样电阻换成精密型、供电加了稳压,才算真正达到工业应用的门槛。整个过程最深的体会是:这种看似简单的模拟电路,每个环节都藏着物理极限,不能只靠计算,得实际搭电路测数据才行。尤其是占空比失真这个问题,理论算出来觉得没事,实测下来才发现是主要误差来源。大家做的时候别怕踩坑,多拿示波器看波形,多记录数据,方案最终一定可以收敛。