現場總線技術是目前自動化控制領域發展比較迅速的一門技術,其中CAN(Controller Area Network)總線[2]是在國際上應用最廣泛的現場總線之一。近幾年隨著汽車電子行業的發展,現代汽車中CAN總線已經成為必須采用的裝置之一。本文以ATMEL公司新近生產的一款內置CAN控制器的單片機——AT90CAN128為基礎,設計了一款車載CAN總線系統,通過CAN智能測控儀表對車中部分單元參數量進行實時監控,使各單元之間協調運轉。另外,傳輸線束大大簡化,可靠性得到了極大的提高,有效節約了線束安裝空間和系統成本。 1 AT90CAN128特性概述 1.1 基本特性 AT90CAN128[3]是基于AVR RISC結構的8位低功耗CMOS微處理器,它采用了先進的指令集以及單周期指令執行時間,其數據吞吐率高達1 MIPS/MHz,其內核具有豐富的指令集和32個通用工作寄存器。所有寄存器都直接與ALU相連接。通過將8位RISC CPU與系統內可編程的Flash集成在一個芯片內,為許多嵌入式控制應用提供了靈活而低成本的方案。 1.2 內置CAN控制器概述 AT90CAN128內置有完全符合CAN2.0A和2.0B標準協議的CAN控制器。采用MOb(消息對象)方式進行數據的發送和接收,共有15個MOb,它們具有相同的屬性:有11位標識符(2.0A協議),也可擴展至29位(2.0B議);8位數據緩沖(靜態分配);Tx,Rx幀 緩沖或自動響應配置;時間標識。 MOb是一個CAN消息幀的描述符。它包括處理一個CAN消息幀的所有信息。這意味著一個MOb可以看成一個對象,來描述一條CAN消息。MOb的數目是從0到14。它們相互獨立,但在多重比較的時候,低位的MOb會獲得優先權。每個MOb都被安置在一個頁中來保存。頁的序號就是MOb的序號。 2 車載CAN總線控制系統的設計 由于對實時性要求比較高,所以采用高速CAN總線,信息傳輸速度為500kbps,連接的主要對象有:駕駛員計算機、發動機、自動變速器、安全氣囊、儀表信號采集系統、聯合制動系統等。由于各個節點作用不同,所以在硬件搭建和軟件設計以及通信協議的制定上都采用了相應的方案。下面以聯合制動單元為例,做具體分析。 聯合制動單元接收由駕駛員計算機終端發送的CAN總線消息命令,根據對液力制動扭矩、機械制動扭矩、合成扭矩等參數進行檢測的狀態,經過電液控制算法計算,實現前驅、后驅制動控制。對正常制動回路油位、緊急制動回路油位的報警等信息,通過CAN總線反饋給駕駛員計算機終端。 2.1 聯合制動單元硬件電路組成 以AT90CAN128單片機作為控制系統核心,外圍設有8路光隔模擬量輸入、4路模擬量輸出、多路光隔開關量輸入、輸出、LED報警及CAN總線收發器,總線的接口芯片選用的是Philips公司的PCA82C250。 2.2 通信協議制定 2.2.1 各終端消息標識符的定義 采用CAN擴展幀的29位標識符進行定義,其中P為3位優先級;R為保留擴展位;8位的BW為報文類型代碼;8位的BD為目標地址或報文類型擴展碼;8位的BY為發送報文源地址。部分設備節點名稱和分配地址如下:主駕駛員終端地址10、副駕駛員終端地址20、聯合制動單元地址30。 2.2.2 各消息類型和命令值內容的定義 駕駛員計算機終端對聯合制動單元的控制消息內容為2個字節——命令類型和命令值。命令類型包括:狀態查詢命令(數據0x1,命令值0x0)、前/后驅制動命令(數據0x2/0x3,命令值0x0)、聯合制動單元前/后驅制動信息確認(數據0x4/0x5,命令值0x0)等。 聯合制動單元提供給駕駛員計算機終端的消息內容包括:聯合制動單元狀態信息(7字節,分別為液力制動扭矩、機械制動扭矩、合成扭矩、速度以及緊急回路和正常油壓的數值,以及正常制動回路油位和緊急制動回路油位的報警狀態)、聯合制動單元報警信息(2字節,分別為正常制動回路油位報警和緊急制動回路油位的報警)、聯合制動單元制動返回消息(2字節,分別為收到的前驅或后驅制動命令的命令數據和命令值)等。 2.3 軟件設計(CAN總線通訊部分) 2.3.1 初始化部分 初始化前將CAN通用控制寄存器的最高位置1(復位模式)。完成后,回到操作模式。 下面給出了CAN控制器的初始化程序: void CAN_INIT ( void ) { CANGCON = 0x80 ; /*進入復位模式并且復位MOb*/ while ( ENFG == 1 ) ; /*測試CANGSTA中的ENFG位是否為0*/ CANGIE = 0xB0 ; /*使能所有中斷及接收、發送中斷*/ CANIE2 = 0xFF ; /*MOb 0"7中斷使能*/ CANIE1 = 0x00 ; /*MOb 8"14中斷禁止*/ CANBT1 = 0x02 ; /*設置波特率為500kbps*/ CANBT2 = 0x20 ; CANBT3 = 0x01 ; CANTCON = 0x8F ; /*設置定時器預定標*/ /*以“聯合制動單元狀態查詢消息”為例*/ CANPAGE = TX_PAGE ; /*指定此消息的MOb頁(寄存器中的高4位)*/ CANCDMOB = 0x17 ; /*禁止狀態,IDE位為1表示擴展幀,數據長度代碼為7*/ CANIDT1 = 0x84 ; /*標識符設置*/ CANIDT2 = 0xB1 ; CANIDT3 = 0x18 ; CANIDT4 = 0xF2 ; CANIDM1 = 0xFF ; /*標識符屏蔽設置*/ CANIDM2 = 0xFF ; CANIDM3 = 0xFF ; CANIDM4 = 0xFF ; CANGCON = 0x02 ; /*進入操作模式*/ While ( ENFG == 0 ) ; /*測試CANGSTA中的ENFG位是否為1*/ } 2.3.2消息的發送部分 消息的發送均采用中斷方式實現。首先通過設置CANPAGE寄存器來指定被發送的頁數,將數據裝載到CANMSG寄存器中,然后由CANCDMOB寄存器來控制發送動作,將消息發送出去,同時將觸發CANSTMOB中的TXOK中斷。 下面以協議中的“聯合制動單元狀態查詢命令”為例,給出了發送程序: void CAN_TX ( void ) { CANPAGE = TX_PAGE ; /*指定此消息的MOb頁(寄存器中的高4位)*/ CANMSG = 0x01 ; /*裝載消息數據*/ CANMSG = 0x00 ; /*裝載消息命令值*/ CANCDMOB = 0x52 ; /*發送狀態,IDE位為1表示擴展幀,數據長度代碼為2*/ } void CAN_TX_INTER ( void ) /*發送中斷子程序*/ { If ( ( CANSTMOB & 0x40 ) == 0x40 ) /*發送中斷*/ { CANSTMOB & = 0xBF ; /*清TXOK位*/ CANCDMOB = 0x12; /*停止發送*/ } } 2.3.3消息的接收部分 消息的接收同樣采用中斷方式實現。先設置CANPAGE寄存器來指定接收的頁數,隨后由CANCDMOB寄存器來控制接收動作,當有消息到達時,將觸發CANSTMOB中的RXOK中斷,消息中的數據將被裝載到CANMSG寄存器中。 下面以協議中的“接收聯合制動單元狀態信息”為例,給出了接收程序: void CAN_RX ( void ) { CANPAGE = RX_PAGE ; /*指定此消息的MOb頁(寄存器中的高4位)*/ CANCDMOB = 0x97 ; /*接收狀態,IDE位為1表示擴展幀,數據長度代碼為7*/ } void CAN_RX_INTER ( void ) /*接收中斷子程序*/ { If ( ( CANSTMOB & 0x20 ) == 0x20 ) /*接收中斷*/ { CANSTMOB & = 0xDF ; /*清RXOK*/ For ( i = 0 ; i } } 4 結束語 與目前同類型的單片機相比較,AT90CAN128在數據采集、PWM(快速PWM模式)等設計中都有其明顯的優勢,特別是內置了CAN控制器,這讓它在現代自控領域的發展前景十分樂觀。通過實踐證明,該車載CAN總線系統運行良好,完全可以達到預期的功能。 本文作者創新點:本文由于采用了AT90CAN128單片機,使得該CAN總線系統的設計方法與傳統的CAN總線網絡設計思路有所不同,內置CAN控制器可大大降低設備成本、簡化硬件結構、通信效率加強、提高了安全性以及可靠性。軟件設計上可通過對MOb的配置,實現消息隊列的設定,這種方法更加的靈活、易懂。 |