rs485总线电平异常解决方案解析 (rs485反相器自动收发)

无源的RS485转RS232使用的反相法自动换向技术,在速率过高的时候,会导致丢包,本文就分享一个解决措施。

一、摘要

无源的RS485转RS232使用的反相法自动换向技术,在速率过高的时候,会导致丢包,本文就分享一个解决措施。

二、问题描述

之前我们的产品的RS485设计借鉴了图1中的转换器的原理,该方案的原理主要是使用反相器法,具体的实现原理就是:反相法使用了一个反相器,依赖于发送信号TX的电平决定RS485芯片属于发送还是接收状态,例如,TX为高电平时,反相后为低电平,此时收发器处于接收状态,AB总线上的逻辑由上下拉决定,此时为逻辑1;当TX为低电平时,反相后为高电平,此时收发器处于发送状态,AB总线上的逻辑为0。

简单说,就是反相法可以发送低电平,高电平其实是有AB线上的上下拉电阻决定的。

经过我们的长时间的验证,该种方案在100kbps波特率以内都不会丢包,但是波特率大约100kbps以上,例如115200bps时,丢包可以达到0.1%,这是我们不允许的。

rs485硬件自动切换电路,rs485模块存在错误

图1:Tps563200现货价格

三、原因分析

反相器法的原理上是没有问题的,但是我们忽略了一个串口的底层实现方式,串口通信是异步通信,双方没有时钟同步,依赖于双方的声称。

UART通信没有时钟同步,不是说不需要时钟,而是两个系统的时钟来自两个设备,各跑各的,没有同步。这就要求两个系统的时钟误差不能太大。UART接收的流程如下:

(1)接收端选定好与发送端一致的起始位数、数据位数、校验位数、停止位数、波特率,例如下图起始位1、数据位8、校验无、停止位1、波特率9600bps。

(2)RX线上无传输时,保持为高电平,RX端有采样器,采样器以波特率的16倍采样周期对一位bit数据进行采样。确认起始位后,再经过16个采样周期,采样第一位数据,再经过16个采样周期,采样第二位,以此类推。

rs485硬件自动切换电路,rs485模块存在错误

图2:UART 采样示意图

rs485硬件自动切换电路,rs485模块存在错误

图3:UART 过采样示意图

rs485硬件自动切换电路,rs485模块存在错误

图4:UART 误差允许范围

这里就存在一个问题,发送和接收的底层启动都是由不同的厂家不同的工程师做的,大部分的工程师都是取数据bit的50%~80%位宽的数据,如果双方的波特率误差过大,就有可能数据还没有发送接收,但是RS485芯片已经切换到接收状态了,导致发送的数据错误。

使用100k速率仿真现有的方案,TXD信号和方向引脚同时切换,几乎没有余量。极端情况下就有可能数据没有传输结束,方向引脚就切换了,导致数据传不出去。理想的方案应该是方向引脚延后30%~50%的位宽再切换方向。

rs485硬件自动切换电路,rs485模块存在错误

图5:现有反向器的RS485方向切换方案仿真图

四、解决方案

解决的方案需要在原有的基础上,增加D1、R3、R4、C1。如下图6。

由于该换向的原理是发送数据0的时候,DE/RE引脚为高电平,U2为发送状态,数据有U2发送出去。而发送数据1的时候,DE/RE引脚为低电平,U2实际为接收状态,AB总线上的 逻辑1其实是有R1、R2的上下拉电阻使得Va-Vb>200mV的。因此,我们的设计主要保证发送数据0的时候,方向引脚比数据延迟30%~50%左右,保证数据顺利发送出去。

实现的原理如下:

TXD发送数据0的时候,经过反相器U1,DE/RE引脚为高电平,使得U2为发送状态,下一bit数据即将为1,但是经过R4、C1的RC充电效应,U2的pin3引脚并不会立即为高电平,而是经过延迟后才为高电平,延迟的时间即是我们设计的方向延迟时间。举例子,假设U1的高电平阈值为1.5V,U1的供电电压为5V,R4=36K,C1=300pF,根据公式:t = RC*Ln[(V1-V0)/(V1-Vt)],可以估算出切换方向延迟的时间约3.1uS。

TXD发送数据1的时候,经过反相器U1,DE/RE引脚为低电平,使得U2为接收状态,接收状态下,AB总线上的值由上拉R1,下拉R2决定,不再需要U2发送数据,因此方向控制信号等同于无效。

rs485硬件自动切换电路,rs485模块存在错误

图6:方向信号延后措施

使用100K的频率进行仿真,结果显示方向引脚可以延后1.85uS,可以满足要求。

rs485硬件自动切换电路,rs485模块存在错误

图7:100K频率仿真图

五、总结

本文主要通过增加RC延迟和反相器波形整形,从而达到方向切换比数据bit延后的目的,读者在实际使用过程,还需要根据自己设计的最高波特率来选择RC的参数,如RC时间太长,在频率很高的情况下,反相器可能没有输出,一致时0,一般设置为位宽的30%左右即可,例如115200bps的波特率,位宽是8.6uS,延迟参数可以设置为8.6*0.3=2.5u左右。二极管D1和R3主要是为了应付TXD信号由高变低的时候,能够快速的释放反相器输入引脚的电压,让反相器的输出为高电平,及时将数据0发送出去。