一、 概述
本文介绍如何使用 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 作者:扎根地下