摘 要:本文針對整車對電池管理系統(tǒng)提出雙can通信的要求,設(shè)計(jì)了由cpld、tms320lf2407與sja1000構(gòu)成的雙can控制器。文中介紹了其硬件電路和軟件流程。原文位置 關(guān)鍵詞:混合動(dòng)力電動(dòng)汽車;電池管理系統(tǒng);雙can控制器 電池管理系統(tǒng)是混合動(dòng)力汽車中重要的電子控制單元,具有保障電池正常、可靠和高效工作的作用,是電池與用電設(shè)備之間的橋梁。在研制以及批量生產(chǎn)過程中都需要對其內(nèi)部控制參數(shù)進(jìn)行離線或在線匹配標(biāo)定,而電池管理系統(tǒng)需要采集和處理大量的數(shù)據(jù),本文選用tms320lf2407作為標(biāo)定用can控制器。作為電動(dòng)汽車上的一個(gè)can節(jié)點(diǎn),需要接收整車發(fā)來的can消息來執(zhí)行對外部繼電器、風(fēng)扇以及電池等器件的控制命令,本文選用sja1000?! ‰pcan硬件電路和 cpld邏輯設(shè)計(jì) 雙can硬件電路設(shè)計(jì) tms320lf2407基于增強(qiáng)的哈佛結(jié)構(gòu),是地址線和數(shù)據(jù)線分離的微處理器,對晶振倍頻后,頻率高達(dá)40mhz。而sja1000的地址線和數(shù)據(jù)線復(fù)用,增加了dsp與sja1000之間讀寫數(shù)據(jù)的難度,這也是本系統(tǒng)設(shè)計(jì)的難點(diǎn)。常規(guī)的設(shè)計(jì)方式是在dsp與sja1000之間加一個(gè)電平轉(zhuǎn)換雙向緩沖驅(qū)動(dòng),其結(jié)構(gòu)框圖如圖1所示。按這種方式設(shè)計(jì)的電路,當(dāng)對sja1000進(jìn)行讀寫操作時(shí),先配置dsp的i/o端口,將ale拉高,鎖存地址,然后通過dsp的i/o端口將和()拉低,進(jìn)行讀(寫)數(shù)據(jù),最后拉高()和。按此方式每次讀寫sja1000寄存器中的值,均需通過程序?qū)le、和()信號進(jìn)行設(shè)置, 增加了程序源代碼。如果控制器的閃存空間比較緊張,采取這種硬件連接方式顯然是不可取的。而且,為使?fàn)顟B(tài)寄存器的狀態(tài)位讀寫正確,can報(bào)文讀寫時(shí)需在程序中加一定延時(shí),這將影響電池管理系統(tǒng)的實(shí)時(shí)性?! ?
圖1 一般雙can控制器的硬件結(jié)構(gòu)圖 為了盡量減少程序源代碼,節(jié)省寶貴的存儲資源并提高電池管理系統(tǒng)的實(shí)時(shí)性,本文采用cpld連接雙can控制器的接口電路,實(shí)現(xiàn)can報(bào)文收發(fā)。其硬件結(jié)構(gòu)如圖2所示。
圖2 基于cpld的雙can控制器硬件結(jié)構(gòu)圖 cpld的邏輯設(shè)計(jì)原文位置 cpld具有速度快、體積小、驅(qū)動(dòng)能力強(qiáng)、可在線編程等優(yōu)點(diǎn)?;赾pld的邏輯控制電路適合完成譯碼任務(wù),本文選用epm7064芯片,通過譯碼電路的軟件設(shè)計(jì),完成sja1000輸入信號的邏輯選通控制?! pld的輸入信號是dsp發(fā)送的信號,由高位地址a[15…13]、i/o空間選通引腳以及寫/讀信號組成。其中,地址線a13作為sja1000的地址和數(shù)據(jù)的選擇線,地址線a14和a15經(jīng)譯碼后作為片選信號。地址線a13和i/o空間選通信號產(chǎn)生sja1000的地址鎖存信號sja_ale,地址線a13和讀寫信號產(chǎn)生sja1000的數(shù)據(jù)和地址讀寫信號。其cpld的輸入/輸出信號邏輯關(guān)系如表1所示。原文位置 雙can軟件程序設(shè)計(jì) 該can控制器的收發(fā)程序包括兩部分:dsp的can收發(fā)程序和sja1000的can收發(fā)程序。每個(gè)can收發(fā)程序主要由三個(gè)函數(shù)組成:can初始化程序、can報(bào)文接收程序和can報(bào)文發(fā)送程序。由于dsp的can收發(fā)程序比較容易設(shè)計(jì),只需設(shè)置can控制器寄存器中的相應(yīng)位,就可實(shí)現(xiàn)can報(bào)文的收發(fā)。所以,本文主要介紹sja1000的can報(bào)文收發(fā)程序設(shè)計(jì)?! 谋?中可以看到,sja1000的寄存器映射到dsp的i/o空間。本文選擇0x8000作為sja1000地址輸入端口,0xa000作為sja1000數(shù)據(jù)輸入/輸出端口。其程序主要由sja1000初始化、sja1000接收報(bào)文和sja1000發(fā)送報(bào)文三個(gè)子函數(shù)組成。其收發(fā)函數(shù)的流程如圖3所示?! ?
圖3 sja1000發(fā)送報(bào)文程序流程圖 sja1000初始化 通過向can控制器sja1000模式寄存器寫0x01,讓其進(jìn)入復(fù)位模式,然后分別對sja1000的時(shí)鐘分頻寄存器、錯(cuò)誤報(bào)警限額寄存器、中斷使能寄存器、接收代碼和接收屏蔽寄存器、總線時(shí)序寄存器和輸出控制寄存器設(shè)置,最后向模式寄存器寫0x08,進(jìn)入正常工作模式。初始化程序如下: #define sja1000_data_port porta000原文位置 ioport unsigned int porta000; //定義數(shù)據(jù)輸入/輸出端口 #define sja1000_address_port port8000原文位置 ioport unsigned int port8000; //定義地址輸入端口 …… sja1000_write(reg_mode, 0x01); tempdata= sja1000_read(reg_mode); //向模式寄存器寫0x01,進(jìn)入復(fù)位模式 while((tempdata & 0x01) != 0x01); //等待sja1000復(fù)位