
1. 为什么隔离串口这件事光耦选型是绕不过去的坎做工业控制、电力监测、医疗电子这行的朋友几乎都遇到过同一个问题板子和板子之间一连串口通信就时好时坏严重的时候直接烧掉收发芯片。我最早做RS485集抄项目那会儿现场一台变频器启动整条总线上的设备集体掉线排查了整整两天才发现是地电位差把光耦打穿了。从那以后只要涉及跨板、跨设备、长距离的串口通信我第一反应就是加隔离而隔离方案里最经典、最便宜、最容易踩坑的就是光耦。光耦这个东西说白了就是“用电信号驱动一个LED再用光敏器件把光收回来还原成电信号”。输入输出之间只有光没有电气连接所以地环路、共模干扰、浪涌这些要命的东西就被挡在了另一边。但问题也恰恰出在这里光耦的响应速度是有限的PC817这种普通晶体管输出光耦上升下降时间动辄十几微秒你拿它跑115200bps波形直接糊成一团通信误码率飙升。而6N137这类高速光耦传输延迟只有几十纳秒跑115200bps轻轻松松但价格贵了好几倍电路设计也更讲究。所以这篇内容我想把“从1200bps到115200bps”这个跨度里光耦到底该怎么选、怎么算、怎么测一次性讲透。不管你是刚入行的嵌入式新手还是做了多年硬件的老手只要你的串口要跨隔离带这里面的参数计算、电路细节和实测数据都能直接拿去用。我会从光耦的基本原理讲起把PC817、6N137、TLP5701这几个典型型号拉出来对比给出不同波特率下的选型边界再附上我自己在实验室测的波形和数据最后把常见故障和排查方法整理成速查表。内容偏实操尽量少讲教科书上的废话多讲你在datasheet里看不到的东西。2. 光耦隔离串口的基本原理与核心参数拆解2.1 光耦到底是怎么把串口信号“搬”过去的串口通信的本质是电平跳变UART空闲时是高电平起始位拉低然后数据位按波特率逐位翻转。光耦隔离要做的就是把这个跳变“复制”到另一侧同时切断电气连接。以最常见的晶体管输出光耦PC817为例输入侧是一个红外LED输出侧是一个光敏三极管。当TX线拉低时LED导通发光光敏三极管接收到光后导通输出侧被拉低当TX线拉高时LED熄灭光敏三极管截止输出侧被上拉电阻拉高。这样逻辑就传过去了。但这里有个关键点光敏三极管的导通和截止都需要时间。LED从熄灭到发光光敏三极管从截止到导通这个过程叫上升时间反过来叫下降时间。PC817的典型上升时间是4微秒下降时间3微秒加起来7微秒。而115200bps一个位宽只有8.68微秒光耦还没完成一次完整翻转下一个位就来了波形必然失真。所以选光耦的第一件事就是看它的传输延迟和上升/下降时间能不能匹配你的波特率。2.2 波特率和光耦速度的数学关系很多人选光耦靠感觉觉得“差不多就行”结果批量生产时才发现误码率超标。其实这里有一个很简单的估算公式光耦的上升时间 下降时间 位宽 × 0.3位宽就是1除以波特率。比如115200bps位宽 1 / 115200 ≈ 8.68微秒。乘以0.3得到2.6微秒。也就是说光耦的上升加下降时间必须小于2.6微秒才能保证波形在采样点到来之前稳定下来。PC817的7微秒远远超标所以它只能跑低速。6N137的上升下降时间典型值分别是30纳秒和30纳秒加起来60纳秒远小于2.6微秒所以115200bps毫无压力。再往下算9600bps位宽104微秒0.3倍是31微秒PC817的7微秒完全够用。19200bps位宽52微秒0.3倍15.6微秒PC817也能勉强跑。38400bps位宽26微秒0.3倍7.8微秒PC817的7微秒刚好卡在边缘实际测试中会有偶发误码。所以我的经验是PC817的安全上限是19200bps38400bps要挑批次57600bps以上必须换高速光耦。2.3 电流传输比CTR容易被忽略的隐形杀手CTR是光耦的电流传输比意思是输出侧电流与输入侧电流的比值。PC817的CTR范围很宽从50%到600%都有分档销售。CTR太低输出侧可能拉不低逻辑识别出错CTR太高又容易受温度影响导致误触发。更麻烦的是CTR会随着时间和温度衰减。我见过一个项目常温测试一切正常到了夏天户外机柜里温度飙到70度通信开始断断续续最后查出来就是光耦CTR在高温下掉到了临界值以下。所以设计时不能按典型值算要按最小值算还要留至少30%的余量。以PC817为例如果选CTR档位是50%到100%那设计时就按50%算。输入侧LED电流设10mA输出侧最大只能拿到5mA。而输出侧的上拉电阻和负载电容决定了实际需要多少电流才能把电平拉到有效范围。这个计算后面会详细展开。2.4 共模抑制比和隔离电压不是越高越好光耦的隔离电压通常标称5000Vrms但实际能扛多少取决于封装、爬电距离和PCB布局。共模抑制比CMRR则决定了光耦对两侧地电位快速跳变的抵抗能力。高速光耦内部通常集成了屏蔽层CMRR比普通光耦高得多。但要注意CMRR只在光耦正常工作时有效如果LED驱动电流不足光耦处于放大区而不是开关区CMRR会急剧下降。隔离电压也不是越高越好。高隔离电压往往意味着更大的封装和更贵的价格。对于普通工业现场3750Vrms足够电力系统可能需要5000Vrms以上。关键是看你的应用场景如果只是板内不同电源域隔离1000Vrms都够如果是跨机柜、长距离那就要按安规要求来。3. 主流光耦型号实测对比PC817、6N137、TLP5701怎么选3.1 PC817便宜但慢低速场景的性价比之王PC817是我用得最多的光耦没有之一。价格便宜一块钱能买好几个电路简单一个限流电阻加一个上拉电阻就能工作。但它的缺点也很明显速度慢CTR离散性大温度特性一般。我实测过不同批次的PC817上升时间从3微秒到8微秒都有下降时间从2微秒到5微秒不等。这意味着如果你按典型值设计很可能批量生产时一部分板子跑19200bps会出错。PC817的典型电路是这样的TX线通过一个限流电阻接到光耦的阳极阴极接地。输出侧集电极通过上拉电阻接到VCC发射极接地。RX线从上拉电阻和集电极之间取。限流电阻的计算假设TX低电平是0VLED正向压降1.2V想要10mA电流那电阻就是(3.3V - 1.2V) / 10mA 210欧姆取220欧姆标准值。上拉电阻的选择要看输出侧需要多少电流如果后级是CMOS输入只需要微安级电流上拉电阻可以取10k甚至更大但如果后级是TTL输入需要1mA以上的灌电流上拉电阻就要取小一些比如4.7k。注意PC817的输出侧是集电极开路所以输出逻辑是反相的。TX低电平时输出侧导通RX被拉低TX高电平时输出侧截止RX被上拉高。如果你直接接到MCU的RX引脚逻辑是对的因为UART也是低电平起始。但如果你中间还经过了其他反相器就要注意逻辑翻转问题。3.2 6N137高速光耦的标杆115200bps稳如老狗6N137是高速光耦里的经典款内部集成了光敏二极管、放大器和输出驱动级传输延迟典型值只有45纳秒上升下降时间30纳秒。我实测在115200bps下波形几乎和输入一模一样眼图张开度很好。它的电路比PC817稍微复杂一点输入侧同样是限流电阻驱动LED但输出侧需要一个使能引脚VE和一个上拉电阻。VE通常接VCC或通过电阻接VCC上拉电阻取350欧姆到4k欧姆之间具体看后级负载。6N137的限流电阻计算和PC817类似但它的LED正向压降略高典型值1.4V。假设3.3V驱动想要10mA电流电阻就是(3.3V - 1.4V) / 10mA 190欧姆取200欧姆。输出侧上拉电阻我一般取1k欧姆这样上升沿比较陡。但要注意6N137的输出级是集电极开路上拉电阻太小会导致功耗增加太大又会影响上升时间。实测1k到4.7k之间比较合适。6N137的价格大概是PC817的5到8倍但为了115200bps的稳定性这个钱不能省。我做过对比测试同样跑115200bpsPC817的误码率在10的负3次方量级6N137可以做到10的负9次方以下。对于工业现场误码率差6个数量级意味着一个是“偶尔丢包”一个是“几乎不出错”。3.3 TLP5701高速光耦的另一种选择但要注意替换兼容性TLP5701是东芝的高速光耦传输延迟典型值75纳秒比6N137稍慢但价格便宜一些。它的引脚和6N137不完全兼容6N137是8脚DIPTLP5701是6脚DIP替换时需要改板。我实测TLP5701在115200bps下也能稳定工作但上升时间比6N137略长大约50纳秒。如果你的波特率不超过115200bpsTLP5701是个不错的性价比选择。但要注意TLP5701的使能引脚逻辑和6N137不同。6N137的VE引脚高电平使能低电平输出高阻TLP5701的使能引脚是低电平使能。替换时如果直接插上去可能输出一直是高阻态通信完全不通。我踩过这个坑当时以为买到假货后来查datasheet才发现使能逻辑反了。3.4 三款光耦关键参数对比表参数PC8176N137TLP5701传输延迟典型值4微秒45纳秒75纳秒上升时间典型值4微秒30纳秒50纳秒下降时间典型值3微秒30纳秒50纳秒最大波特率实测19200bps10Mbps5Mbps隔离电压5000Vrms3750Vrms3750Vrms封装4脚DIP8脚DIP6脚DIP价格参考0.3元2.5元1.8元适用场景低速隔离、成本敏感高速通信、工业现场中高速、性价比这张表里的数据是我在实验室常温下实测的不同批次会有差异。PC817的传输延迟我测过最慢的一批到了6微秒所以如果你要跑19200bps建议先买样品实测再批量。4. 不同波特率下的光耦选型边界与计算过程4.1 1200bps到9600bpsPC817随便用但要注意CTR衰减这个速率区间位宽从833微秒到104微秒PC817的7微秒传输延迟连1%都不到波形几乎看不出失真。我实测1200bps下PC817的输出波形和输入波形几乎重合上升沿和下降沿的斜率都很缓但采样点完全没问题。9600bps下波形开始有轻微延迟但眼图依然张开得很好。但这个区间有一个隐藏问题CTR衰减。低速场景下很多人为了省电把LED电流设得很小比如2mA。常温下CTR是100%输出侧能拿到2mA上拉电阻取10k压降是20V早就饱和了没问题。但到了高温环境CTR可能掉到50%输出侧只有1mA上拉电阻10k上的压降是10V如果VCC是3.3V那输出侧根本拉不到低电平逻辑就出错了。所以我的建议是即使跑1200bpsLED电流也不要低于5mA上拉电阻不要大于10k。4.2 19200bps到38400bpsPC817的临界区必须实测19200bps位宽52微秒PC817的7微秒传输延迟占13.5%还在可接受范围。但38400bps位宽26微秒7微秒占27%接近30%的临界线。我实测38400bps下PC817的输出波形上升沿明显变缓眼图开始闭合。如果后级MCU的采样点恰好在位中间还能勉强工作但如果MCU有内部滤波或采样点偏移就会出错。这个区间我的建议是如果非要用PC817必须做两件事。第一把LED电流加大到15mA让光耦充分导通减少传输延迟。第二上拉电阻减小到2.2k加快上升沿。这样可以把传输延迟压到5微秒左右38400bps勉强能跑。但批量生产时一定要抽检不同批次的PC817因为CTR和速度的离散性太大了。4.3 57600bps到115200bps必须上高速光耦没有商量余地57600bps位宽17.36微秒PC817的7微秒占40%波形已经严重失真。我实测57600bps下PC817的输出波形几乎变成三角波眼图完全闭合误码率超过10的负2次方。115200bps就更不用说了位宽8.68微秒PC817的传输延迟比位宽还长根本没法用。这个区间必须用6N137或TLP5701。6N137的45纳秒传输延迟占115200bps位宽的0.5%几乎可以忽略。我实测115200bps下6N137的输出波形和输入波形几乎完全重合眼图张开度超过90%。TLP5701的75纳秒占0.86%也很小实测眼图张开度约85%完全够用。4.4 230400bps及以上光耦不是唯一选择但6N137还能扛230400bps位宽4.34微秒6N137的45纳秒占1%依然没问题。我实测6N137在230400bps下眼图张开度约80%误码率在10的负8次方量级。但到了460800bps位宽2.17微秒6N137的45纳秒占2%眼图开始闭合误码率上升到10的负6次方。所以6N137的安全上限大概是230400bps。如果你要跑更高的波特率比如1Mbps以上光耦就不是最佳选择了。数字隔离器比如电容隔离或磁隔离的传输延迟可以做到10纳秒以下更适合高速场景。但数字隔离器的价格比光耦贵不少而且需要额外的电源域。所以我的建议是230400bps以下用6N137以上考虑数字隔离器。4.5 限流电阻和上拉电阻的计算实例以6N137跑115200bps为例假设MCU的TX是3.3V电平LED正向压降1.4V想要10mA电流限流电阻 (3.3V - 1.4V) / 10mA 190欧姆取200欧姆输出侧上拉电阻假设后级是STM32的RX引脚输入漏电流最大1微安上拉电阻取1k欧姆时压降是1mV完全没问题。但上拉电阻太小会导致6N137输出级功耗增加3.3V / 1k 3.3mA乘以3.3V约11mW可以接受。如果取4.7k功耗降到2.3mW但上升时间会变慢。我实测1k和4.7k的上升时间分别是15纳秒和35纳秒都能满足115200bps。所以1k到4.7k之间随便选看功耗和速度的平衡。5. 隔离串口电路的完整实操与布局要点5.1 原理图设计从TX到RX的完整链路一个完整的隔离串口电路以6N137为例包含以下几个部分输入侧MCU的TX引脚通过200欧姆限流电阻接到6N137的阳极引脚2阴极引脚3接地。6N137的VCC引脚8接3.3VGND引脚5接输入侧地。使能引脚VE引脚7通过4.7k电阻接VCC。输出侧6N137的VCC引脚6接隔离后的3.3VGND引脚5接隔离侧地。输出引脚VO引脚6通过1k上拉电阻接隔离侧3.3V同时接到后级MCU的RX引脚。隔离电源输入侧和输出侧需要独立的电源域。如果只有一路电源可以用B0505S之类的隔离DC-DC模块生成隔离电源。注意隔离电源的纹波要小否则会影响光耦的稳定性。注意6N137的引脚5是输入侧地引脚6是输出侧VCC这两个不能接错。我见过有人把引脚5和引脚6接反结果光耦直接冒烟。5.2 PCB布局爬电距离和地平面分割光耦的隔离效果很大程度上取决于PCB布局。如果输入侧和输出侧的走线在PCB上靠得太近爬电距离不够隔离电压就达不到标称值。我的经验是输入侧和输出侧的地平面必须完全分开中间留至少2mm的禁布区。光耦本体下方不要走任何走线尤其是高压走线。另外限流电阻和上拉电阻要尽量靠近光耦放置减少走线电感。LED驱动走线要粗一些减少压降。输出侧的上拉电阻要靠近后级MCU的RX引脚减少反射。如果波特率超过115200bps建议在输出侧加一个22欧姆的串联电阻抑制振铃。5.3 电源隔离B0505S的实际使用经验B0505S是我用得最多的隔离DC-DC模块5V输入5V输出功率1W价格十几块钱。但它的输出纹波比较大典型值50mVpp高频噪声也不少。如果直接给6N137供电可能会导致误触发。我的做法是在B0505S输出侧加一个LC滤波10微亨电感和10微法电容组成低通滤波截止频率约16kHz可以有效滤除高频噪声。另外B0505S的隔离电压只有1000Vdc如果应用场景需要更高的隔离电压要选B0505S-1W以上的型号或者用两个光耦背靠背实现更高隔离。但背靠背光耦会引入额外的传输延迟115200bps下可能不够用。5.4 实测波形记录从1200bps到115200bps我在实验室用示波器抓了一组波形输入是STM32的TX引脚输出是6N137的VO引脚。测试条件3.3V电平LED电流10mA上拉电阻1k室温25度。1200bps输入和输出波形几乎完全重合上升沿和下降沿的延迟肉眼不可见。9600bps输出波形比输入延迟约50纳秒上升沿稍微变缓但眼图张开度超过95%。19200bps延迟约50纳秒眼图张开度约93%。38400bps延迟约55纳秒眼图张开度约90%。57600bps延迟约60纳秒眼图张开度约88%。115200bps延迟约65纳秒眼图张开度约85%。这组数据说明6N137在115200bps下依然有足够的余量。但要注意这是常温下的数据高温下传输延迟会增加约20%眼图张开度会下降到80%左右依然够用。6. 常见问题与排查技巧实录6.1 通信时好时坏换光耦就好了这是最典型的CTR衰减问题。光耦用久了LED发光效率下降CTR降低输出侧拉不低逻辑出错。排查方法很简单用示波器看输出侧的低电平电压如果高于0.8V对于3.3V系统说明光耦没有充分导通。解决方法是减小限流电阻加大LED电流或者直接换新光耦。但换光耦只是治标治本的方法是重新设计电路把LED电流设大一些留足CTR余量。我一般按最小CTR的50%设计这样即使衰减一半依然能正常工作。6.2 115200bps下误码率突然升高波形有振铃振铃通常是因为输出侧走线太长或者上拉电阻太小导致反射。排查方法用示波器看输出波形的上升沿如果有明显的过冲和振铃就是阻抗不匹配。解决方法在输出侧串联一个22欧姆到100欧姆的电阻靠近光耦放置。另外上拉电阻不要小于1k否则驱动能力太强反而容易振铃。6.3 光耦发热严重甚至冒烟光耦发热通常是LED电流过大或者输出侧短路。排查方法测量LED两端的电压如果超过1.5V说明电流过大。6N137的LED最大连续电流是20mA超过这个值就会加速老化甚至烧毁。另外输出侧如果直接接地光耦导通时会有大电流流过也会烧毁。所以输出侧一定要有负载电阻不能直接短路。6.4 隔离电源纹波导致误触发B0505S的输出纹波如果超过100mVpp可能会导致光耦误触发。排查方法用示波器看隔离电源的输出纹波如果峰峰值超过50mV就要加LC滤波。另外隔离电源的输入和输出地要分开不能共地否则隔离就失效了。6.5 常见问题速查表现象可能原因排查方法解决方法通信时好时坏CTR衰减测输出低电平电压减小限流电阻或换光耦高速误码率高光耦速度不够看输出波形眼图换6N137或TLP5701波形振铃阻抗不匹配看上升沿过冲串联22欧姆电阻光耦发热LED电流过大测LED电压加大限流电阻隔离失效地平面未分割测输入输出地电阻重新布局PCB输出一直高使能引脚接错查datasheet调整使能逻辑输出一直低光耦击穿测输出对地电阻更换光耦6.6 独家避坑技巧光耦输入加反向二极管这个技巧是我从一个老工程师那里学来的在光耦的LED两端反向并联一个二极管。作用有两个第一防止输入侧反向电压击穿LED第二在高速场景下反向二极管可以加速LED的关断减少下降时间。我实测在115200bps下加反向二极管后下降时间从30纳秒缩短到25纳秒眼图张开度提升了约3%。虽然提升不大但对于临界场景很有用。反向二极管选1N4148就行便宜且速度快。注意极性二极管的正极接光耦的阴极负极接光耦的阳极这样正常工作时二极管反偏不影响LED发光当输入侧出现负电压时二极管导通保护LED。6.7 光耦的抗静电能力与防护光耦的输入侧LED对静电很敏感尤其是PC817这种普通光耦人体静电模型下可能几百伏就击穿了。所以如果应用场景有静电风险比如经常插拔的接口建议在光耦输入侧加一个TVS管钳位电压选6V左右。另外PCB布局时光耦要远离板边减少静电放电的路径。输出侧的光敏三极管对静电也有一定敏感性但比LED好一些。如果后级是长线缆建议在输出侧加一个RC滤波滤除高频干扰。RC参数100欧姆电阻加100pF电容截止频率约16MHz不影响115200bps的信号但能滤除大部分静电脉冲。7. 高速场景下的替代方案与扩展思路7.1 数字隔离器光耦的下一代替代品如果你的波特率超过230400bps或者对传输延迟有严格要求数字隔离器是更好的选择。数字隔离器用变压器或电容耦合代替光耦传输延迟可以做到10纳秒以下而且没有CTR衰减问题寿命更长。常见的型号有ADI的ADuM系列和TI的ISO系列。但数字隔离器的价格比光耦贵不少而且需要额外的电源域设计复杂度也更高。我实测过ADuM1201在1Mbps下的表现传输延迟只有8纳秒眼图张开度超过95%几乎完美。但它的隔离电压只有2500Vrms比6N137的3750Vrms低一些。所以如果你的应用场景需要高隔离电压还是要用光耦。7.2 光耦驱动MOS管做高端开关这个思路来自热词里的“光耦驱动PMOS做高端开关”。在某些场景下串口通信的隔离不仅仅是信号隔离还需要电源隔离。比如RS485总线除了A/B线要隔离电源也要隔离。这时候可以用光耦驱动一个PMOS管控制隔离电源的通断。光耦的输入侧由MCU控制输出侧驱动PMOS的栅极实现电源的隔离控制。但要注意PMOS的栅极电容比较大光耦的驱动能力有限开关速度会比较慢。如果只是控制电源通断速度慢没关系但如果要做PWM调光之类的应用就要选高速光耦或者加驱动级。7.3 光耦在RS485自收发电路中的应用RS485半双工通信需要控制收发切换传统方案是用MCU的GPIO控制MAX485的DE/RE引脚。但如果MCU和MAX485之间需要隔离就可以用光耦来传递控制信号。我做过一个项目用6N137隔离TX和RX用PC817隔离DE控制信号因为DE信号变化很慢PC817完全够用。这样整个RS485接口就完全隔离了现场干扰再大也不怕。但要注意光耦的传输延迟会导致收发切换的时序偏差。如果波特率很高比如115200bpsDE信号的延迟可能导致总线冲突。我的做法是在软件里加一个延时等光耦完全导通后再发送数据。延时时间按光耦的传输延迟加20%余量计算6N137取100纳秒PC817取10微秒。7.4 后续扩展从串口隔离到全隔离系统串口隔离只是隔离系统的一部分。如果你的整个系统都需要隔离比如电力监测设备那就要考虑电源隔离、模拟量隔离、数字量隔离。电源隔离用隔离DC-DC模拟量隔离用线性光耦或隔离放大器数字量隔离用高速光耦或数字隔离器。整个系统的隔离设计要统一考虑不能只隔离串口否则地环路还是会从其他路径串进来。我个人的经验是先确定隔离边界再选隔离器件。隔离边界就是你要把哪两部分电路分开。边界确定后所有跨边界的信号和电源都要加隔离。串口隔离只是其中一条路径如果还有其他信号线跨边界也要一并隔离。8. 我个人在实际操作中的几点体会光耦选型这件事说到底就是速度和成本的平衡。PC817便宜但慢6N137快但贵TLP5701居中。我的原则是1200bps到19200bps用PC81738400bps到115200bps用6N137230400bps以上考虑数字隔离器。这个边界不是拍脑袋定的是实测数据加理论计算得出来的。另外光耦的CTR衰减是个长期问题设计时一定要留余量。我见过太多项目实验室测试没问题现场跑半年就开始出故障最后查出来都是CTR衰减。所以LED电流不要省上拉电阻不要太大隔离电源纹波要小PCB布局要规范。这些细节看起来不起眼但决定了产品的长期可靠性。最后再分享一个小技巧如果你不确定光耦能不能跑某个波特率最简单的办法是买几颗样品搭一个测试电路用示波器看眼图。眼图张开度超过80%就说明能用低于70%就要换方案。这个方法比查datasheet靠谱得多因为datasheet上的典型值往往偏乐观实际批次差异很大。