尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于光耦的RS-232C串口隔离通信模块设计与实现

基于光耦的RS-232C串口隔离通信模块设计与实现 1. 项目背景与核心难点1.1 为什么非要用光耦给RS-232C做隔离做工业通信的人都知道RS-232C接口在实验室里看着简单三根线TX、RX、GND一接就能跑但到了现场就不一样了。真正让人头疼的不是协议而是“地”。当两台设备距离远、供电独立、或者靠近大功率负载时两个地之间的电位差可能高达几伏甚至几十伏。地电位不一致轻则造成数据乱码重则烧毁串口芯片。我遇到过好几次设备调试时好好的一接上某个变频器串口芯片当场冒烟。光耦Photocoupler的价值就在这里它把信号用光从一边传到另一边两边没有直接的电气连接。信号进去了电位被隔断了地环路也断开了。我的项目目标是做一套RS-232C光电隔离通信模块要求速率100kbps单路双向用光耦作为隔离核心把隔离电压做到1000V以上成本控制在几十块钱以内。这个方案不依赖成品串口隔离器适合自己画板子、自己做样机也适合嵌入到现有设备中。大家可能觉得100kbps对于RS-232C来说不算快毕竟现在动不动就几Mbps甚至上百Mbps。但对光耦来说100kbps是一个分水岭。普通光耦比如PC817数据手册上写能到80kHz带宽用来做LED隔离没问题但放到串口上跑100kbps波形早就变形了误码率感人。如果你用普通光耦做过串口隔离应该能理解我说的那种感觉——波特率一调到9600以上数据就像鬼画符。所以要实现100kbps光耦的选型和外围电路都得认真对待。1.2 100kbps对光耦链路意味着什么RS-232C标准里传统波特率上限是115.2kbps100kbps虽然不是极限但已经接近这个接口的“高速”区间了。把时间轴拉一下能更直观100kbps下1个比特的周期是10微秒也就是10000纳秒一个完整的UART帧以“起始位8个数据位停止位”算至少10个比特整个帧只有100微秒。在这10微秒的位周期里光耦的上升沿、下降沿、传播延迟、抖动每一项都会侵蚀有效采样窗口。常见串口芯片的采样点一般设在位周期的中间以16倍过采样来算容忍的偏差只有几个百分点。如果一个光耦的上升沿加上下降沿就占掉了2到3微秒那有效数据窗口直接缩水两三成再加上两端晶振误差、线路干扰误码就是迟早的事。所以我给自己定的要求是光耦链路的上升/下降时间控制在0.5微秒以内单边延迟控制在1微秒以内这样才能保证100kbps稳跑甚至上到115.2kbps也不虚。顺便说一句RS-232C通信虽然老但工业现场离不开它。老旧设备要联网、数控机床要采集数据、仪表要上位机监控这些场景全是RS-232C。给这类链路做隔离比直接换新总线方案要省事得多很多场合根本不允许你改设备。下面我就把整个项目从选型、原理、计算到波形调试的完整过程整理出来。2. 核心器件选型什么样的光耦能跑100kbps2.1 光耦的几个关键参数怎么看光耦的核心参数有隔离电压、CTR电流传输比、上升/下降时间、传播延迟、共模抑制比。对100kbps通信排序是速度大于CTRCTR大于隔离电压共模抑制比排在最后。CTR含义好理解就是IC除以IF再乘以100%表示输入LED电流多大时输出侧能给出多大电流。普通光耦如PC817典型CTR在50%到600%分档而高速数字光耦如6N137则不需要用户关心CTR内部有高增益放大器只要输入电流达到阈值输出就是标准的数字电平。这一点很重要如果选用普通晶体管输出光耦来做数字通信要考虑CTR和温度漂移而选用数字光耦内部集成施密特触发器或逻辑门输出波形规整抗温漂能力也强。速度参数要区分“带宽”和“数字延迟”。PC817的带宽看着有80kHz这对小信号模拟传输有意义但用在数字脉冲上实际要看它的开通延迟、关断延迟、上升时间和下降时间。PC817在IF5mA、RL4.7kΩ的典型条件下上升时间和下降时间都是3到4微秒延迟也差不多这个量级。把这些加起来一个10微秒的位周期里光耦自己就占了差不多一大半传输出来的数字波形已经严重畸变。而6N137这类高速数字光耦传播延迟在60纳秒量级边沿在20到40纳秒量级完全不是一个数量级。2.2 具体型号怎么选我最终选了6N137。原因有三第一它内部集成了施密特触发器和退尖峰逻辑输出是集电极开路可以直接接TTL负载第二最大数据传输速率10Mbps跑100kbps绰绰有余实际上它在1Mbps以下都很稳几乎不占用串口的时序预算第三它便宜批量几块钱一个国内现货多不像某些高速光耦又贵又难买。不过6N137有个坑需要提前说一下它需要两个独立电源输入侧和输出侧不能共用同一个电源。如果你想省事用单电源会在电源上留下一条连通的“桥”隔离就白做了。后面我会详细说电源隔离方案。除了6N137我还试过ACPL-0721和TLP2361。ACPL-0721输出端是推挽CMOS不需要上拉电阻使用上更简单但价格略高。TLP2361也很不错传输延迟约100纳秒是集电极开路输出同样需要上拉电阻。衡量下来6N137是性价比最均衡的选择而且它的输入阈值电流典型5mA最大10mA以内一定能触发。官方手册里还提到6N137内部LED与检测电路集成在一起外部只需要限流电阻不用额外驱动电路。我整理了一个选型对比表方便大家根据手头资源去选型号数据速率传播延迟典型值输出类型需要上拉电阻输入电流要求价格量级PC817约80kHz小信号4到10μs晶体管需要CTR决定几毛6N13710Mbps约60ns集电极开路需要5到10mA几块ACPL-072110Mbps约60ns推挽CMOS不需要5到10mA十几块TLP236110Mbps约100ns集电极开路需要5到10mA几块到十几块实操结论如果手头只有PC817想跑100kbps基本可以放弃但如果你把波特率降到9600以下且要求不高它勉强可以用。本文后面所有设计都基于6N137选购时注意买正规渠道的货市场上假冒或者翻新件不少买到假件波形一眼就看出来不对。3. 完整电路设计与参数计算3.1 先决定在哪一边做隔离RS-232C是数字信号。RS-232C收发器MAX232、SP3232等把TTL电平转换为RS-232C电平±12V范围。那么光耦应该放在哪一层有两个方案。方案一在RS-232C信号线上直接串光耦。看起来最直接但输入端接±12V计算电阻时要考虑正负电平的切换还需要额外二极管处理反向电压。更麻烦的是RS-232C电平不比TTL电平光耦输出侧的信号仍然是TTL不能满足另一端的RS-232C电平要求所以信号即使穿过光耦也还得在两侧各加收发器。这个方案等于还是要把RS-232C先转成TTL然后再进光耦。方案二在RS-232C收发器的TTL侧放光耦。每侧先用RS-232C收发器把RS-232C电平降到TTL或CMOS再经过光耦隔离。这样光耦的输入侧和输出侧都是稳压后的TTL电源计算简单抗干扰也好。隔离器对外依然是RS-232C接口对用户完全透明。我最终选了方案二。理由很简单TTL侧的信噪比和电源稳定性都容易控制RS-232C电平大起大落用光耦直接耦合容易因为负半周导致LED反向击穿或者误触发而且这个方案可以顺便隔离RTS/CTS等流控信号扩展灵活。下面给一个完整电路的信号流向。信号流向是设备A的RS-232C输出进入模块左侧连接器J1后先由U1SP3232转成TTL电平的TXD这个TXD信号经过6N137光耦U3隔离后作为右侧TTL信号进入U2SP3232的T2IN再由U2输出RS-232C电平到设备B的J2接口。反向路径同理用另一个光耦从右向左过一遍。中间的“隔离边界”两侧分别用两套独立电源左边VCC1给U1右边VCC2给U2和光耦输出侧。3.2 输入侧限流电阻计算6N137输入侧是一个LED正常工作电流IF建议控制在5mA到15mA之间。极限最大是50mA但咱不做极端工控最好别超15mA。输入电路很简单TTL输出接到限流电阻R_in再接到光耦第2、3脚LED阳极和阴极。以5V供电为例设V_F1.4V6N137数据手册中IF10mA时典型V_F在1.2V到1.7V之间当TTL高电平为5V时R_in (VOH - V_F) / IF如果IF取10mAR_in (5 - 1.4) / 0.01 360Ω取整选360Ω或390Ω。390Ω时电流约9.2mA够用且省功耗。如果使用3.3V供电R_in (3.3 - 1.4) / 10mA 190Ω取200Ω或220Ω。这里有个细节TTL高电平不是理想的5V74系列TTL的高电平最低只有2.4V有些MCU输出的GPIO高电平等于供电电压。计算时最好按最恶劣情况验证一下如果VOH只有2.4VIF就只有(2.4 - 1.4) / 390Ω 2.56mA这就低于6N137的输入阈值电流了很可能无法触发。所以我是直接用CMOS输出电平的器件或者MCU推挽输出高电平等于VCC才有把握。如果你用的是开漏输出那必须要加拉上电阻否则光耦输入侧电流根本建立不起来。这个坑我在第一版样机上踩过后面会写进问题排查表。还有一个注意点6N137的LED内部没有内置限流电阻所以R_in绝不能省否则一接上就可能直接烧坏LED。3.3 输出侧上拉电阻与电路6N137的输出是集电极开路必须接一个上拉电阻到VCC_iso才能把输出电平拉起来。这个上拉电阻的大小直接影响输出边沿速度。阻值越小输出边的上升沿越快但功耗也越大阻值越大边沿越慢而且受负载电容影响越大。对于100kbps输出位宽10微秒实际上从数据手册的低电平输出逻辑电流看若上拉电阻取390Ω在VCC5V时输出低电平电流约为12.8mA能驱动常见TTL端口。用1kΩ上拉时输出低电平电流约5mA也够。我在调试中实测过390Ω上拉时上升沿大约30纳秒1kΩ时大约80纳秒上下。对100kbps来说都可以接受只是更快速的边沿能减少数据采样点的抖动所以我最终用了510Ω算是功耗和速度的折中。上拉电阻应该接在光耦输出侧的电源VCC_iso上并且尽量靠近6N137的第6脚。注意输出侧也不能和输入侧共用电源地这是光耦隔离的关键。如果输出侧地没和输入侧地分开光耦等于白装了甚至可能造成地环路回流烧掉光耦。实际输出电路还要处理逻辑极性。6N137的输出是反相的输出低电平表示输入LED有电流高电平表示无电流。如果你的TTL逻辑要求正逻辑高有效那需要把输入和输出的极性关系理清楚。最简单的办法是加一个反相器或者在RS-232C收发器的输入配置上做调整。我自己在6N137输出之后加了一个74HC1G04单反相器把反相拉回正逻辑同时增强驱动能力和波形整形效果。下面给出一个发送通道的关键元件表以5V TTL侧为例元件参数作用U36N137信号隔离R_in390Ω限制IF约9.2mAR_pull510Ω光耦输出上拉到VCC_isoU474HC1G04或74HC04反相整形修正极性C1/C2100nF10μF两侧电源去耦针对RXD通道就是一模一样的对称电路不再重复。3.4 电源隔离与防静电设计光耦隔离做到100%的前提是两侧电源完全独立。实际项目中我用DC-DC隔离电源模块例如B0505S-1WR2输入5V输出隔离的5V隔离电压1kV或更高输出功率1W足以驱动半个模块的SP3232和光耦。选DC-DC模块时输出功率要覆盖后续负载SP3232在静态下电流约0.3mA工作在100kbps时也就几mA6N137输出电流几mA74HC1G04几mA。整条通道加起来不到20mA1W的DC-DC轻轻松松。隔离电源模块的“地”和原边“地”是分开的这正好满足光耦两侧隔离的需求。接法上B0505S的输入端接VCC1和GND1输出端接VCC2和GND2。这里还要在DC-DC模块输出端加LC滤波否则开关噪声会影响信号。我加了一个22μH电感加10μF钽电容纹波大约几十mV通信就稳定了。接口防护方面RS-232C在工业环境里容易遭受静电和浪涌。我在J1/J2连接器上加了保护器件每个信号线对地接一个双向TVS二极管SMBJ15CA并在信号线上串联一个100Ω电阻。如果现场环境更恶劣还应该加气体放电管但一般电子设备场合TVS足够。保护器件要放在最外侧然后是SP3232之后才是光耦侧的低压TTL部分不能让浪涌直接冲到光耦。PCB布局上隔离边界必须清晰。把光耦和DC-DC模块的隔离带画出来左右两侧的地平面完全分开不要有任何走线跨越。隔离带下如果铺铜必须切开。这个非常关键——哪怕只有一根地线跨过了隔离边界隔离的性能就会打折扣。4. 实操过程与波形调试4.1 样机搭建与首次上电我分两步走先在面包板上搭建最小信号链路验证逻辑然后再画PCB打样。面包板阶段用6N137、SP3232、B0505S、74HC1G04做了一版最小信号路径RS-232C线缆从USB转串口FT232方案发出信号进SP3232转TTLTTL进光耦光耦输出再经反相器用示波器看输出波形。第一次上电输入侧给5V输出侧也先临时用同一个5V供电只是为了查明逻辑正式测试时换成隔离电源。用信号发生器在光耦输入端打一个5V方波在6N137输出端看波形。此时发现高电平只有约4.2V而不是5V。原因有两个一是6N137输出低电平时输出管饱和压降占了一点电压二是上拉电阻偏大加上示波器探头电容拖慢了上升沿。把上拉电阻从1kΩ换到510Ω后高电平接近4.8V上升沿明显改善。这个现象提醒我面包板上的杂散电容和飞线对高速信号影响很大。100kbps虽然只是“中速”但边沿几十纳秒的信号在长飞线上会产生振铃和串扰。所以面包板阶段只验证逻辑正确性波形细节必须要到PCB上再看。4.2 100kbps波形实测与调整PCB回来后我把所有芯片和元件焊上先不接RS-232C线路单独用信号发生器以100kbps实际使用一个10μs周期的方波模拟输入光耦输入端用示波器同屏测输入和输出。这里必须强调测光耦波形时要用差分探头或把两个探头的接地夹分别接在两侧地上不能把两侧地短接否则等于把隔离绕过去了。实测结果输入信号为5V方波经过光耦和反相器后输出的高电平到低电平的延迟约为75ns低到高约为90ns上升沿约45ns下降沿约35ns。这个延迟和边沿对100kbps来说毫无压力——10微秒的位周期里光耦总共占用不到150ns数据采样窗口几乎没被侵蚀。然后我把波特率设置在100kbps发送一个0x550b01010101的循环字符。0x55在100kbps下呈现为50kHz的方波这个特殊模式最适合考验光耦对称性。实测眼图将多次波形叠加边缘清晰过冲很小抖动峰峰值约200ns比接收端设备允许的抖动阈值小得多。这说明100kbps隔离链路是稳定可靠的。接着扩展到115.2kbps做极限测试传输10000字节随机数据校验误码率为0。所以项目标题里的100kbps并不是极限这个光耦链路的最大实际能力大约在2Mbps以上只是受限于RS-232C收发器的自身规格最终稳跑115.2kbps没有问题。4.3 PCB布局和布线经验画板子有几个要注意的地方。第一光耦下面不要铺输入侧的地更不要铺输出侧的地。隔离边界两侧以光耦为中心各留出3mm以上的空隙最好做一条镂空槽开窗但不铺铜这是我在第二版板子上做的改进实测耐压和抗干扰能力明显增强。第二SP3232的去耦电容要尽量靠近它的电源引脚。SP3232内部有充电泵工作时会产生开关噪声如果去耦不好噪声会串到TTL信号里最后反映为波形上的毛刺。
返回列表