物理层基础: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 物理层,说白了就是三件事:差分信号抗干扰、半双工控制方向、终端电阻防反射。这三件事做好了,你的灯光控制总线就成功了一半。
下一章咱们聊聊数据链路层,怎么组帧、怎么寻址、怎么避免冲突。到时候你会发现,物理层扎实了,上层协议写起来就顺手多了。