物理层基础:RS-485总线特性、差分信号原理、终端电阻匹配

各位同学,咱们今天聊聊物理层。说实话,很多做嵌入式的人,一上来就怼协议栈、怼应用层,结果硬件上出了问题,查三天三夜都找不到原因。我当年就吃过这个亏。

RS-485,这玩意儿在工业现场、灯光控制、楼宇自动化里太常见了。你想想看,一个灯光控制网络,动不动就几十米、上百米的线,走普通TTL串口?那信号早畸变成啥样了。所以,RS-485就是干这个活的。

差分信号:为什么它能抗干扰?

RS-485的核心,说白了就是差分信号传输。它不是靠一根线对地的电压来判断逻辑0和1,而是靠两根线之间的电压差。

具体怎么玩的?

  • A线(非反相)B线(反相),两根线拧在一起走。
  • 当 A 比 B 高 200mV 以上,逻辑就是 1(或者说空闲状态)。
  • 当 A 比 B 低 200mV 以上,逻辑就是 0(或者说驱动状态)。

为什么会这样设计?因为外部干扰(比如电机启动、电磁辐射)通常是共模干扰——同时作用在两根线上。你想想看,两根线受到的干扰幅度差不多,那它们的差值基本不变。这就是差分信号抗干扰的底层逻辑。

关键点:RS-485 接收器的输入灵敏度典型值是 ±200mV。也就是说,只要两根线之间的压差绝对值超过 200mV,就能正确识别。这个余量很大,所以即使线路上有衰减,也能正常工作。

我记得有一次在现场调试,一个灯光控制箱旁边就是变频器。变频器一启动,TTL串口直接乱码。换成RS-485后,稳如老狗。嗯,这就是差分信号的价值。

RS-485 总线特性:半双工、多点、长距离

RS-485 有几个硬指标,我建议你记牢了:

参数 典型值 说明
传输模式 半双工 同一时刻只能一个节点发送,其他节点接收
节点数量 最大 256 个(标准) 取决于接收器输入阻抗,1/8 负载可达 256 个
最大距离 1200 米(约 4000 英尺) 与波特率成反比,速率越高距离越短
共模电压范围 -7V ~ +12V 这是 RS-485 芯片能承受的极限
差分电压 ≥ 1.5V(驱动输出) 空载时可达 5V 左右

这里有个坑,我跟你讲。半双工意味着你要控制发送和接收的切换。很多新手直接用串口的 TX、RX 接上去,发现数据发不出去或者收不到。为什么?因为 RS-485 芯片需要一根控制引脚(通常是 DE/RE 引脚)来切换方向。

警告:千万不要把 RS-485 的 A、B 线接反!接反了不会烧设备,但数据完全不通。我曾经在项目验收前夜,被这个问题折腾到凌晨三点。后来养成了习惯:所有线缆做好标签,A 线用红色,B 线用黑色。

终端电阻匹配:为什么必须加?

终端电阻,这是 RS-485 总线里最容易忽略、也最容易出问题的地方。

先说说原理。信号在电缆里传输,遇到阻抗突变的地方就会反射。反射回来的信号叠加在原信号上,就会造成波形畸变、过冲、振铃。你想想看,如果反射信号足够强,接收器可能误判逻辑电平。

RS-485 标准规定,总线特性阻抗约为 120Ω。所以,我们在总线的最远端(注意,是最远端,不是每个节点)并联一个 120Ω 的电阻,让信号走到尽头时被吸收掉,不再反射回来。

个人经验:我一般会在总线的两端各加一个 120Ω 电阻。如果节点数少、距离短(比如 10 米以内),不加也能工作。但一旦距离超过 50 米,或者节点数超过 10 个,我建议你老老实实加上。否则,数据偶尔出错,查起来更痛苦。

怎么判断要不要加?有个简单方法:用示波器看 A、B 线之间的波形。如果波形上升沿有台阶或者过冲,那就是反射,需要加终端电阻。如果波形干净利落,那可以不加。

避坑指南:我踩过的几个雷

  • 共模电压超限:我曾经在一个项目中,RS-485 的 A、B 线对地电压测出来有 15V。芯片直接冒烟了。后来发现是现场地线没接好,导致共模电压漂移。解决方案:加共模扼流圈,或者用隔离型 RS-485 芯片(比如 ADM2483)。
  • 总线空闲时状态不确定:当总线上所有节点都处于接收状态时,没有节点驱动总线,A、B 线之间的电压差接近 0V。这时候接收器可能输出随机电平。解决办法:加偏置电阻,让空闲时 A 比 B 高 200mV 以上。我习惯在主机端加 680Ω 上拉到 5V,680Ω 下拉到 GND。
  • 地环路:多个节点之间如果地电位不一致,会形成地环路电流,干扰通信。我建议使用隔离电源和隔离 RS-485 芯片,或者至少保证所有节点共地。

一个简单的硬件连接示例

下面是一个典型的 RS-485 节点电路(以 MAX485 为例):

// 引脚连接示意
// MCU 端:
//   TXD  -> MAX485 的 DI 引脚(数据输入)
//   RXD  <- MAX485 的 RO 引脚(数据输出)
//   GPIO -> MAX485 的 DE 和 RE 引脚(方向控制,通常短接)
//
// 总线端:
//   MAX485 的 A 引脚 -> 总线 A 线
//   MAX485 的 B 引脚 -> 总线 B 线
//
// 终端电阻(仅在总线两端):
//   在 A 和 B 之间并联 120Ω 电阻
//
// 偏置电阻(仅在主机端):
//   A 线通过 680Ω 上拉到 5V
//   B 线通过 680Ω 下拉到 GND

嗯,这里要注意:DE 和 RE 引脚短接后,用一根 GPIO 控制。高电平时使能发送,低电平时使能接收。切换时记得加一点延时(比如 10μs),等芯片状态稳定后再操作。

总结一下

RS-485 物理层,说白了就是三件事:差分信号抗干扰、半双工控制方向、终端电阻防反射。这三件事做好了,你的灯光控制总线就成功了一半。

下一章咱们聊聊数据链路层,怎么组帧、怎么寻址、怎么避免冲突。到时候你会发现,物理层扎实了,上层协议写起来就顺手多了。