• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      CAN總線協(xié)議的動力電池報文采集與解析*

      2018-08-08 07:31:38,,,,
      關(guān)鍵詞:寄存器時序中斷

      ,,,,

      (上海工程技術(shù)大學(xué) 汽車工程學(xué)院,上海 201620)

      引 言

      電動汽車車用鋰電池發(fā)展十分迅速,預(yù)計未來幾年動力電池將進(jìn)入大量回收的階段,因此需要考慮電池的回收、處理和再利用等問題。電動汽車的動力電池組壽命終結(jié)后,仍具有約70%~80%的容量,因此可將動力電池梯次利用于風(fēng)光儲能、智能電網(wǎng)的削峰填谷等[5]。本文設(shè)計了一套采集報文的裝置,采用主控制芯片M2+CAN控制器,通過對電動汽車退役電池進(jìn)行再測試,從BMS中獲取與單體電池性能相關(guān)的報文,根據(jù)協(xié)議進(jìn)行報文解析、計算,可篩選出一致性較好的電池,有助于提高能源利用率。

      1 CAN總線報文采集系統(tǒng)結(jié)構(gòu)

      本文采用上海山意微電子技術(shù)有限公司研發(fā)的國產(chǎn)32位M2芯片作為主控制器,M2芯片有兩個UART接口,但不帶CAN接口,采用NXP公司的一種獨立CAN控制器SJA1000,可在BasicCAN和PeliCAN兩種協(xié)議下工作。其中BasicCAN支持CAN2.0A協(xié)議,PeliCAN工作方式支持CAN2.0B協(xié)議。CAN收發(fā)器采用TJA1050[1]。整體結(jié)構(gòu)硬件模塊包括:MCU主控制器、CAN 控制器、CAN 收發(fā)器,接收的報文可通過PC上位機(jī)軟件窗口觀察到。系統(tǒng)框圖如圖1所示。

      圖1 CAN總線報文采集系統(tǒng)框圖

      2 系統(tǒng)硬件設(shè)計

      上海山意微電子技術(shù)有限公司自主研發(fā)的M2芯片,是基于MIPS架構(gòu)的32位精簡指令型處理器,擁有128 KB的Flash存儲空間、2個UART/LIN通信串口、1個SPI通信接口、8路20位ADC采集模塊以及豐富的I/O接口,溫度穩(wěn)定性高,滿足使用需求。本文采用的SJA1000CAN控制器是NXP公司的一種獨立CAN控制器,可在BasicCAN和PeliCAN兩種協(xié)議下工作。其中PeliCAN工作方式可接收擴(kuò)展幀,29位標(biāo)識符。由于本文采集的是電池管理系統(tǒng)發(fā)出的CAN報文,均為擴(kuò)展幀、數(shù)據(jù)幀,因此選擇PeliCAN工作方式。

      3 系統(tǒng)軟件設(shè)計

      3.1 SJA1000驅(qū)動程序設(shè)計

      CAN控制器SJA1000內(nèi)部包含128個8位的寄存器,不帶有MCU處理器,相當(dāng)于是主控制器M2的外部RAM空間,主控制器可通過讀、寫時序?qū)JA1000的寄存器進(jìn)行訪問和設(shè)置,因此首先要對訪問時序進(jìn)行軟件編程,實現(xiàn)主控制器與CAN控制器之間的通信,本文采用Intel模式下的交流時序。

      寫時序圖如圖2所示。

      圖2 寫時序圖

      WR_SJA_REG(volatile int ADD,volatile int DATA){

      /*初始化引腳*/

      MemoryWrite32(SPI_CTL_REG,0x8);

      //關(guān)閉SPI復(fù)用引腳功能

      MemoryWrite32(U1_CTL0_REG,0x10);

      //關(guān)閉UART引腳功能

      MemoryWrite32(A_SDV2P_CTL_REG,0x0);

      //關(guān)閉SD引腳功能

      int p,i;

      /*芯片I/O口引腳配置,單向I/O SEG口引腳配置*/

      RT_GDR_BIT_OFF(0); //SEG 20 ==GDR 0 ALE

      RT_GDR_BIT_ON(1); //SEG 21 ==GDR 1 RD

      RT_GDR_BIT_ON(2); //SEG 22 ==GDR 2WR

      RT_GDR_BIT_ON(3); //SEG 23 ==GDR 3CS

      RT_IOCTL_Set32(0xFFFF); //設(shè)置I/O口為輸出

      RT_GDR_BIT_ON(0); //ALE HIGN

      for(i=0;i<5;i++);

      ADD=ADD<<6;

      RT_GPIO_Write32(ADD); //M2向SJA1000發(fā)送地址

      for(i=0;i<5;i++);

      RT_GDR_BIT_OFF(0); //ALE LOW

      for(i=0;i<5;i++);

      RT_GDR_BIT_OFF(3); //CS LOW

      for(i=0;i<5;i++);

      RT_IOCTL_Set32(0xFFFF); //設(shè)置I/O口為輸出

      for(i=0;i<5;i++);

      RT_GDR_BIT_OFF(2); //WR LOW

      for(i=0;i<5;i++);

      DATA=DATA<<6;

      RT_GPIO_Write32(DATA); //M2向SJA1000發(fā)送數(shù)據(jù)

      p=RT_GPIO0_Read32();

      p=p>>6;

      p=p&0Xff;

      for(i=0;i<5;i++);

      RT_GDR_BIT_ON(2); //WR HIGN

      for(i=0;i<5;i++);

      RT_GDR_BIT_ON(3); //CS HIGN

      for(i=0;i<5;i++);

      return p;

      }

      由于脈寬保持時間需要保持大于一定的時間,且時序的正確配合十分重要,程序中利用for延時不同的時間來實現(xiàn)。同時,采用的GPIO口為復(fù)用引腳,需先關(guān)閉本控制芯片的SPI、UARTt和SD的復(fù)用引腳功能。同理,讀交流時序如圖3所示。

      圖3 讀時序圖

      讀時序與寫時序都是主控制器鎖定目標(biāo)寄存器,但讀操作是直接把SJA1000寄存器的值讀取回來,當(dāng)先向SJA1000發(fā)送完地址以后,把8路A/D總線I/O口設(shè)置為輸入后,寄存器中的數(shù)據(jù)就會自動發(fā)送回來。一次讀時序包括由主控制器向SJA1000發(fā)送寄存器地址后,把A/D數(shù)據(jù)地址總線設(shè)置為輸入,讀回數(shù)據(jù)。讀時序程序如下:

      RD_SJA_REG(volatile int ADD){

      ……

      //向SJA1000發(fā)送地址部分內(nèi)容和寫時序部分相同

      RT_IOCTL_Set32(0x0); //設(shè)置GPIO為輸入

      for(i=0;i<5;i++);

      RT_GDR_BIT_OFF(1); //RD LOW

      for(i=0;i<5;i++);

      p=RT_GPIO1_Read();

      p=p>>6;

      p&=0xff;

      for(i=0;i<5;i++);

      RT_GDR_BIT_ON(1); //RD HIGN

      for(i=0;i<5;i++);

      RT_GDR_BIT_ON(3); //CS HIGN

      for(i=0;i<5;i++);

      return p;

      }

      讀、寫時序程序設(shè)計好以后,接下來的對寄存器的配置、SJA1000的初始化、報文的接收和發(fā)送都是基于此通信時序進(jìn)行相關(guān)寄存器的配置,因此讀寫時序程序的設(shè)計十分重要。為測試此讀寫時序的正確性,采用邏輯分析儀進(jìn)行觀察檢測,得到的讀時序圖和寫時序分別圖4和圖5所示。

      圖4 邏輯分析儀讀時序

      圖5 邏輯分析儀寫時序

      3.2 初始化SJA1000

      CAN控制器控制SJA1000進(jìn)行報文的接收和發(fā)送之前,需要在復(fù)位模式下對SJA1000進(jìn)行初始化操作[2]。主要操作內(nèi)容包括配置時鐘分頻寄存器、操作模式、設(shè)置驗收代碼寄存器和驗收屏蔽寄存器,設(shè)置通信波特率等。初始化程序如下:

      int Sja1000_Init(){

      int s,a;

      s=ENTER_RSTMODE(); //置位復(fù)位請求和單濾波模式

      s=TEST_COMMUNI_REG();

      //寫入測試寄存器,查看讀寫功能是否正確

      s=SET_CLOCK_REG(0xC8);

      //選擇Pelican模式,禁能外部時鐘引腳Intel模式

      s=SET_ACCEPT_FILTER(0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF);//屏蔽寄存器,設(shè)為無關(guān),可接收所有報文

      //當(dāng)屏蔽位為1不濾波,屏蔽為位0就表示可以導(dǎo)通相同ID

      s=SET_BAUDRATE(ByteRate_125k);//選擇波特率

      WR_SJA_REG(REG_OCR,0x1A);

      //輸出控制寄存器——正常輸出模式

      WR_SJA_REG(REG_INTENABLE,0x1D);

      //設(shè)置中斷,接收和發(fā)送中斷

      //喚醒中斷使能,數(shù)據(jù)溢出中斷使能,錯誤報警中斷使能,

      //發(fā)送中斷使能,接收中斷使能

      a=RD_SJA_REG(REG_CONTROL);

      a&=0xfe;

      WR_SJA_REG(REG_CONTROL,a);

      //退出復(fù)位模式,進(jìn)入工作模式,寄存器末尾功能位置0

      return 0;

      }

      本文中需要接收的報文是擴(kuò)展幀、數(shù)據(jù)幀,因此選擇PeliCAN工作方式支持CAN2.0B協(xié)議。幀信息占一個字節(jié),幀ID分配4個字節(jié),使用29位,幀數(shù)據(jù)分配8個字節(jié),設(shè)置單濾波模式,設(shè)置4個驗收代碼寄存器ACR和4個驗收屏蔽寄存器AMR,下面以一個寄存器為例,驗收代碼寄存器定義如下:

      位76543210功能AC.7AC.6AC.5AC.4AC.3AC.2AC.1AC.0

      驗收屏蔽寄存器AMR定義如下:

      位76543210功能AM.7AM.6AM.5AM.4AM.3AM.2AM.1AM.0

      ACR的每一位和AMR一一對應(yīng),驗收屏蔽為0表示相關(guān),即只接收和驗收代碼寄存器幀ID相同的報文。反之為1表示無關(guān),即接收所有報文。本文中接收到的報文是把來自科列的報文導(dǎo)入到上位機(jī)軟件USB_CAN TOOL中發(fā)送出來,所以設(shè)置為FF,接收所有報文即可。

      3.3 接收CAN 報文

      一條完整的報文包含三部分內(nèi)容:幀信息、幀ID、幀數(shù)據(jù)。幀信息解釋了幀的格式和數(shù)據(jù)長度;標(biāo)準(zhǔn)幀ID為11位,擴(kuò)展幀ID為29位標(biāo)識符;幀數(shù)據(jù)寄存器中保存報文的數(shù)據(jù)。收到的報文CAN核心模塊把串行位流轉(zhuǎn)換成并行數(shù)據(jù),經(jīng)過驗收濾波器存儲在FIFO中。M2主控制器通過中斷輪詢的方式訪問SJA1000。當(dāng)接收到報文后產(chǎn)生接收中斷,M2從緩沖區(qū)讀取報文,并釋放接收緩沖區(qū),繼續(xù)根據(jù)中斷情況讀取下一條報文。其CAN 報文接收程序如下:

      while(1){

      int0=RT_SEG_Read(1);

      WR_SJA_REG(REG_INTENABLE,0x01);

      //設(shè)置M2接收中斷使能

      if(int0==0){ //模擬下降沿觸發(fā)

      a=RD_SJA_REG(REG_INTERRUPT);

      //讀取中斷寄存器只有讀寄存器不會置位

      if(a&0x01){

      b=RD_SJA_REG(REG_RXBuffer1);

      length=b&0x0f;

      if((b&0x40)!=0x40){//數(shù)據(jù)幀=為遠(yuǎn)程幀

      h=0;

      for(i=0;i<4;i++){

      f=RD_SJA_REG(REG_RXBuffer5-i);

      g=f<<(8*i);

      h+=g;

      }

      h=h>>3;//幀ID信息

      puts(“ID:”);

      puts(xtoa(h));

      for(i=0;i

      //數(shù)據(jù)擴(kuò)展幀從buffer6標(biāo)準(zhǔn)幀到buffer4

      c=RD_SJA_REG(REG_RXBuffer6+i);

      puts(xtoa(c));

      }

      ……

      WR_SJA_REG(REG_COMMAND,0x04);//釋放緩沖區(qū)//

      }

      }

      3.4 發(fā)送CAN報文

      M2通過判斷在這之前的最后一次發(fā)送是否成功,若成功則將需要發(fā)送的報文通過A/D總線發(fā)送到發(fā)送緩沖區(qū),發(fā)出發(fā)送命令后,將報文發(fā)出。在硬件上,當(dāng)按下Key鍵時,進(jìn)行報文發(fā)送。其CAN 報文發(fā)送程序部分如下:

      key=RT_SEG_Read(0); //按鍵key值寫入寄存器數(shù)據(jù)//

      if(key==0){

      e=RD_SJA_REG(REG_STATUS);

      e&=0x04;

      if(e==0x04){ //CPU可以向發(fā)送緩沖區(qū)寫信息

      WR_SJA_REG(REG_TXBuffer1,0x05);

      //發(fā)送報文的信息

      WR_SJA_REG(REG_TXBuffer2,0x00);

      WR_SJA_REG(REG_TXBuffer3,0x01);

      WR_SJA_REG(REG_TXBuffer4,0x42);

      WR_SJA_REG(REG_TXBuffer5,0x42);

      WR_SJA_REG(REG_TXBuffer6,0x42);

      WR_SJA_REG(REG_TXBuffer7,0x42);

      WR_SJA_REG(REG_TXBuffer8,0x42);

      WR_SJA_REG(REG_TXBuffer9,0x42);

      WR_SJA_REG(REG_TXBuffer10,0x42);

      WR_SJA_REG(REG_TXBuffer11,0x42);

      WR_SJA_REG(REG_COMMAND,0x03);//發(fā)送命令

      }

      }

      4 實例驗證

      本文主要使用的是報文的接收功能。以接收為實例,硬件連接完成后,將在與M2配套的編譯環(huán)境Camel Studio中編寫的軟件程序下載到M2中,同時通過使用CAN分析儀來模擬BMS給該報文采集裝置發(fā)送報文。

      通過CAN分析儀提供的上位機(jī)軟件USB_CAN TOOL模擬BMS發(fā)送CAN 報文,在USB_CAN TOOL上位機(jī)軟件中導(dǎo)入所需發(fā)送的報文,本文摘取報文的部分信息,導(dǎo)入的報文信息如圖6所示,報文信息來自科列公司提供的BMS的報文和報文解析協(xié)議。在PC機(jī)上打開Camel Studio軟件,將編譯后的CAN報文接收程序下載到M2中,運(yùn)行后即可接收到USB_CAN TOOL發(fā)出的報文。實物連接圖如圖7所示。

      圖6 導(dǎo)入報文信息內(nèi)容

      圖7 實驗實物連接圖

      由CAN 分析儀發(fā)出的報文信息導(dǎo)入后如圖8所示。由M2和其上位機(jī)軟件Camel Studio接收到的報文及顯示如圖9所示。

      圖8 CAN 分析儀發(fā)出報文信息顯示

      圖9 M2上位機(jī)軟件Camel Studio接收報文顯示

      報文接收到以后,可根據(jù)電池廠家提供的協(xié)議進(jìn)行翻譯,本質(zhì)上是匹配ID后對數(shù)據(jù)按照協(xié)議規(guī)則進(jìn)行計算。報文解析如圖10所示。

      圖10 報文解析

      由此可以得到電池的電壓值,根據(jù)這些值計算出單體電池的直流內(nèi)阻。本實驗的電池工況是先讓電池處于開路狀態(tài),電流為0 A,測得電壓值U1,再進(jìn)行5 A放電,測得電壓值為U2,時間為T2。從而可進(jìn)一步計算T2時刻下電池的直流內(nèi)阻,直流內(nèi)阻=(U1-U2)/5。如圖11所示。

      圖11 單體電池直流內(nèi)阻分布圖

      圖11的橫坐標(biāo)表示電池的序號,一共是84節(jié)電池。縱坐標(biāo)表示電池的直流內(nèi)阻,單位為歐姆。由圖可知,有5顆電池的直流內(nèi)阻值偏大,其余電池整體的一致性比較穩(wěn)定。用此方法同時也可測得不同時間、不同工況下的直流內(nèi)阻值。

      結(jié) 語

      本文根據(jù)接收退役電池組的BMS發(fā)出的CAN報文,設(shè)計了一套主控制芯片M2+SJA1000的裝置,并為該裝置芯片之間實現(xiàn)通信和控制芯片接收CAN報文設(shè)計編程,成功實現(xiàn)報文的獲取。同時如需對驗收濾波寄存器進(jìn)行相應(yīng)的配置,只需要在復(fù)位模式下在軟件程序中修改相關(guān)寄存器值。

      猜你喜歡
      寄存器時序中斷
      時序坐標(biāo)
      基于Sentinel-2時序NDVI的麥冬識別研究
      Lite寄存器模型的設(shè)計與實現(xiàn)
      跟蹤導(dǎo)練(二)(5)
      千里移防,衛(wèi)勤保障不中斷
      解放軍健康(2017年5期)2017-08-01 06:27:44
      分簇結(jié)構(gòu)向量寄存器分配策略研究*
      一種毫米波放大器時序直流電源的設(shè)計
      電子制作(2016年15期)2017-01-15 13:39:08
      DPBUS時序及其設(shè)定方法
      河南科技(2014年15期)2014-02-27 14:12:36
      AT89C51與中斷有關(guān)的寄存器功能表解
      FPGA內(nèi)嵌PowerPC的中斷響應(yīng)分析
      新津县| 斗六市| 孟州市| 台南县| 武清区| 陇南市| 金门县| 仁怀市| 东光县| 慈溪市| 南昌市| 建阳市| 顺平县| 化隆| 航空| 旬邑县| 马龙县| 启东市| 普安县| 延寿县| 成安县| 龙口市| 罗田县| 廊坊市| 买车| 上犹县| 托里县| 喀喇沁旗| 恩施市| 天津市| 科技| 信阳市| 桂东县| 辰溪县| 将乐县| 郓城县| 彰化县| 正宁县| 萍乡市| 礼泉县| 同心县|