一、 概述
本文介紹如何使用 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 作者:紮根地下
更多資訊,請掃碼關注我們!
評論