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