ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

3.3V与5V UART电平转换:2N7002 MOSFET双向方案详解

3.3V与5V UART电平转换:2N7002 MOSFET双向方案详解 1. 为什么3.3V和5V设备之间总得加这么一级搞嵌入式的人迟早会撞上这个场景手头一个3.3V的主控比如STM32F103或者ESP32要跟一个5V逻辑的外设打交道——可能是老款的GPS模块、工业传感器、或者某些还在用5V单片机的 legacy 设备。TX接RXRX接TX线一插上电通信失败。示波器一挂发现3.3V端输出的高电平只有3.3V5V那边根本认不出来反过来5V端往3.3V端灌高电平5V直接怼进3.3V的IO口运气好点IO口扛住了运气不好直接烧引脚。这就是UART电平转换要解决的问题。UART本身是个非常简单的异步串行协议没有时钟线靠波特率对齐TX和RX交叉连接空闲时线是高电平。问题就出在这个高电平上——不同供电电压的芯片对高的定义不一样。5V TTL通常要求输入高电平大于2.0V3.3V CMOS输出高电平典型值3.3V勉强能过但3.3V TTL要求输入高电平大于2.0V5V输出5V进去就超了绝对最大额定值。市面上解决这个问题的方案不少专用电平转换芯片比如TXS0108E、TXB0104、电阻分压、三极管方案、光耦隔离。但如果你只是要转一路UART而且希望成本低、元件好找、电路简单2N7002 MOSFET这个方案几乎是性价比最高的选择。一颗2N7002几分钱加两个上拉电阻总共三个元件就能实现真正的双向电平转换而且不需要方向控制引脚。这篇内容就是把这个方案从头到尾拆一遍为什么2N7002能双向工作、上拉电阻怎么选、实际布线要注意什么、以及我在几个项目里踩过的坑。适合正在做多电压系统联调、或者想搞明白MOSFET电平转换原理的硬件和嵌入式工程师。2. 2N7002这颗小管子凭什么能双向导通2.1 先搞清楚2N7002的基本参数2N7002是一颗N沟道增强型MOSFETSOT-23封装便宜到按斤称。它的关键参数如下参数典型值说明VDS漏源击穿电压60V远超3.3V/5V场景需求VGS(th)开启阈值1.0V ~ 2.5V栅极电压超过这个值开始导通RDS(on)导通电阻1.2Ω VGS4.5V小电流下压降可忽略ID连续漏极电流115mAUART信号电流远小于此Ciss输入电容约20pF影响高速信号边沿UART的波特率通常从9600到115200高一点的到1M甚至2M。信号电流在mA级别2N7002的电流能力绰绰有余。真正需要关注的是VGS(th)和体二极管。2.2 体二极管是双向导通的关键很多人第一次看到这个电路会懵MOSFET不是有方向吗怎么做到双向的关键在于2N7002内部那个寄生体二极管body diode。N沟道MOSFET在制造时源极和衬底短接漏极和衬底之间自然形成一个PN结。对于N沟道管这个二极管的阳极在源极阴极在漏极。也就是说当源极电位高于漏极时体二极管正向导通。在电平转换电路里2N7002的源极接低压侧3.3V漏极接高压侧5V栅极接低压侧电源3.3V。这样体二极管的方向是从3.3V侧指向5V侧。当3.3V侧拉低时体二极管先导通把5V侧也拉低然后MOSFET沟道在VGS作用下进一步导通把两边都拉到接近0V。反过来当5V侧拉低时体二极管是反偏的不导通。但此时源极3.3V侧因为上拉电阻还是高电平栅极也是3.3VVGS0MOSFET截止。等等那5V侧拉低怎么传到3.3V侧这里就是精妙之处当5V侧被拉低到0V时源极3.3V侧通过上拉电阻保持3.3V栅极也是3.3VVGS0管子确实截止。但是——体二极管虽然反偏MOSFET的沟道在VGS0时是关断的可实际上当漏极电位低于源极时情况变了。让我重新理一下。正确的接法是源极接低压侧漏极接高压侧栅极接低压侧电源。当高压侧漏极被拉低到0V时源极还是3.3V此时VGS3.3V-3.3V0不对栅极接的是3.3V源极也是3.3VVGS0管子截止。但漏极是0V源极是3.3V体二极管阳极在源极3.3V阴极在漏极0V体二极管正向导通电流从3.3V侧通过体二极管流向5V侧把3.3V侧也拉低。所以双向导通的本质是一个方向靠MOSFET沟道另一个方向靠体二极管。两个方向都能把低电平传递过去而高电平则被各自的上拉电阻拉到各自的电源轨。2.3 栅极为什么必须接低压侧电源栅极接低压侧电源3.3V而不是高压侧5V原因有两个第一如果栅极接5V当3.3V侧拉低时VGS5V-0V5V管子导通没问题。但当5V侧拉低时源极还是3.3VVGS5V-3.3V1.7V可能刚好在阈值附近管子可能微导通导致两边电平互相干扰。第二2N7002的VGS绝对最大额定值通常是±20V接5V没问题但接低压侧更安全而且能保证VGS在管子完全导通的区间VGS3.3V时RDS(on)约几欧姆足够UART使用。注意有些资料会把源极和漏极反过来接栅极接高压侧那样也能工作但体二极管方向变了分析起来更绕。建议统一按源极低压、漏极高压、栅极低压来记不容易出错。3. 上拉电阻选多大这事比你想的讲究3.1 上拉电阻决定了上升沿和功耗电平转换电路里高电平不是MOSFET推出来的而是上拉电阻拉出来的。MOSFET只负责拉低。所以上升沿的陡峭程度完全取决于上拉电阻和线路电容的RC时间常数。UART信号在115200波特率下位宽约8.68微秒。要保证信号质量上升时间通常要求小于位宽的1/10也就是约0.87微秒。线路电容包括PCB走线电容、芯片引脚电容、探头电容加起来典型值50pF到100pF。RC时间常数τR×C。如果R10kΩC100pFτ1微秒上升时间约2.2τ2.2微秒已经超过位宽的1/4边沿会明显变缓高速下可能误码。如果R4.7kΩτ0.47微秒上升时间约1微秒勉强够用。如果R2.2kΩτ0.22微秒上升时间约0.5微秒比较稳妥。但电阻越小静态功耗越大。当线被拉低时电流从电源通过电阻流向MOSFET到地。5V侧拉低时电流5V/R。R2.2kΩ时电流约2.3mAR10kΩ时0.5mA。对于电池供电设备这个功耗要考虑。我的经验值是115200及以下用4.7kΩ高速率用2.2kΩ低功耗场景用10kΩ但波特率别超过57600。两侧的上拉电阻可以取相同值也可以高压侧稍小一点因为5V侧拉低时电流更大但上升沿要求一样。3.2 上拉电阻接在哪一侧的电源这是新手最容易搞混的地方3.3V侧的上拉电阻接3.3V电源5V侧的上拉电阻接5V电源。不能都接5V也不能都接3.3V。如果3.3V侧上拉接5V那么当MOSFET导通时5V会通过上拉电阻灌进3.3V侧的IO口虽然MOSFET导通时源极被拉低但静态时如果MOSFET截止3.3V侧IO口会看到5V电平可能损坏。如果5V侧上拉接3.3V那么5V侧的高电平只有3.3V5V设备可能识别不了高电平通信失败。所以两侧各自接自己的电源轨这是铁律。3.3 一个实际计算例子假设你要跑115200波特率线路电容估算80pF要求上升时间小于0.5微秒。上升时间tr≈2.2RC所以Rtr/(2.2C)0.5μs/(2.2×80pF)0.5×10^-6/(1.76×10^-10)2841Ω。取标准值2.7kΩ或3.3kΩ。如果取3.3kΩtr2.2×3300×80×10^-120.58微秒稍慢但可接受。取2.2kΩtr0.39微秒更稳。功耗方面5V侧拉低时电流5V/2.2kΩ2.27mA3.3V侧3.3V/2.2kΩ1.5mA。UART空闲时线是高电平不拉低所以静态功耗为零忽略漏电流。只有传输数据时才有功耗平均功耗更低。提示如果你用示波器看波形发现上升沿有台阶或者振铃通常是上拉电阻太大加上线路电感导致的。先把电阻降到2.2kΩ试试还不行就要考虑缩短走线或者加小电容滤波。4. 从原理图到PCB几个容易翻车的细节4.1 原理图连接顺序不能乱正确的连接方式2N7002的**源极S**接3.3V侧的TX/RX线同时接3.3V上拉电阻2N7002的**漏极D**接5V侧的RX/TX线同时接5V上拉电阻2N7002的**栅极G**接3.3V电源3.3V侧和5V侧共地注意SOT-23封装的2N7002引脚定义通常引脚1是栅极引脚2是源极引脚3是漏极。但不同厂家可能有差异焊接前一定要看数据手册。我见过有人把源漏接反结果通信时好时坏查了半天才发现是体二极管方向不对。4.2 共地是必须的但地线噪声要小心UART电平转换的两侧必须共地否则没有共同的参考电位信号无法识别。但共地会引入地线噪声特别是当5V侧有大电流设备时地线上的压降可能让3.3V侧看到的地电位波动导致误码。我的做法是在电平转换电路附近放一个0.1μF的陶瓷电容跨接在3.3V和地之间再放一个1μF的电容在5V和地之间。这两个电容要尽量靠近MOSFET和上拉电阻滤掉高频噪声。如果两侧地线较长可以用一个0Ω电阻或者磁珠在单点连接减少地环路。4.3 走线长度和串扰UART虽然速率不高但边沿陡峭时高频分量丰富。如果TX和RX走线并行走很长可能互相串扰。建议TX和RX走线尽量短最好不超过10cm如果必须走长线中间加地线隔离避免在MOSFET附近走其他高速信号线上拉电阻放在MOSFET旁边不要放在远端我做过一个项目UART线走了20cm排线115200波特率下误码率很高。后来把上拉电阻从10kΩ降到2.2kΩ误码率明显下降但还有偶发错误。最后在接收端加了施密特触发器整形才彻底解决。所以长线场景下电平转换只是第一步信号整形也要考虑。4.4 电源时序问题如果3.3V和5V电源不是同时上电可能出现一个问题3.3V先上电5V还没上此时5V侧的上拉电阻没有电源线是浮空的。3.3V侧如果拉低MOSFET导通但5V侧没有上拉线被拉低后无法恢复高电平。等5V上电后如果此时3.3V侧正好在发送低电平5V侧可能一直保持低电平导致通信异常。解决办法在5V侧上拉电阻上并联一个肖特基二极管到5V电源阳极接线阴极接5V这样即使5V没上电线被拉低后可以通过二极管从3.3V侧借电恢复不行这样会倒灌。更简单的办法是确保两侧电源同时上电或者在软件上等电源稳定后再初始化UART。注意如果两侧电源时序无法保证建议用带使能引脚的电平转换芯片或者加电源监控电路。2N7002方案适合电源时序可控的场景。5. 实测波形与常见故障排查5.1 正常波形长什么样用示波器双通道看3.3V侧和5V侧的TX线正常情况应该是空闲时两侧都是各自的高电平3.3V和5V起始位下降沿两侧几乎同时下降5V侧可能稍慢几十纳秒数据位跳变时上升沿有RC充电曲线下降沿很陡停止位恢复高电平5V侧上升到5V3.3V侧上升到3.3V如果5V侧的高电平只有3.3V左右说明5V上拉电阻没接或者接错了。如果3.3V侧的高电平超过3.6V说明3.3V上拉接到了5V赶紧断电检查。5.2 通信失败但波形看起来正常这种情况最头疼。波形幅度、边沿都正常但就是误码。可能的原因波特率不匹配两边设备的波特率误差累积。UART通常允许±2%到±3%的误差如果两边晶振都不准加起来超了就会误码。用示波器测一下位宽算一下实际波特率。地线噪声用示波器看地线如果地线上有几十毫伏的高频噪声可能导致接收端误判。加电容滤波或者改用差分信号RS485。MOSFET型号不对有些N沟道MOSFET的VGS(th)太高3.3V驱动不够。2N7002的VGS(th)最大2.5V3.3V驱动没问题。但如果你用了IRF540之类的VGS(th)可能4V3.3V根本导不通。上拉电阻太大边沿太缓接收端在采样点还没到阈值。降电阻。5.3 一个真实的排查案例之前有个项目STM32F103和5V的GPS模块通信用的是2N7002方案。低速9600波特率下正常提到115200就大量误码。示波器看波形上升沿明显变缓从0V到3.3V用了约2微秒。算了一下上拉电阻是10kΩ线路电容约100pFτ1微秒上升时间2.2微秒确实太慢。把上拉电阻换成2.2kΩ上升时间降到约0.5微秒误码消失。但功耗从0.5mA增加到2.3mA对于这个市电供电的设备无所谓。如果是电池设备就得在速率和功耗之间权衡。后来我又遇到一个更隐蔽的问题换了2.2kΩ后大部分数据正常但偶尔有单比特错误。查了很久发现是GPS模块的TX线在PCB上走了一段靠近DC-DC电源的电线开关噪声耦合进来了。在GPS模块TX线靠近MOSFET的地方加了一个100pF电容到地滤掉高频噪声问题解决。所以电平转换电路本身没问题但布局布线引入的噪声也会导致误码。6. 什么时候该换方案什么时候2N7002就够了6.1 2N7002方案的适用边界这个方案不是万能的。以下场景建议直接换专用芯片波特率超过1M2N7002的Ciss约20pF加上线路电容RC时间常数很难做小。专用电平转换芯片内部有加速电路能跑到几十MHz。需要自动方向控制且两侧电压都低于3.3V比如1.8V和3.3V之间转换2N7002的VGS(th)可能不够低需要低阈值MOSFET或者专用芯片。多路UART密集布局每路都要两个电阻一个管子占板面积大。用TXS0108E这类8通道芯片更省空间。需要隔离2N7002不隔离两侧共地。如果两侧地电位差很大或者需要电气隔离用光耦或者数字隔离器。6.2 和专用芯片的对比方案成本元件数最高速率方向控制隔离2N7002极低3~500kbps自动无TXS0108E中160Mbps自动无TXB0104中1100Mbps自动无光耦中高21Mbps需方向有电阻分压极低2低单向无对于大多数3.3V和5V之间的UART通信115200波特率2N7002方案完全够用而且成本最低。我手头几个量产项目都用的这个方案出货几万套没出过批量问题。6.3 一个替代方案双MOSFET背靠背如果觉得体二极管方向分析太绕可以用两个2N7002背靠背连接源极对源极或者漏极对漏极栅极都接低压侧电源。这样两个体二极管方向相反无论哪边拉低都能通过其中一个管子导通。但元件数翻倍成本增加而且两个管子的阈值要匹配。除非有特殊需求否则单管方案更简洁。7. 我在实际项目里攒下的几条经验第一条上拉电阻不要省。有人觉得MOSFET导通时能把线拉低高电平靠芯片内部上拉就行。但大多数UART引脚内部上拉很弱几十kΩ边沿会非常缓。外部上拉电阻是必须的而且要根据速率选值。第二条栅极接低压侧电源不要接高压侧。我见过一个设计把栅极接5V低速时能用高速时因为VGS不够导致管子不完全导通波形畸变。接3.3V能保证VGS3.3V2N7002在这个电压下RDS(on)约几欧姆足够。第三条两侧上拉电阻分别接各自电源。这个前面强调过了但还是要再说一遍因为这是最常见的错误。我帮别人查过至少三次这个问题都是上拉接错电源导致通信失败。第四条PCB布局时把MOSFET和上拉电阻放在一起。上拉电阻离MOSFET越近线路电感越小边沿越干净。如果上拉电阻放在连接器旁边MOSFET放在芯片旁边中间走线会引入电感可能导致振铃。第五条留一个串联电阻的位置。在MOSFET的漏极或源极串联一个0Ω电阻调试时如果发现振铃或者过冲可以换成22Ω或33Ω电阻阻尼。这个位置不占地方但调试时能救命。第六条用示波器看波形时探头地线要短。用长地线夹子测高频信号会引入振铃让你误以为电路有问题。用弹簧地针或者短地线看到的波形才真实。第七条如果通信距离超过30cm考虑加TVS管。长线容易引入静电和浪涌2N7002的栅极很脆弱静电可能击穿。在两侧线上各加一个TVS管到地钳位电压选5V或6.8V的。这个电路我用了快十年从8位机时代到现在的32位MCU只要涉及3.3V和5V混压UART基本都是这套方案。简单、便宜、可靠三个元件解决问题。如果你正在调这个电路希望上面这些经验能帮你少走点弯路。
返回列表