• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

485通讯中的故障解决

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发送出去。

全部回复(4)
正序查看
倒序查看
2022-01-22 14:37

485通信在PLC应用中也时常用到,像各种传感器、集线器都用485,但是吧,在单片机开发中还真没有用过。

0
回复
2022-01-22 14:38

这个帖子写的非常好,值得学习。

0
回复
2022-01-24 11:34

一般来说,对于设备数量较少时不需要匹配电阻的,特别是用到多个485设备时,如果自己的产品是从机时,最好不要焊接匹配电阻

0
回复
lsx3021
LV.1
5
2022-02-09 11:36

很好的经验和学习资料,收藏了!

0
回复