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