《基于CAN總線技術(shù)的汽車車燈、電動(dòng)車窗、雨刮的控制系統(tǒng)》由會(huì)員分享,可在線閱讀,更多相關(guān)《基于CAN總線技術(shù)的汽車車燈、電動(dòng)車窗、雨刮的控制系統(tǒng)(32頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
32
基于CAN總線技術(shù)的汽車車燈、電動(dòng)車窗、雨刮的控制系統(tǒng)
簡(jiǎn)介
隨著現(xiàn)代汽車的迅猛發(fā)展和電子技術(shù)的日新月異,汽車電子設(shè)備不斷增多,從發(fā)動(dòng)機(jī)控制到傳動(dòng)系統(tǒng)控制,從行駛、制動(dòng)、轉(zhuǎn)向系統(tǒng)控制到安全保證系統(tǒng)及儀表報(bào)警系統(tǒng),從電源管理到為提高舒適性而作的各種努力,使汽車綜合控制系統(tǒng)越來越復(fù)雜。目前.以微控制器為代表的汽車電子在整車電子系統(tǒng)中應(yīng)用廣泛,汽車控制正由機(jī)電控制系統(tǒng)轉(zhuǎn)向以分布式網(wǎng)絡(luò)為基礎(chǔ)的智能化系統(tǒng)。CAN總線是一種支持分布式和實(shí)時(shí)控制的串行通信網(wǎng)絡(luò),以其高性能和高可靠性在自動(dòng)控制領(lǐng)域廣泛應(yīng)用。本設(shè)計(jì)主要針對(duì)基于CAN總線的汽車電子系統(tǒng)的設(shè)計(jì),包括汽車車燈和汽車車窗和汽車雨刮等控制系統(tǒng)的總體設(shè)計(jì)思想、方法和硬件設(shè)計(jì),介紹如何實(shí)現(xiàn)用CAN總線完成汽車控制系統(tǒng)的控制。
目錄
CAN總線 3
1.1 CAN簡(jiǎn)介 3
1.2 CAN總線協(xié)議的報(bào)文幀結(jié)構(gòu)形式 3
CAN 總線在奧迪A6汽車車燈上的應(yīng)用 4
2.1 燈光控制系統(tǒng)的網(wǎng)絡(luò)硬件設(shè)計(jì)。 5
2.2 MCU的選擇 6
2.3 CAN通訊控制器 6
2.4 CAN總線收發(fā)器 6
2.5 系統(tǒng)的軟件設(shè)計(jì) 7
2.6 CAN控制初始化程序 7
2.7 中央處理器程序設(shè)計(jì) 8
2.8車燈控制程序 11
CAN總線在奧迪A6汽車電動(dòng)車窗上的應(yīng)用 15
3.1系統(tǒng)的總體設(shè)計(jì) 15
3.2硬件接口電路設(shè)計(jì) 15
3.3系統(tǒng)軟件設(shè)計(jì) 17
3.3.1 CAN控制初始化-----------------------------------------------------------------------------------------------17
3.3.2節(jié)點(diǎn)發(fā)送/接收?qǐng)?bào)文-------------------------------------------------------------------------------------- --17
3.3.3 主控程序--------------------------------------------------------------------------------------------------------18
3.4電動(dòng)車窗系統(tǒng)主要技術(shù)參數(shù)和功能 19
CAN總線在奧迪A6汽車雨刮上的應(yīng)用 19
4.1系統(tǒng)的總體設(shè)計(jì) 19
4.2系統(tǒng)硬件電路設(shè)計(jì) 20
4.2.1雨量檢測(cè)模塊 20
4.2.2開關(guān)控制模塊 21
4.2.3 ECU和CAN通信模塊 21
4.2.4輸出驅(qū)動(dòng)模塊 22
4.2.5雨刮電動(dòng)機(jī) 22
4.3系統(tǒng)軟件設(shè)計(jì) 24
結(jié)語-----------------------------------------------------------------------------------------------------------------------32
CAN總線
1.1 CAN簡(jiǎn)介
CAN(ControllerAreaNewtork)即控制器局域網(wǎng),是一種先進(jìn)的串行通信協(xié)議,屬于現(xiàn)場(chǎng)總線范圍。CAN總線是最初由德國Bosch公司在80年代初期,為了解決現(xiàn)代汽車中眾多的控制與測(cè)試一起之間的數(shù)據(jù)交換而開發(fā)的一種串行數(shù)據(jù)通信協(xié)議,目的是通過較少的信號(hào)線將汽車上的各種電子設(shè)備通過網(wǎng)絡(luò)連接起來,并提高數(shù)據(jù)在網(wǎng)絡(luò)中傳輸?shù)目煽啃?,CAN總線具有較強(qiáng)糾錯(cuò)能力,支持差分收發(fā),因而適合高噪聲環(huán)境,并具有較遠(yuǎn)的傳輸距離,特別適合于中小型分布式測(cè)控系統(tǒng),目前己在工業(yè)自動(dòng)化、建筑物環(huán)境控制、機(jī)床、醫(yī)療設(shè)備等領(lǐng)域得到廣泛應(yīng)用。CAN總線具有以下幾個(gè)重要特點(diǎn):
1)結(jié)構(gòu)簡(jiǎn)單,只有兩根線與外部相連,且內(nèi)部含有錯(cuò)誤探測(cè)和管理模塊。
2)通信方式靈活??梢远喾N方式工作,網(wǎng)絡(luò)上任意一個(gè)節(jié)點(diǎn)均可在任意時(shí)刻主動(dòng)的向網(wǎng)絡(luò)上的其他節(jié)點(diǎn)發(fā)送信息,而不分主從。
3)可以點(diǎn)對(duì)點(diǎn)、點(diǎn)對(duì)多點(diǎn)及全局廣播方式發(fā)送和接受數(shù)據(jù)。
4)網(wǎng)絡(luò)上的節(jié)點(diǎn)信息可分成不同的優(yōu)先級(jí),可以滿足不同的實(shí)時(shí)要求。
5)CAN通訊格式采用短幀格式,每幀字節(jié)數(shù)最多為8個(gè),可滿足通常工業(yè)領(lǐng)域中控制命令、工作狀態(tài)和測(cè)試數(shù)據(jù)的一般要求。同時(shí),8個(gè)字節(jié)也不會(huì)占用總線時(shí)間過長,從而保證了通訊的實(shí)時(shí)性。
6)采用非破壞性總線仲裁技術(shù)。當(dāng)兩個(gè)節(jié)點(diǎn)同時(shí)向總線上發(fā)送數(shù)據(jù)時(shí),優(yōu)先級(jí)低的節(jié)點(diǎn)主動(dòng)停止數(shù)據(jù)發(fā)送,而優(yōu)先級(jí)高的節(jié)點(diǎn)可以不受影響繼續(xù)傳輸數(shù)據(jù),這大大地節(jié)省了總線仲裁沖突時(shí)間,在網(wǎng)絡(luò)負(fù)載很重的情況下也不會(huì)出現(xiàn)網(wǎng)絡(luò)癱瘓。
7)直接通訊距離最大可達(dá)1k0m(速率在5kb/S以下),最高通訊速率可達(dá)1Mb/s(此時(shí)距離最長為40m)。節(jié)點(diǎn)數(shù)可達(dá)110個(gè),通信介質(zhì)可以是雙絞線、同軸電纜或光導(dǎo)纖維。
8)CAN總線通訊接口中集成了CAN協(xié)議的物理層和數(shù)據(jù)鏈路層功能,可完成對(duì)通信數(shù)據(jù)的成幀處理,包括位填充、數(shù)據(jù)塊編碼、循環(huán)冗余檢驗(yàn)、優(yōu)先級(jí)判別等項(xiàng)工作。
9)CAN總線采用CRC檢驗(yàn)并可提供相應(yīng)的錯(cuò)誤處理功能,保證了數(shù)據(jù)通信的可靠性。
1.2 CAN總線協(xié)議的報(bào)文幀結(jié)構(gòu)形式
在報(bào)文傳輸時(shí),不同的幀具有不同的傳輸結(jié)構(gòu),下面將分別介紹四種傳輸幀的結(jié)構(gòu),只有嚴(yán)格按照該結(jié)構(gòu)進(jìn)行幀的傳輸,才能被節(jié)點(diǎn)正確接收和發(fā)送。
(1)數(shù)據(jù)幀由七種不同的位域(Bit Field)組成:幀起始(Start of )、仲裁域(Arbitration Field)、控制域(Control Field)、數(shù)據(jù)域(DataField)、CRC域(CRC Field)、應(yīng)答域(ACK Field)和幀結(jié)尾(End of )。數(shù)據(jù)域的長度可以為0~8個(gè)字節(jié)。
1)幀起始(SOF):幀起始(SOF)標(biāo)志著數(shù)據(jù)幀和遠(yuǎn)程幀的起始,僅由一個(gè)“顯性”位組成。在CAN的同步規(guī)則中,當(dāng)總線空閑時(shí)(處于隱性狀態(tài)),才允許站點(diǎn)開始發(fā)送(信號(hào))。所有的站點(diǎn)必須同步于首先開始發(fā)送報(bào)文的站點(diǎn)的幀起始前沿(該方式稱為“硬同步”)。
2)仲裁域:仲裁域由標(biāo)識(shí)符和RTR位組成,標(biāo)準(zhǔn)幀格式與擴(kuò)展幀格式的仲裁域格式不同。標(biāo)準(zhǔn)格式里,仲裁域由1l位標(biāo)識(shí)符和RTR位組成。標(biāo)識(shí)符位有ID28~I(xiàn)Dl8。擴(kuò)展幀格式里,仲裁域包括29位標(biāo)識(shí)符、SRR位、IDE(Identifier Extension,標(biāo)志符擴(kuò)展)位、RTR位。其標(biāo)識(shí)符有ID28~I(xiàn)DO。為了區(qū)別標(biāo)準(zhǔn)幀格式和擴(kuò)展幀格式,CANl.0~1.2版本協(xié)議的保留位r1現(xiàn)表示為IDE位。IDE位為顯性,表示數(shù)據(jù)幀為標(biāo)準(zhǔn)格式;IDE位為隱性,表示數(shù)據(jù)幀為擴(kuò)展幀格式。在擴(kuò)展幀中,替代遠(yuǎn)程請(qǐng)求(Substitute Remote Request,SRR)位為隱性。仲裁域傳輸順序?yàn)閺淖罡呶坏阶畹臀?,其中最?位不能全為零。RTR的全稱為“遠(yuǎn)程發(fā)送請(qǐng)求(Remote TransmissionRequest)”。RTR位在數(shù)據(jù)幀里必須為“顯性”,而在遠(yuǎn)程幀里必須為“隱性”。它是區(qū)別數(shù)據(jù)幀和遠(yuǎn)程幀的標(biāo)志。
3)控制域:控制域由6位組成,包括2個(gè)保留位(r0、r1同于CAN總線協(xié)議擴(kuò)展)及4位數(shù)據(jù)長度碼,允許的數(shù)據(jù)長度值為0~8字節(jié)。
4)數(shù)據(jù)域:發(fā)送緩沖區(qū)中的數(shù)據(jù)按照長度代碼指示長度發(fā)送。對(duì)于接收的數(shù)據(jù),同樣如此。它可為0~8字節(jié),每個(gè)字節(jié)包含8位,首先發(fā)送的是MSB(最高位)。
5)CRC校驗(yàn)碼域:它由CRC域(15位)及CRC邊界符(一個(gè)隱性位)組成。CRC計(jì)算中,被除的多項(xiàng)式包括幀的起始域、仲裁域、控制域、數(shù)據(jù)域及15位為0的解除填充的位流給定。此多項(xiàng)式被下列多項(xiàng)式X15+X14+X10+X8+X7+X4+X3+1除(系數(shù)按模2計(jì)算),相除的余數(shù)即為發(fā)至總線的CRC序列。發(fā)送時(shí),CRC序列的最高有效位被首先發(fā)送/接收。之所以選用這種幀校驗(yàn)方式,是由于這種CRC校驗(yàn)碼對(duì)于少于127位的幀是最佳的。
6)應(yīng)答域:應(yīng)答域由發(fā)送方發(fā)出的兩個(gè)(應(yīng)答間隙及應(yīng)答界定)隱性位組成,所有接收到正確的CRC序列的節(jié)點(diǎn)將在發(fā)送節(jié)點(diǎn)的應(yīng)答間隙上將發(fā)送的這一隱性位改寫為顯性位。因此,發(fā)送節(jié)點(diǎn)將一直監(jiān)視總線信號(hào)已確認(rèn)網(wǎng)絡(luò)中至少一個(gè)節(jié)點(diǎn)正確地接收到所發(fā)信息。應(yīng)答界定符是應(yīng)答域中第二個(gè)隱性位,由此可見,應(yīng)答間隙兩邊有兩個(gè)隱性位:CRC域和應(yīng)答界定位。
7)幀結(jié)束域:每一個(gè)數(shù)據(jù)幀或遠(yuǎn)程幀均由一串七個(gè)隱性位的幀結(jié)束域結(jié)尾。這樣,接收節(jié)點(diǎn)可以正確檢測(cè)到一個(gè)幀的傳輸結(jié)束。
CAN 總線在奧迪A6汽車車燈上的應(yīng)用
摘要:以汽車控制局域網(wǎng)CAN總線為基礎(chǔ),結(jié)合89C51單片機(jī),對(duì)奧迪汽車的的車燈進(jìn)行控制。
關(guān)鍵詞:89C51,sja1000,CAN總線,82c250
正文:
燈光控制系統(tǒng)是保證汽車安全行駛的一個(gè)重要系統(tǒng)。傳統(tǒng)的燈光控制系統(tǒng)多采用繼電器和獨(dú)立模式控制,這使得車內(nèi)線束過多且布線復(fù)雜,會(huì)引起嚴(yán)重的電磁干擾,使系統(tǒng)的可靠性下降。CAN(Controller Area Network)數(shù)據(jù)總線是一種適用汽車環(huán)境的汽車局域網(wǎng)。它能夠很好的解決這個(gè)問題,它具有較高的傳輸速度,主要是針對(duì)汽車中對(duì)實(shí)時(shí)性要求很高的動(dòng)力系統(tǒng)而設(shè)計(jì)的。利用CAN總線,不僅能簡(jiǎn)化線束,而且還能大大降低車輛的故障率?;贑AN總線的燈光控制系統(tǒng),就很好用利用CAN總線的優(yōu)勢(shì),發(fā)揮車燈的最大性能。
本設(shè)計(jì)利用CAN總線通信協(xié)議建立汽車燈光(前照燈)控制系統(tǒng)的局域網(wǎng)(對(duì)于汽車其他燈光可以按照同樣道理設(shè)計(jì)而成,只需要多加幾個(gè)通信的節(jié)點(diǎn)),控制的燈光有:遠(yuǎn)光燈、近光燈、示寬燈、霧燈、轉(zhuǎn)向燈。通過CAN總線實(shí)現(xiàn)上述燈光的開和閉的控制。
2.1 燈光控制系統(tǒng)的網(wǎng)絡(luò)硬件設(shè)計(jì)。
對(duì)于傳統(tǒng)的燈光控制系統(tǒng)如圖一所示。
(圖一)
從圖一可以看出,傳統(tǒng)供電系統(tǒng)是所謂的并行結(jié)構(gòu),一個(gè)用電器賠一跟電力線和一個(gè)開關(guān),開關(guān)置于駕駛員旁,由駕駛員控制開關(guān)通斷,控制燈(或其他用電器)工作。這種結(jié)構(gòu)缺點(diǎn)是若用電設(shè)備越多,電力線就越多,這無疑是加大了汽車的負(fù)擔(dān)而且容易收到干擾,導(dǎo)致器件不能正常運(yùn)行。
對(duì)于CAN總線的燈光控制系統(tǒng)如圖二所示。
它利用CAN總線,能夠有效的減小電力線的數(shù)量,減少干擾,實(shí)現(xiàn)優(yōu)化控制。
智能開關(guān)
智能開關(guān)
MCU
Can總線收發(fā)器
Can總線收發(fā)器
MCU
車燈控制開關(guān)
車燈1
車燈2
(圖二)
我們可以直接在(圖二)中增加CAN總線收發(fā)器,及其MCU控制電路,這樣就能實(shí)現(xiàn)更多的車燈控制系統(tǒng)。
2.2 MCU的選擇
本設(shè)計(jì)選用AT89C51單片機(jī)作為燈光控制節(jié)點(diǎn)MCU。P89C51單片機(jī)是一個(gè)8位高性能微控制器。AT89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲(chǔ)器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低電壓,高性能CMOS8位的單片機(jī)。AT89C2051是一種帶2K字節(jié)閃爍可編程可擦除只讀存儲(chǔ)器的單片機(jī)。單片機(jī)的可擦除只讀存儲(chǔ)器可以反復(fù)擦除100次。該器件采用ATMEL高密度非易失存儲(chǔ)器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲(chǔ)器組合在單個(gè)芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡(jiǎn)版本。AT89C單片機(jī)為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價(jià)廉的方案。
2.3 CAN通訊控制器
本設(shè)計(jì)采用SAJ1000獨(dú)立CAN控制器。PHILIPS公司的PCA82C200是符合CAN2.0A協(xié)議的總線控制器,SJA1000是它的替代產(chǎn)品,它是應(yīng)用于汽車和一般工業(yè)環(huán)境的獨(dú)立CAN總線控制器。具有完成CAN通信協(xié)議所要求的全部特性。經(jīng)過簡(jiǎn)單總線連接的SJA1000可完成CAN總線的物理和數(shù)據(jù)鏈路層的所有功能。其硬件與軟件設(shè)計(jì)和PCA82C200的基本CAN模式(BesicCAN)兼容。同時(shí),新增加的增強(qiáng)CAN模式(PeliCAN)還可支持CAN2.0B協(xié)議。
2.4 CAN總線收發(fā)器
本文世紀(jì)采用CAN總線收發(fā)器82C250。PCA82C250是CAN協(xié)議控制器和物理總線之間的接口,該器件對(duì)總線提供差動(dòng)發(fā)送能力并對(duì)CAN控制器提供差動(dòng)接收能力。如在ISO11898標(biāo)準(zhǔn)中描述的,它們可以用高達(dá)1Mbit/s的位速率在兩條有差動(dòng)電壓的總線電纜上傳輸數(shù)據(jù)。這是全世界使用最廣泛的CAN收發(fā)器之一。
圖三為車燈控制系統(tǒng)硬件電路圖,它的工作原理為:CAN總線控制器與單片機(jī)連通,由單片機(jī)的程序給予初始化,并選通控制器,當(dāng)單片機(jī)P1.0~P1.4其中一個(gè)管腳開關(guān)按下時(shí),立刻把數(shù)據(jù)傳送到CAN控制器SJA1000,利用CAN總線收發(fā)器82C250將信號(hào)發(fā)出,通過CANH,CANL兩個(gè)管腳傳輸數(shù)據(jù),當(dāng)控制對(duì)象(車燈)系統(tǒng)中的收發(fā)器收到信號(hào)時(shí),其系統(tǒng)中的CAN總線控制器發(fā)出中斷,使車燈系統(tǒng)的MCU執(zhí)行相關(guān)程序,控制車燈驅(qū)動(dòng)電路,使其相應(yīng)的車燈完成控制目的。(注意圖中的發(fā)光二極管為車燈的驅(qū)動(dòng)電路,驅(qū)動(dòng)車燈的亮和滅)
(圖三)
微處理器AT89C51負(fù)責(zé)SJA1000的初始化,通過控制SJA1000實(shí)現(xiàn)數(shù)據(jù)的接受和發(fā)送等通訊任務(wù)。SJA1000的AD0~AD7連接到單片機(jī)的P0.0~P0.7口,SJA1000的CS連接到89c51的P2.0,P2.0為0時(shí)片外存儲(chǔ)器地址可選中SJA1000,CPU通過這些地址可對(duì)SJA1000執(zhí)行相應(yīng)的讀/寫操作。SJA1000的RD,WR,ALE分別與89c51的引腳相連,INT接INT0。
82c250與CAN總線的接口采用了一定的完全和抗干擾措施。一般情況下,若CAN總線系統(tǒng)干擾很強(qiáng)烈,為了增強(qiáng)CAN總線節(jié)點(diǎn)的抗干擾能力,SJA1000的TX0和RX0并不是直接與82C250的TXD和RXD相連,而是通過高速光耦6N137后與82c250相連,且光耦部分電路VCC和VDD完全隔離,這樣就可以實(shí)現(xiàn)總線上各節(jié)點(diǎn)間的電氣隔離。
2.5 系統(tǒng)的軟件設(shè)計(jì)
系統(tǒng)軟件設(shè)計(jì)的關(guān)鍵是通訊程序的設(shè)計(jì)。本設(shè)計(jì)的通訊軟件程序主要由3部分組成:初始化程序、中央處理器程序、車燈控制程序。編寫主要運(yùn)用KEIL的C語言對(duì)AT89C51進(jìn)行軟件程序設(shè)計(jì)。
2.6 CAN控制初始化程序
初始化程序主要是通過對(duì)CAN控制器控制段中的寄存器寫入控制字,從而確定CAN控制器的工作方式等。有3種方式進(jìn)入初始化程序:一是上電復(fù)位;二是硬件復(fù)位;三是軟件復(fù)位,即運(yùn)行期間通過給CAN控制器發(fā)一個(gè)復(fù)位請(qǐng)求,置復(fù)位請(qǐng)求為1。在復(fù)位期間,必須初始化的寄存器有:MR模式寄存器、CDR時(shí)分寄存器、ACR接收代碼寄存器、AMR屏蔽寄存器、BTR總線定時(shí)定時(shí)器及OCR輸出控制寄存器等。需要注意的是,這些寄存器僅能在復(fù)位期間寫訪問。因此,在對(duì)這些寄存器初始化前,必須確保系統(tǒng)進(jìn)入了復(fù)位狀態(tài)。流程圖如下:
2.7 中央處理器程序設(shè)計(jì)
中央處理器程序包括初始MCU,以及初始化CAN控制器。通過查詢,判斷是否有開關(guān)信號(hào)發(fā)出。若有,將此信號(hào)發(fā)送到CAN控制器,CAN控制器經(jīng)處理后發(fā)送到CAN收發(fā)器。
程序流程圖如下:
判斷是否有按鍵按下
初始化MCU,初始化CAN控制器
否
數(shù)據(jù)是否發(fā)完
啟動(dòng)發(fā)送數(shù)據(jù)程序
是
否
是
圖1. 中央MCU控制程序
中央處理器程序如下
#include
#define uchar unsigned char
#define uint unsigned int
uchar sj[8];
#define TIM0 -50000
sbit cs=P2^0;
#define MyAddr 1
#define CAN_DATA P0
#define CAN_CR 0 //控制
#define CAN_CMR 1 //命令
#define CAN_SR 2 //狀態(tài)
#define CAN_IR 3 //中斷
#define CAN_ACR 4 //驗(yàn)收
#define CAN_AMR 5 //屏蔽
#define CAN_BTR0 6 //時(shí)序0
#define CAN_BTR1 7 //時(shí)序1
#define CAN_OCR 8 //輸出
#define CAN_TXB 10 //發(fā)送緩沖
#define CAN_RXB 20 //接收緩沖
#define CAN_CDR 31 //分頻
uchar pdata CAN[32] _at_(0);
void CAN_INI() /*初始化部分*/
{
CAN[CAN_CR]=0x01; //進(jìn)入復(fù)位模式,允許訪問各個(gè)寄存器
CAN[CAN_ACR]=MyAddr; //驗(yàn)收,表示接收的數(shù)據(jù)中第一位為1。
CAN[CAN_AMR]=0x00; //屏蔽;00表示不屏蔽,8位全有效。
CAN[CAN_BTR0]=0x07; //總線時(shí)序0
CAN[CAN_BTR1]=0xff; //總線時(shí)序1
CAN[CAN_OCR]=0x1A; //0xaa,0xd2,0xfa 輸出控制
CAN[CAN_CR]=0x02; //接收中斷使能,否則不能接收
}
void delay(uint x) //延時(shí)部分
{
uint y;
for(y=x;y>0;y--);
}
void CAN_SEND() /*發(fā)送數(shù)據(jù)部分*/
{
uchar i,p;
p=CAN[CAN_SR]; //狀態(tài)寄存器的內(nèi)容給p
if (p&0x04) //檢查第三位即發(fā)送緩沖器的狀態(tài),為1 CPU可以向發(fā)送緩沖器寫報(bào)文
{
p=CAN_TXB; /*p指向發(fā)送緩存首址*/
for(i=0;i<8;i++) CAN[p++]=sj[i];
CAN[CAN_CMR]=0x01; /*請(qǐng)求發(fā)送*/
}
}
void main()
{
P0=0xff;
EA=0;
cs=0;
EX0=0;
PX0=0;
ET0=0;
CAN_INI();
IT0=1;//外中斷請(qǐng)求信號(hào)方式控制位:1 脈沖方式(后沿負(fù)跳有效),0 電平方式(低電平有效)
TH0=TIM0&0XFF; TL0=TIM0>>8; TR0=1; //啟動(dòng)0號(hào)計(jì)數(shù)器,-50000equsFFFF3CB0;TH0==B0,TL0==3C
EX0=1;
ET0=1;
EA=1;
PX0=1;
while(1)
{
if((P0&0xff)!=0xff)
{
delay(10000);
if((P0&0xff)!=0xff)
{
sj[0]=P0^0;
sj[1]=P0^1;
sj[2]=P0^2;
sj[3]=P0^3;
sj[4]=P0^4;
sj[5]=1;
sj[6]=1;
sj[7]=1;
CAN_SEND();
}
}
}
}
void Timer1() interrupt 1 using 1
{
TH0=TIM0&0XFF; TL0=TIM0>>8; TR0=1;
}
2.8車燈控制程序
當(dāng)CANH,和CNAL,有數(shù)據(jù)傳來時(shí),經(jīng)過CAN總線數(shù)據(jù)接受器接受到的數(shù)據(jù),發(fā)送給SJA1000控制器,控制器接受完畢后發(fā)出中斷請(qǐng)求,MCU接受中斷請(qǐng)求,發(fā)生中斷隨之處理中斷程序。
程序框圖如下:
判斷是否有數(shù)據(jù)需要接收
初始化MCU和CAN總線控制器
數(shù)據(jù)是否收完
啟動(dòng)數(shù)據(jù)接受程序
否
否
申請(qǐng)中斷,執(zhí)行MCU中斷程序
圖2.車燈控制系統(tǒng)MCU程序
車燈控制程序如下
#include
#define uchar unsigned char
#define uint unsigned int
#define TIM0 -50000
uchar sj[8];
uchar CANBUS=0;
sbit cs=P2^0;
sbit qd1=P0^1;
sbit qd0=P0^0;
sbit qd2=P0^2;
sbit qd3=P0^3;
sbit qd4=P0^4;
sbit qd5=P0^5;
sbit qd6=P0^6;
sbit qd7=P0^7;
#define MyAddr 1
#define CAN_DATA P0
#define CAN_CR 0 //控制
#define CAN_CMR 1 //命令
#define CAN_SR 2 //狀態(tài)
#define CAN_IR 3 //中斷
#define CAN_ACR 4 //驗(yàn)收
#define CAN_AMR 5 //屏蔽
#define CAN_BTR0 6 //時(shí)序0
#define CAN_BTR1 7 //時(shí)序1
#define CAN_OCR 8 //輸出
#define CAN_TXB 10 //發(fā)送緩沖
#define CAN_RXB 20 //接收緩沖
#define CAN_CDR 31 //分頻
uchar pdata CAN[32] _at_(0);
void CAN_INI() /*初始化部分*/
{
CAN[CAN_CR]=0x01; //進(jìn)入復(fù)位模式,允許訪問各個(gè)寄存器
CAN[CAN_ACR]=MyAddr; //驗(yàn)收,表示接收的數(shù)據(jù)中第一位為1。
CAN[CAN_AMR]=0x00; //屏蔽;00表示不屏蔽,8位全有效。
CAN[CAN_BTR0]=0x07; //總線時(shí)序0
CAN[CAN_BTR1]=0xff; //總線時(shí)序1
CAN[CAN_OCR]=0x1A; //0xaa,0xd2,0xfa 輸出控制
CAN[CAN_CR]=0x02; //接收中斷使能,否則不能接收
}
void main()
{
P0=0xff;
EA=0;
cs=0;
EX0=0;
PX0=0;
ET0=0;
CAN_INI();
IT0=1;//外中斷請(qǐng)求信號(hào)方式控制位:1 脈沖方式(后沿負(fù)跳有效),0 電平方式(低電平有效)
TH0=TIM0&0XFF; TL0=TIM0>>8; TR0=1; //啟動(dòng)0號(hào)計(jì)數(shù)器,-50000equsFFFF3CB0;TH0==B0,TL0==3C
EX0=1;
ET0=1;
EA=1;
PX0=1;
while(1);
}
void CAN_INT() interrupt 0 using 1/*接收中斷*/
{
uchar i,p;
p=CAN[CAN_IR];
if(p&0x01) //中斷寄存器的低一位為一:RXFIFO不空且中斷寄存器的RIE(接收中斷使能)位置1
{
p=CAN_RXB;//接收數(shù)據(jù)的首地址給p
for(i=0;i<8;i++)
{
sj[i]=CAN[p++];//讀接收的數(shù)據(jù)
}
CAN[CAN_CMR]=0x04; /*釋放接收緩存*/
CANBUS=1;
}
if(CANBUS==1)
{
qd0=sj[0];
qd1=sj[1];
qd2=sj[2];
qd3=sj[3];
qd4=sj[4];
qd5=sj[5];
qd6=sj[6];
qd7=sj[7];
}
}
void Timer1() interrupt 1 using 1
{
TH0=TIM0&0XFF; TL0=TIM0>>8; TR0=1;
}
CAN總線在奧迪A6汽車電動(dòng)車窗上的應(yīng)用
3.1系統(tǒng)的總體設(shè)計(jì)
現(xiàn)在各中高檔轎車都安裝有電動(dòng)車窗,按鈕控制車窗玻璃的升降。如果車窗無智能,司機(jī)在沒有注意到乘客的手或物體伸出窗口的情況下按下按鈕,乘客容易被車窗夾傷。為了安全,很多乘車都采用電動(dòng)防夾車窗。在充分研究有關(guān)CAN總線在汽車電子系統(tǒng)中的應(yīng)用和電動(dòng)車窗防夾方案的基礎(chǔ)上,提出一種基于CAN總線的轎車車窗智能控制系統(tǒng)的設(shè)計(jì)方案,實(shí)現(xiàn)車窗在正常工作模式下防夾控制功能和緊急情況下(異常工作模式)快速升降車窗控制功能。CAN總線系統(tǒng)節(jié)點(diǎn)分為不帶微控制器的非智能節(jié)點(diǎn)和帶微控制器的智能節(jié)點(diǎn)。該系統(tǒng)采用智能節(jié)點(diǎn)設(shè)計(jì),轎車車窗按CAN總線結(jié)構(gòu)和電器元件在汽車中的物理位置劃分為左前、右前、左后和右后4個(gè)節(jié)點(diǎn)單元。其中左前節(jié)點(diǎn)為主控制單元,除負(fù)責(zé)本地(左前)車窗的升降,還可以遠(yuǎn)程控制其他車窗。各節(jié)點(diǎn)采用獨(dú)立的帶CAN功能的微控制器設(shè)計(jì),其CAN網(wǎng)絡(luò)結(jié)構(gòu)如圖所示。
3.2硬件接口電路設(shè)計(jì)
該系統(tǒng)采用片內(nèi)含有CAN控制器的P8xC591作為節(jié)點(diǎn)單元主控制器。P8xC591采用強(qiáng)大的80C51指令集;內(nèi)部集成有SJAl000 CAN控制器的PeliCAN功能;全靜態(tài)內(nèi)核提供了擴(kuò)展的節(jié)電方式:振蕩器停止和恢復(fù)而不丟失數(shù)據(jù);改進(jìn)的1:l內(nèi)部時(shí)鐘分頻器在12 MHz外部時(shí)鐘頻率時(shí)實(shí)現(xiàn)500ns指令周期。
控制器P8xC2591讀取按鍵信息,驅(qū)動(dòng)車窗電機(jī)按預(yù)先編制的軟件指令運(yùn)行,同時(shí)監(jiān)測(cè)傳感器的輸出電壓和負(fù)載電流,作為車窗在上升(下降)過程中與障礙物夾持時(shí)的邏輯判斷,然后驅(qū)動(dòng)電機(jī)。為了防止車窗玻璃上升到頂部或下降到底部時(shí),電動(dòng)機(jī)受到?jīng)_擊堵轉(zhuǎn)而降低電動(dòng)車窗機(jī)械的使用壽命,該系統(tǒng)設(shè)計(jì)具有軟停止功能,并且手動(dòng)或自動(dòng)上升、下降時(shí)都有此功能。當(dāng)玻璃上升(下降)快到頂(底)部時(shí),在上升軟停止點(diǎn)切斷電動(dòng)機(jī)的電源使其停止工作,通過電動(dòng)機(jī)的慣性使玻璃上升(下降)到頂(底)部。各節(jié)點(diǎn)單元相關(guān)命令和狀態(tài)通過CAN控制器以報(bào)文格式由CAN總線完成與其他節(jié)點(diǎn)單元信息間的傳輸和共享。系統(tǒng)節(jié)點(diǎn)單元硬件設(shè)計(jì)框圖如圖所示。
車窗控制系統(tǒng)CAN總線硬件原理圖
系統(tǒng)左前節(jié)點(diǎn)單元除具有全局控制外,其余節(jié)點(diǎn)單元只負(fù)責(zé)控制本地車窗,硬件設(shè)計(jì)僅多一個(gè)按鍵K4,主要在于軟件設(shè)計(jì)。該系統(tǒng)設(shè)計(jì)的控制電路不僅支持節(jié)點(diǎn)單元間的CAN總線通信,還要檢測(cè)壓電傳感器和負(fù)載電流等模擬量,判斷各種邏輯,通過驅(qū)動(dòng)器實(shí)現(xiàn)控制功能。
3.3系統(tǒng)軟件設(shè)計(jì)
系統(tǒng)軟設(shè)計(jì)目主包括CAN控制器始化、節(jié)點(diǎn)發(fā)送接收?qǐng)?bào)文主控程序3個(gè)模塊。
can控制器初始化
CAN控制器電或硬復(fù)位必須始化,包括操作模式、驗(yàn)收濾波器、總線位定時(shí)、斷配置TXDC輸出引腳。
節(jié)點(diǎn)發(fā)送/接收?qǐng)?bào)文
報(bào)文發(fā)送由CAN控制器遵循CAN協(xié)議規(guī)范自動(dòng)完成。首先CPU必須待發(fā)送數(shù)據(jù)按特定格式組合成幀報(bào)文,進(jìn)入CAN控制發(fā)送緩沖器,并置位命令寄存器發(fā)送求標(biāo)志,發(fā)送處理通過斷求或查詢狀態(tài)標(biāo)志進(jìn)行控制。其發(fā)送程序分發(fā)送遠(yuǎn)程幀數(shù)據(jù)幀兩種,遠(yuǎn)程幀無數(shù)據(jù)場(chǎng)。
報(bào)文接收程序責(zé)節(jié)點(diǎn)報(bào)文接收以及總線關(guān)閉、誤報(bào)警、接收溢出等其處理。報(bào)文收發(fā)主有斷接收方式查詢接收方式。軟設(shè)計(jì)采報(bào)文接收查詢斷控制方式報(bào)文發(fā)送斷控制方式。報(bào)文發(fā)送/接收程序流程如下圖所示。
主控程序
各車窗節(jié)點(diǎn)單元,左節(jié)點(diǎn)單元功能最復(fù)雜,具有最控制優(yōu)先權(quán)。這里以左節(jié)點(diǎn)單元例,詳細(xì)介紹其主控程序設(shè)計(jì)。首先始化系統(tǒng),包括P8xC591控制器CAN模塊始化、斷、I/0端口、定時(shí)模塊、看門狗模塊、A/D轉(zhuǎn)換器模塊設(shè)置全局變量,還電機(jī)堵轉(zhuǎn)時(shí)最電流車窗頂(底)時(shí)傳感器電壓閾值入EPROM。P8xC591實(shí)測(cè)電流EPROM標(biāo)定值比較,實(shí)現(xiàn)防夾功能,比較電壓閾值測(cè)得傳感器電路電壓值判斷車窗達(dá)極限位置。始化完成,讀組合按鍵信息,根據(jù)按鍵動(dòng)作實(shí)施具體操作,同時(shí)發(fā)送CAN報(bào)文,完成各節(jié)點(diǎn)單元間CAN通信智能化控制。圖5左節(jié)點(diǎn)單元主控程序流程。
設(shè)計(jì)流程圖
3.4電動(dòng)車窗系統(tǒng)主要技術(shù)參數(shù)和功能
①防夾功能 初始化后,手動(dòng)和自動(dòng)上升時(shí)都具有防夾功能,防夾次數(shù)不受限制;從車窗上極限下沿40mm往下,車窗上極限上沿40 mm往上的區(qū)間為防夾區(qū)間
②省電模式 在輸入信號(hào)消失120 ms后。且電動(dòng)機(jī)溫度接近室溫25℃時(shí),系統(tǒng)自動(dòng)進(jìn)入省電模式.靜態(tài)電流小于300μA。當(dāng)電動(dòng)機(jī)控制單元一旦得到輸入指令就被喚醒。
③軟停止功能 上升軟停止點(diǎn)為上極限位置約2 mm處,下降軟停止點(diǎn)為下極限位置上約12 mm處。
④電動(dòng)機(jī)保護(hù)功能對(duì)電動(dòng)機(jī)采取保護(hù)措施,提高電動(dòng)機(jī)和電動(dòng)車窗系統(tǒng)的使用壽命。
⑤自診斷保護(hù)功能 為保證系統(tǒng)的可靠性,同時(shí)提高系統(tǒng)的平均無故障時(shí)間,采用自診斷保護(hù)措施:如果電源電壓超過16 V0.5 V,關(guān)閉自動(dòng)上升功能。
⑥系統(tǒng)抗干擾設(shè)計(jì)技術(shù)軟件抗干擾以其設(shè)計(jì)靈活、節(jié)省硬件資源、成本低等優(yōu)勢(shì)得到廣泛應(yīng)用。
CAN總線在奧迪A6汽車雨刮上的應(yīng)用
4.1系統(tǒng)的總體設(shè)計(jì)
本設(shè)計(jì)為奧迪A6汽車雨刮控制系統(tǒng),由左右節(jié)點(diǎn)構(gòu)成。左節(jié)點(diǎn)主控制單元,兩節(jié)點(diǎn)基本相同,區(qū)別僅在于左節(jié)點(diǎn)多出開關(guān)命令模塊。以左節(jié)點(diǎn)為介紹內(nèi)容,它包括雨量檢測(cè)模塊、電源模塊、開關(guān)控制模塊、CAN通信模塊、處理器模塊??蓪?shí)現(xiàn)停止、低速、高速、點(diǎn)動(dòng)、間歇、自動(dòng)五種刮水模式。左節(jié)點(diǎn)工作時(shí),開關(guān)控制命令輸入到控制器模塊,雨量檢測(cè)模塊將雨量信息輸入控制模塊供自動(dòng)模式使用,控制器由開關(guān)信號(hào)和雨量信號(hào)作出判斷,輸出命令到輸出驅(qū)動(dòng)模塊和CAN通信模塊。右節(jié)點(diǎn)經(jīng)CAN通信模塊獲得動(dòng)作命令,輸出驅(qū)動(dòng)命令到輸出驅(qū)動(dòng)模塊。電源模塊為左右節(jié)點(diǎn)供電。
左節(jié)點(diǎn) 右節(jié)點(diǎn)
ECU
開關(guān)控制模塊
CAN通信
電源
輸出驅(qū)動(dòng)模塊
輸出驅(qū)動(dòng)模塊
CAN通信
ECU
電源
雨量檢測(cè)模塊
系統(tǒng)整體電路圖
4.2系統(tǒng)硬件電路設(shè)計(jì)
4.2.1雨量檢測(cè)模塊
圖4-1雨量檢測(cè)電路圖
圖4-2紅外傳感器檢測(cè)原理圖
雨量檢測(cè)采用紅外雨水傳感器,紅外光受外界環(huán)境影響小,且易于檢測(cè)。把半導(dǎo)體發(fā)光元件和感光元件配成一對(duì),從發(fā)光元件發(fā)出的光信號(hào),如果在光路途中遇到雨滴落下,由于光的散射,光強(qiáng)減弱,可利用檢測(cè)光強(qiáng)的衰減信號(hào)來控制雨刮器的動(dòng)作。由此雨量檢測(cè)部分由紅外光發(fā)射電路和紅外光接收電路組成,如圖4-1所示。
圖中左半部分為紅外發(fā)射電路,紅外發(fā)射管采用硅光電二極管,它具有暗電流小、噪聲低、受溫度影響小、價(jià)格便宜等優(yōu)點(diǎn)。紅外發(fā)射管三個(gè)并聯(lián),三極管驅(qū)動(dòng),利用單片機(jī)定時(shí)器定時(shí)中斷在P5.0口產(chǎn)生38 kHz的頻率脈沖控制發(fā)射管的通斷,采用這種方式可以減少發(fā)射電路的功耗。電路中D1用來指示紅外發(fā)射管是否在正常工作中。右半部分為紅外接收電路,采用Vishay公司的紅外專用集成接收芯片 TK1838,該芯片將光接收二極管、放大電路、帶通濾波器、檢波電路封裝在一起,以實(shí)現(xiàn)接收脈沖編碼信號(hào)調(diào)制的紅外光信號(hào),塑料封裝可濾除可見光,使得電路簡(jiǎn)單,體積也比較小。TK1838芯片共有3個(gè)引腳:l腳為輸出,2 腳為接地,3 腳電源接 +5 V,內(nèi)部集成了放大、濾波、解調(diào)及其控制電路,1腳直接輸出高低電平。TK1838只有接收到38 kHz的脈沖信號(hào)才會(huì)工作。當(dāng)接收不到38 kHz的脈沖信號(hào)時(shí),1腳輸出高電平;當(dāng)接收到38 kHz的脈沖信號(hào)時(shí),1腳輸出低電平。當(dāng)有雨滴落在擋風(fēng)玻璃的“敏感區(qū)域”時(shí),1腳輸出一串脈沖波,脈沖波的數(shù)量則與雨量的大小成正比。
4.2.2開關(guān)控制模塊
汽車上使用的電源系統(tǒng)是12V系統(tǒng),控制輸入信號(hào)也為12V,而89C51是5V系統(tǒng)供電。開關(guān)的控制信號(hào)不能直接輸入到MCU管腳,必須進(jìn)行電平轉(zhuǎn)換,使輸入的12V雨刮器開關(guān)控制信號(hào)轉(zhuǎn)換后輸出5V電壓,再進(jìn)入到MCU的I/O管腳。開關(guān)處的具體電平轉(zhuǎn)換連接電路,如下圖4-3所示。整個(gè)模塊總共有“停止、低速、高速、點(diǎn)動(dòng)、間歇、自動(dòng)”五個(gè)按鈕。
圖4-3控制開關(guān)模塊電路圖
4.2.3 ECU和CAN通信模塊
雨刮器中的ECU和CAN通信模塊與車燈控制系統(tǒng)、車窗控制系統(tǒng)中ECU和CAN通信模塊一樣。
4.2.4.電源模塊
電源模塊為控制器的其它模塊電路提供符合要求的電源。目前汽車上使用的電源系統(tǒng)是12V系統(tǒng),蓄電池的電壓范圍是9~15V,一般單片機(jī)的輸入電壓和各個(gè)管腳的最大輸入電壓是5V,需要對(duì)汽車上的電源系統(tǒng)進(jìn)行電平轉(zhuǎn)換,給需要5V電源的MCU和其它器件使用,如圖4-4所示。
圖4-4 電源模塊電路原理圖
4.2.4輸出驅(qū)動(dòng)模塊
輸出驅(qū)動(dòng)模塊主要實(shí)現(xiàn)ECU輸出命令信號(hào)轉(zhuǎn)化為能夠驅(qū)動(dòng)繼電器工作的大電流信號(hào)。以電機(jī)的正反轉(zhuǎn)控制信號(hào)驅(qū)動(dòng)電路為原理分析,其他的繼電器動(dòng)作電路同樣?;鶚O接主控器控制引腳,輸出高電平時(shí),三極管導(dǎo)通對(duì)電流進(jìn)行放大,繼電器吸合進(jìn)行開關(guān)動(dòng)作。繼電器并聯(lián)反向二極管的作用是泄流,三極管截止時(shí)形成回路,繼電器中線圈電流經(jīng)二極管流走。
圖4-5 輸出驅(qū)動(dòng)控制繼電器電路圖
4.2.5雨刮電動(dòng)機(jī)
本設(shè)計(jì)采用永磁電動(dòng)機(jī),通過改變電樞電流方向控制器正反轉(zhuǎn),通過改變正負(fù)電刷間串聯(lián)繞組匝數(shù)控制轉(zhuǎn)速。主控器輸出命令控制繼電器動(dòng)作,有不同的繼電器組合動(dòng)作可以選擇電樞電流方向和電刷間匝數(shù)。自動(dòng)停位滑片隨電動(dòng)機(jī)轉(zhuǎn)動(dòng),當(dāng)刮水片不在風(fēng)窗下緣位置時(shí)保持通電,當(dāng)刮水片正好停在風(fēng)窗下緣位置時(shí),電動(dòng)機(jī)與電源斷開。
1—電樞 2—永久磁鐵磁極
3—蝸桿 4—蝸輪 5—自動(dòng)停位滑片
圖4-6 雨刮電動(dòng)機(jī)原理圖
4.3系統(tǒng)軟件設(shè)計(jì)
開始
單片機(jī)初始化
停止鍵按下
低速鍵按下
輸出停止命令
Y
N
高速鍵按下
輸出低速命令
Y
輸出高速命令
Y
輸出點(diǎn)動(dòng)命令
Y
點(diǎn)動(dòng)鍵按下
N
N
輸出間歇命令
Y
間歇鍵按下
N
輸出點(diǎn)動(dòng)命令
Y
點(diǎn)動(dòng)鍵按下
N
Y
自動(dòng)鍵按下
N
雨量檢測(cè)
輸出自動(dòng)命令
CAN總線發(fā)送信號(hào)
N
軟件流程設(shè)計(jì)如圖所示,單片機(jī)初始化程序包括初始化I/O端口的輸入輸出狀態(tài),設(shè)置定時(shí)計(jì)數(shù)器的參數(shù)和中斷優(yōu)先級(jí)等。逐個(gè)按鍵檢測(cè)輸入信號(hào),經(jīng)控制器處理后輸出控制命令到本地控制驅(qū)動(dòng)裝置,然后初始化CAN通信模塊,發(fā)送命令信號(hào)到其他節(jié)點(diǎn)。循環(huán)檢測(cè)按鍵狀態(tài)進(jìn)行控制。其中的點(diǎn)動(dòng)信號(hào)為短暫通電信號(hào),電動(dòng)機(jī)短暫工作后停止;間歇信號(hào)為延時(shí)一段時(shí)間后電動(dòng)機(jī)工作之后再延時(shí),電動(dòng)機(jī)再工作;自動(dòng)控制信號(hào)使電機(jī)根據(jù)雨量檢測(cè)信號(hào)的大小來選擇電動(dòng)機(jī)轉(zhuǎn)動(dòng)速度。
具體代碼:
#include
#include "sja_reg_def.h"
unsigned char xdata CAN_SJA_BaseAdr _at_ 0xfa00; //定義SJA1000的片選基址:根據(jù)實(shí)際電路確定
unsigned char xdata *SJA_CS_Point ; //指針指向空
unsigned char Send_CAN_Filter[8]={0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff};//存放SJA1000濾波器參數(shù)
unsigned char Send_CAN_Data[8]; //待發(fā)送的數(shù)據(jù),具體數(shù)據(jù)由發(fā)送前確定
unsigned char Rec_CAN_Data[8]; //用于接收數(shù)據(jù)
unsigned char Send_CAN_Info_ID[5]={0x88,0x00,0x00,0x00,0x00}; //幀頭標(biāo)識(shí)碼
unsigned char BTR0,BTR1;
unsigned long int num= 0; //用于雨量檢測(cè)時(shí)的脈沖計(jì)數(shù)
unsigned char flag_zidong=0; //用于標(biāo)記雨量大小
sbit KEY_Diandong = P1^0; //點(diǎn)動(dòng),按下鍵得低電平
sbit KEY_Zidong = P1^1; //自動(dòng)
sbit KEY_Jianxie = P1^2; //間歇
sbit KEY_High = P1^3; //高速
sbit KEY_Low = P1^4; //低速
sbit KEY_Stop = P1^5; //停止
sbit StartRain = P1^6; //啟動(dòng)雨量檢測(cè)
sbit RainSignal = P1^7; //接收雨量信號(hào)
sbit MC_front = P2^0; //正:0,0;反;1,1;停:1,0
sbit MC_back = P2^1;
sbit MC_choose = P2^2; //輸出高速:1;輸出高速:0
/*延時(shí)函數(shù)*/
void Delayms( unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/*CAN總線初始化*/
void Can_Sja_Init()
{
SJA_CS_Point=&CAN_SJA_BaseAdr; //確定基址指針
BTR0=0x00;
BTR1=0x14; //設(shè)置為1M波特率通信
//SJAEntryResetMode();
*(SJA_CS_Point+REG_CAN_MOD) |= 0X01; //進(jìn)入復(fù)位模式
//WriteSJAReg(REG_CAN_CDR,0xc8);
*(SJA_CS_Point+REG_CAN_CDR) = 0X08; //配置時(shí)鐘分頻寄存器,選擇PeliCAN模式
//WriteSJAReg(REG_CAN_MOD,0x01);
*(SJA_CS_Point+REG_CAN_MOD) = 0X01; //配置模式寄存器,選擇雙濾波、正常模式
//WriteSJARegBlock(16,Send_CAN_Filter,8);
*(SJA_CS_Point+REG_CAN_ACR0) = Send_CAN_Filter[0]; //配置驗(yàn)收代碼/屏蔽寄存器
*(SJA_CS_Point+REG_CAN_ACR1) = Send_CAN_Filter[1];
*(SJA_CS_Point+REG_CAN_ACR2) = Send_CAN_Filter[2];
*(SJA_CS_Point+REG_CAN_ACR3) = Send_CAN_Filter[3];
*(SJA_CS_Point+REG_CAN_AMR0) = Send_CAN_Filter[4];
*(SJA_CS_Point+REG_CAN_AMR1) = Send_CAN_Filter[5];
*(SJA_CS_Point+REG_CAN_AMR2) = Send_CAN_Filter[6];
*(SJA_CS_Point+REG_CAN_AMR3) = Send_CAN_Filter[7];
//WriteSJAReg(REG_CAN_BTR0,BTR0);
*(SJA_CS_Point+REG_CAN_BTR0) = BTR0; //配置總線定時(shí)器0等于0x00
//WriteSJAReg(REG_CAN_BTR1,BTR1);
*(SJA_CS_Point+REG_CAN_BTR1) = BTR1; //配置總線定時(shí)器1等于0x14
//WriteSJAReg(REG_CAN_OCR,0x1a);
*(SJA_CS_Point+REG_CAN_OCR) = 0X1a; //配置輸出管腳
//SJAQuitResetMode();
*(SJA_CS_Point+REG_CAN_MOD) &= 0Xfe;
}
/*MCU外部中斷初始化*/
void Init_Cpu()
{
PX0 = 1; //外部中斷0高優(yōu)先級(jí)
IT0 = 1; //下降沿觸發(fā)
EX0 = 1; //允許外部中斷
EA = 1; //允許總中斷
}
/*CAN發(fā)送函數(shù)*/
void Can_Sja_Send()
{
unsigned char sr,i ;
EA = 0 ; //發(fā)送期間不接受新的請(qǐng)求
do
{
sr = *(SJA_CS_Point+REG_CAN_SR); //讀狀態(tài)寄存器
}while((sr&0x0c)!= 0x0c); //等待接收完、上一次發(fā)送完 、緩沖器開鎖
for(i=0;i<5;i++)
{ *(SJA_CS_Point+16+i)=Send_CAN_Data[i]; //寫標(biāo)識(shí)碼,第16個(gè)地址為幀頭標(biāo)識(shí)碼開始地址
}
for(i=0;i<8;i++)
{ *(SJA_CS_Point+21+i)=Send_CAN_Data[i]; //寫數(shù)據(jù),第21個(gè)地址為發(fā)送緩沖開始地址
}
*(SJA_CS_Point+REG_CAN_CMR) = 0x01; //使能發(fā)送請(qǐng)求
EA = 1; //發(fā)送完可以接收新的請(qǐng)求
}
/*中斷CAN接收函數(shù)*/
void Receive_Int1() interrupt 2 //接收中斷采用外部中斷1
{
unsigned char ir,i;
EA = 0; //接收期間關(guān)中斷
do
{
ir = *(SJA_CS_Point+REG_CAN_IR); //讀中斷寄存器
}while((ir&0x01)!=0x01);
for(i=0;i<5;i++)
{ Rec_CAN_Data[i] = *(SJA_CS_Point+16+i); //接收標(biāo)識(shí)碼
}
for(i=0;i<8;i++)
{ Rec_CAN_Data[i] = *(SJA_CS_Point+21+i); //接收數(shù)據(jù)
}
*(SJA_CS_Point+REG_CAN_CMR) = 0x04; //釋放接收緩沖區(qū)
*(SJA_CS_Point+REG_CAN_IR) = *(SJA_CS_Point+REG_CAN_ALC); //釋放仲裁隨時(shí)捕捉寄存器,讀出即可清除
*(SJA_CS_Point+REG_CAN_IR) = *(SJA_CS_Point+REG_CAN_ECC); //釋放錯(cuò)誤代碼捕捉寄存器,讀出即可清除
*(SJA_CS_Point+REG_CAN_IER) = 0X01; //接收中斷使能
EA = 1; //恢復(fù)中斷
}
/*雨刮停止工作函數(shù)*/
void Stop()
{
MC_front = 1;
MC_front = 0;
}
/*雨刮間歇工作函數(shù)*/
void Jianxie()
{ while(!KEY_Jianxie)
{
MC_choose = 0; //低速運(yùn)轉(zhuǎn)
MC_front = 0; //正轉(zhuǎn)200ms
MC_back = 0;
Delayms(200);
MC_front = 0; //反轉(zhuǎn)
MC_back = 0;
Delayms(100); //100ms后機(jī)械歸位
MC_front = 1; //停止1000ms
MC_back = 0;
Delayms(1000);
}
}
/*雨刮高速工作函數(shù)*/
void High()
{
while(!KEY_High)
{
MC_choose = 1; //高速運(yùn)轉(zhuǎn)
MC_front = 0; //正轉(zhuǎn)100ms
MC_back = 0;
Delayms(100);
MC_front = 0; //反轉(zhuǎn)100ms
MC_back = 0;
Delayms(100);
}
}
/*雨刮低速工作函數(shù)*/
void Low()
{
while(!KEY_High)
{
MC_choose = 0; //低速運(yùn)轉(zhuǎn)
MC_front = 0; //正轉(zhuǎn)200ms
MC_back = 0;
Delayms(200);
MC_front = 0; //反轉(zhuǎn)200ms
MC_back = 0;
Delayms(200);
}
}
/*雨刮點(diǎn)動(dòng)工作函數(shù)*/
void Diandong()
{
MC_choose = 0; //低速運(yùn)轉(zhuǎn)
MC_front = 0; //正轉(zhuǎn)200ms
MC_back = 0;
Delayms(200);
MC_front = 0; //反轉(zhuǎn)100ms后機(jī)械歸位
MC_back = 0;
鏈接地址:http://www.hcyjhs8.com/p-10177759.html