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