文|株洲時(shí)代電子技術(shù)有限公司 劉潔 曾海林
CAN 總線由于采用差分信號(hào)進(jìn)行數(shù)據(jù)傳輸,有著極強(qiáng)的抗干擾能力,同時(shí),由于它采用非破壞性的總線仲裁機(jī)制,使得即便同一時(shí)刻不同節(jié)點(diǎn)同時(shí)往CAN 總線發(fā)送數(shù)據(jù),也不會(huì)出現(xiàn)數(shù)據(jù)混亂和通信出錯(cuò)的情況,由于CAN 總線的各種優(yōu)點(diǎn),使得其在歐美國(guó)家乃至全世界被廣泛應(yīng)用,尤其是在工業(yè)控制、工業(yè)儀表和汽車(chē)電子等領(lǐng)域,CAN 總線控制系統(tǒng)廣泛應(yīng)用于各類(lèi)機(jī)械自動(dòng)化設(shè)備中。
隨著設(shè)備內(nèi)各總成節(jié)點(diǎn)不斷增加,與此同時(shí)接入到網(wǎng)絡(luò)控制系統(tǒng)的的第三方設(shè)備與傳感器也逐漸增加,出現(xiàn)了各種各樣通信波特率,CAN 總線在不同波特率下允許的最大通訊距離是: 10km (5Kbps)、6.7km (10Kbps)、3.3km(20Kbps)、1.3km (50Kbps)、620m (100Kbps)、530m (125Kbps)、270m(250Kbps)、130m(500Kbps)和40m(1Mbps)。由于CAN 總線通信時(shí)必須保持同種波特率,故接入的第三方控制系統(tǒng)中主控制器與從節(jié)點(diǎn)之間只能用同一波特率進(jìn)行通信 ;由于某些第三方設(shè)備的波特率是無(wú)法修改的(如發(fā)動(dòng)機(jī)ECU 和變速箱VTDC 等),故此時(shí)接入第三設(shè)備后,所有同一網(wǎng)絡(luò)的從節(jié)點(diǎn)都需通過(guò)修改底層程序重新燒寫(xiě)程序才能實(shí)現(xiàn)波特率的修改,大大增加了工作量,如果能夠開(kāi)發(fā)一種在線修改波特率的程序,勢(shì)必大大減少工作量,同時(shí)使得波特率的修改變得極為方便快捷。為此,本文提出了一種CAN 總線波特率自適應(yīng)程序設(shè)計(jì)的方案,設(shè)計(jì)了基于此方案的軟件程序,通過(guò)在實(shí)驗(yàn)室調(diào)試,充分驗(yàn)證了該軟件方案的可行性。
目前的網(wǎng)絡(luò)控制系統(tǒng)根據(jù)現(xiàn)場(chǎng)應(yīng)用按照網(wǎng)絡(luò)控制單元所處的網(wǎng)絡(luò)位置,分為主控制單元與從控制單元,其中主控制單元相互之間以主CAN 網(wǎng)絡(luò)連接,以固定波特率通訊;從控制單元與從控制單元之間以設(shè)備CAN 網(wǎng)絡(luò)連接,通訊波特率采用自適應(yīng)方式。現(xiàn)場(chǎng)應(yīng)用示意圖如圖1 所示。
圖1 中顯示控制單元、主控制單元和從控制單元均為自主研發(fā)的網(wǎng)絡(luò)控制單元,設(shè)備與傳感器均為標(biāo)準(zhǔn)CAN 設(shè)備與傳感器,整個(gè)系統(tǒng)構(gòu)成一個(gè)網(wǎng)絡(luò)控制平臺(tái)。一個(gè)主控制單元或幾個(gè)主控制單元配合設(shè)備CAN 組成整系統(tǒng)中的一個(gè)分系統(tǒng),例如,控制一組作業(yè)部件時(shí),由一個(gè)或幾個(gè)主控制單元根據(jù)相應(yīng)算法控制多個(gè)從控制單元發(fā)生相應(yīng)動(dòng)作。此時(shí)控制系統(tǒng)的界限更加明顯,如作業(yè)系統(tǒng)可以分為搗固、穩(wěn)定和測(cè)量,加上走行和發(fā)動(dòng)機(jī)控制,獨(dú)立組成局域網(wǎng),這樣主CAN 網(wǎng)絡(luò)數(shù)據(jù)量也會(huì)相應(yīng)減少。
圖1 總線應(yīng)用方案圖
在控制單元設(shè)計(jì)時(shí)選用具有兩個(gè)獨(dú)立CAN控制單元的DSP 芯片,在以往的設(shè)計(jì)基礎(chǔ)上豐富硬件功能,滿(mǎn)足通訊需求。從控制單元只使用一個(gè)CAN,原則上設(shè)備與傳感器只能掛在設(shè)備CAN 網(wǎng)絡(luò)。
在保證原有程序正常運(yùn)行的基礎(chǔ)上,設(shè)計(jì)從控制單元具備自適應(yīng)波特率調(diào)整功能,主控制單元有下發(fā)更改波特率的功能。當(dāng)局域網(wǎng)絡(luò)添加新的控制單元或者其他設(shè)備時(shí)由操作者在人機(jī)交互界面點(diǎn)擊新增某局域網(wǎng)絡(luò)設(shè)備,啟動(dòng)自適應(yīng)匹配波特率程序。
圖2 是顯示器啟動(dòng)波特率更改程序的基礎(chǔ)流程圖,省略了標(biāo)志位設(shè)置以及程序溢出流程,基本的功能由命令下發(fā)與讀取主控制單元收到命令返回值組成,命令的下發(fā)增加了主控制單元收到后的校驗(yàn)過(guò)程,如果主控制單元收到命令,會(huì)返回一個(gè)收到命令的狀態(tài),確保要修改子網(wǎng)絡(luò)波特率的主控制單元已經(jīng)收到修改命令。當(dāng)主控制單元成功修改了其子網(wǎng)絡(luò)波特率后會(huì)返回相應(yīng)的響應(yīng)碼到顯示器,此時(shí),顯示控制單元會(huì)記錄下本主控制單元下子網(wǎng)絡(luò)的最新的CAN通訊波特率。顯示器波特率修改子程序流程圖如圖2 所示。
某個(gè)需要更改其子網(wǎng)絡(luò)CAN通信波特率的主控制單元,首先會(huì)在CANA 收到顯示控制單元的命令,然后保持現(xiàn)有波特率通過(guò)CANB 下發(fā)更改波特率的命令給從控制單元。圖3 為主控制單元波特率更改程序流程圖,省略了標(biāo)志位設(shè)置以及程序溢出流程。在此程序設(shè)計(jì)時(shí)沒(méi)有使用從控制單元收到命令后的反饋,是因?yàn)樵趶目刂茊卧O(shè)計(jì)時(shí)增加了通訊異常判斷,所以只要在200ms 的時(shí)間里發(fā)送改變波特率的命令即可。還需要特別指出的是在CANB 波特率改變之前必須要屏蔽別的數(shù)據(jù)發(fā)送命令,使子網(wǎng)絡(luò)僅僅只有專(zhuān)用校驗(yàn)碼廣播存在,提高網(wǎng)絡(luò)可靠性。
圖2 顯示器啟動(dòng)波特率更改子程序流程圖
主機(jī)外設(shè)寄存器初始化包括CAN 寄存器的初始化,確保主機(jī)上電后CAN 通訊波特率為默認(rèn)可知值,主機(jī)收到上位機(jī)請(qǐng)求改變波特率命令后,會(huì)立即將修改命令下發(fā)到子網(wǎng)絡(luò)的所有從機(jī),然后等待從機(jī)修改波特率操作,此過(guò)程需要一定時(shí)間,只有等所有從機(jī)修改完成后,主機(jī)才開(kāi)始以修改后的波特率下發(fā)特定校驗(yàn)碼到從機(jī),通過(guò)從機(jī)是否收到特定檢驗(yàn)碼來(lái)判定從機(jī)修改波特率是否成功,當(dāng)從機(jī)修改成功后,主機(jī)會(huì)收到相應(yīng)的從機(jī)回應(yīng)碼,主機(jī)程序再進(jìn)入正常的作業(yè)程序,進(jìn)行正常的作業(yè)數(shù)據(jù)收發(fā)。主機(jī)程序流程圖如圖3 所示。
圖3 主機(jī)程序流程圖
改變波特率的最終目的就是在子網(wǎng)絡(luò)可以加掛不同頻段的設(shè)備,因此在加入新設(shè)備時(shí)需要更改在局域網(wǎng)中所有從控制單元的波特率。圖4 為從控制單元波特率更改程序流程圖,省略了標(biāo)志位設(shè)置以及程序溢出流程。因此在程序設(shè)計(jì)時(shí),從控制單元設(shè)計(jì)為三種狀態(tài)都能夠自動(dòng)匹配波特率,一個(gè)是從控制單元出廠后未設(shè)定波特率,一個(gè)是通訊異常,另外一個(gè)是主控制單元啟動(dòng)改變波特率的程序,這三種狀態(tài)均能進(jìn)入波特率調(diào)整入口,這時(shí)波特率寄存器依次更改為800K、500K 和250K 等,重置CAN 控制寄存器,主程序不斷地讀取網(wǎng)絡(luò)數(shù)據(jù),如果通訊正?;蛘邔?zhuān)用校驗(yàn)碼識(shí)別成功,說(shuō)明波特率修改成功,保存波特率參數(shù)并返回主程序,主程序?qū)⒁孕薷某晒蟮牟ㄌ芈逝c其他設(shè)備通訊。從機(jī)的波特率修改部分程序流程圖如圖4 所示。
圖4 從機(jī)程序流程圖
其中波特率修改函數(shù)的流程圖如圖5 所示。
其中,MAX 一般定義為80~150,特定校驗(yàn)碼由主機(jī)與從機(jī)開(kāi)發(fā)人員事先約定好,修改波特率依次從高到低,分別采取800K、500K 和250K 等分別進(jìn)行試探,當(dāng)波特率與主機(jī)不匹配達(dá)一定時(shí)間(由MAX 定義),說(shuō)明所有可能匹配的波特率已經(jīng)進(jìn)行試探,仍然收不到數(shù)據(jù),說(shuō)明通信已經(jīng)出錯(cuò),此時(shí)需修改初始化波特率為默認(rèn)的800K,以供重新上電恢復(fù)通信;當(dāng)波特率與主機(jī)匹配時(shí),從機(jī)才會(huì)收到來(lái)自主機(jī)的特定校驗(yàn)碼,此時(shí),從機(jī)需將波特率參數(shù)存儲(chǔ)到FLASH 區(qū),下次上電則從FLASH 讀取出該波特率參數(shù)。
根據(jù)測(cè)試需要,在實(shí)驗(yàn)室搭建了相應(yīng)的測(cè)試平臺(tái),測(cè)試中選擇一臺(tái)主機(jī)和多臺(tái)從機(jī),如圖6 所示。
現(xiàn)場(chǎng)試驗(yàn)先驗(yàn)證一主多從方式,此時(shí)開(kāi)啟主從正常通訊內(nèi)容,使網(wǎng)絡(luò)數(shù)據(jù)接近正常工作狀態(tài),再由主控制單元發(fā)送命令改變波特率,發(fā)現(xiàn)從控制單元收到命令不穩(wěn)定,考慮實(shí)際應(yīng)用時(shí),一旦啟動(dòng)波特率更改命令,設(shè)備CAN 網(wǎng)絡(luò)上不應(yīng)該存在其他命令,因此對(duì)其他命令屏蔽,從控制單元能夠正常響應(yīng)。最終2 個(gè)從控制單元的波特率調(diào)整為與主控制單元相同的波特率并通信正常。試驗(yàn)驗(yàn)證程序設(shè)計(jì)可以實(shí)現(xiàn)主控制單元下發(fā)命令與從控制單元的配合基本正常,對(duì)從控制單元的波特率設(shè)定也僅需要更改與波特率相關(guān)的寄存器即可完成。從控制單元收到更改命令后一些試驗(yàn)數(shù)據(jù)如圖7~圖13 所示。
圖5 波特率修改程序流程圖
圖6 測(cè)試平臺(tái)網(wǎng)絡(luò)結(jié)構(gòu)拓?fù)鋱D
圖7 從控制單元0x209 波特率初始設(shè)定800Kb 的一些試驗(yàn)數(shù)據(jù)
圖8 從控制單元0x209 修改為500Kb 的一些試驗(yàn)數(shù)據(jù)
圖9 從控制單元0x209 修改為250Kb 的一些試驗(yàn)數(shù)據(jù)
由圖7~9 可以看出,從控制單元0x209 無(wú)論是在修改前的800K 的波特率還是在修改為500K 和250K 都能正常收到了來(lái)自其他控制單元0x207 和0x208 的數(shù)據(jù)(變量CountData207 和CountData208 代表接收數(shù)據(jù)幀數(shù)),控制單元是收不到自身所發(fā)數(shù)據(jù),故CountData209 一直為0,以上數(shù)據(jù)充分說(shuō)明了波特率自適應(yīng)調(diào)節(jié)是成功的。
圖10 從控制單元0x208 初始為800Kb 收到數(shù)據(jù)
圖11 從控制單元0x208 轉(zhuǎn)化為500Kb 收到數(shù)據(jù)
圖12 從控制單元0x208 轉(zhuǎn)化為250KB 收到數(shù)據(jù)
由圖10~12 可以看出,從控制單元0x208 無(wú)論是在修改前的800K 的波特率還是在修改為500K 和250K 都能正常收到了來(lái)自其他控制單元0x209 和0x207 的數(shù)據(jù)(變量CountData209 和CountData207 代表接收數(shù)據(jù)幀數(shù)),控制單元是收不到自身所發(fā)數(shù)據(jù),故CountData208 一直為0。
以上數(shù)據(jù)充分說(shuō)明了波特率自適應(yīng)調(diào)節(jié)是成功的。
當(dāng)主控制單元發(fā)送錯(cuò)誤命令時(shí),波特率不會(huì)調(diào)整,也不會(huì)收到數(shù)據(jù),當(dāng)主控制單元調(diào)整為系統(tǒng)默認(rèn)的標(biāo)準(zhǔn)波特率(800K、500K 和250K)時(shí),從控制單元會(huì)再次正常收到數(shù)據(jù)。
圖13 從控制單元收到錯(cuò)誤命令時(shí)收到數(shù)據(jù)為零
當(dāng)主控制單元重新以正常波特率發(fā)送時(shí),從控制單元又會(huì)自動(dòng)調(diào)整到正確的波特率進(jìn)行正常通訊,確保了通信的可靠和可恢復(fù)性。
通過(guò)學(xué)習(xí)和實(shí)踐,在保持原有主從機(jī)程序不變的基礎(chǔ)上,通過(guò)實(shí)驗(yàn)驗(yàn)證波特率調(diào)整方案切實(shí)可行,并在基于DSP的控制單元上進(jìn)行了一主一從和一主二從試驗(yàn),在沒(méi)有改變其他程序的基礎(chǔ)上添加了波特率改變的程序,系統(tǒng)排除了多個(gè)不穩(wěn)定因素,已經(jīng)能夠正常運(yùn)行,并將在一主多從的局域網(wǎng)中廣泛試驗(yàn)。