RS485基本都是由RS232转换而来,此时就需要将全双工切换到半双工,目前大部分的工程师基本都是使用软件换向的方法,作者就遇到过软件换向不及时丢包的方法,并提供一种解决思路工参考。
问题描述
最近公司在做一个采集器,具体的原理就是通过串口将客户数据采集上来,由于客户的接口是RS232的,而我们的采集器只有RS485接口,无法直接对接,因此我们引入了一个中间的RS232/RS485转换器,对接我们的采集器,这种用法相信也是论坛工程师绝大多数的选择,不料在进行可靠性测试过程一个晚上,丢包率竟然高度10%,这种有线的连接,又是低速率串口,理论上的丢包率应该是0。
图1:信号采集原理图
原因分析
首先我们排除以下几个原因:
1、走线长度:设备都摆放在一起,长度只有2米不到;2、干扰问题:这是在办公室测试的,没有大的干扰;3、数据速率:波特率只用了115200,常规波特率;4、软件问题:这个RS485采集软件已经用了好几年,一直很稳定;5、客户的PLC程序:客户在现场也用了好几年,也很稳定。
问题的定位基本可以大致确定方向,就是出在这个RS485和RS232的数据转换上,我们的采集器的接口设计原理图如下:
图2:采集器端口设计原理图
通过示波器的抓波我们发现,问题原因就在这个端口上。如下图;TX是我们采集器发出的信号,RX是客户PLC回复的信号,DIR是我们的采集器的方向控制信号。简单说,就是在0uS的时候,我们发出去数据,PLC在150uS左右就回复数据,而我们的方向切换引脚在200~300uS不等。也就是说我们发送完数据,来不及切换到接收状态,PLC就回复数据了,导致数据丢失。
通过和软件工程师沟通,由于我们跑的是Linux系统,方向引脚控制采取的是进程控制的方法,这个进程本来优先级已经很高,到时由于是多进程运行,还是会被其他系统进程抢占,所以导致无法做到更高的切换速度,或者是切换速度无法明确,只能是一个区间。
图3:示波器实测图
解决方案
既然是采集器来不及换向,解决的思路很简单,有两个方案;
1、将采集的换向速度提高,提高到100uS以内;2、将PLC的回复时间变慢,延长到500uS以后。
由于客户担心改程序出问题,所以不愿意改,只好我们修改采集器的换向速度,我们的软件工程师也不愿意改,理由是产品运行多年,很稳定,怕改出问题。按照自然法制,怕麻烦的事,用钱肯定能解决!
终于不负有心人,我们找到了两个用钱解决的思路,就是更换RS485接口芯片,不让软件参与换向。可选的芯片有两种:
1、美信公司的MAX13488:由芯片自动切换方向,无需软件干预切换方向,驱动能力强,通信速率高,MAX13488宣称最高可以到16Mbps,与普通的RS485芯片性能一样。
图4;MAX13487 内部框图
2、周立功公司的RSM(3)485PHT,由芯片自动切换方向,无需软件干预切换方向,驱动能力强,通信速率高,DC电源、隔离、RS485芯片功能三合一,节省板卡空间。
图5;RSM(3)485PHT原理图
最终,我们选择了周立功的RSM(3)485PHT,经过7天的长时间丢包测试,丢包率为0%,测试通过。
举一反三
在接口转换设计中,匹配性问题是我们经常会遇到的,RS485由于定位是比较低速的串口,使用起来一般都不会有问题,我们的采集器也是99%的设备接入都没问题,这个客户的PLC也是我们遇到的唯一回复时间这么快的PLC,正常的PLC都会在500uS以后。这就给我们启示:所有的双工通信转换为单工通信时,都应该考虑换向不及时导致的数据丢失。
02
匹配电阻使用不当导致RS485通信失败
很多工程师都知道RS485的匹配电阻120R电阻的重要性,因此设计时候都有预留该电阻。但多个RS485设备并联时,需要注意该电阻的影响。
问题描述
之前我们公司做过数据采集器,采集是通过RS485与其他客户的设备连接的,产品设计之初是一对一连接,产品发布了2年基本没有收到市场的问题反馈,最近一个月时,客户有反馈我们的RS485读取不到数据,更换好几个全新的数据依旧,要求我们尽快解决。
原因分析
由于我们的产品已经发布2年都没问题,所以我们的主要怀疑方向就是客户的现场应用方案。我们先审视一下我们自己的RS485端口设计,如下图1。这个方案在点对点应用场景多年都ok。
图1:RS485端口设计原理图
接着我们审视客户的应用方案,如图2所示,客户采用的是手拉手的模式,这种模式也是常用的拓扑结构。
图2:客户的现场应用方案
由于暂时还没有找到原因,我们去RS485的标准这里找一些参考,终于,我们在RS485的标准里面找到以下关键信息;如下表:
总结下来,主要是以下的几条;
(1)驱动器输出信号电平(负载最小时):±1.5V;(2)驱动器负载最小阻抗:54Ω;
(3)接收器门槛电压:±200mV;(4)接收器输入阻抗最小值:≥12KΩ。
根据RS485差分阻抗的计算公式,当有64个终端并接时(n=64时),当RS485总线上只有首位两端有终端匹配电阻Rt时,总线上的差分阻抗为54.74Ω,刚刚符合RS485的标准。
图3,多个RS485并联的示意图
但是,由于我们的终端匹配电阻Rt是使用一个固定120欧姆阻值的电阻焊接在主板上,客户没有办法把中间的电阻删除,导致整个RS485总线上并联了多个120R的电阻,导致RS485总线上的差分阻抗远远小于54Ω,无法满足标准要求的大于54欧姆的要求,总线上的阻抗太小,导致驱动电流太大,RS485芯片无法提供足够的电流。解决方案
已经定位到原因,主要还是最初的设计定位是点对点通信,忽略了客户的对点通信的需求,将RS485总线上的匹配电阻Rt全部都焊接了,客户一旦使用多个设备并联时,导致了总线的差分阻抗太小。解决的办法就是将除了收尾两端的Rt全部删除。如下图4
图4:删除中间设备的Rt,只保留收尾两端的Rt
整改之后,经过我们测试部的测试和客户的使用1个多月,再也没有反馈问题,问题基本算解决。
总结
通过这次的事故,我们还总结了RS485以下的容易犯的错误:
(1)上下拉电阻的主要作用:RS485增加上下拉电阻的主要目的是为了解决总线在空闲状态、或者是开路状态(485收发器与总线断开)下,使得总线上的电压大于RS485标准要求的200mV(实际应用考虑余量设置为300mV);
(2)上下拉电阻的常规值:RS485的上下拉电阻阻值选择主要满足空闲状态下Vab大于300mV,该电阻越小,功耗越大,功耗大到一定程度时,甚至会触发RS485 的电源输出保护,导致通信失败,因此满足空闲下300mV情况该电阻越大越好,一般的应用,该电阻选择1K/R0805即可;
(3)多节点时的上下拉电阻:当RS485的总线上的节点增加时,由于RS485芯片内部也有内部上下拉电阻(该阻值一般都是上百K),该阻值与输入阻抗Rin并联后,再与终端匹配电阻并联,最终的等效差分阻抗很容易会小于RS485标准要求的54Ω。因此,2个节点以上的应用,则需要考虑外部上下拉电阻带来的阻抗减小,
(4)终端匹配电阻:从上面公式可以看出,只增加2个匹配电阻,差分阻抗就降低到60Ω,如果再增加一个就降低到40Ω,因此,使用多个节点时,最多只能在首尾两端增加120Ω的匹配电阻。
RS485纯硬件反相法自动换向过早导致数据丢包
之前我们的产品的RS485设计借鉴了图1中的转换器的原理,该方案的原理主要是使用反相器法,具体的实现原理就是:反相法使用了一个反相器,依赖于发送信号TX的电平决定RS485芯片属于发送还是接收状态,例如,TX为高电平时,反相后为低电平,此时收发器处于接收状态,AB总线上的逻辑由上下拉决定,此时为逻辑1;当TX为低电平时,反相后为高电平,此时收发器处于发送状态,AB总线上的逻辑为0。简单说,就是反相法可以发送低电平,高电平其实是有AB线上的上下拉电阻决定的。
经过我们的长时间的验证,该种方案在100kbps波特率以内都不会丢包,但是波特率大约100kbps以上,例如115200bps时,丢包可以达到0.1%,这是我们不允许的。
图1:Tps563200现货价格
原因分析
反相器法的原理上是没有问题的,但是我们忽略了一个串口的底层实现方式,串口通信是异步通信,双方没有时钟同步,依赖于双方的声称。
UART通信没有时钟同步,不是说不需要时钟,而是两个系统的时钟来自两个设备,各跑各的,没有同步。这就要求两个系统的时钟误差不能太大。UART接收的流程如下:
(1)接收端选定好与发送端一致的起始位数、数据位数、校验位数、停止位数、波特率,例如下图起始位1、数据位8、校验无、停止位1、波特率9600bps。
(2)RX线上无传输时,保持为高电平,RX端有采样器,采样器以波特率的16倍采样周期对一位bit数据进行采样。确认起始位后,再经过16个采样周期,采样第一位数据,再经过16个采样周期,采样第二位,以此类推。
图2:UART 采样示意图
图3:UART 过采样示意图
图4:UART 误差允许范围
这里就存在一个问题,发送和接收的底层启动都是由不同的厂家不同的工程师做的,大部分的工程师都是取数据bit的50%~80%位宽的数据,如果双方的波特率误差过大,就有可能数据还没有发送接收,但是RS485芯片已经切换到接收状态了,导致发送的数据错误。
使用100k速率仿真现有的方案,TXD信号和方向引脚同时切换,几乎没有余量。极端情况下就有可能数据没有传输结束,方向引脚就切换了,导致数据传不出去。理想的方案应该是方向引脚延后30%~50%的位宽再切换方向。
图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发送数据,因此方向控制信号等同于无效。
图6:方向信号延后措施
使用100K的频率进行仿真,结果显示方向引脚可以延后1.85uS,可以满足要求。
图7:100K频率仿真图
总结
本文主要通过增加RC延迟和反相器波形整形,从而达到方向切换比数据bit延后的目的,读者在实际使用过程,还需要根据自己设计的最高波特率来选择RC的参数,如RC时间太长,在频率很高的情况下,反相器可能没有输出,一致时0,一般设置为位宽的30%左右即可,例如115200bps的波特率,位宽是8.6uS,延迟参数可以设置为8.6*0.3=2.5u左右。二极管D1和R3主要是为了应付TXD信号由高变低的时候,能够快速的释放反相器输入引脚的电压,让反相器的输出为高电平,及时将数据0发送出去。