做单片机开发的人几乎都遇到过这种“薛定谔的I/O口”昨天还正常今天上电就短路拿手碰一下引脚都可能复位示波器一挂上去又好像什么都没发生。我自己最惨的一次是在控制24V继电器时没做隔离继电器一吸合STM32的引脚直接对地击穿拆了芯片后拿万用表一量内部CMOS管已经烧成了低阻PCB上只留下一道浅浅的痕迹。从那以后我养成了一个习惯任何要引出板的I/O口先画保护电路再写代码。单片机I/O口保护说穿了就是围绕五件事过压、过流、静电放电ESD、感性负载反电动势、地环路干扰。网上聊这个主题的文章不少但大多只给一张电路图不讲参数怎么算、为什么这么选照着抄很容易翻车。所以这篇我把实际项目里用过的五种方案——光耦隔离、二极管钳位、TVS管、串联电阻、三极管/缓冲器驱动——按从“彻底隔离”到“低成本钳位”的顺序全部拆开讲每一种都附上参数计算和适用边界最后给出一套组合保护链的参考。不管你是刚画第一块51最小系统的新手还是已经用STM32做过几个产品、被售后问题反复骚扰的老开发这五个方案都会有用。1. 先讲清楚I/O口为什么会烧一锅端掉所有失效机理1.1 过压、过流、静电、地环路四种死法不是一回事很多初学者以为I/O口损坏就是“电压太高烧掉了”其实不然。单片机的I/O口失效通常可以归成四类机理完全不同防护思路也完全不同。过压是最容易理解的外部电压超过芯片引脚的最大额定值一般在VDD0.3V或5.5V左右视具体器件而定芯片内部那个寄生二极管就会正向导通电流直接灌进电源轨。如果进来的电流大到内部敷铜铝线承受不住金属线就会熔断表现为引脚开路如果局部温度过高导致氧化层击穿表现为引脚对地或对电源短路。过流则常见于直接用I/O口驱动LED、蜂鸣器、继电器这类负载。很多人觉得“51单片机I/O口能输出20mA”就把LED直接挂在P1口上电阻都不加。结果就是长时间超过芯片手册标称的最大灌电流/拉电流内部MOS管发热时间一长输出级损坏。这种情况在5V的51系统里尤其常见因为电平高、压降大电流更容易冲上去。静电放电ESD又是另一个维度的问题。人体或设备积累了几千伏甚至上万伏的静电在接触金属外壳或接插件的一瞬间释放脉冲宽度只有纳秒级但峰值电流可以到几十安培。这种脉冲不需要多高的平均功率就能把CMOS栅氧化层击穿。所以很多产品“放着放着就坏了”或者冬天干燥季节故障率明显上升大概率就是静电。别以为只有工业环境才有静电办公室里的塑料椅、化纤衣服、干燥的北方空气都是静电源。最容易被忽视的是感性负载反电动势。继电器线圈、电机绕组、电磁阀线圈都本质上是电感电流被切断的瞬间电感为了维持电流会产生反向电动势幅度可以去到几十伏甚至几百伏与电源电压叠加在一起直接打在驱动管或I/O口上。很多第一次玩继电器的新手都会踩这个坑三极管驱动继电器逻辑上完全正确但没加续流二极管结果烧了I/O口甚至三极管还以为是驱动电路哪根线接错了。还有一种更隐蔽的失效叫地环路干扰。控制板和外部设备各自用独立的电源供电两个地之间的电位差可能只有零点几伏但如果信号线直接连接这个电位差就会在信号回路里产生电流。地环路电流倒灌进I/O口后轻则逻辑电平混乱重则让I/O口长时间承受反向偏置最后损坏。两个设备接地良好的时候看不出来等哪天负载变化导致地电位波动故障就出来了。1.2 芯片内部那对寄生二极管能扛多少几乎所有的CMOS芯片输入端内部都有一对寄生二极管一个连接在引脚和VDD之间一个连接在引脚和VSS之间方向是反向偏置。这对二极管本身是芯片ESD保护结构的一部分当引脚电压超过VDD一个二极管压降、或者低于VSS-一个二极管压降时它们会正向导通把电流泄放到电源轨或地上。很多工程师就误以为“芯片自带ESD保护所以可以随便折腾”。实际完全不是。芯片内部的寄生二极管能承受的电流只有毫安级别而且是按纳秒级ESD脉冲设计的目标只是让芯片在生产装配过程中不被静电打死根本没打算让它在持续过压下长期工作。如果你的I/O口被外部短接到12V几毫安的电流持续流进去芯片内部的寄生二极管和电源轨上的铜线很快就会被热量烧穿。记住一句话外部保护电路的本质就是在芯片内部寄生二极管导通之前把过压电流接管过来并且把它限制在一个安全的量级。理解这一点后面所有方案的设计逻辑就都清晰了。2. 方案一光耦隔离——从物理上切断“共地”这条命脉2.1 光耦不是“隔离IC”要把电流算清楚光耦隔离是五种方案里唯一能做到“物理隔离”的。它的核心结构就是一个发光二极管加一个光敏三极管输入侧和输出侧之间只有光信号传输没有电气连接。用光耦隔离I/O口最大的意义不是“防过压”而是“切断地环路”。举个例子你用一个24V供电的传感器检测信号传感器地和单片机地之间如果没有电气联系直接用导线把信号接到I/O口那么两个地之间的电位差就全部落在信号线上可能会形成持续的电流回路。如果中间隔一个光耦输入侧接传感器输出侧接单片机两侧完全隔离地环路就不存在了。但光耦的选型和参数计算很多人做得非常随意。觉得反正PC817便宜发光二极管串个电阻、输出三极管接个上拉就好了结果做出来的电路要么信号传不过去要么波形严重变形。光耦在设计时要算清楚的电流只有两部分输入侧流过LED的电流IF输出侧流入三极管基极的电流由CTR决定。输入侧的核心是给LED限流输出侧的核心是确定上拉电阻能不能让输出三极管饱和导通。2.2 PC817参数计算全程限流电阻和上拉电阻到底取多少以最常用的PC817为例。它的LED额定电流一般是50mA正常工作推荐5~20mA正向压降VF典型值1.2V左右。假设你要采集一个24V的工业开关量信号输入侧限流电阻的计算公式是Rin (Vin - VF) / IF取IF 10mA则Rin (24 - 1.2) / 0.01 2.28kΩ取标准值2.2kΩ。这里有个容易被忽略的细节如果你的输入电压范围很宽比如实际现场是18V到30V那么你按24V算出来的电阻在30V时IF (30 - 1.2) / 2.2k 13mA没超过LED最大电流但在18V时IF (18 - 1.2) / 2.2k 7.6mA还在10mA附近问题不大。但如果输入电压波动范围很大就要按最大电压来校核LED电流按最小电压来校核CTR是否足够两头都要照顾到。输出侧的电阻计算更容易出错。PC817按分档不同CTR电流传输比可以从50%一直到600%温度升高、LED老化之后CTR还会下降。设计时必须按“最小CTR”来算否则低温或若干年后输出三极管的驱动电流不够信号就传不过去。假设你用的是PC817C档CTR典型范围200%~400%。为了留裕量我习惯按100%做保守校验。输入IF 10mA输出侧三极管可用的集电极电流IC理论上就有10mA。输出侧接3.3V单片机上拉电阻取4.7kΩ则输出三极管要吸收的电流Iup (3.3 - 0.2) / 4.7k ≈ 0.66mA。0.66mA远小于10mA所以三极管一定能饱和输出低电平约0.2V满足单片机低电平要求。实际上你会发现上拉电阻在4.7k到10k之间都能工作取小点波形更陡取大点更省电。2.3 低速大电流和高频信号的隔离选型差异光耦一个很大的限制是速度。普通PC817的上升沿和下降沿时间大概在3~5微秒级用来传1kHz的继电器控制信号、按钮信号完全没问题但要是拿去隔离UART串口波特率一高波形就变成圆弧乱码立刻出现。我自己试过用PC817隔离115200波特率的串口结果完全没法用换成6N137高速光耦后才恢复正常。所以在选光耦时先问自己两个问题信号频率是多少要不要长期稳定传输1kHz以下的开关量PC817、TLP521这些便宜货完全能胜任几十kHz以上的信号老老实实上6N137或者数字隔离器。另外还要注意光耦输入侧LED的反向耐压一般只有几伏如果输入侧是长线缆、容易感应出负电压需要在LED两端反向并联一个二极管把负压钳到-0.7V左右或者串入一个1N4148挡一挡。光耦还有一个成本容易被低估的陷阱想要真正隔离输入侧和输出侧的电源也必须隔离否则光耦隔离了信号地电源还是通过DC-DC模块连在一起等于白隔离。所以光耦常常要配合隔离电源模块使用总体成本就上去了。这也是为什么我在很多产品里能用二极管钳位和串联电阻解决的就尽量不上光耦——成本差太多。3. 方案二二极管钳位——每个I/O口都有的“安全护栏”3.1 为什么不能只靠单片机内部钳位二极管钳位应该是所有方案里最“小而美”的两个二极管一只阳极接I/O、阴极接VCC另一只阳极接GND、阴极接I/O。正常工作时二极管反偏对信号基本没影响一旦I/O电压超过VCC0.3V上面的二极管正向导通把电压钳在VCC 二极管VF一旦电压低于GND - 0.3V下面的二极管导通把电压钳在-0.3V左右。有的开发者觉得这跟芯片内部寄生二极管的工作原理一样没必要外部再接。问题在于芯片内部的寄生二极管电流承受能力太弱持续几个毫安就可能损坏。外部二极管可以选额定电流200mA甚至更大的型号相当于给I/O口加了一个“大号安全气囊”。你可以这么理解芯片内部寄生二极管是接送快递的小推车外部钳位二极管是重型卡车ESD脉冲来了不能指望小推车去拉几十吨的货。3.2 肖特基二极管选型BAT54、BAT54S还是ESD阵列钳位二极管的选择有个关键指标正向压降VF。用普通1N4148做钳位VF约0.7V3.3V单片机VCC 3.3V时上钳位到3.3 0.7 4.0V已经超过了很多MCU引脚绝对最大额定值通常是VDD 0.3V或者3.6V。所以3.3V系统里我强烈建议用肖特基二极管比如SOT-23封装的BAT54系列VF只有0.3V左右3.3V 0.3V 3.6V刚好卡在极限边缘。BAT54S里面包含两个单独的肖特基二极管一颗芯片就能完成上下钳位布板还特别省地方。低速数字信号、GPIO按键输入、接插件信号都可以直接上这颗。如果信号频率比较高则要考虑BAT54的结电容虽然比普通硅二极管小但几十pF量级对MHz级信号还是有一点影响高速线上更推荐用低电容的ESD保护器件本质上是内部集成了超低电容钳位二极管的阵列。选型时还有一个容易被忽略的参数漏电流。肖特基二极管漏电流比硅二极管大BAT54的漏电流在常温下大概2μA温度升高后还会变大。如果你I/O口接的是高阻抗模拟信号比如一个10kΩ源阻抗的ADC采样通道2μA的漏电流在10kΩ上就会产生20mV的误差这对12位ADC来说是不能接受的。模拟通道上要么换用低漏电流的专用ESD管要么在二极管之后再加一级运放缓冲。3.3 钳位到哪条电源轨3.3V、5V还是保护地二极管钳位电路有个非常反直觉的坑很多人直接把二极管钳位到3.3V电源轨上以为这就安全了。实际上一旦外部突然灌入大电流这个电流会通过二极管直接注入3.3V电源把电源电压瞬间抬高。3.3V电源被抬到4V、5V整板其他芯片可能集体异常甚至LDO都被打挂。所以钳位二极管并不是“接到VCC就行”还要考虑电源轨能不能吸收这个冲击电流。稳妥的做法有两种要么在VCC到GND之间放一个足够大的储能电容比如100nF加1μF组合让冲击电流先被电容吸收要么不要让钳位二极管直接钳到敏感的3.3V轨而是钳到一条“保护轨”上比如在I/O口先串一个几百欧到几kΩ的电阻再由二极管钳位到3.3V。串阻限制了冲击电流的大小电源轨承受的冲击就小得多这正是后面方案四要和方案二搭配使用的原因。如果你实在不放心也可以这样设计上钳位二极管接到5V电源轨前提是这个I/O口能容忍5V输入51单片机这类5V器件没问题下钳位接地。这样3.3V电源不会被打扰只要5V轨再单独加一个TVS做兜底就行。4. 方案三TVS管——瞬态高压的“泄洪闸”4.1 TVS管动作原理与稳压管的本质区别TVSTransient Voltage Suppressor二极管是专门用来对付瞬态过压的也是所有I/O口保护方案中和“静电放电”“雷击浪涌”绑定最深的一个。它的工作原理是雪崩击穿电压低于反向截止电压时TVS呈高阻漏电流很小电压一旦超过击穿电压VBR它迅速雪崩导通把电压钳在钳位电压VC附近。区别在于稳压管设计成可以长时间工作在击穿状态用来稳定电压TVS则专门为瞬时大电流设计能在纳秒级时间内把几千瓦的脉冲功率泄放到地但你不能把它当稳压管用不能让它长时间导通否则它会直接烧毁。打个比方稳压管是一个能持续分流的水龙头TVS是一个感应到洪水就自动全开的大闸门开闸放水很猛但开久了闸门自己也受不了。4.2 选型参数逐项拆解VRWM、VBR、VC、PPP选TVS时最重要的几个参数以信号线上常用的SMBJ3.3A单向TVS为例VRWM反向截止电压是3.3V意思是信号电压不超过3.3V时TVS完全不导通。实际选型时VRWM要高于信号正常工作的最高电压比如3.3V逻辑信号选3.3V或稍高一点的5V档不要让正常信号把TVS触发。VBR击穿电压是3.85V~4.53V超过这个区间TVS开始雪崩。注意VBR是一个范围不同批次、不同温度会有差异设计时要留足裕量。VC钳位电压最大6.4V这是TVS在承受额定峰值脉冲电流时两端实际会出现的最高电压。这个值必须低于被保护器件的绝对最大额定值。比如很多3.3V单片机的I/O最大只能到3.6V那么单独一个VC6.4V的TVS其实保护不了I/O显然需要串联电阻先把电流限制住。PPP峰值脉冲功率是TVS的“吸收能力”指标。SMBJ系列是600WSMAJ是400WSMCJ可以到1500W甚至更高。选多大取决于你的应用环境室内板级ESD防护400W就够户外通信接口或者雷电多发地区就得用SMCJ这种大功率的。单向与双向的选择也容易搞混。信号只在0到VCC之间摆动的用单向TVS方向并到GND信号可能摆到负压的比如RS-485总线、交流采样信号必须用双向TVS否则负压过来直接烧TVS。4.3 高速信号线上低电容TVS的必要性普通TVS有比较大的结电容像SMBJ这类功率大一点的结电容可以到几百pF。几百pF对于一个几兆赫兹的数字信号来说可能就是致命伤边沿变慢、信号质量急剧恶化。所以TVS不能“随便抓一颗就放上去”高速信号线必须选低电容TVS或者专用的ESD保护阵列。现在市面上有很多集成式的ESD保护器件封装极小内部结构其实是“低电容二极管阵列 TVS”结电容可以做到1pF以下专门用于USB、HDMI这类高速接口。对单片机I/O来说如果不是特别高速的通信线普通贴片TVS就够用。我自己的习惯是RS-485、CAN、USB这类通讯接口用专用低电容ESD管普通的GPIO、按键、继电器控制线就用普通TVS成本能省不少。另外TVS的摆放位置比很多人想象的还关键。ESD脉冲是在连接器处进入的TVS一定要尽量靠近连接器放置主控芯片一侧的串联电阻要放在TVS之后这样ESD一进门就被TVS泄放到地剩下的小尾巴再被电阻磨一磨。要是TVS放得太远走线太长ESD脉冲的电压会在走线电感上叠加出额外的尖峰TVS还没来得及反应过来后面的芯片已经被打了。5. 方案四串联电阻——最简单也最容易被低估的保护5.1 串联电阻真正的保护逻辑限流优先于限压很多初学者不理解串联电阻到底保护了什么。它不能把12V变成3.3V因为I/O口在输入状态时是高阻抗电阻两端几乎没有电流压降也几乎为零。所以如果I/O口后面没有任何钳位或泄放通路串联电阻对过压几乎没有作用12V照样施加到引脚上。串联电阻的真正意义是限流当引脚电压超过芯片寄生二极管导通电压或外部钳位二极管导通电压时串联电阻决定流进引脚、流经二极管的电流有多大。举个例子如果I/O口内部寄生二极管导通外部误接12V没有串联电阻时电流理论上可以到几百毫安甚至几安培瞬间烧穿芯片串入10kΩ电阻后12V里绝大部分压降落在电阻上流进引脚的电流只有不到一毫安芯片内部的寄生二极管就能扛住。所以“串联电阻”几乎总是和“二极管钳位”搭配使用单独使用时它更多是在限制电流而不是限制电压。5.2 与钳位二极管搭配时的电阻计算串联电阻与钳位二极管搭配是最经典的I/O口保护结构我强烈建议所有连接器信号、板外信号都加上这一层。计算公式其实很简单钳位电压大约等于VCC VF肖特基取0.3V普通硅管取0.7V你要做的是决定允许的最大钳位电流然后反推电阻。比如你的3.3V单片机I/O口可能被错误地接触到12V用了BAT54钳位后钳位电压约3.6V。你希望钳位电流不超过5mA那么R (12 - 3.6) / 0.005 1.68kΩ取标准值1.8kΩ或2.2kΩ。有人觉得电流取1mA更安全那R (12 - 3.6) / 0.001 8.4kΩ取10kΩ也行。但电阻越大信号边沿越缓高频信号和PWM波形就会变形。RC时间常数由串联电阻和引脚寄生电容共同决定1kΩ加20pF的RC是20ns几乎可以忽略10kΩ加20pF就是200ns到了1MHz以上信号就变差了。还有一个容易被忽视的点电阻本身的功率。持续误接12V时串联电阻上的功耗是 (12 - 3.6)^2 / R。取1.8kΩ时是39mW取100Ω时是705mW这时候必须用1W或更大功率的电阻否则电阻自己先烧冒烟。瞬态脉冲时间很短的话功率可以超过额定功率但要按脉冲功率曲线去查不能拍脑袋。实际上很多芯片厂商在数据手册里都会建议外部I/O串330Ω到1kΩ的电阻目的就是兼容ESD保护和信号完整性的折中。我自己的板子上凡是接到排针、接插件、面板按键的GPIO默认都串一个330Ω或1kΩ电阻万用表表笔戳上去也能挡一挡。5.3 51单片机P0口为什么天然需要这种思路聊到串联电阻就绕不开51单片机的P0口。老51的P0口是开漏结构没有内部上拉做输出高电平时必须外加一个上拉电阻。很多人第一次画51最小系统P0口直接接LED不加上拉要么LED不亮要么输出电平不对。这个上拉电阻在功能上是给P0口提供高电平在保护视角下也顺便起到了限流作用P0口外部如果被短路到地电流会被上拉电阻限制住不至于直接烧坏I/O口。以LED驱动的典型电路为例5V供电、LED压降2V、工作电流5mA串联电阻R (5 - 2) / 0.005 600Ω取标准值680Ω或1kΩ都行。这个时候电阻既是LED的限流电阻又是I/O口的保护电阻。51单片机的P0口和P1~P3口电气结构不太一样P1~P3是准双向口内部有弱上拉外部一般不接上拉也能工作但驱动能力比P0灌电流方式弱。无论哪个口养成串电阻的习惯都不会亏。串联电阻看起来是最不起眼的保护但在实际产品的返修率降低上往往是最见效、性价比最高的一个。一个电阻几分钱换来的可能是少烧一个几十块钱的MCU。6. 方案五三极管与缓冲器——把I/O口从“出力”变成“指挥”6.1 继电器驱动电路续流二极管是救命的I/O口最危险的负载就是继电器这类感性负载。三极管在这里的作用是让单片机I/O口只输出一个很小的基极电流真正的大电流由三极管的集电极回路去承担。说白了就是让I/O口“只当指挥不当苦力”。先看一个标准的低边驱动结构单片机I/O通过基极电阻接到NPN三极管的基极发射极接地继电器线圈接在VCC和三极管集电极之间。单片机输出高电平时三极管导通继电器吸合输出低电平时三极管截止继电器释放。这个电路里有三个地方不能省。第一是基极电阻阻值要保证三极管深度饱和导通。第二是基极下拉电阻防止单片机上电瞬间I/O处于高阻状态时三极管基极被干扰误触发导致继电器误动作。第三就是继电器线圈两端反并联的续流二极管这是最重要也最容易被漏掉的。续流二极管的作用前面已经讲过当三极管关断、继电器线圈电流被切断的瞬间线圈会感应出几十伏甚至上百伏的反电动势如果没有续流二极管这个反电动势会直接叠加在集电极电压上瞬间击穿三极管。加了续流二极管阳极接三极管集电极阴极接电源正极之后断电瞬间线圈电流通过二极管继续流动反电动势被钳在约0.7V三极管就安全了。6.2 三极管基极电阻计算与饱和条件基极电阻的计算采用“深度饱和”的思路。以12V继电器为例线圈电阻约171Ω工作电流IC 12 / 171 ≈ 70mA。用常见的S8050三极管datasheet标称hFE在100~300之间按最保守的最小值100算要保证集电极电流70mA基极电流至少要0.7mA。为了确保三极管饱和导通我习惯把基极电流取到理论值的3~5倍也就是2~3.5mA。I/O口输出高电平如果是3.3V三极管VBE约0.7V那么基极电阻Rb (3.3 - 0.7) / 0.002 ≈ 1.3kΩ取标准值1kΩ。这样实际基极电流是2.6mA饱和深度足够继电器动作稳定。用5V的51单片机时Rb (5 - 0.7) / 0.002 ≈ 2.15kΩ取2.2kΩ也没问题。基极下拉电阻一般取10kΩ到100kΩ不影响正常驱动又能防止误触发。6.3 74HC244缓冲器在输入采集中的应用除了驱动端输入端的大电流隔离也可以靠缓冲器。比如要采集很多个外部按键、拨码开关信号信号线走线比较长直接进单片机I/O口被静电打一下、被线缆感应噪声干扰一下都可能出问题。用一个74HC244这类八路缓冲器做输入侧隔离单片机只读缓冲器的输出外部信号先经过缓冲器处理相当于多了一道“防火墙”。74HC244的好处是输入阻抗高、输出驱动能力强更重要的是它的输入端一般自带ESD保护结构I/O口不至于直接暴露在外部环境中。实际使用中我还会在缓冲器的每个输入引脚上串一个1kΩ电阻这样即使外部长期误接电源电压电流也被限制住了。缓冲器的输出侧到单片机之间还可以再串一个100Ω到330Ω的电阻形成层层设防。7. 五种方案横向对比与一套完整的组合保护链7.1 选型决策什么场景该上什么防护五种方案各有侧重不是越多越好而是按威胁类型组合。我自己做选型时心里大概有一张优先级表。表格可以这样看信号是否出机箱、是否跨设备供电、是否驱动感性负载、是否可能误接高压。按这个顺序逐个排查方案自然就浮出来了。方案是否隔离主要防什么抗过压能力响应速度成本典型场景光耦隔离是地环路、电压转换、共模干扰强慢普通光耦较高跨设备开关量采集、继电器控制隔离二极管钳位否过压限幅、ESD小尾巴中配合电阻快低板内I/O过压保护TVS管否ESD、雷击浪涌强瞬时极快低到中外部接插件、通信接口、电源入口串联电阻否限制电流、减小信号振铃弱单独无极低所有I/O口的通用标配三极管/缓冲器否缓冲器无隔离大电流/感性负载、I/O过载中中低继电器、蜂鸣器、电机驱动给个快速判断法板内信号串联电阻必加其余按需信号出机箱一定要有TVS能上光耦就上光耦驱动继电器一类的感性负载三极管驱动加续流二极管是底线多个设备供电系统互联优先考虑光耦隔离而不是拼命堆钳位。7.2 一个混合信号系统的完整保护链参考用一个实际项目举例我做过一个STM32控制板需要采集机箱外部的24V工业传感器开关量同时要驱动两个12V继电器还有一个面板上的外部按键。24V开关量输入这条链路我做了两级隔离。最前端是一个光耦输入侧限流电阻4.7kΩLED电流约5mA输出侧上拉4.7kΩ到3.3V再接一个1kΩ串联电阻进STM32引脚。在STM32引脚旁边我又放了一颗SMBJ3.3A TVS到地防止光耦输出侧被后端静电打坏。这样地环路问题被光耦切断过压问题被TVS兜住过流问题被两个电阻限制住整条链路在三年多的现场运行里没有烧过一次I/O。12V继电器驱动这条链路STM32引脚出来先是一个100Ω电阻再接1kΩ基极电阻到S8050三极管基极对地再接一个10kΩ下拉。继电器线圈并联1N4007续流二极管。另外我还在继电器驱动电路前加了一颗光耦把继电器回路和单片机电平完全隔离。为什么这里要上光耦因为继电器接线是引出到机箱的和外部电源、电机、接触器都在同一个电柜里现场环境恶劣隔离之后单片机这边各种电压波动都影响不到。外部按键这条链路比较简单GPIO串一个1kΩ电阻按键对地按键另一侧接3.3V。1kΩ电阻既能在按键短路时限制电流也能在静电从按键缝隙打进来时给I/O口争取一点缓冲时间。7.3 我踩过的坑保护电路接了反而引入新问题的三个案例第一坑是给继电器加了驱动三极管但忘了续流二极管结果一断电就烧三极管烧了三颗之后才意识到是反电动势的问题。后来换成ULN2003这种内置续流二极管的达林顿管才彻底解决。教训是不要总想着“我逻辑正确就行”感性负载的反电动势是物理定律不会因为你的电路“看起来对”就放过你。第二坑是用BAT54做钳位时往5V电源轨上钳结果5V电源本身用一个很“软”的LDO供电一个脉冲灌进去5V轨被瞬间打到6V以上后面的3.3V LDO因为输入超压也一起挂了。后来我在5V电源入口处加了一颗SMBJ5.0A TVS和一个大容量电解电容冲击电流被电源入口先泄放掉钳位电路才能真正起到保护作用。钳位二极管不是单独工作的它泄放的电流最终要有一个去路。第三坑是在ADC采样通道上直接用肖特基钳位结果发现温度一高读数就明显漂移。查了半天是BAT54在高温下漏电流增大相当于在ADC输入端并联了一个可变电阻。后来换成了低漏电流的ESD保护器件并且把源阻抗从100kΩ降到了10kΩ漏电流的影响才压下去。给模拟信号加保护时一定要格外关注漏电流参数和源阻抗的匹配。第四个不算坑而是一个习惯现在我做任何带外部接插件的板子都会在靠近连接器的地方预留一个TVS位置在靠近MCU的地方预留一个RC滤波位置哪怕第一版不贴等样机测试发现问题时也不用重新改板。PCB上留几个0201电阻电容的位置成本几乎为零但给调试和返修省下的时间不可估量。保护电路这个东西很多时候不是你加得不够多而是你没想清楚每一种保护到底在防什么。把过压、过流、ESD、反电动势、地环路这五类威胁逐个对号入座再按成本从低到高逐层叠加I/O口就不会再莫名其妙地“去世”了。