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

资讯详情

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

低功耗RS-485收发器与1.8V低压MCU直连的设计要点

低功耗RS-485收发器与1.8V低压MCU直连的设计要点 1. 为什么我会盯上“低功耗低压接口”这个组合1.1 RS-485 其实是这样的物理层很多做嵌入式、做仪器仪表的朋友对 RS-485 都不陌生但真正把物理层特性吃透的人不多。RS-485 本质上是一个差分总线标准靠 A、B 两根线之间的电压差来传数据A-B 大于 200mV 判为逻辑 1A-B 小于 -200mV 判为逻辑 0。这样的差分结构带来两个天然优势一是抗共模干扰强二是支持长距离传输标准下最远能到 1200 米左右节点数量最传统标准是 32 个单位负载用上现代的低负载芯片以后挂 256 个节点也常见。我在项目里用到 RS-485 的场景基本是仪表采集、Modbus RTU 通信、工业传感器上报这类。这些场景有几个共同特点通信距离远、现场环境乱、节点分散。而到了电池供电的那一类设备里还要再多加两个要求——待机要省电接口要和低压 MCU 直连。前者好理解后者很多人一开始没重视等画完板子调不通了才反应过来。1.2 传统收发器在低压 MCU 面前的三个毛病我那块采集板的主控是 1.8V 逻辑的低压 MCU当时我随手选了颗常见的 5V 供电 RS-485 收发器心想反正是数字信号电平只要“大概齐”就行。结果板子一回来通信测试各种不稳定总结下来传统方案有三个很现实的问题逻辑高电平阈值太高。很多传统 5V 供电的收发器VIH 下限是 2.0V 附近。1.8V MCU 的 IO 口输出高电平通常只有 1.8V 甚至更低有时经过走线、上拉电阻再打个折根本到不了 2.0V接收端就认为这不是一个稳定的高电平直接导致数据错误。静态电流偏大。普通收发放着不动供电电流经常在毫安级别。对插电设备无所谓但电池供电的设备是按年算功耗的毫安级待机电流基本没戏。缺少主动关断能力。即便有 shutdown 脚也不一定做到微安级关断很多所谓“低功耗”只是把静态电流从 5mA 降到 1mA离真正的电池设备需求差得远。1.3 低功耗和低压接口不是同一个东西但经常一起出现这里要先把概念掰开低功耗和低压接口说的是两回事。低功耗指芯片在工作、待机、关断时的电流表现低压接口指的是逻辑侧和 MCU 对接的那几个引脚能不能直接接受 1.8V、2.5V、3.3V 这样的低电平信号。RS-485 收发器本身的工作电压和逻辑侧电平是可以分开的。很多带低压接口的芯片供电依然是 3.3V 或 5V因为总线驱动需要足够的输出电压摆幅去满足 RS-485 标准里驱动电压的要求但逻辑侧的输入阈值可以做到很低或者单独引出一个 VIO 引脚直接跟随 MCU 的电源电压。这就像你家的门禁主机是 220V 供电但面板上的按键和室内机之间用的是低压信号线两层东西不能混为一谈。所以当你看到“Low-Power RS-485 Transceiver with Low-Voltage Interface”这个标题时重点应该拆成两个维度去理解第一这颗收发器在关断时能省到多低第二它和低压 MCU 之间能不能免掉电平转换。下面我分别展开。2. 低压接口的真正含义逻辑阈值、VIO 与电平匹配2.1 高电平识别不了这才是核心问题很多人觉得数字电平匹配很简单3.3V 接 5V 系统只要芯片手册说兼容就行。但实际上每个芯片的逻辑输入都有一个 VIH高电平输入阈值和 VIL低电平输入阈值只有当输入电压高于 VIH 时芯片才认为这是逻辑 1低于 VIL 时认为逻辑 0两者之间是不确定区。举例来说一颗传统 5V 供电收发器的 VIH 可能是 2.0V那么 3.3V MCU 输出 3.3V 高电平还有 1.3V 的裕量能用。但如果 MCU 是 1.8V 供电输出高电平大约 1.8V就已经低于 2.0V 了。这在最理想的情况下都不够更别提串了电阻、过了连接器、板子走线又长的情况。所以不是你电路连错了而是电平裕量从一开始就是负数。有些 3.3V 供电的收发器看起来好一点但 VIH 常常是 0.7×VCC 左右算下来约 2.31V对于 1.8V 的 MCU 依然不够友好。这就是“3.3V 供电的收发器”和“低压接口收发器”之间的差别前者逻辑阈值跟随自身电源后者则专门为低压控制器优化过。2.2 带低压接口的收发器如何做到直连我后来换上的那颗低功耗低压接口收发器逻辑侧输入阈值能做到 1.2V 左右1.8V MCU 输出高电平完全能覆盖。还有一类芯片更彻底直接提供独立的 VIO 引脚VIO 接多少伏逻辑阈值就跟着多少伏走MCU 是 1.8V 就把 VIO 接 1.8VMCU 是 3.3V 就把 VIO 接 3.3V灵活性很高。这种设计的最大好处是省掉中间的电平转换器。以前 1.8V MCU 对接传统 RS-485 收发器往往要加 TXS0102、74LVC2T45 之类的电平转换芯片多两个器件就多两个从几十微安到几百微安不等的静态电流还多占 PCB 面积多两条可能出问题的信号链路。现在一颗芯片直接完成电平匹配信号路径最短边沿最干净。选型的时候别只看“3.3V 兼容”这几个字一定要去数据手册里翻 VIH、VIL 这两个参数。低压接口芯片通常会明确写出 VIH 低至 1.2V 或者“支持 1.8V 逻辑电平”看到这种描述才靠谱。2.3 如果手里只有普通收发器临时方案怎么做你可能手头没有带低压接口的 RS-485 收发器只有传统型号但又想先调通。我不建议你去改 MCU 供电电压更靠谱的临时方案是加一级电平转换。便宜的做法是两个 MOS 管加两个电阻或者直接用集成的双通道电平转换芯片。注意选芯片的时候同样要关注静态电流别让电平转换器把整板功耗给吃回去。另一个讨巧的办法是把 MCU 的 IO 配置成开漏输出外部上拉到收发器的 VCC比如 5V。开漏输出在低电平时拉低高电平时靠外部上拉到 5V这样收发器看到的高电平就是 5V稳稳超过 VIH。但前提是 MCU 的 IO 引脚能承受 5V 电压并且开漏模式下的上升沿速度能满足你的波特率要求。这个方法我只建议应急用批量产品最好不要这么干因为开漏上拉的上升边和走线电容组合在一起很容易把信号边沿搞得很钝高速下会出问题。3. 低功耗模式、唤醒时序与电池寿命的账3.1 静态电流、关断电流、工作电流的差别评估一颗 RS-485 收发器省不省电不能只看工作电流因为类产品在实际系统里大部分时间是闲着不通信的。要分开看三个参数静态电流Icc芯片正常使能、无数据收发时的供电电流。关断电流Ishutdown芯片进入 shutdown 模式后的电流低功耗型号一般能做到 1μA 左右甚至更低。工作电流使能驱动、总线上带负载时的电流这个值受负载影响很大。传统收发器静态电流常有 3mA 上下对于插电设备还可以接受但换到电池供电就完全不行。这里我特意强调“关断模式”——当你把 RS-485 收发器的 /RE 和 DE 控制到关断状态时接收器和驱动器的内部电路大多关掉芯片才能进入微安级待机。关键要确认你选的型号是否真正支持这种 shutdown 模式而不是仅仅把驱动器输出变成高阻内部偏置还一直开着。3.2 一年的功耗到底差多少我们直接算账。假设设备用一颗 1900mAh 的 3.6V 锂电池每天通过 RS-485 上报 10 次每次通信过程大约 100ms通信时整段电流平均 20mA。每天通信耗电10 × 0.1s × 20mA 20mAs一年通信耗电20mAs × 365 7300mAs 2.03mAh这部分固定跑不掉关键差别在待机。如果收发器一直处于静态模式电流 3mA一年下来就是 3mA × 8760h 26.28Ah1900mAh 电池几个星期就空了。如果用支持 shutdown 的型号关断电流 1μA一年待机耗电 1μA × 8760h 8.76mAh加上通信的 2.03mAh一年总共约 11mAh。这个量级对于 1900mAh 电池来说基本上等于忽略不计设备生命周期内都不用考虑换电池。我实际测过这样一组对比数据工作模式电流一年耗电1900mAh 电池估算传统收发器静态3mA26.28Ah约 3 周耗尽使能但不通信0.5mA4.38Ah约 5 个月shutdown 模式低功耗型号1μA8.76mAh基本无感总线上加一对 10kΩ 偏置额外 0.5mA4.38Ah直接吃掉几倍功耗最后一行的偏置电阻最坑很多人芯片选对了外围电路却没省着用两颗 10kΩ 偏置电阻一年耗掉 4.38Ah硬生生把低功耗设计毁掉了。这个话题下面专门讲。3.3 唤醒时间不能只看数字要跟波特率一起算低功耗收发器从 shutdown 回到正常收发需要一段时间数据手册里通常叫唤醒时间tWU。我用的这颗典型值约 5μs乍一看很短但放在高速通信里就不能忽略。在 9600bps 下1 位时间是 104μs5μs 唤醒时间只占不到 0.05 位MCU 先拉高 DE做点别的延时基本无感。但在 115200bps 下1 位时间大约 8.68μs5μs 已经超过半个位时间了。如果你在拉高 DE 的瞬间立刻往 UART 里塞数据第一个字节的头几位可能就丢了。更稳妥的做法是先拉高 DE让收发器完成唤醒再延时至少 2 到 3 位时间然后才开始发数据。如果系统里用 Modbus 这类轮询协议主站发给从站的帧之间本来就有间隔这个延时完全不影响性能。反过来从发送切回接收时也一样不要把 DE 拉低的动作和 UART 发送完成的标志贴得太近建议等发送移位寄存器彻底清空后再切方向否则最后一位有可能被自己的接收器听到产生额外中断。4. 想让低功耗电池节点稳定工作外围电路这样配4.1 端接电阻接在哪里不是拍脑袋的事RS-485 总线的端接电阻标准做法是在总线物理两端各接一只 120Ω中间节点不接。这个电阻的作用是吸收信号在电缆末端产生的反射阻抗匹配了波形上就没有明显振铃。但端接电阻在低功耗系统里是需要权衡的。假设驱动器输出差分电压约 2V双端各接一只 120Ω等效负载电阻 60Ω驱动器要持续输出约 33mA 电流。这个电流在通信期间吃功耗如果每次只收发几十毫秒总量不大但如果你的设备是长距离高压驱动再加上终端电阻两端的静态压差功耗还是能感觉到。我个人的实践是点对点、距离几十米以内的短链路可以先不接端接电阻用示波器看波形如果上升沿没有明显过冲就不接如果距离超过百米或者节点数量多、走线分支较长老老实实按标准两端各接 120Ω。低功耗不是牺牲信号质量的借口而是在满足波形要求的前提下尽量少加不必要的负载。还有一种“只在主站端接”的折中方案很多仪表现场也在用。因为主站往往是一端另一端的从站可能是最后一个物理节点但你不一定能确定线缆走线是谁在末端。所以更可靠的办法是先确认物理拓扑再决定端接位置不要每个板子上都放一个可焊的 120Ω结果多个节点都焊了总线上等效阻抗太低驱动器负载过重通信反而更差。4.2 偏置、失效保护与空闲状态RS-485 是差分总线空闲时如果没有任何驱动A 和 B 之间电压差接近 0V这是接收器的不确定区。老式收发器在总线空闲时 RO 输出可能是随机电平MCU 的 UART 如果一直开着 RX 中断就会收到一堆 0x00 或者 0xFF干扰系统休眠。解决办法有两条路。一条是给 A、B 加上下拉偏置电阻B 上拉到 VCCA 下拉到 GND让总线空闲时 A-B 保持大于 200mV接收器输出稳定高电平。阻值的选择要综合考虑阻值太小静态电流大阻值太大抗干扰能力差而且总线负载重的时候偏置可能被拉掉。我这里用 10kΩ 到 100kΩ 这个范围举例具体看总线节点数和端接电阻来算。另一条路是选带失效保护功能的收发器。这类芯片内部已经有偏置逻辑在总线开路、短路、空闲三种状态下接收器输出都能保持确定的高电平。对于低功耗设计我会优先选这类芯片因为你可以省掉外部偏置电阻避免它们在待机时悄悄耗电。省下电阻不光省面积一年能省好几 mAh。4.3 保护器件和连接器放置工业场景里RS-485 线经常被拉到室外雷击感应、静电放电、设备启停产生的浪涌都会跑到 A、B 线上。收发器本身再省电被打坏了也白搭。我在连接器入口处会放一对 TVS 管方向是 A 对地、B 对地有些设计还会在 A-B 之间并一个双向 TVS。选择 TVS 时注意两点一是结电容要低否则高速信号被拉出圆角二是钳位电压要和收发器能承受的最大共模范围匹配一般收发的共模范围是 -7V 到 12VTVS 的钳位要在这个范围之外但尽量接近保护效果才好。如果现场环境特别恶劣比如电机频繁启停、地电位差明显可以在 TVS 内侧再串一个共模电感。共模电感不影响差分信号但对共模噪声有抑制作用。注意它的位置要在 TVS 内侧、收发器外侧否则雷击能量先经过共模电感再打到 TVS 上路径不合理保护效果会打折扣。4.4 节点数量与拓扑总线节点数量不是随便挂的。每个收发器对总线都有一个输入负载标准 RS-485 规定 32 个单位负载为满负荷。现在很多低功耗收发器用的是 1/8 单位负载理论上最多可以挂 256 个节点但实际应用里还要考虑每颗芯片的输入电容总线上所有节点的电容并联之后会跟端接电阻构成低通滤波限制最高可用波特率。节点越多线缆越长波特率就必须越低。拓扑方面RS-485 最怕星型连接从一个中心节点分叉出去几根长线会在分叉点形成阻抗不连续反射严重。正确做法是手拉手菊花链从第一个设备到最后一个设备A 和 B 像串糖葫芦一样依次连过去。低功耗节点通常板子小、接口少但布线时也要尽量让 A/B 进出线方向一致不要在节点内部绕大圈。5. 实测距离、速率、波形和三个典型故障排查5.1 一次实测记录不同距离和速率的表现为了验证低功耗低压接口收发器在实际现场的边界我做了一组布线实测用双绞屏蔽线点对点连接分别测了 100 米、500 米、1000 米三种距离每种距离下跑 9600、38400、115200 三种典型波特率检查波形和误码情况。距离9600bps38400bps115200bps100m正常正常正常500m正常正常波形边沿轻微变缓仍正常1000m正常波形有振铃加 120Ω 端接后稳定不可用测试里有两件事值得分享。一是 1000 米跑 38400bps 时不加端接电阻A-B 差分波形在上升沿出现明显过冲偶尔误码在远端补上一只 120Ω 端接电阻后波形立刻干净了。二是 115200bps 在 1000 米距离完全不可用这是因为线缆本身有分布电容和端接电阻一起组成低通滤波器边沿被拉得很缓接收器的阈值穿越时间变长误码率飙升。所以碰到“远距离传不上去”的问题不要第一反应就是换芯片先算距离和波特率的乘积。通常的经验值线缆越长波特率必须越低1000 米级别老老实实跑 9600bps才符合 RS-485 的物理规律。5.2 故障一通信完全不通A/B 反接这是 RS-485 现场最经典的问题。有一次我帮同事看一个从站死活不上线主站发送指令以后从站没有任何回应。查了接线两边都是 A 接 A、B 接 B看起来很规矩但就是不通信。后来我用示波器挂在从站侧的 A-B 两端发现主站发数据时差分波形是反的——主站认为的 A 比 B 正对应逻辑 1从站侧量出来却是负的。这说明两边设备对 A、B 的定义并不一致。有些厂家把 A 定义为反相端有些厂家正好反过来。单纯按颜色或者丝印“A 接 A”不可靠必须以实际电压关系为准。排查方法很简单主站发送一个 0x55 这样的交替数据用示波器看从站 A-B 差分波形如果波形方向和主站一致就说明极性对如果反了把从站的 A、B 两根线对调即可。没有示波器的话可以用万用表量空闲状态下 A、B 对 GND 的电压带偏置的系统里 A 通常接近 GNDB 通常接近 VCC如果和这个规律不一致基本就是极性接反。5.3 故障二空闲时终端疯狂收 0x00另一个高频问题总线啥也没传从站 MCU 的串口却不停地收到 0x00 或者 0xFF。第一次遇到这情况我以为是接收中断配置错了后来用示波器量收发器 RO 引脚发现总线空闲时 RO 不是稳定的高电平而是随机跳。原因就是前面说的收发器没有失效保护总线空闲时 A-B 接近 0V落在接收器的输入不确定区RO 输出随机。而 MCU 的 UART 在没有起始位时默认认为线路空闲是高电平一旦 RO 在低电平和高电平之间抖动UART 就会误认为收到起始位和数据。解决思路分两种如果芯片本身支持失效保护直接打开或者确认外围引脚配置正确如果不支持就在 A、B 上加偏置电阻让空闲状态确定在高电平。加了偏置之后再量 RO应该是稳定高电平MCU 不会再收到垃圾数据。5.4 故障三方向切换太快导致最后一个字节丢失半双工 RS-485 用 DE 引脚控制驱动方向发送时 DE 拉高接收时 DE 拉低。这个切换时序是最容易被忽略的。我遇到过一种情况主站连着发一帧 8 字节的 Modbus 指令从站能收到前面 7 个字节最后一个字节偶尔丢或者多出来一个字节的异常数据。用逻辑分析仪同时抓 DE 和 TX 信号发现问题出在 MCU 的串口发送完成标志 TCIE 触发后我立刻把 DE 拉低了。但 UART 的发送完成标志并不等于移位寄存器已经物理送完最后一位芯片内部还有一段缓冲
返回列表