由于筆者在調試STM32移植的MODBUS協議的時候遇到了一些問題,需要借助示波器來看波形,而關于485通信波形相關的資料網上不多,所以把自己調試過程中的波形記錄下來。
硬件:STM32單片機,1個主機和10個從機,移植MODBUS協議,采用輪詢機制,主機挨個詢問從機,從機采集一些信息回復給主機。
原理圖:使用帶隔離的芯片ADM2483,PA1,PA2,PA3指的是單片機的引腳,分別是使能,TXD和RXD。
代碼:基本上是http://www.openedv.com/forum.php?mod=viewthread&tid=98367&highlight=modbus
根據自己的業務稍微做了簡化和修改。
以下是主機詢問以及從機回答的波形,兩組。測試的是AB兩線的電壓差
以下是一組主機詢問與從機回答的波形,中間間隔7ms左右。注意,MODBUS規定兩組數據之間必須有3.5字符的間隔,我的單個字符時長大約1ms,所以這個間隔不得小于3.5ms。
以下是一個命令的波形,可以看出一個命令用時約為8ms多一點,而一個命令是8個字符,通常情況下1個字符包括1位起始位、8位數據位(一般情況)、1位校驗位(或者沒有,本例子沒有校驗位)、1位停止位(一般情況下)。也就是一個字符是10位,由此可以推算出波特率:10bit / 1.05ms X 1000 ≈ 9600 bit/s
以下兩圖是把波形進一步“放大”,嘗試從波形里讀出數據。約4格表示一個字符。
此圖是上圖前四格的第一個字符,也就是10位,起始位總是低電平,而結束位是高電平,8個數據位,低位在前。可以看出,第一格式起始位的低電平,接下來是連續3個高電平和5個低電平,最后一格是結束位的高電平。中間的數據位是1110 0000,由于低位在前,所以實際是0000 0111,也就是0x07
下圖的黃色線是A線對地電壓,藍線是B線對地電壓。為了方便觀察,第一個圖把兩個波形完全分開了,第二個圖的“地”在同一水平線上。而A減去B,也就是黃色減去藍色,就可以得到465總線上的電壓情況。可以看出,單個A或是B的波形都不是很理想,定時A-B的波形還不錯。大概這就是485通信穩定的一個原因了吧。