電機(jī)PID控制補(bǔ)充篇-野火上位機(jī)串口協(xié)議介紹
0 引言
之前介紹的電機(jī)PID控制的系列文章,得到不少電子愛好者的關(guān)注,不過也收到一些關(guān)于串口通信的疑問反饋。之前的一系列文章,確實(shí)沒有著重介紹串口軟件的使用細(xì)節(jié)以及通信協(xié)議的具體格式。本篇就來補(bǔ)充一下野火PID調(diào)試助手的串口協(xié)議。
下野火PID調(diào)試助手的使用界面如下,與串口通信協(xié)議相關(guān)的,主要分為三個(gè)部分:
啟/停區(qū):控制電機(jī)的啟動(dòng)、停止以及程序的復(fù)位
數(shù)據(jù)曲線區(qū):接收板子發(fā)上來的數(shù)據(jù),進(jìn)行速度曲線或位置曲線等的繪制

在介紹串口協(xié)議之前,推薦安裝一個(gè)虛擬串口驅(qū)動(dòng)軟件來在自己的電腦上虛擬出兩個(gè)串口,方便分析串口數(shù)據(jù)。
比如我們在電腦上產(chǎn)生兩個(gè)虛擬串口,這兩個(gè)串口可以看作是通過線連接了起來,比如我們使用野火PID助手和另一個(gè)串口助手軟件分別連接這兩個(gè)虛擬串口,當(dāng)野火PID助手發(fā)送數(shù)據(jù)時(shí)(比如按下啟動(dòng)按鈕),另一端的串口助手軟件就可以收到并顯示野火PID助手發(fā)來的數(shù)據(jù),這樣我們就能分析野火PID助手下發(fā)數(shù)據(jù)的數(shù)據(jù)格式了。

1 PID調(diào)試助手串口協(xié)議介紹
先來看一下野火PID調(diào)試助手的串口協(xié)議數(shù)據(jù)格式。
串口協(xié)議的定義參考野火論壇的介紹:https://www.firebbs.cn/forum.php?mod=viewthread&tid=29923&extra=page%3D1
1.1 指令包格式
串口數(shù)據(jù)是通過一包一包的數(shù)據(jù)發(fā)送的,每一包的數(shù)據(jù)格式如下:

所有多字節(jié)的低字節(jié)在前(關(guān)于高低字節(jié)或數(shù)據(jù)大小端的介紹,可參考:)
包頭固定為四字節(jié)的0x59485A53
通道地址1到5對應(yīng)軟件上的CH1到CH5,CH1為0x01,CH2為0x02
包長度為從包頭到校驗(yàn)的所有數(shù)據(jù)長度
指令為相應(yīng)的功能碼
參數(shù)為指令需要參數(shù)時(shí)加入
校驗(yàn)為校驗(yàn)和方式——8位
1.2 指令分類
上述數(shù)據(jù)格式中,需要重點(diǎn)關(guān)注的是“指令”這一字段,它表明了這一包數(shù)據(jù)的具體含義。
另外,串口數(shù)據(jù)包括下發(fā)數(shù)據(jù)和上傳數(shù)據(jù),下發(fā)數(shù)據(jù)就是野火PID助手按照協(xié)議包格式向板子發(fā)送串口數(shù)據(jù),上傳數(shù)據(jù)就是板子按照協(xié)議包格式向野火PID助手送串口數(shù)據(jù)。
1.2.1 下發(fā)數(shù)據(jù)
野火PID助手下發(fā)設(shè)定的數(shù)據(jù)或指令到板子中

1.2.2?上傳數(shù)據(jù)
板子上傳數(shù)據(jù)或指令到野火PID助手

2 數(shù)據(jù)實(shí)測與分析
2.1 實(shí)測下發(fā)的數(shù)據(jù)
測試數(shù)據(jù)的下發(fā),可以只使用一個(gè)電腦進(jìn)行測試,通過虛擬串口,分別連接野火PID助手和另一個(gè)串口助手軟件,通過野火PID助手向另一個(gè)串口助手發(fā)送數(shù)據(jù),以Hex方式顯示接收的數(shù)據(jù),并觀察數(shù)據(jù)的格式。
2.1.1 下發(fā)啟動(dòng)(0x12) 停止(0x13) 復(fù)位(0x14)
這3個(gè)是指令,沒有數(shù)據(jù)參數(shù),數(shù)據(jù)長度為0x0B,也就是11個(gè)byte


2.1.2 下發(fā)目標(biāo)值(0x11) 周期(0x15)
這2個(gè)指令,帶有1byte數(shù)據(jù),數(shù)據(jù)長度為0x0F,也就是15個(gè)byte


2.1.3 下發(fā)送PID(0x10)
這個(gè)指令,帶有12byte數(shù)據(jù)(3個(gè)float),數(shù)據(jù)長度為0x17,也就是23個(gè)byte


注意:這里PID的數(shù)據(jù)是float型的,在發(fā)送時(shí)是需要拆分成4個(gè)字節(jié)的Hex格式發(fā)送的,關(guān)于float類型數(shù)據(jù)轉(zhuǎn)為Hex格式的介紹,可參考:
2.2 實(shí)測上傳數(shù)據(jù)
測試數(shù)據(jù)的上傳,需要將程序下載到板子中,板子通過軟件連接電腦上的任意串口調(diào)試軟件,以Hex方式顯示接收的數(shù)據(jù),分析數(shù)據(jù)的格式。
2.2.1 上傳啟動(dòng)(0x04)/停止(0x05)狀態(tài)

2.2.2 上傳目標(biāo)值(0x01)/周期值(0x06)

2.2.3 上傳PID參數(shù)(0x03)


2.2.4 上傳實(shí)際值(0x02)
這里就是將電機(jī)的轉(zhuǎn)速和位置值上傳到野火PID助手中,用于顯示位置曲線或速度曲線。


3 串口收發(fā)程序
再來看一下與串口數(shù)據(jù)發(fā)送與接收相關(guān)的主要代碼:
3.1 發(fā)送
按格式組包數(shù)據(jù):
將一包數(shù)據(jù)一個(gè)個(gè)發(fā)送給上位機(jī):
3.2 接收
使用中斷的方式進(jìn)行串口數(shù)據(jù)的接收:
接收之后的數(shù)據(jù)保存在串口接收緩存ReCV1數(shù)組中,然后再根據(jù)協(xié)議格式解析數(shù)據(jù)即可。
4 總結(jié)
本篇介紹的野火PID助手的串口協(xié)議格式,包括下發(fā)的數(shù)據(jù)格式和上傳的數(shù)據(jù)格式,并通過實(shí)際獲取串口數(shù)據(jù)的Hex格式數(shù)據(jù),與協(xié)議的定義進(jìn)行對比分析,使得能夠更加的理解串口數(shù)據(jù)的格式。
如果遇到野火PID助手下發(fā)指令板子沒反應(yīng),或板子上傳數(shù)據(jù)PID數(shù)據(jù)無法顯示曲線,這時(shí)就要先排查一下串口數(shù)據(jù)的格式是否正確,若不正確,就要看下自己程序中的串口收發(fā)函數(shù)編寫的是否正確,只有串口數(shù)據(jù)符合了規(guī)定的協(xié)議格式,才能正確的進(jìn)行數(shù)據(jù)通信。
如果串口數(shù)據(jù)格式正常,電機(jī)還不轉(zhuǎn),就要排查硬件接線是否正常以及是否要根據(jù)自己的電機(jī)編碼器參數(shù)來修改程序中的參數(shù)。