金樹軍
摘 要: CAN總線在汽車電子、樓宇控制及其他工業(yè)控制領(lǐng)域中得到了廣泛應(yīng)用,AVR型單片機(jī)在儀表、工業(yè)控制領(lǐng)域也得到了廣泛應(yīng)用。主要介紹AVR型單片機(jī)AT90CAN128在CAN總線節(jié)點(diǎn)中的實(shí)現(xiàn)方案及具體技術(shù)路線,給出增強(qiáng)型CAN總線節(jié)點(diǎn)電路原理圖、主要程序設(shè)計(jì)方案,為開發(fā)人員快速應(yīng)用提供必要的技術(shù)基礎(chǔ)。
關(guān)鍵詞: CAN總線節(jié)點(diǎn); 單片機(jī); 程序設(shè)計(jì); 工業(yè)控制
中圖分類號(hào): TN911.7?34 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2014)09?0093?04
0 引 言
CAN是控制器局域網(wǎng)絡(luò)(Controller Area Network, CAN)的簡(jiǎn)稱,是由研發(fā)和生產(chǎn)汽車電子產(chǎn)品著稱的德國(guó)BOSCH公司開發(fā),并最終成為國(guó)際標(biāo)準(zhǔn)(ISO 11898),是國(guó)際上應(yīng)用最廣泛的現(xiàn)場(chǎng)總線之一。在北美和西歐,CAN總線協(xié)議已經(jīng)成為汽車計(jì)算機(jī)控制系統(tǒng)和嵌入式工業(yè)控制局域網(wǎng)的標(biāo)準(zhǔn)總線,并且擁有以CAN為底層協(xié)議專為大型貨車和重工機(jī)械車輛設(shè)計(jì)的J1939協(xié)議。
CAN總線目前已經(jīng)在車輛、船舶等運(yùn)輸業(yè)中;嵌入式機(jī)器控制、工廠自動(dòng)化、過程自動(dòng)化和發(fā)電等制造業(yè)中;電梯控制、嵌入式門控制、供暖控制、通風(fēng)控制、空調(diào)控制等樓宇自動(dòng)化中;醫(yī)療設(shè)備、重病監(jiān)護(hù)等衛(wèi)生保健中;分揀機(jī)、輸送機(jī)、加油站、自動(dòng)取款機(jī)等行業(yè)中;舞臺(tái)控制、照明控制等娛樂行業(yè)中;煤礦安全監(jiān)控系統(tǒng)等工業(yè)通信中得到廣泛應(yīng)用。
AVR單片機(jī)做為一款單周期指令的單片機(jī),具有簡(jiǎn)單易學(xué)、費(fèi)用低廉、功能強(qiáng)大等優(yōu)點(diǎn)。目前已用于軍事、工業(yè)、家用電器、智能玩具、便攜式智能儀表和機(jī)器人制作等領(lǐng)域。廣泛用于空調(diào)控制板、打印機(jī)控制板、智能電表、智能手電筒、LED控制屏、醫(yī)療設(shè)備、GPS等領(lǐng)域或設(shè)備。AT90CAN128作為AVR單片機(jī)系列之一,不僅擁有AVR單片機(jī)本身的功能和資源,更兼具了CAN控制器功能。設(shè)計(jì)時(shí),只在其外圍增加高速光電轉(zhuǎn)換器和CAN收發(fā)器等器件即可。下面就基于AT90CAN128的CAN總線節(jié)點(diǎn)設(shè)計(jì)進(jìn)行詳細(xì)說明。
1 硬件設(shè)計(jì)
如圖1所示,CAN總線節(jié)點(diǎn)電路主要由光電耦合器HCPL0600、CAN收發(fā)器PCA82C251組成。兩個(gè)光電耦合器引出的CANTX、CANRX引腳分別與AT90CAN128單片機(jī)的TXCAN、RXCAN引腳連接。兩個(gè)光電耦合器起到不同節(jié)點(diǎn)之間電氣隔離的作用。需要特別說明的一點(diǎn)是光電耦合器部分電路所采用的兩個(gè)電源VCC和VDD必須也是完全隔離的,否則采用光電耦合器就失去了意義。電源的完全隔離可采用小功率電源隔離模塊或帶多5 V隔離輸出的開關(guān)電源模塊實(shí)現(xiàn)。這些電路雖然增加了節(jié)點(diǎn)的復(fù)雜性,但是卻提高了節(jié)點(diǎn)的穩(wěn)定性和安全性,在CAN總線節(jié)點(diǎn)設(shè)計(jì)中是非常必要的。
PCA82C251的CANH、CANL引腳與CAN總線的接口部分也采用了一定的安全和抗干擾措施。PCA82C251的CANH和CANL引腳各自通過一個(gè)0 Ω的電阻與CAN總線相連,電阻可起到一定的緩沖作用,保護(hù)PCA82C251免受電流的沖擊。CANH和CANL與地之間分別并聯(lián)了一個(gè)30 pF的小電容,可以起到濾除總線上的高頻干擾和一定的防電磁輻射的能力。CANH和CANL與地之間分別接了一個(gè)瞬態(tài)抑制二極管,當(dāng)CAN總線受瞬間的高能量沖擊時(shí),它能以極高的速度(最高達(dá)1×10-12 s)使其阻抗驟然降低,同時(shí)吸收大電流,將其兩端間的電壓箝位在一個(gè)預(yù)定的數(shù)值上,從而確保后面的電路元件免受瞬態(tài)高能量的沖擊而損壞。CANH和CANL在連入總線之前,均通過一個(gè)可恢復(fù)保險(xiǎn)絲,當(dāng)總線上有大電流時(shí),大電流產(chǎn)生的熱量使可恢復(fù)保險(xiǎn)絲內(nèi)的高分子材料迅速膨脹,切斷鏈狀導(dǎo)電通道,元件由低阻抗瞬變?yōu)楦咦杩?,阻斷電路,保護(hù)負(fù)載,在故障排除后,高分子材料自動(dòng)收縮,導(dǎo)電通道重新鏈接,元件又自行恢復(fù)至原始狀態(tài),從而實(shí)現(xiàn)“重復(fù)使用,無(wú)須更換,一勞永逸”之目的。CANH,CANL之間利用放電管,實(shí)現(xiàn)有限能量雷擊的防護(hù)。PCA82C251的Rs腳上接有一個(gè)斜率電阻,大小可根據(jù)總線通信速度適當(dāng)調(diào)整,一般在16~140 kΩ之間。
為了增強(qiáng)CAN總線的驅(qū)動(dòng)能力,當(dāng)波特率一定時(shí),延長(zhǎng)CAN總線的通信距離,筆者根據(jù)實(shí)踐經(jīng)驗(yàn),設(shè)計(jì)了如圖2所示的CAN總線信號(hào)增強(qiáng)電路,其設(shè)計(jì)核心思想是增加CANTXD的信號(hào)強(qiáng)度。實(shí)踐證明,此電路能夠延長(zhǎng)通信距離30%以上。
圖2 CAN總線信號(hào)增強(qiáng)電路原理圖
2 軟件設(shè)計(jì)
筆者在軟件設(shè)計(jì)過程中使用了ICCV7 for AVR和AVR Studio 4.14。ICCV7 for AVR用來建立工程、編寫代碼、編譯代碼;生成可供AVR Studio 4.14調(diào)用的鏡像文件,即COF文件;生成可供AVR Studio 4.14下載的目標(biāo)文件,即HEX文件。AVR Studio 4.14集成了匯編、編譯器以及調(diào)試器功能,筆者使用深圳微雪電子有限公司的USB AVR JTAG ICE XPII仿真器,結(jié)合AVR Studio 4.14進(jìn)行軟件調(diào)試。
CAN總線節(jié)點(diǎn)的軟件設(shè)計(jì)主要包括CAN控制器的初始化程序、數(shù)據(jù)接收程序、數(shù)據(jù)發(fā)送程序。
本軟件設(shè)計(jì)是筆者在開發(fā)煤礦安全監(jiān)控系統(tǒng)礦用本安型分站中驗(yàn)證過的,讀者可根據(jù)本軟件設(shè)計(jì)進(jìn)行配置,即可實(shí)現(xiàn)通信。
2.1 CAN控制器初始化
筆者設(shè)計(jì)CAN控制器初始化軟件時(shí),硬件資源情況如下:AT90CAN128晶振頻率為7.372 8 MHz,CAN通信波特率為5 Kb/s,禁能屏蔽寄存器。
2.1.1 復(fù)位設(shè)計(jì)
CAN控制器的初始化工作流程如圖3所示。
只有在CAN控制器處于復(fù)位狀態(tài)時(shí),才能對(duì)它進(jìn)行相關(guān)配置。因此,初始化工作的第一步就是復(fù)位CAN控制器。可通過對(duì)CAN通用控制寄存器CANGCON賦值0x01使CAN此時(shí)判斷通用狀態(tài)寄存器CANGSTA的Enable/Standby模式位是否為Standby模式,若是,則繼續(xù)執(zhí)行初始化程序的其他代碼,若不是,則重新判斷,直到是為止。此段程序代碼可參考如下:
//等待CAN控制器進(jìn)入Standby模式
while(CANGSTA & 0x04);
設(shè)計(jì)人員可在此處做定時(shí)及判斷處理,以防止程序在此處死循環(huán),不能執(zhí)行其他程序。
圖3 CAN控制器初始化程序流程圖
復(fù)位郵箱的初始化工作包括對(duì)0~14個(gè)郵箱的標(biāo)識(shí)符寄存器、標(biāo)識(shí)符屏蔽寄存器、郵箱狀態(tài)寄存器、郵箱控制和數(shù)據(jù)長(zhǎng)度寄存器以及數(shù)據(jù)存儲(chǔ)寄存器進(jìn)行清零等工作。此段代碼可參考如下:
unsigned char MobChannel;
unsigned char MobData;
for (MobChannel = 0 ; MobChannel < 15 ; MobChannel++)
{
CANPAGE = (MobChannel << 4);
CANIDT4 = 0;
CANIDT3 = 0;
CANIDT2 = 0;
CANIDT1 = 0;
CANIDM4 = 0;
CANIDM3 = 0;
CANIDM2 = 0;
CANIDM1 = 0;
CANSTMOB = 0;
CANCDMOB = 0;
for(MobData = 0; MobData < 8; MobData++)
{
CANMSG = 0;
}
}
2.1.2 位定時(shí)寄存器設(shè)計(jì)
位定時(shí)寄存器的初始化工作包括對(duì)CANBT1、CANBT2、CANBT3的這三個(gè)寄存器的配置。CANBT1可配置波特率預(yù)分頻器,CANBT2可配置同步跳轉(zhuǎn)寬度和傳輸時(shí)間段,CANBT3可配置相位段1、相位段2和采樣點(diǎn)。應(yīng)用中實(shí)際配置如下:
//波特率為5K
CANBT1 = 0x7e;
//同步跳轉(zhuǎn)寬度為32 μs
//傳輸時(shí)間段為64 μs
CANBT2 = 0x6e;
//相位段1為16 μs
//相位段2為64 μs
//采樣點(diǎn)為3,即總線采樣3次
CANBT3 = 0x7b;
此時(shí),可通過CAN定時(shí)器控制寄存器關(guān)閉CAN定時(shí)器,使其處于空閑狀態(tài)。
2.1.3 郵箱寄存器設(shè)計(jì)
郵箱寄存器設(shè)計(jì)包括接收數(shù)據(jù)郵箱寄存器設(shè)計(jì)和發(fā)送郵箱寄存器設(shè)計(jì)。接收數(shù)據(jù)郵箱寄存器的初始化工作包括郵箱地址寄存器配置、郵箱狀態(tài)寄存器配置、郵箱消息和DLC寄存器配置、標(biāo)識(shí)符寄存器配置以及標(biāo)識(shí)符屏蔽寄存器配置。
筆者在應(yīng)用中實(shí)際配置如下:
CANPAGE=0x00;
郵箱地址寄存器配置為0x00,即選擇郵箱地址為0,采用自動(dòng)增加索引指針方式,索引指針默認(rèn)為0。
選擇好郵箱地址后才能對(duì)郵箱的其他寄存器進(jìn)行配置。
CANSTMOB=0x00;
郵箱狀態(tài)寄存器配置為0x00。使郵箱數(shù)據(jù)長(zhǎng)度在設(shè)定的DLC范圍內(nèi),處于未發(fā)送和未接收狀態(tài),位值監(jiān)測(cè)標(biāo)識(shí)、位填充標(biāo)識(shí)、CRC校驗(yàn)標(biāo)識(shí)、幀格式標(biāo)識(shí)以及應(yīng)答狀態(tài)均處于正常狀態(tài)。
CANCDMOB = 0x18;
郵箱消息和DLC寄存器配置為0x18。選擇CAN2.0B工作模式,數(shù)據(jù)長(zhǎng)度為8,當(dāng)數(shù)據(jù)超過8時(shí),只有8個(gè)數(shù)據(jù)有效。
//CAN標(biāo)識(shí)符寄存器
CANIDT4 = 0x00;
CANIDT3 = 0x00;
CANIDT2 = 0x00;
CANIDT1 = 0x00;
//CAN標(biāo)識(shí)符屏蔽寄存器
CANIDM4 = 0x00;
CANIDM3 = 0x00;
CANIDM2 = 0x00;
CANIDM1 = 0x00;
如上,配置標(biāo)識(shí)符寄存器、標(biāo)識(shí)符屏蔽寄存器均為0x00,不對(duì)數(shù)據(jù)進(jìn)行濾波處理,接收數(shù)據(jù)后根據(jù)實(shí)際情況處理。設(shè)計(jì)人員可根據(jù)自身項(xiàng)目實(shí)際需要進(jìn)行濾波設(shè)計(jì)。
發(fā)送數(shù)據(jù)郵箱寄存器的初始化工作包括郵箱地址寄存器配置、郵箱狀態(tài)寄存器配置以及郵箱消息和DLC寄存器配置。
CANPAGE=(1<< 4);
郵箱地址寄存器配置為0x10,即選擇郵箱地址為1,采用自動(dòng)增加索引指針方式,索引指針默認(rèn)為0。
CANSTMOB = 0x40;
郵箱狀態(tài)寄存器配置為0x40。提前置位TXOK位,使郵箱處于數(shù)據(jù)發(fā)送完成狀態(tài)。
CANCDMOB = 0x18;
郵箱消息和DLC寄存器配置為0x18。選擇CAN2.0B工作模式,數(shù)據(jù)長(zhǎng)度為8,當(dāng)數(shù)據(jù)超過8時(shí),只有8個(gè)數(shù)據(jù)有效。這樣配置使得CAN總線節(jié)點(diǎn)接收和發(fā)送的數(shù)據(jù)類型保持一致。
2.1.4 中斷寄存器設(shè)計(jì)
中斷寄存器的初始化工作包括中斷使用寄存器配置和郵箱使能寄存器配置。
筆者在應(yīng)用中實(shí)際配置如下:
CANGIE=0xef;
中斷使用寄存器配置為0xef。使能全局中斷、接收中斷、總線關(guān)閉中斷、郵箱錯(cuò)誤中斷、幀緩沖區(qū)中斷、通用錯(cuò)誤中斷、CAN定時(shí)器溢出中斷,禁能發(fā)送中斷。
CANIE1=0x00;
CANIE2=0x01;
使能地址為0的郵箱中斷,禁能地址為1~14的郵箱中斷。
2.1.5 結(jié)束設(shè)計(jì)
在這個(gè)設(shè)計(jì)里主要包括郵箱優(yōu)先級(jí)配置、郵箱接收使能配置、CAN控制啟動(dòng)配置。
CANHPMOB = 0x00;
CANPAGE = 0x00;
CANCDMOB |= 0x80;
如上配置,使地址為0的郵箱優(yōu)先級(jí)最高,同時(shí),使能地址為0的郵箱的接收功能。
CANGCON |=0x02;
通過配置CAN通用控制寄存器的Enable / Standby為1,并等待CANGSTA的ENFG狀態(tài)為1時(shí),使CAN控制器進(jìn)入正常工作模式。至此,CAN控制器初始化工作完成。
2.2 數(shù)據(jù)接收程序設(shè)計(jì)
數(shù)據(jù)接收程序負(fù)責(zé)每個(gè)CAN節(jié)點(diǎn)數(shù)據(jù)的接收以及簡(jiǎn)單的數(shù)據(jù)處理。AT90CAN128的CAN控制器主要有兩種數(shù)據(jù)接收方式:中斷接收方式和查詢接收方式。筆者在應(yīng)用中使用的是中斷方式。
AT90CAN128的CANIT中斷段號(hào)是19,在定義函數(shù)時(shí),可采用如下方式:
#pragma interrupt_handler CanIsr:19
void CanIsr(void)
{
(此處略去接收數(shù)據(jù)程序代碼)
}
當(dāng)有總線上有數(shù)據(jù)發(fā)送,即可進(jìn)入這個(gè)中斷函數(shù)。
2.3 數(shù)據(jù)發(fā)送程序設(shè)計(jì)
數(shù)據(jù)發(fā)送程序負(fù)責(zé)CAN節(jié)點(diǎn)數(shù)據(jù)的發(fā)送。 首先將待發(fā)送的數(shù)據(jù)按特定格式送入發(fā)送緩存區(qū)中,然后啟動(dòng)發(fā)送,等待發(fā)送成功,清除發(fā)送完成標(biāo)志位即可。因該功能設(shè)計(jì)簡(jiǎn)單,這里不做贅述。
3 結(jié) 語(yǔ)
本文通過CAN總線節(jié)點(diǎn)硬件電路設(shè)計(jì)及分析,為設(shè)計(jì)人員提供了實(shí)際可行的CAN總線電路原理,并通過各種保護(hù)電路的設(shè)計(jì),增強(qiáng)了CAN總線節(jié)點(diǎn)的抗干擾能力、抗高電壓能力、抗大電流能力,提高了CAN總線節(jié)點(diǎn)的整體性能。尤其是通過信號(hào)增強(qiáng)電路,提高了CAN總線節(jié)點(diǎn)的信號(hào)穩(wěn)定性、可靠性,大大延長(zhǎng)了CAN總線節(jié)點(diǎn)的通信距離,使CAN總線節(jié)點(diǎn)因保護(hù)電路受到的損失得到彌補(bǔ)和提高。筆者應(yīng)用本電路原理在煤礦、金屬礦山監(jiān)控分站中已經(jīng)得到成功應(yīng)用。實(shí)踐證明,該電路性能穩(wěn)定、可靠,技術(shù)指標(biāo)完全滿足工業(yè)控制、通信領(lǐng)域要求。
本文通過AT90CAN128單片機(jī)CAN控制器驅(qū)動(dòng)程序設(shè)計(jì)、發(fā)送程序設(shè)計(jì)、郵箱清理程序設(shè)計(jì)、中斷接收程序設(shè)計(jì),為設(shè)計(jì)人員提供了實(shí)際可行的程序設(shè)計(jì)方案。設(shè)計(jì)人員可按照文中給出的晶振、波特率等參數(shù)進(jìn)行設(shè)計(jì),即可實(shí)現(xiàn)CAN總線節(jié)點(diǎn)之間的通信,大大節(jié)省了設(shè)計(jì)人員的開發(fā)時(shí)間。
本文設(shè)計(jì)和研究的CAN總線節(jié)點(diǎn)技術(shù)和AT90CAN128單片機(jī)的CAN控制器程序設(shè)計(jì)技術(shù)都是目前各領(lǐng)域常用的基本技術(shù),CAN總線的核心技術(shù),即多主通信技術(shù),是工業(yè)控制和通信領(lǐng)域解決關(guān)鍵問題的重點(diǎn)和難點(diǎn),限于篇幅,這里不作贅述。本文所作論述,難免存在疏漏和不足,有待以后的進(jìn)一步實(shí)踐和研究。
參考文獻(xiàn)
[1] 李真花,崔健.CAN總線輕松入門與實(shí)踐[M].北京:北京航空航天大學(xué)出版社,2010.
[2] 張培仁.CAN總線設(shè)計(jì)及分布式控制[M].北京:清華大學(xué)出版社,2012.
[3] 馬潮.AVR單片機(jī)嵌入式系統(tǒng)原理與應(yīng)用實(shí)踐[M].2版.北京:北京航空航天大學(xué)出版社,2012.
[4] 王衛(wèi)東.模擬電子技術(shù)基礎(chǔ)[M].北京:電子工業(yè)出版社,2010.
[5] 許莉婭,段帥君,李傳南.基于Verilog HDL語(yǔ)言的CAN總線控制器設(shè)計(jì)及驗(yàn)證[J].現(xiàn)代電子技術(shù),2012,35(10):43?46.
[6] 張輝.基于C8051F040單片機(jī)的CAN總線測(cè)試模式研究[J].現(xiàn)代電子技術(shù),2012,35(6):43?44.