摘 要: 一種快速、高效的CAN適配" title="適配">適配器設(shè)計方案。把雙端口" title="雙端口">雙端口RAM分為兩個獨立的區(qū)域,實現(xiàn)了雙緩沖" title="雙緩沖">雙緩沖,并從軟硬件上保證了PC機和片載單片機對雙端口RAM的不沖突訪問。
關(guān)鍵詞: CAN總線 CAN適配器? 雙端口RAM? 單片機
Stewart平臺機器人又稱六自由度并聯(lián)機器人,它具有剛度大、承載能力強、誤差小、精度高、自重負(fù)荷比小、動力性能好、控制容易等一系列優(yōu)點。本文基于CAN適配器實現(xiàn)了Stewart平臺機器人的遠(yuǎn)程監(jiān)控。由于在應(yīng)用Stewart平臺進行實驗性研究時,外部的控制量無法預(yù)知,并有可能超出Stewart平臺機器人的承受范圍。因此,外部的控制命令需要經(jīng)過一個保護、控制系統(tǒng),經(jīng)過此系統(tǒng)上位機的解析后再送給Stewart平臺。同時,上位機也負(fù)責(zé)實時采集Stewart平臺的運動數(shù)據(jù)并發(fā)送。遠(yuǎn)程控制計算機通過接收到的狀態(tài)信息產(chǎn)生下一時刻的控制命令。整個系統(tǒng)結(jié)構(gòu)如圖1所示。
遠(yuǎn)程監(jiān)控的實現(xiàn)要求機器人把并聯(lián)機器人六根桿的長度傳送給遠(yuǎn)程控制端,再把控制量傳回機器人。實際應(yīng)用中要傳輸?shù)臈U長為1000~2000mm,一根桿長可以用10位二進制表示,6根桿長共用60位,加上4位校驗碼共8個字節(jié)??刂屏渴窍乱淮螜C器人的6根桿長,所以也為8個字節(jié)。為了保證機器人的運行安全,要求控制周期最大為20ms,由于監(jiān)控端還要進行機器人位置姿態(tài)解算,因此必須選擇實時、高效的通信方式。為了保證實時,選用了基于實時DOS的機器人控制系統(tǒng)。如果選用以太網(wǎng)卡通信,其在DOS下的驅(qū)動比較麻煩,況且如果使用TCP/IP協(xié)議實現(xiàn)局域網(wǎng)通信,略顯復(fù)雜。
1 CAN適配器的研究現(xiàn)狀
控制器局域網(wǎng)CAN-bus(Controller Area Network)是目前國際上應(yīng)用最廣泛的現(xiàn)場總線之一。它是一種架構(gòu)開放、廣播式的新一代網(wǎng)絡(luò)通信協(xié)議,成本低,實時處理能力強,可以在強電磁干擾環(huán)境下可靠工作。因此CAN總線被廣泛應(yīng)用于離散控制領(lǐng)域中的過程檢測和控制,特別是工業(yè)自動化的底層監(jiān)控,以解決控制與測試之間可靠和實時的數(shù)據(jù)交換。
CAN總線具有協(xié)議簡單、有效載荷高等特點,可以實現(xiàn)點對點和多點間的通信,其最高通信速率達(dá)1Mbps/40m,用于局域網(wǎng)通信時可保證較高的實時性。假設(shè)實際通信中CAN總線的效率為80%,則傳送22字節(jié)(有效數(shù)據(jù)8+8字節(jié),控制信令3+3字節(jié))的時間僅為0.22ms,完全可以滿足本項目需要。本文根據(jù)控制要求設(shè)計實現(xiàn)了適合控制系統(tǒng)數(shù)據(jù)傳輸?shù)腃AN控制器,具有速率高、實時性好、PC機運行負(fù)擔(dān)小等特點。
本文在眾多CAN適配器的研究和開發(fā)的基礎(chǔ)上做了進一步改進,把雙緩沖的概念引入雙端口RAM,實現(xiàn)了PC機讀寫和板載單片機接收的并行工作,并用兩個鎖存" title="鎖存">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器" title="鎖存器">鎖存器避免PC機與單片機的訪問沖突。實踐表明,該方法可以大大提高通信效率。
2 雙緩沖的實現(xiàn)
2.1 硬件基礎(chǔ)
適配卡主要由雙端口RAM、微處理器、發(fā)送/接收數(shù)據(jù)緩沖區(qū)、CAN控制器及其收發(fā)電路組成,如圖2所示。其中CAN控制器采用Philips公司的SJA1000及與其對應(yīng)的PCA82C250 CAN總線收發(fā)器;板載單片機采用AT89C52,負(fù)責(zé)SJA1000的初始化,向PC端接收/發(fā)送數(shù)據(jù)以及通過控制SJA1000實現(xiàn)數(shù)據(jù)的接收和發(fā)送等通信任務(wù);發(fā)送和接收緩沖區(qū)各由一個62256存儲器構(gòu)成,各容量為8KB,采用先進先出的方式存放數(shù)據(jù)。
本文采用雙緩沖區(qū)模式實現(xiàn)高效通信。該模式在工程上稱為“乒乓”緩沖區(qū)模式,與常用的單緩沖區(qū)模式相比,其優(yōu)點是:可以使用容量較小的內(nèi)存,不間斷地對無限量的數(shù)據(jù)緩沖(輸入與輸出端需協(xié)同工作)。這種緩沖區(qū)模式的工作原理是: 在內(nèi)存中開辟兩塊容量相等的緩沖區(qū)(以下稱1# 緩沖區(qū)和2# 緩沖區(qū))。在通信時,PC機獲取某緩沖區(qū)(如1# 緩沖區(qū)),把數(shù)據(jù)寫入;然后獲取另一塊緩沖區(qū)的寫控制權(quán),在PC機給2#緩沖區(qū)寫的同時,單片機把1#緩沖區(qū)的數(shù)據(jù)傳送給CAN控制器,從而實現(xiàn)PC機寫入雙端口RAM與單片機發(fā)送的并行工作,大大提高通信效率。為了實現(xiàn)此功能,使用雙端口RAM作為PC機和單片機之間的交換區(qū),并協(xié)調(diào)緩沖區(qū)的控制權(quán),避免讀寫沖突。
雙端口RAM采用CYPRESS公司的7C132,容量為2KB。其中1000字節(jié)作為PC機向微處理器發(fā)送數(shù)據(jù)的緩沖區(qū),1000字節(jié)作為PC機從微處理器接收數(shù)據(jù)的緩沖區(qū)。其他區(qū)域用于存放PC機對板卡的初始化信息,包括幀長、通信模式、目標(biāo)節(jié)點ID等。雙端口RAM擁有兩個完全獨立的端口,并允許兩個端口獨立、異步地對存儲器中的任何存儲單元進行存取操作。當(dāng)兩個端口同時對存儲器中的同一單元進行存取操作時會發(fā)生競爭現(xiàn)象,造成數(shù)據(jù)的丟失或誤讀。為此,雙端口RAM利用內(nèi)部的仲裁邏輯電路決定兩邊的優(yōu)先權(quán),并對外提供2個信號,以表示對該端口的操作是否有效。未獲得許可的端口
信號被拉成低電平,此間,對該端口的讀操作均無效。解決雙端口RAM的競爭問題有兩種方法:軟件查詢法和硬件判優(yōu)法。
硬件判優(yōu)法需要CPU具有等待時序的功能。本文所討論的CAN適配卡中微處理器采用的AT89C52不具備READY引腳的功能,因此硬件判優(yōu)法在本適配卡中無法實現(xiàn)。
軟件查詢法是將信號接到微處理器的一個I/O引腳上,通過查詢此I/O引腳的狀態(tài)確定當(dāng)前是否能對雙端口RAM進行讀寫操作。軟件查詢法會增加微處理的負(fù)擔(dān),僅適用于競爭現(xiàn)象不經(jīng)常發(fā)生的情況。本文所討論的CAN適配卡通過兩片74LS374實現(xiàn)PC機和單片機的狀態(tài)鎖存,巧妙地實現(xiàn)單片機和PC機的協(xié)調(diào)通信。
具體電路如圖3所示。
PC機的狀態(tài)字鎖存信號由ISA總線的和139A的Y1經(jīng)過一個或非門決定。平時CLK引腳為低電平,當(dāng)PC向139A的Y1所對應(yīng)的I/O地址(即A2~A9為跳線開關(guān)選定地址,A1、A0為01)寫狀態(tài)字時,
和Y1同時為低,CLK引腳變?yōu)楦唠娖?,出現(xiàn)一個上升沿,從而將ISA數(shù)據(jù)總線的狀態(tài)字鎖存在374中,等待C52的讀取。當(dāng)C52從PC狀態(tài)字對應(yīng)地址(F700H)讀取狀態(tài)字時,139B的Y3、C52的P2.3和
同時出現(xiàn)低電平,從而使得374的
引腳信號有效,將374鎖存內(nèi)容送到C52的P0口,C52完成對PC狀態(tài)字的讀取。
C52的、P2.4和139B的輸出Y3經(jīng)過邏輯或非決定C52狀態(tài)字的鎖存信號CLK是否有效。當(dāng)C52向其狀態(tài)字對應(yīng)地址(EF00H)寫入狀態(tài)字時,
、P2.4和Y3會同時出現(xiàn)一個低電平信號,經(jīng)過或非門后變?yōu)楦唠娖?,由于CLK引腳平時是低電平,這時會出現(xiàn)一個上升沿,從而把C52送到P0口的狀態(tài)字鎖存在74LS374中,等待PC的讀取。當(dāng)PC從C52狀態(tài)字地址(A2~A9為跳線開關(guān)選定地址,A1、A0為10)讀取狀態(tài)字時,ISA總線的
和139A的Y2會同時出現(xiàn)低電平信號,使得374的
引腳信號有效,將其鎖存內(nèi)容送到ISA的數(shù)據(jù)總線上,從而完成對C52狀態(tài)字的讀取。
2.2 狀態(tài)控制
雙緩沖機制非常有效,但是用雙端口RAM實現(xiàn)雙緩沖時,必須解決訪問沖突問題。為了減小CPU查詢此狀態(tài)的負(fù)擔(dān),PC端和單片機端均通過自己的狀態(tài)變量和讀取對方鎖存器來判別緩沖區(qū)的使用權(quán),以避免訪問沖突。下面介紹實現(xiàn)方法。
記連接ISA/IOW的鎖存器為PC_STATUS,該鎖存器反映PC機的狀態(tài)變量PC_FLAG,為PC寫,單片機只讀;記連接C52/WR的鎖存器為MCU_STATUS,該鎖存器反映單片機的狀態(tài)變量MCU_FLAG,為單片機寫,PC只讀。
鎖存器低4位中,第0位反映1# 緩沖區(qū)的占有權(quán)。規(guī)定兩個鎖存器的低2位中,若第0位相同,則PC端對1# 緩沖區(qū)有控制權(quán),否則該緩沖區(qū)的控制權(quán)在單片機端;鎖存器第1位反映2# 緩沖區(qū)的狀態(tài),不再贅述??刂茩?quán)示意圖如圖4。如果任意一方把自己鎖存器的對應(yīng)位求反后,則表示放棄控制權(quán)。如PC_STATUS=01H,MCU_STATUS=00H,表示PC機擁有2#緩沖區(qū),單片機擁有1#緩沖區(qū)。MCU_STATUS保持不變,當(dāng)PC_STATUS=03H時,表示PC放棄2#緩沖區(qū),即單片機同時得到兩個緩沖區(qū)。
鎖存器中第3、4位為1,分別表示1#、2#緩沖區(qū)有數(shù)據(jù),PC讀到此狀態(tài)便知單片機已寫好數(shù)據(jù)等待PC機讀??;單片機讀到此狀態(tài)便知該緩沖區(qū)中有數(shù)據(jù)要發(fā)送。
3 軟件設(shè)計
CAN適配器與PC機的關(guān)系如圖5所示。最上面一層是應(yīng)用層,主要功能是實現(xiàn)用戶與CAN適配卡之間的接口程序,完成數(shù)據(jù)的發(fā)送和接收。其余層構(gòu)成CAN適配器。其中控制層由微處理器AT89C52完成,主要負(fù)責(zé)檢測PC端和CAN總線的狀態(tài),并進行相應(yīng)的數(shù)據(jù)轉(zhuǎn)移,即把PC端要發(fā)送的數(shù)據(jù)從雙端口RAM中取出并通過CAN總線發(fā)往指定的節(jié)點,或者接收來自CAN總線上的數(shù)據(jù)并將其放入接收緩沖區(qū)等待PC端用戶的讀取。數(shù)據(jù)層主要由CAN控制器SJA1000完成報文的驗收和濾波以及數(shù)據(jù)的接收/發(fā)送。最底層是物理層,CAN收發(fā)器PCA82C250完成協(xié)議控制器和物理傳輸線路之間的接口,將總線電纜上的差動電壓轉(zhuǎn)換為邏輯電平信號或者進行相反的操作。
為了實現(xiàn)通信,本文完成了PC機程序和板載單片機程序的設(shè)計。單片機程序描述如下:
(1)等待PC機初始化,得到幀長、目標(biāo)ID等信息;
(2)查詢CAN總線是否有數(shù)據(jù),如果沒有則轉(zhuǎn)到(5);
(3)得到可以接收的緩沖區(qū)編號;
(4)接收數(shù)據(jù)。修改狀態(tài),放棄當(dāng)前緩沖區(qū)控制權(quán),置有數(shù)據(jù)位為1,并鎖存該狀態(tài);
(5)判斷PC機方有無數(shù)據(jù)要發(fā)送,如果沒有則轉(zhuǎn)到(2);
(6)得到待發(fā)送的緩沖區(qū)編號;
(7)發(fā)送數(shù)據(jù)。修改狀態(tài),放棄當(dāng)前緩沖區(qū)控制權(quán),置有數(shù)據(jù)位為0,并鎖存該狀態(tài);
(8)轉(zhuǎn)到(2)。
(3)中得到可接收緩沖區(qū)編號的條件是:MCU_FLAG和PC_STATUS的低2位中有一位不同,并且該位表示緩沖區(qū)中沒有數(shù)據(jù)(對應(yīng)的第3或4位為0);(6)得到待發(fā)送緩沖區(qū)編號的條件是:MCU_FLAG和PC_STATUS的低2位中有一位不同,并且該位表示的緩沖區(qū)中有數(shù)據(jù)。上述程序中的讀是從CAN總線讀,寫是向CAN控制器發(fā)送數(shù)據(jù);而PC機的寫是向單片機寫,讀是從單片機讀。因此二者的程序非常類似,不再重復(fù)。
為了提高通信效率,本文做了三方面的工作。首先將板載單片機AT89C52作為適配卡的主控制器,負(fù)責(zé)數(shù)據(jù)管理工作,提高了數(shù)據(jù)傳輸?shù)乃俣?、穩(wěn)定性和可靠性,減輕了PC機的處理負(fù)擔(dān);其次利用雙端口RAM作為PC機數(shù)據(jù)發(fā)送和接收的緩沖區(qū),并將雙端口RAM映射為PC機內(nèi)存的一部分,減少了PC發(fā)送和接收數(shù)據(jù)的時間;最后根據(jù)雙緩沖的思想,把整個緩沖區(qū)一分為二,使PC機寫數(shù)據(jù)和CAN適配卡發(fā)送數(shù)據(jù)異步進行,并用鎖存器實現(xiàn)互斥訪問,進一步提高通信速度和效率。
本文中遠(yuǎn)程控制器的操作系統(tǒng)為Win98,這是因為Win2000或者XP的實時性并不比Win98好,而且Win98可以對I/O端口直接讀寫,開發(fā)工作量小。
參考文獻(xiàn)
1 鄔寬明.CAN總線原理與應(yīng)用系統(tǒng)設(shè)計[M].北京:北京航空航天大學(xué)出版社,1996
2 呂杜鵑.CAN智能適配卡的設(shè)計方案[J].工業(yè)控制計算機,2001;(8)
3 楊朝龍.基于雙接收緩沖隊列的CAN驅(qū)動模型設(shè)計[J].微計算機信息,2006;(2)
4 傅民倉.基于CAN總線的數(shù)據(jù)采集系統(tǒng)實現(xiàn)與應(yīng)用[J].現(xiàn)代電子技術(shù),2006;(2)
5 陳楊楊.CAN總線和DeviceNet通信協(xié)議在單片機系統(tǒng)中的應(yīng)用[J].儀器儀表學(xué)報,2005;(2)