ARTICLE DETAIL

资讯详情

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

RS-232光耦隔离设计实战:100kbps下的选型与电路详解

RS-232光耦隔离设计实战:100kbps下的选型与电路详解 前阵子给一台工控设备加串口隔离板子画完、程序烧好结果115200一上电就是乱码降到9600一切正常。排查到最后发现不是我代码的问题而是随手选的那颗PC817在拖后腿。这也是为什么看到“Photocoupler for RS-232C 100-kbps Communications”这个题目时我觉得值得把整个设计过程重新梳理一遍——100 kbps恰好卡在普通光耦和高速光耦的分界线上很多人在这个速率上翻过车。RS-232C是工业现场最常用的串口之一虽然速率和距离都不算亮眼但胜在简单、普及、设备兼容性好。问题在于当两个设备各自使用不同的电源系统或者现场有大功率电机、变频器频繁启停时两个设备之间的地电位会瞬间差出几十伏。这时候直接用串口线硬连轻则误码重则烧掉主控板上的串口芯片。光耦隔离就是解决这个问题的标准手段——把信号用“光”传过去地完全断开两侧互不影响。但隔离这件事看似就是“信号进光耦、光耦出信号”实际做起来坑不少。尤其是100 kbps这个速率不上不下9600波特率随便用什么光耦都能跑100 kbps以上就必须认真选型、算时序、调电路。这篇就把我做这个项目的完整过程拆开讲包括延迟预算怎么算、光耦怎么选、输入输出电路怎么设计、实测会遇到哪些问题、以及为什么在很多场景下光耦依然是比数字隔离器更务实的选择。1. 100 kbps是道坎RS-232C隔离设计先得算清延迟预算1.1 RS-232C隔离到底解决什么问题先明确一个概念RS-232C标准的电平范围是-15V到15V逻辑1对应负电压逻辑0对应正电压而这种负逻辑让不少第一次接触的人栽过跟头。在典型应用中发送端的UART TX输出经过电平转换芯片比如MAX232、SP3232变成±12V左右的RS-232电平通过线缆传到接收端再经过接收端的电平转换芯片恢复到3.3V或5V的UART电平。加光耦隔离的场景通常是这样的设备A和设备B各自的电源系统不共地或者虽然名义上“共地”但实际地电位差很大。工业现场最常见的起因是大功率设备启动时地线上瞬间流过很大电流导致两个设备的“地”不是同一个电位。如果不隔离这些地电流就会经过串口线形成回路轻则影响信号电平判断重则直接烧毁串口芯片。光耦隔离的接法是在RS-232信号进入MCU之前加一级光耦RS-232电平信号驱动光耦输入端的LED光耦输出端再接到MCU的UART RX引脚。输入端和输出端的参考地完全独立信号通过光传递电气上彻底隔绝。这是目前串口隔离最成熟、成本最低的方案。1.2 100 kbps的位周期与延迟预算拆解100 kbps意味着每秒传100,000个比特每个比特位的持续时间是波特率的倒数T_bit 1 / 100,000 10 µsUART的帧格式通常是最小10位1个起始位 8个数据位 1个停止位无校验所以传输一个字节至少需要100 µs。从理论上看10 µs的位宽并不算紧张问题在于光耦本身会引入延迟和波形畸变。UART接收端对信号质量的容忍度是有限度的。典型UART要求在每一个位的中心点采样如果信号的上升沿或下降沿偏离理想位置太多采样点就会落在错误的电平上。工程上通常要求边沿偏差不大于位宽的10%也就是10 µs位宽下偏差不超过1 µs。边沿偏差的来源主要有两个一是光耦的传播延迟从输入信号变化到输出信号变化的时间二是脉冲宽度失真高电平宽度和低电平宽度不对称。再看整个信号链路。很多隔离设计是在RS-232设备和MCU之间加单向光耦一条完整的收发链路要经过两个光耦发送侧一个MCU TX → RS-232线路接收侧一个RS-232线路 → MCU RX。假设两个光耦的传播延迟相加为t_total要让系统稳定工作t_total至少要小于位宽的50%也就是5 µs实际设计建议控制在位宽的20%以内即2 µs。这里“建议小于2 µs”不是拍脑袋定的而是要保证即使UART的时钟本身有±2%的频率偏差、线上信号有若干ns的边沿抖动最后的采样点依然落在数据位的稳定区间内。1.3 为什么普通光耦跑不了100 kbps这是整个设计最核心的认知。光照耦不是不能传数字信号而是它内部的响应速度有物理极限。以最常用的PC817为例这类普通光耦的传播延迟tPHL/tPLH典型值在3~4 µs上升时间和下降时间各1~2 µs。单独一只PC817从输入变化到输出稳定整个过程可能超过5 µs——这已经吃掉了一个位宽10 µs的一半。如果收发两侧各用一只PC817总延迟会超过6 µs甚至更高100 kbps下基本没法工作。为什么PC817这么慢因为它的输出是光敏三极管三极管从截止到饱和需要电荷积累和泄放的过程加上集电极输出电容和外部负载电阻组成的RC时间常数整个响应被拖慢。而高速光耦如6N137内部集成了施密特触发器和高增益放大器输入侧只要有足够的电流让检测器翻转输出级的数字电路会快速输出稳定的电平延迟直接降到纳秒级。这里也解释了为什么9600波特率下PC817没有压力——9600 bps的位宽约104 µsPC817哪怕搞出5 µs的延迟也才占位宽的5%。而100 kbps的位宽只有10 µsPC817的5 µs直接占据50%不踩坑才怪。2. 光耦选型参数清单CTR、传播延迟、上升下降时间分别怎么卡2.1 四个核心参数速查表选光耦不能只看隔离耐压尤其是做串口隔离四个参数必须一起看传播延迟、脉冲宽度失真、上升/下降时间、电流传输比CTR。我整理了一张常用对比表参数PC817普通光耦6N137高速逻辑光耦TLP2361高速推挽光耦传播延迟 tPHL/tPLH3~4 µs48~75 ns25 ns级脉冲宽度失真 PWD数µs级不稳定典型20 ns最大70 ns10 ns级上升/下降时间1~2 µs20~40 ns10 ns级输出结构光敏三极管集电极开路施密特推挽输出CTR50%~600%逻辑输出无需关注CTR逻辑输出无需关注CTR适用最高波特率19.2 kbps稳妥100 kbps及以上10 Mbps级隔离耐压5 kVrms5 kVrms5 kVrms从表格可以直观看出6N137级别的光耦在100 kbps下余量非常充足。传播延迟最大75 ns两个光耦串联也不到150 ns相比位周期的10 µs几乎可以忽略。2.2 高速光耦型号推荐与封装差异实际项目中我常用的是这几颗6N137经典高速光耦DIP-8封装需要外加输出上拉电阻和0.1 µF去耦电容。价格便宜供货稳定但功耗略高输出级是集电极开路。HCPL-0601和6N137功能类似SOIC-8封装体积更小适合板子空间紧张的情况。ACPL-072L延迟更低约20 ns级功耗也更低适合对功耗敏感的场景。TLP2361近期比较喜欢用的型号SOIC-6封装也能兼容常见的SOIC-4焊盘设计内部推挽输出不需要外部上拉电阻波形更漂亮延迟在30 ns左右。缺点是价格比6N137贵一些。如果预算充足、又不想纠结上拉电阻的取值TLP2361这种推挽输出的光耦是最省心的选择。如果追求成本和通用性6N137依然是百万级出货的经典料淘宝和立创商城都能轻松买到技术资料也齐全。2.3 CTR降额计算低温与老化留多少余量CTRCurrent Transfer Ratio电流传输比是普通光耦三极管输出型的核心指标定义是输出集电极电流与输入LED电流的百分比CTR IC / IF × 100%以PC817为例不同档位的CTR范围不同常见的是50%~600%IF5mA时。这个范围很宽设计时不能按最大值算要按最小值扛。更关键的是CTR会随温度和环境老化下降低温时LED的光输出会降低高温时光敏管的电流放大倍数也会下降长期运行后LED本身还会光衰。工程经验是按25°C数据手册数值的50%做最坏情况校核。比如PC817标称最低CTR50%那设计时就按25%来算IC_min IF × CTR_min / 100 5 mA × 25% 1.25 mA如果输出上拉电阻取1 kΩ、输出高电平为5V光耦导通时要拉低到逻辑低电平比如0.4V以下需要的最小电流是(5V - 0.4V) / 1kΩ 4.6 mA。这就超过IC_min了说明按这种方式直接用PC817可能连低电平都拉不稳。这也是为什么PC817类光耦最好在低速≤19.2 kbps且CTR余量充分的场景下使用。而6N137这类逻辑输出光耦没有CTR这个参数的困扰它内部已经把光电二极管信号放大并整形成数字电平输入侧只要提供足够电流通常IF ≥ 5 mA保证内部检测器翻转即可。设计时只需保证IF不需要计算输出端的拉电流能力。3. 输入侧电路设计正负电平转换与限流电阻计算3.1 RS-232电平与UART逻辑的方向转换RS-232的电气特性和UART逻辑是反的。UART逻辑1对应高电平比如3.3V逻辑0对应低电平0V而RS-232逻辑1对应-3V到-15V逻辑0对应3V到15V。这意味着把RS-232信号接到光耦输入端时LED的导通条件正好和UART逻辑相反但通过光耦的反相输出又可以恰好恢复成UART逻辑。这个对应关系是设计的关键我会在第四章用一条完整的链路逐步推演。输入侧电路的接法比较直接RS-232信号线接光耦输入LED的阳极LED阴极通过限流电阻接地。当信号为正电压逻辑0电流从信号经过LED和限流电阻流向地LED发光当信号为负电压逻辑1LED两端是反偏不导通光耦输出保持高电平。这个方案只用了电阻和光耦没有额外器件是最常见的接法。3.2 限流电阻计算以±12V信号电平为例限流电阻的取值决定了LED的正向电流IF而IF又影响光耦的开关速度和寿命。IF太小光耦输出级的驱动不足翻转速度变慢IF太大LED长期过流会加速光衰缩短寿命。通用原则是把IF控制在5~10 mA之间6N137数据手册建议的最小IF是5 mA。计算限流电阻的公式很简单R (V_OH - V_F) / I_F其中V_OH是RS-232信号的高电平电压典型值在9V到12V之间MAX232供电5V时的输出约±9VSP3232约±12V也有部分芯片输出更接近±5VV_F是光耦内部LED的正向压降红外LED通常在1.0~1.4V之间计算取1.2VI_F是想要设定的电流取10 mA。以典型12V信号为例R (12V - 1.2V) / 10 mA 1080 Ω取标准值1 kΩ即可。此时实际电流为(12 - 1.2) / 1000 10.8 mA在合理范围内。如果确认实际信号电平较低比如用5V供电的RS-232芯片按5 mA计算R (5V - 1.2V) / 5 mA 760 Ω取750Ω或820Ω。这里要特别注意不能盲目照搬别人电路里的电阻值必须先确认自己板子的RS-232电平范围否则可能IF不足导致光耦无法稳定翻转。3.3 LED反向耐压保护1N4148的接法这是很多教程不会专门强调、但实际项目中非常重要的细节。RS-232信号空闲时处于-3V到-15V的负电压这个负压直接施加在光耦输入LED上方向是反偏。普通LED的反向耐压只有5~6VRS-232的负压足以把它击穿。虽然短时间击穿不一定会立刻烧坏但长期工作在反向击穿状态会加速LED光衰导致CTR下降最终表现为通信从稳定变成偶发误码。解决方案是在光耦输入LED两端反向并联一只二极管常见选1N4148或1N4007。1N4148开关速度快、反向恢复时间短适合串口信号场景1N4007虽然便宜但恢复时间慢不推荐用于高速信号保护。接法很简单二极管的阴极接LED的阳极阳极接LED的阴极也就是与LED反向并联。这样负压到来时二极管正向导通把负压钳位在约0.7VLED承受的只是这0.7V反压安全无忧。如果RS-232信号可能会受到外部浪涌干扰比如长线缆引入了静电还应该在输入端并联TVS管。TVS的选型一般是双向TVS如SM712钳位电压范围覆盖±7V到±12V放在连接器出口处在光耦保护二极管之前先泄放浪涌能量。光耦本身不是ESD保护器件不要指望它能扛住直接雷击或强静电。4. 输出侧设计与逻辑极性验证一个反相就把链路搞死4.1 集电极开路输出与上拉电阻的相互作用6N137是集电极开路输出实际是OC门/OD门结构必须通过外部上拉电阻接到VCC才能输出高电平。上拉电阻的取值直接影响波形的上升沿质量。输出端的总电容CL包括光耦输出管的结电容、PCB走线寄生电容、下一级芯片输入电容比如MCU的GPIO引脚大约3~5pF示波器探头约10pF。上升时间可以用一阶RC模型估算tr ≈ 0.7 × RL × CL举两个例子就明白了RL 1 kΩCL 50 pFtr ≈ 35 ns非常干净。RL 10 kΩCL 300 pFtr ≈ 2.1 µs在100 kbps下占位宽21%波形会明显变圆已经有风险。所以在100 kbps场景下上拉电阻推荐取1 kΩ到4.7 kΩ之间。我习惯取2.2kΩ兼顾功耗和边沿速度。需要注意上拉电阻带来的静态电流VCC5V时RL2.2kΩ的静态拉电流约2.3mA如果同时用了4~5路光耦总电流也就10mA左右用LDO供电完全没压力。输出侧VCC的退耦也很关键。6N137的输出级在开关瞬间会产生较大的电流尖峰如果VCC引脚附近没有去耦电容这个电流尖峰会转化成电源噪声反过来干扰输出波形。我习惯在每个光耦的VCC引脚旁边放一颗0.1 µF陶瓷电容并尽量靠近引脚放置距离不超过3mm必要时再加一颗10µF钽电容做低频去耦。4.2 全链路极性推演从TX到RX这个部分被问得最多光耦到底会不会改变逻辑极性答案是“恰好正确地改变了一次”。直接推演一条完整链路发送端MCU的TX引脚TTL逻辑经过RS-232收发器变成RS-232电平再进入光耦输入端光耦输出端接到接收端MCU的RX引脚。以最常见的方向“RS-232设备TX → 光耦 → MCU RX”为例空闲状态RS-232信号线为负电压-9V逻辑1→ 光耦输入端LED截止 → 光耦输出晶体管截止 → 上拉电阻让输出引脚为高电平 → MCU RX读到高电平。UART空闲时RX本来就是高电平正确。起始位UART起始位是逻辑0对应RS-232正电压9V→ LED导通 → 输出晶体管导通 → 输出引脚被拉到低电平 → MCU RX读到低电平。UART正确检测到起始位。数据位RS-232逻辑0正电压→ 输出低RS-232逻辑1负电压→ 输出高。光耦输出端的电平序列与UART逻辑完全一致。也就是说RS-232的负逻辑经过光耦之后被“翻译”回了UART的正逻辑。不需要额外加反相器但前提是输入端采用“信号驱动LED阳极”的接法。如果你图省事把LED接在正电源和信号之间即信号拉低时LED导通逻辑就会被反向输出电平序列和UART完全反相这时就必须再加一级反相电路或改用其他接法。4.3 电源去耦与PCB布局要点隔离光耦必须在输入侧和输出侧分别使用独立的电源和地这是隔离的定义。输入侧地GND1跟RS-232设备的地相连输出侧地GND2跟MCU的地相连。这两个地之间不能有任何电气通路。PCB布局上光耦要放在输入侧和输出侧的“分界线”位置光耦下方的PCB铜箔要挖空增加爬电距离。爬电距离的要求取决于隔离耐压等级常规工业产品3750Vrms的隔离爬电距离至少5~6mm如果需要加强绝缘或过认证直接拉到8mm以上。这个距离是物理距离不是电气距离所以布局时要把光耦的输入引脚和输出引脚尽量分开走线不要在光耦下方或附近铺一大块连续的铜箔把两侧地连接起来。另一个容易忽视的点是示波器探头的地线。调试时如果示波器探头地线夹在GND2而探头本身通过电源线接了大地而GND1又通过RS-232线缆屏蔽层接了大地那么GND1和GND2就被示波器探头的地线意外短路了隔离完全失效。调试隔离电路时最好使用隔离示波器探头或者用电池供电的示波器避免无意中破坏隔离。5. 实测波形与三个常见坑波特率不匹配、波形发圆、误码偶发5.1 实测波形长什么样设计完成后我习惯用0x55二进制01010101作为测试数据因为它每个数据位都在0和1之间交替产生的是方波密度最高的信号最能暴露波形质量问题。测试方法是在MCU端连续循环发送0x55用示波器同时测量光耦输出引脚和MCU RX引脚重点观察上升沿、下降沿以及高电平宽度和低电平宽度是否对称。100 kbps下正确工作的波形特征是上升沿和下降沿都小于100 ns6N137级高低电平宽度都在4.9~5.1 µs左右位周期的±2%整体波形接近理想方波没有明显的振铃和过冲。如果波形变成“梯形”上升沿长到接近1 µs那就要检查上拉电阻是不是选大了或者后级负载电容是不是过大。5.2 坑一上拉电阻过大导致波形发圆这是最容易踩的坑。我第一版设计时为了省功耗把上拉电阻选了10 kΩ实测100 kbps通信时接收端偶发乱码。用示波器一看输出波形的上升沿明显变缓低电平正常但高电平爬得很慢看起来就像方波被“磨圆”了。计算一下10 kΩ上拉、后级等效CL大约150pF时tr ≈ 1 µs占了位宽的10%加上光耦本身的延迟和失真已经逼近UART的容忍极限。解决办法是换成2.2 kΩ上拉再测tr降到约230 ns通信恢复正常。这个案例提醒我光耦输出侧的RC时间常数一定要在画板之前就估算不要等PCB回来了再改。5.3 坑二输入侧二极管缺失损坏光耦这个坑更隐蔽。有一次做样机测试板子连续运行三天后RS-232通信开始偶发失败。排查后发现是光耦输入端LED光衰导致的。原因很简单板卡调试时RS-232连接器一直插着但对方设备没有开机此时RS-232信号线悬空或处于空闲负电压状态LED长时间承受反向偏压。虽然光耦没有立刻坏但LED内部已经发生了不可逆的损伤CTR明显下降导致后续通信不稳定。后来在所有光耦输入端都补上了反向并联的1N4148这个问题再没出现过。如果你发现自己的光耦方案老是“用一段时间就出问题”检查一下输入端有没有反压保护这是最常见的老化元凶。5.4 坑三隔离被“共地”悄悄破坏另一个真实案例两块板子都做了光耦隔离设计但现场调试时通信用零误码用示波器一量发现GND1和GND2之间有波形、有电流实际上隔离已经被破坏了。找了一圈发现问题出在电源模块上设备A的输出地和设备B的输入地通过电源模块的寄生电容连在一起了。更常见的破坏路径是我在4.3节提到的“示波器地线环路”和“PCB铺铜跨分割”问题。所以隔离设计光看原理图是不够的必须检查实际物理连接。我用过的检测方法是断电状态下用万用表蜂鸣档测GND1和GND2之间的电阻正常应该是无穷大开路如果蜂鸣器响说明隔离已经被某个元件或走线短路了。注意有些电源模块内部有Y电容此时直流电阻虽然开路但高频交流阻抗很低这属于正常现象信号隔离依然有效。判断标准是信号地之间有没有可传导的低阻通路以及高频噪声有没有通过这条通路耦合。6. 光耦与数字隔离器的取舍以及后续扩展6.1 什么时候继续用光耦做完这个项目后我常被人问现在数字隔离器比如ISO7721、SI8620性能比光耦好太多为什么还用光耦我的回答是看场景。100 kbps这个速率下光耦和数字隔离器都能轻松胜任最终取舍看的是成本、通道数、隔离耐压和供应链。光耦的优势在于单通道成本低、品类极多、封装标准化程度高任何一家电子市场都能买到而数字隔离器在高通道数、高可靠性、长时间运行一致性上优势明显但价格相对较高供货渠道也没有光耦那么分散。如果预算敏感、只是隔离一对串口信号我依然会用6N137或TLP2361如果是多路串口或者需要同时隔离多路IO数字隔离器更划算因为一颗四通道数字隔离器比四颗光耦的总价还便宜而且不用考虑CTR老化和PWD问题。6.2 如果要升级到全双工/多通道该怎么加RS-232全双工需要TX和RX两个方向每个方向都要一个光耦如果还要流控信号CTS/RTS每个信号通道都需要光耦。我见过的工业串口隔离板多数是4通道或6通道光耦设计对应完整的RS-232全功能接口。多通道设计时要特别注意两个点一是每个光耦的输入限流电阻和输出上拉电阻必须单独计算不要因为“上一路这么选了”就一路带过二是多个光耦同时翻转时输出侧的电源电流会产生叠加尖峰VCC去耦电容应该按通道数成倍增加必要时在光耦阵列的电源入口处加一颗10~47µF的铝电解电容做蓄能。6.3 电源隔离与ESD保护一起做最后一个重要的点是光耦只隔断了信号地如果设备A和设备B的电源仍然通过同一个DC-DC模块或同一个LDO供电那么两地依然通过电源路径相连信号隔离形同虚设。真正的隔离设计必须包含电源隔离常见做法是用隔离DC-DC模块比如B0505S-1WR2为隔离侧的RS-232收发器单独供电。注意隔离电源模块的输出端也要加滤波电容0.1µF 10µF否则电源纹波会直接影响光耦输出波形。ESD保护也不能漏。RS-232连接器是裸露的金属引脚插拔时很容易积累静电。在连接器入口处加一颗TVS管双向钳位电压选择±7V左右比如SM712能有效保护光耦和后面的MCU引脚。这颗TVS要放在连接器最近处泄放路径越短越好PCB上TVS的地引脚直接接到机壳地或输入侧地。说实话这个项目做下来最大的体会是串口隔离这件事看起来简单但每个参数都值得认真对待。100 kbps是一个“既不算快也不算慢”的速率恰恰是很多通用器件性能曲线的分水岭。如果你正在做类似设计建议第一次打样就把上拉电阻、输入限流电阻都设计成可调的预留几组0603焊盘分别贴1kΩ、2.2kΩ、4.7kΩ实测波形后再定案。另外调试时一定养成先抓波形再动代码的习惯——很多“乱码”问题根子不在软件而在时钟沿上那几微秒的偏差。
返回列表