RS485使用注意事項(上下拉電阻)


這里把這三天來調試RS485總線所遇到的問題和經驗教訓總結一下,備忘。

這兩天主要做的是把Keller 30X系列工業用壓力變送器的RS485接口和STM32單片機聯通,並將數據通過USB口轉發到PC上。

我首先直接使用Keller 30X連接電腦的RS485接口,這自然沒有問題,用Keller自帶的小軟件直接就能看到結果。

其次讓STM32的RS485接口和電腦連接,這步調試整整用了1天半,遇到了幾個比較棘手的問題:

  1. 發送時,由於RS485為半雙工模式,發送時需要處理收發轉換。發送前將T/NR線拉高,然后用串口發送一個字節的數據。發送完之后不能馬上把T/NR線拉低,需要等待一會兒(大約發送1~2位的時間,視波特率而定),等接收方確認收到停止位后,再把T/NR拉低進入接收模式。
  2. 接收時和發送同理,電腦向單片機發送數據時停止位起碼要有2位,以保證單片機收到停止位,否則連續發送時會把后一位數據中的1->0跳變認作起始位,導致傳輸錯誤
  3. 芯片選擇方面,要認清MAX3485和MAX485的區別。MAX3485是CMOS電平的,用3.3V供電。MAX485是TTL電平的,用5V供電。STM32單片機的IO都是CMOS電平,所以理應使用MAX3485芯片。如果一定要做TTL和CMOS的電平轉換,記住CMOS可以驅動TTL,而TTL驅動CMOS時需要上拉電阻。如果電平搞錯了,最明顯的狀況就是發送正常而接收亂碼。
  4. RS485的終端電阻不要亂接。RS485的終端電阻是接在總線最末端防止電波反射的,如果線很短干脆就不要接了,否則反而容易把差分信號拉小,使信噪比降低
  5. RS485的AB線上的上下拉電阻個人認為沒有必要接。首先MAX3485內部有上下拉電路,本身就能夠把AB線鉗位在1上;其次,如果線纜很長,設備所處的地電位和主板所處的地電位很可能不一樣,附加上下拉電阻反而會產生附加的暗電流,會把差分信號拉小,降低信噪比。
  6. STM32的Tx口要配置成推挽輸出模式,Rx口要配置成內置上拉模式(當然也可以配置成懸空模式,在電路板上用電阻上拉)

最后嘗試將Keller 30X和STM32單片機連接,悲劇就發生了。Keller 30X的485接口完全是針對電腦設計的,(9600,n,8,1)的配置下一幀連續發送20多個字節。正如上文所述,單片機需要至少1位的安全時間用於處理中斷程序,在接受Keller的快速連發時,下一字節的開始位到來時,單片機還處於中斷處理程序中,所以直接將其忽略了,這導致單片機將數據中出現的1->0的跳變認作下一位的起始位,使后續傳輸全部出錯。

不幸的是,Keller 30X的通信芯片不能編程,所以也無法給它加入安全事件。最后我只能采用的模擬信號A/D轉換的方式來采集Keller 30X的壓力信號。這個故事告訴我們,以后設計面向單片機的UART接口時(不管是RS232,rs485還是TTL,CMOS),一定要考慮到目標單片機的性能。單片機不比電腦,處理一個串口接收中斷一瞬間就可以完成,向單片機發送數據時,兩字節之間一定要留足安全時間,以保證目標單片機有足夠的時間處理中斷,讀取寄存器中的數據。STM32單片機已經算是快的了,處理一個中斷尚且需要1位的時間,如果是51的話,相信這個時間還會更長。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM