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