Hands-On 基於 LKS32MC453 對 BSP AFE BM81710H 進行電壓採集

關鍵字 :BMSAFE電壓採集BPS

一、 概述

本文介紹如何使用 LKS32MC453 MCU與 AFE BM81710H 進行 I2C 通訊,並通過 Demo 程序進行 Hands-on 實驗,成功實現了對 AFE BM81710H 採集17串電池電壓的數據,並通過 UART 串口助手列印輸出。

硬體平台:WPI-PES_BMS V1.1 板,WPI-LPCLINK2 Debugger_V1.0 板,60V 直流穩壓電源

軟體平台:Keil uVision5, LKS32MC45x_PeripDemo_v2.9

二、 硬體連接

如圖1所示為LKS32MC453 MCU 搭載 AFE BM81710H實物板,如圖中紅框裡從左到右所示分別為:CELL1-CELL17電壓採集端、BM81710H晶片、wake up喚醒引腳,LKS32MC453 MCU。

CELL1-CELL17電壓採集端:用來連接17串電池。

BM81710H 晶片:用來採集17串電壓數據並將數據傳給MCU進行處理。

wake up喚醒引腳:使能高電平,用來喚醒BM81710H。

MCU:使能wake up引腳高電平,提供I2C通訊功能,給AFE BM81710H發送寫/讀命令,並接收採集的17串電池電壓的數據,並進行數據處理,通過UART列印到UART串口助手上。

硬體操作流程:首先在CELL1-CELL17電壓採集端依次連接17串3.0V的電池,給系統提供51V的總電源,通過板子上的DC-DC BUCK和LDO電路實現將51V電源轉換為3.3V給MCU供電,上電後AFE BM81710H默認進入關機狀態,所以,需要MCU先使能wake up引腳高電平,用來喚醒AFE BM81710H,然後延時70ms,等待BM81710H 系統內部穩定,最後MCU通過軟體的方式與BM81710H進行I2C通訊,採集、處理17串電池電壓數據並通過UART列印到UART串口助手上。

▲ 圖 1 來自WPI PES_BMS V1.1板

三、軟體配置

3.1 Demo函數概述

       .main函數實現:程序依次進行了系統時鐘初始化(選用 96MHZ)、UART 初始化(波特率設為 115200 用於後續列印數據)、使能 BM81710H wake up 引腳高電平以喚醒默認關機的晶片、延時函數初始化、延時 70ms 等待晶片內部穩定、I2C GPIO 及驅動參數初始化、BM81710H 初始化配置 OTP 映射寄存器參數,最後通過函數實現每 500ms 循環採集一次 17 串電池電壓。

int main(void)

{

        SystemInit();                                 //系統時鐘初始化,96MHZ系統時鐘

        Host_UART_Init(115200);          //UART 初始化,波特率115200HZ

        BM81710H_WakeUp_GPIO_HighLevel();//BM81710H上電默認進入關機模式,使能 WakeUp 引腳高電平,進行喚醒

        delay_init(96);                                      //延時函數初始化

        delay_ms(70);                                       //延時70ms,BM81710H喚醒後需 70ms系統內部系統穩定

    I2C_GPIO_Init();                                    //I2c 引腳初始化

I2C_Driver_Init(I2C0,200000);             //I2c 配置初始化,波特率 200KHZ

BM81710H_Init();                         //BM81710H 初始化

while(1)

        {

                Get_BM81710H_voltage();     //BM81710H 採集17串電池電壓及總電壓

                delay_ms(500);                          //延時 500ms

        }      

}


SystemInit():程序對系統時鐘進行了初始化,系統時鐘選用96MHZ。

Host_UART_Init(115200):對UART進行初始化,為了後續使用UART將17串電池電壓數據列印到UART串口助手上。

BM81710H_WakeUp_GPIO_HighLevel():因為BM81710H上電默認進入關機狀態,使能BM81710H wake up引腳高電平,用來喚醒晶片。

delay_init(96):延時函數初始化。

delay_ms(70):延時70ms,目的是BM81710H喚醒後需等待70ms內部系統穩定。

I2C_GPIO_Init():I2C GPIO,詳見博文,Hands-On 基於 LKS32MC453 對 I2C 軟體配置進行介紹。

I2C_Driver_Init(I2C0,200000):I2C 驅動參數初始化,詳見博文,Hands-On 基於 LKS32MC453 對 I2C 軟體配置進行介紹。

BM81710H_Init():BM81710H初始化 ,是為了對OTP映射寄存器參數進行配置。

uint8_t BM81710H_Init():實現 ① 解鎖寄存器 ② 停止用戶參數的自動映射 ③ 使能寫 OTP映射寄存器 ④ 配置OTP映射寄存器參數。

Get_BM81710H_voltage()for循環實現 CELL1-CELL17 17串單體電池電壓值的讀取及計算,並通過串口助手列印出來。

uint8_t BM81710H_Init(void)

{

    uint8_t ret;

  // 3.0x70(PWD) Write 0xdfe8,make pwd_active=1 unlock

    ret |= write_word(SLV_ADDR, OP_PWD, REG_PWD_DATA);                //寫 0xdfe8,使 pwd_active=1 解鎖操作

    // 2.0x71(CFGMAPS TOP) Write 0xABC6, make auto_remap_cfg_stop=1

    ret |= write_word(SLV_ADDR, OP_CFGMAP_STOP, REG_AUTO_REMAP_CFG_STOP_DATA); //寫 0xABC6 使 auto_remap_cfg_stop=1

    // 4.0x72(CFGREGE N) Write 0xABC7 make cfg_reg_wr_en=1,Open to access 0x54 - 0x5F not to operate 0xFB,

    ret |= write_word(SLV_ADDR, OP_CFGREG_EN, REG_CFG_REG_WR_EN_DATA);        //寫 0xABC7,使 cfg_reg_wr_en=1

    // 5.0x54~0x5F register map

    ret |= write_word(SLV_ADDR, OP_CFG00, REG_CFG0_DATA); // CFG0 — 過壓(OV)閾值及充電過流 1(OCC1)延遲參數配置

    ret |= write_word(SLV_ADDR, OP_CFG01, REG_CFG1_DATA);       // CFG1 — 過放(UV)參數配置及 OV 釋放方式選擇

    ret |= write_word(SLV_ADDR, OP_CFG02, REG_CFG2_DATA);       // CFG2 — 放電過流 1&2 參數配置及 OV 延時選擇

    ret |= write_word(SLV_ADDR, OP_CFG03, REG_CFG3_DATA);       // CFG3 — 充電過流 1&2(OCC1&OCC2)參數配置及放電過流 2(OCD2)延時選擇

    ret |= write_word(SLV_ADDR, OP_CFG04, REG_CFG4_DATA);       // CFG4 — 充放電高溫(OTC/OTD)保護閾值配置及高低溫延時選擇

    ret |= write_word(SLV_ADDR, OP_CFG05, REG_CFG5_DATA);       // CFG5 — 放電短路(SCD)保護參數配置及充放電高溫遲滯參數配置(OTCR/OTDR)

    ret |= write_word(SLV_ADDR, OP_CFG06, REG_CFG6_DATA);       // CFG6 — 充放電低溫(UTC/UTD)閾值,放電管釋放選擇及 TS2 配置

    ret |= write_word(SLV_ADDR, OP_CFG07, REG_CFG7_DATA);       // CFG7 — 充放電低溫遲滯(UTCR/UTDR),二次過充(SOV)閾值,喚醒配置及充電高低溫釋放方式選擇

    ret |= write_word(SLV_ADDR, OP_CFG08, REG_CFG8_DATA);       // CFG8 — MOSFET 高溫(MOT)保護參數配置及充電過流 2(OCC2)延時選擇

    ret |= write_word(SLV_ADDR, OP_CFG09, REG_CFG9_DATA);       // CFG9 — 電芯均衡參數配置

    ret |= write_word(SLV_ADDR, OP_CFG10, REG_CFG10_DATA);  // CFG10 — 電芯數目,掃描周期,精度選擇,以及充放電電流與充電管控制關係等參數配置

    ret |= write_word(SLV_ADDR, OP_CFG11, REG_CFG11_DATA);// CFG11 — 預充閾值,睡眠模式,IDLE 閾值,LDO 電壓選擇,外部輸入控制放電管,及溫度轉換精度等參數配置


Get_BM81710H_voltage()for循環實現 CELL1-CELL17 17串單體電池電壓值的讀取及計算,並通過串口助手列印出來。

uint8_t Get_BM81710H_voltage (void)

{

int32_t tmp[2];

unsigned int itmp = 0;

uint8_t ret = 0;

uint8_t CELL_NUMBER=17;

int16_t cell_volt[CELL_NUMBER];

for (itmp = 0; itmp < CELL_NUMBER; itmp++)

{

ret |= scan(OP_CH_CELL01 + itmp, tmp); //讀取Cellx單體電壓寄存器的值,並計算出Cellx電壓值

p_dfe_device->cell_volt[itmp] = (tmp[0] & 0xFFFF); //電壓值的賦值操作

printf("Cell%d = %d mV\r\n", itmp + 1, tmp[0]); //列印出當前Cellx 的電壓值

}

}

四、實驗現象

4.1 操作步驟:

      首先在 CELL1-CELL17 電壓採集端依次連接 17 串3.0V 的電池,用萬用表依次在每個 CELL 端量取電壓值均是 3.0V,如下圖所示,綠色板為 LKS32MC453 MCU 搭載 AFE BM81710H實物板,黃色板為 SWD 程序燒錄板。硬體連接好,接下來燒錄程序,程序實現 MCU 使能 wake up 引腳高電平,喚醒 BM81710H,等待 70ms 使 BM81710H 內部系統穩定,與 BM81710H 進行 I2C 通訊,調用電壓獲取函數實現 CELL1-CELL17 電池電壓的獲取,並將獲取的電壓值通過 UART 列印到 UART 串口助手上。

▲ 圖 2 WPI-LPCLINK2 Debugger_V1.0 板連接WPI PES_BMSV1.1板


4.2 串口助手接收到CELL1-CELL17 的電壓值:

▲ 圖 3 來自開源串口助手 開源電子網: www.openedv.com

五、總結

如上所述,為基於 LKS32MC453 MCU 對 BSP AFE BM81710H 進行電壓採集的Handson 操作。如果有問題,可以發送郵件atu.sh@wpi-group.com與我們聯繫。

六、參考文獻

(1)  LKS32MC45x_User_Manual_v1.53

(2)  BM81710H_User_Manual _V1.0

(3) 串口助手:XCOM V2.0 (開源電子網: www.openedv.com

(4) SDK:LKS32MC45x_PeripDemo_v2.9    

 

歡迎在博文下方留言評論,我們會及時回復您的問題。

如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com 作者:紮根地下

更多資訊,請掃碼關注我們!

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論