基于CAN總線的懸浮控制器監(jiān)控終端的設(shè)計
在圖1所示的CAN網(wǎng)絡(luò)結(jié)構(gòu)圖中,數(shù)據(jù)流向大致可以分為二類:各懸浮節(jié)點之間的通信和懸浮節(jié)點與監(jiān)控節(jié)點之間的通信。由于懸浮節(jié)點之間的通信與監(jiān)控終端沒有直接關(guān)系,可以不予考慮。需要考慮的是各懸浮節(jié)點與監(jiān)控終端的通信,這就要求在組成CAN網(wǎng)絡(luò)時就必須制定一個懸浮節(jié)點和監(jiān)控終端間的通信協(xié)議。在實現(xiàn)時,具體協(xié)議如下:
(1)CAN監(jiān)控終端的接收標(biāo)識符為0,其他懸浮控制節(jié)點的標(biāo)識符均不得與之沖突;全部節(jié)點使用統(tǒng)一的波特率(50Kbps或500Kbps);數(shù)據(jù)包的長度統(tǒng)一為8B。
(2)CAN監(jiān)控終端向懸浮節(jié)點的數(shù)據(jù)傳送由監(jiān)控終端的撥碼開關(guān)指定數(shù)據(jù)包的標(biāo)識符,各懸浮節(jié)點通過數(shù)據(jù)包的標(biāo)識符和自身的本地標(biāo)識符比較以確定是否接收該數(shù)據(jù)包。
(3)CAN監(jiān)控終端的監(jiān)聽是開放的,并不需要接收的數(shù)據(jù)包的標(biāo)識符與自身的標(biāo)識符一致。但數(shù)據(jù)包內(nèi)第1個字節(jié)指明了發(fā)送該數(shù)據(jù)包的懸浮控制器的標(biāo)號。如果該標(biāo)號與撥碼開關(guān)指定的標(biāo)號一致,則繼續(xù)處理其他字節(jié)的內(nèi)容;否則,丟棄該包。數(shù)據(jù)包內(nèi)第2字節(jié)表示參數(shù)的類型,其余字節(jié)是浮點形式的參數(shù)數(shù)據(jù)。
(4)在系統(tǒng)開始運行時,各懸浮節(jié)點并不向CAN監(jiān)控終端發(fā)送數(shù)據(jù),只有在CAN監(jiān)控終端向某個節(jié)點發(fā)出“發(fā)送允許”命令之后,該節(jié)點才定時地向CAN監(jiān)控終端發(fā)送上傳數(shù)據(jù)。如果CAN監(jiān)控終端要監(jiān)聽其他節(jié)點的數(shù)據(jù),則需先禁止當(dāng)前節(jié)點的數(shù)據(jù)發(fā)送,再向其他節(jié)點發(fā)出“發(fā)送允許”命令。這樣可以有效減小CAN總線上的數(shù)據(jù)流量。
上述協(xié)議可以有效地維持CAN網(wǎng)絡(luò)中的數(shù)據(jù)通信秩序。
從實際出發(fā),要求軟件盡量簡單,界面盡量友好,便于操作。在實現(xiàn)時,為充分利用LCD的顯示能力,這里采用菜單的方式提示用戶操作。完成后的軟件界面如圖3所示。本文引用地址:http://2s4d.com/article/163293.htm
程序采用分層的程序結(jié)構(gòu)。最底層是一些硬件驅(qū)動程序,如鍵盤掃描、LCD狀態(tài)讀取和LCD數(shù)據(jù)寫入等。在這些底層驅(qū)動程序的基礎(chǔ)上再組織一些上層子程序供主程序調(diào)用。在編程語言的選擇上,考慮到程序的結(jié)構(gòu)相對比較復(fù)雜,程序主體采用C語言編程,只有少部分涉及到DSP一些底層操作的部分才使用匯編語言。軟件的主體流程圖如圖4所示。
初始化包括對CAN控制寄存器的初始化以及屏幕初始化,并在這之后讀取撥碼開關(guān)的狀態(tài),確定波特率及通信對象,向被監(jiān)控節(jié)點發(fā)出“發(fā)送允許”命令等。
程序主體是一個大循環(huán)。在初始化之后便不斷掃描鍵盤。首先判斷是否有鍵按下,如果用戶沒有操作,則檢查CAN模塊是否接收到數(shù)據(jù)。如果沒有接收到數(shù)據(jù),則繼續(xù)掃描鍵盤。如果接收到了數(shù)據(jù)(即相應(yīng)的CAN接收中斷標(biāo)志位置位),則將接收到的數(shù)據(jù)包按上述協(xié)議進(jìn)行分析、整合處理,然后在屏幕上顯示出接收到的數(shù)值;同時,在曲線的對應(yīng)位置上描點,完成曲線的繪制。如果在鍵盤掃描過程中發(fā)現(xiàn)有按鍵按下,則分析按鍵的類別,然后轉(zhuǎn)相應(yīng)的子程序處理。處理完畢再返回主程序。
這里數(shù)據(jù)接收并不采用中斷驅(qū)動方式,因為LCD的響應(yīng)速度較慢。當(dāng)LCD的響應(yīng)速度低于CAN接收數(shù)據(jù)的速度時,會形成中斷嵌套,時間長了就會出現(xiàn)堆棧溢出。此外,采用中斷方式在數(shù)據(jù)量大時會出現(xiàn)DSP無暇顧及用戶鍵盤輸入的現(xiàn)象。實踐表明,采用查詢的方式可以很好地發(fā)揮DSP和LCD的固有能力,而且整體響應(yīng)速度也比中斷方式快。
LCD顯示涉及的子程序比較多,分層也很多。在編寫程序時首先在DSP的Flash ROM里定義一個段,將LCD顯示過程中可能涉及的字符、漢字等點陣數(shù)據(jù)做成一個庫,放入段內(nèi),在使用時再通過ROM訪問指令讀取。
曲線的繪制過程如下:首先確定坐標(biāo)的原點位置、X方向和Y方向的最大坐標(biāo)以及輸入數(shù)值的范圍,然后在內(nèi)存中開辟一個同X坐標(biāo)點數(shù)一樣大小的緩沖區(qū)BUFF,用于記憶已經(jīng)繪制的各點的坐標(biāo);同時設(shè)定一個X指針,用于存儲當(dāng)前的X坐標(biāo)。當(dāng)接收到新的數(shù)據(jù),確定好Y方向的坐標(biāo)后,首先查找BUFF,得到原來顯示在該X位置的點的Y坐標(biāo),將這個位置上的點清除,然后在新的Y坐標(biāo)上描點,最后在BUFF的相應(yīng)X位置上記錄下新描點的Y坐標(biāo)值,此時便完成了一個點的繪制。后面還要調(diào)整屏幕上的指針以標(biāo)明當(dāng)前顯示的X坐標(biāo)。當(dāng)繪制到X方向的最大位置時,再返回X=0的位置繼續(xù)繪圖。
屏幕下方有關(guān)菜單的操作也是采用樹結(jié)構(gòu)實現(xiàn)的,這里不再詳述。
CAN監(jiān)控終端向懸浮節(jié)點發(fā)送數(shù)據(jù)的過程一般是伴隨在相應(yīng)的菜單操作并按下ENTER鍵生效后進(jìn)行的。在每次數(shù)據(jù)發(fā)送之前,程序都需要讀入撥碼開關(guān)的狀態(tài),以確定通信的波特率和通信對象的標(biāo)識符。在實現(xiàn)上,撥碼開關(guān)的最高位控制著波特率,后面7位則決定了通信的發(fā)送標(biāo)識符。
4 結(jié)束語
使用表明,這種基于TMS320LF2407A DSP的CAN總線監(jiān)控終端在多懸浮控制器組成的網(wǎng)絡(luò)中可以發(fā)揮很好的監(jiān)控和調(diào)試作用,其結(jié)構(gòu)小巧、界面友好,使用相當(dāng)方便。
評論