终于不负有心人,我们找到了两个用钱解决的思路,就是更换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 = RCLn[(V1-V0)/(V1-Vt)],可以估算出切换方向延迟的时间约3.1uSTXD发送数据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.60.3=2.5u左右二极管D1和R3主要是为了应付TXD信号由高变低的时候,能够快速的释放反相器输入引脚的电压,让反相器的输出为高电平,及时将数据0发送出去
(图片来源网络,侵删)
0 评论