黃菊花,顧曉輝,曹銘
(南昌大學(xué)機(jī)電工程學(xué)院,江西 南昌 330031)
Arduino是一款便捷靈活、方便上手的基于微控制器的設(shè)計(jì)開發(fā)平臺(tái),具有低成本、易開發(fā)等特點(diǎn)[1]。CAN(controller area network,CAN)總線是國際上應(yīng)用最廣泛的現(xiàn)場(chǎng)總線之一,是一種有效支持分布式控制或?qū)崟r(shí)控制的串行通信網(wǎng)絡(luò),其高性能和可靠性已被認(rèn)同,并不再局限于汽車控制系統(tǒng)應(yīng)用中,被廣泛地應(yīng)用于工業(yè)自動(dòng)化、船舶、醫(yī)療設(shè)備、工業(yè)設(shè)備等方面[2]。因此,各類控制器在開發(fā)和應(yīng)用時(shí),CAN模塊也起著越來越重要的角色。Mathworks開發(fā)基于Simulink開發(fā)環(huán)境下的硬件支持包(hardware support package),Simulink Support Package for Arduino Hardware提供了Arduino的基礎(chǔ)驅(qū)動(dòng)設(shè)備,通過采用Simulink的嵌入式控制系統(tǒng)的開發(fā)解決了傳統(tǒng)開發(fā)周期長(zhǎng)和效率低的問題,使得開發(fā)更加簡(jiǎn)單,成本低,操作方便[3]。
本文確立將如何開發(fā)基于Arduino的CAN驅(qū)動(dòng)設(shè)備技術(shù)作為研究方向。研究中將選用Arduino系列中的Arduino Mega 2560控制器作為核心控制器,CAN總線節(jié)點(diǎn)采用CAN總線控制器MCP2515芯片和TJA1050收發(fā)器組合。
本文設(shè)計(jì)的基于Arduino的CAN驅(qū)動(dòng)設(shè)備技術(shù)由Arduino、MCP2515和CAN總線節(jié)點(diǎn)幾部分組成。Arduino MEGA 2560單片機(jī)作為主控芯片,Arduino MEGA 2560采用USB接口與上位機(jī)PC機(jī)進(jìn)行數(shù)據(jù)傳輸。Arduino MEGA 2560的處理器核心是ATmega2560,具有54路數(shù)字輸入/輸出口(其中16路可作為PWM輸出),16路模擬輸入,適合需要大量I/O接口的設(shè)計(jì)。Arduino系統(tǒng)對(duì)硬件底層的控制代碼細(xì)節(jié)進(jìn)行了封裝,用戶只需要使用Arduino系統(tǒng)封裝好的接口就能高效地實(shí)現(xiàn)對(duì)硬件的控制[4]。
CAN總線節(jié)點(diǎn)的作用是通過CAN總線進(jìn)行各節(jié)點(diǎn)之間的相互通信,通過CAN數(shù)據(jù)的傳輸以實(shí)現(xiàn)復(fù)雜的控制過程。CAN協(xié)議廢除了傳統(tǒng)的站地址編碼,而是對(duì)通信數(shù)據(jù)進(jìn)行編碼,使網(wǎng)絡(luò)內(nèi)節(jié)點(diǎn)不僅在數(shù)量上不受限制,并且不同節(jié)點(diǎn)能夠同時(shí)接收到相同的數(shù)據(jù)[5]。由于CAN總線具有較好的糾錯(cuò)能力,支持分布式控制,能夠?qū)崟r(shí)控制,從而保證了系統(tǒng)的高可靠性和高靈活性,而且CAN總線還采用非破壞性仲裁技術(shù),當(dāng)2個(gè)節(jié)點(diǎn)同時(shí)向網(wǎng)絡(luò)上傳輸數(shù)據(jù)時(shí),優(yōu)先級(jí)低的節(jié)點(diǎn)會(huì)主動(dòng)停止發(fā)送數(shù)據(jù),而優(yōu)先級(jí)高的節(jié)點(diǎn)可在不受影響的情況下繼續(xù)傳輸數(shù)據(jù),有效避免了總線的沖突[6]。
MCP2515是具有局域網(wǎng)絡(luò)CAN協(xié)議的獨(dú)立控制器,可通過收發(fā)器與CAN總線進(jìn)行連接。MCP2515由CAN模塊、SPI協(xié)議模塊和用于配置該器件及其運(yùn)行邏輯的控制器3部分構(gòu)成[7]。Arduino MEGA 2560與MCP2515的連接如圖1。
Arduino的ATmega2560芯片中由19號(hào)腳(SS)、20號(hào)腳(SCK)、21號(hào)腳(MOSI)、22號(hào)腳(MISO)組成的SPI接口與MCP2515的SPI協(xié)議模塊進(jìn)行對(duì)接,再與MCP2515的CAN模塊進(jìn)行通信[8]。采用MCP2515芯片作為CAN總線節(jié)點(diǎn)的CAN總線控制器,TJA1050作為CAN總線節(jié)點(diǎn)的CAN收發(fā)器。MCP2515芯片通過SPI接口和Arduino對(duì)接,Arduino和上位機(jī)進(jìn)行原始數(shù)據(jù)傳輸,然后MCP2515的CAN模塊會(huì)根據(jù)CAN協(xié)議把數(shù)據(jù)封裝成報(bào)文形式,最后通過TJA1050收發(fā)器完成與CAN總線之間的數(shù)據(jù)傳輸[9]。
在整個(gè)平臺(tái)上,Arduino控制器負(fù)責(zé)接收系統(tǒng)的應(yīng)用數(shù)據(jù),整個(gè)平臺(tái)的數(shù)據(jù)由Arduino控制器首先接收,再通過Arduino控制器的SPI接口傳輸?shù)組CP2515控制器,MCP2515控制器將封裝的數(shù)據(jù)通過TJA1050收發(fā)器與CAN總線進(jìn)行通信,完成整個(gè)數(shù)據(jù)傳輸。整個(gè)數(shù)據(jù)流過程如圖2所示。
系統(tǒng)設(shè)計(jì)采用Simulink開發(fā)方式,將Simulink中實(shí)現(xiàn)的CAN驅(qū)動(dòng)設(shè)備加載到Arduino控制器中,實(shí)現(xiàn)對(duì)CAN總線進(jìn)行調(diào)試的功能,最終建立CAN通信。系統(tǒng)實(shí)現(xiàn)中的CAN應(yīng)用層、驅(qū)動(dòng)程序及操作系統(tǒng)共同實(shí)現(xiàn)應(yīng)用層功能[10]。首先在Simulink中進(jìn)行CAN的初始化配置,包括配置MCP2515的寄存器,以及其波特頻率和振蕩器頻率的調(diào)整。通過配置CANCTRL控制寄存器配置好MCP2515的配置模式,由配置寄存器CNF1、CNF2、CNF3配置整個(gè)CAN通信過程的波特頻率。MCP2515是通過SPI接口接收數(shù)據(jù),同時(shí)也要配置好Arduino的SPI接口。CAN初始化模塊如圖3所示。
CAN數(shù)據(jù)的發(fā)送需要讀取MCP2515控制器和Arduino控制器相應(yīng)的發(fā)送狀態(tài),配置其相應(yīng)的寄存器。MCP2515擁有3個(gè)發(fā)送緩沖器用于發(fā)送CAN報(bào)文,并且每個(gè)發(fā)送緩沖器都占用了14字節(jié)的SRAM。在報(bào)文寫入發(fā)送緩沖器之前,需要確認(rèn)TXBnCTRL寄存器的TXREQ位是否清零,只有當(dāng)TXREQ位置為0,才表明發(fā)送緩沖器中沒有等待發(fā)送的報(bào)文。MCP2515的3個(gè)發(fā)送緩沖器的優(yōu)先級(jí)不一樣,與CAN協(xié)議中的報(bào)文仲裁優(yōu)先級(jí)不同,優(yōu)先級(jí)高的發(fā)送緩沖器能夠優(yōu)先發(fā)送,若發(fā)送緩沖器擁有一樣的優(yōu)先級(jí),則編號(hào)較高的報(bào)文會(huì)優(yōu)先發(fā)送。需要配置TXBnSIDH、TXBnSIDL寄存器,來確定需要發(fā)送的報(bào)文的ID,其中TXBnSIDL的EXIDE位被置1表示報(bào)文要發(fā)送擴(kuò)展標(biāo)識(shí)符,置0表示報(bào)文要發(fā)送標(biāo)準(zhǔn)標(biāo)識(shí)符。TXBnDLC寄存器控制發(fā)送緩沖器數(shù)據(jù)字節(jié),0~3字節(jié)的DLC位設(shè)定要發(fā)送數(shù)據(jù)的長(zhǎng)度,RTR位被置1表示要發(fā)送的報(bào)文是遠(yuǎn)程發(fā)送請(qǐng)求,置0表示要發(fā)送的報(bào)文是數(shù)據(jù)幀。另外,TXBnDm寄存器能將帶有數(shù)據(jù)字節(jié)的報(bào)文完成數(shù)據(jù)裝載,數(shù)據(jù)裝載之后就能啟動(dòng)報(bào)文的發(fā)送。當(dāng)器件確認(rèn)發(fā)送緩沖器的TXBnCTRL寄存器中的TXREQ位被置1后,便開始啟動(dòng)報(bào)文發(fā)送。這里指的報(bào)文發(fā)送并不是報(bào)文就能立即發(fā)送出去,而是在發(fā)送緩沖器中將報(bào)文標(biāo)為準(zhǔn)備發(fā)送,只有當(dāng)器件檢測(cè)到CAN總線處于空閑狀態(tài),才能將報(bào)文發(fā)送出去。TXBnCTRL寄存器的TXREQ位在檢測(cè)到報(bào)文發(fā)送成功后會(huì)自動(dòng)置0,在檢測(cè)到報(bào)文發(fā)送失敗時(shí),TXREQ位會(huì)繼續(xù)保持置1,表明CAN總線沒有空閑,需要等待發(fā)送。
此外,如果需要中止發(fā)送報(bào)文,器件可通過將報(bào)文發(fā)送緩沖器的TXBnCTRL寄存器的TXREQ位置為0,也可通過將CANCRTL寄存器的ABAT位置為1,2種方式請(qǐng)求中止發(fā)送該發(fā)送緩沖器中等待發(fā)送的報(bào)文,但是只有尚未開始發(fā)送的報(bào)文才能夠被中止。最后將這些模型封裝成整體的CAN發(fā)送模塊。CAN發(fā)送模塊如圖4。
CAN數(shù)據(jù)的接收要讀取MCP2515控制器以及Arduino控制器相應(yīng)的接收狀態(tài),配置相應(yīng)的接收寄存器。MCP2515擁有2個(gè)全接收緩沖器用于接收CAN報(bào)文,MCP2515還配備了1個(gè)報(bào)文集成緩沖器(message assembly buffer,MAB)。MAB的作用是對(duì)符合驗(yàn)收過濾器條件的報(bào)文進(jìn)行打包發(fā)送至2個(gè)全接收緩沖器內(nèi),并且MAB是唯一一個(gè)能隨時(shí)接收CAN總線的下一條報(bào)文的接收緩沖器。當(dāng)接收緩沖器接收到報(bào)文時(shí),該接收緩沖器的CANINTF寄存器的RXnIF位將被置1,待該報(bào)文被緩沖器處理完畢,器件必須將RXnIF位置為0,以便緩沖器接收CAN總線的下一條CAN報(bào)文,而且CANINTF寄存器具有鎖定功能,在器件沒有處理完上一條CAN報(bào)文前,MCP2515的接收緩沖器不能被載入新的報(bào)文。MCP2515的2個(gè)接收緩沖器的優(yōu)先級(jí)是不一樣的,RXB0的優(yōu)先級(jí)要大于RXB1的優(yōu)先級(jí),這是由于RXB0緩沖器只有2個(gè)驗(yàn)收過濾器而RXB1緩沖器卻擁有4個(gè)驗(yàn)收過濾器,使得RXB0緩沖器接收?qǐng)?bào)文匹配的條件更為嚴(yán)格。另外,RXB0緩沖器如果已經(jīng)在處理一條有效CAN報(bào)文的情況下,接收到了下一條有效CAN報(bào)文,能通過配置RXB0CTRL寄存器將新的報(bào)文滾存至RXB1緩沖器內(nèi)。
CAN接收模塊的建立,需要先讀取MCP2515相應(yīng)引腳的接收狀態(tài),RXCAN引腳檢測(cè)到CAN總線上有CAN報(bào)文,便會(huì)使SOF引腳觸發(fā)起始幀信號(hào)。隨后要對(duì)MCP2515的接收緩沖器的寄存器進(jìn)行配置,通過查詢器件的接收中斷接收CAN總線上的CAN報(bào)文。在Simulink中的接收驅(qū)動(dòng)模塊將接收緩沖器以及其寄存器配置完成,接收中斷配置、接收故障檢測(cè)配置完成,最后將這些模塊封裝成整體的CAN接收模塊。CAN接收模塊如圖5。
要在通信系統(tǒng)中及時(shí)地讀取和處理來自CAN總線的狀態(tài),就必須清楚地知道相應(yīng)的中斷狀態(tài),做出及時(shí)的出錯(cuò)處理、接收數(shù)據(jù)處理、發(fā)送數(shù)據(jù)處理,這都依賴于MCP2515擁有8個(gè)中斷源,具有靈活的中斷處理能力。MCP2515擁有CANINTE中斷使能寄存器和CANINTF中斷標(biāo)志寄存器,包含了所有的中斷使能位和中斷標(biāo)志位。
進(jìn)行CAN通信仿真,首先根據(jù)電機(jī)控制器與整車控制器的CAN通訊協(xié)議通過CANdb++建立DBC文件。電機(jī)控制器與整車控制器的CAN通訊協(xié)議遵行SAE J1939標(biāo)準(zhǔn),通信協(xié)議見表1和表2。將建立好的DBC文件加載到Simulink的CANpack模塊中,并對(duì)模型進(jìn)行對(duì)比修正,修改后的模型見圖6。
實(shí)驗(yàn)說明:在Simulink中通過USB接口將建立好的CAN模塊加載至Arduino MEGA 2560控制器中運(yùn)行,設(shè)置好目標(biāo)轉(zhuǎn)速值、扭矩值、上電控制命令、模式控制命令、運(yùn)行控制命令以及CAN幀數(shù)。其中上電控制命令由字節(jié)中的一位控制,0/1代表接觸器斷開/閉合;模式控制命令由字節(jié)中的一位控制,0/1代表轉(zhuǎn)矩/轉(zhuǎn)速模式;運(yùn)行控制命令由字節(jié)中的2位控制,00代表停止、01代表正向、10代表反向、11代表空轉(zhuǎn)。
實(shí)驗(yàn)采集設(shè)備:USBCAN-II。
實(shí)驗(yàn)分析軟件:CANTEST。
實(shí)驗(yàn)結(jié)果:CAN通信建立完成后,通過CANTEST軟件分析實(shí)現(xiàn)了CAN發(fā)送和CAN接收的功能,并且CANTEST可以加載DBC文件對(duì)報(bào)文進(jìn)行解析,解析后的數(shù)據(jù)見圖7。結(jié)果表明,采用Simulink進(jìn)行嵌入式開發(fā)的基于Arduino控制器能夠完成CAN通信功能。
表1 數(shù)據(jù)格式定義Tab.1 Data format definition
表2 報(bào)文協(xié)議Tab.2 Message protocol
由于圖形可視化的優(yōu)點(diǎn),更多的嵌入式開發(fā)選擇模型設(shè)計(jì)的方式,采用Simulink作為開發(fā)工具也必將成為一種趨勢(shì)。在嵌入式開發(fā)中,控制器的驅(qū)動(dòng)開發(fā)技術(shù)不可缺少,本文基于Arduino控制器的CAN驅(qū)動(dòng)設(shè)備在Simulink中實(shí)現(xiàn)了CAN通訊功能,不僅為Arduino控制器提供了更多的通訊方式,也為控制器更多的系統(tǒng)開發(fā)打下了基礎(chǔ),希望通過CAN驅(qū)動(dòng)設(shè)備通信功能的實(shí)現(xiàn),能夠起到拋磚引玉的作用,實(shí)現(xiàn)基于Simulink的各類控制器的嵌入式開發(fā)。