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