1. 项目概述
在电池管理系统(BMS)开发中,SOC(State of Charge)估算是核心难题。很多工程师在Matlab/Simulink仿真环境中能够获得漂亮的SOC曲线,但一到实际硬件平台就发现各种问题:传感器读数不准、通信不稳定、算法实时性差等。本文将分享如何基于STM32F103和INA226传感器,实现从仿真到实战的完整EKF(扩展卡尔曼滤波)SOC估算方案。
这个项目最大的价值在于解决了三个关键问题:
- 硬件通信可靠性问题
- 传感器精度校准问题
- EKF算法在资源受限MCU上的高效实现
2. 硬件平台搭建
2.1 核心器件选型
2.1.1 MCU选择:STM32F103RCT6
选择这款MCU主要基于以下考虑:
- 72MHz主频足够处理EKF矩阵运算
- 内置FPU(浮点运算单元)可加速算法执行
- 丰富的外设资源(I2C、ADC、定时器等)
- 性价比高,开发资源丰富
2.1.2 电流/电压传感器:INA226
相比常见的INA219,INA226具有以下优势:
- 16位ADC分辨率
- 支持最高36V总线电压
- 内置功率计算功能
- 可编程警报功能
特别注意:务必选择0.1Ω采样电阻版本,而不是常见的0.01Ω版本。0.1Ω电阻在测量小电流时信噪比更高,这对SOC估算精度至关重要。
2.2 硬件连接方案
2.2.1 高侧测量拓扑
采用高侧测量(High-Side Sensing)方案有以下好处:
- 可以检测电池充电和放电电流
- 避免地回路干扰
- 测量范围更宽
关键连接要点:
- INA226的VBS引脚必须与IN+短接
- 采样电阻应选用高精度、低温漂的合金电阻
- I2C总线需加上拉电阻(通常4.7kΩ)
2.2.2 电源设计
- 为STM32和INA226提供稳定的3.3V电源
- 建议使用LDO而非开关电源,减少噪声干扰
- 在电源输入端加装大容量滤波电容
3. 底层驱动开发
3.1 I2C通信问题解决
3.1.1 地址漂移问题
部分INA226模块由于PCB设计问题,地址引脚A0/A1可能悬空,导致I2C地址不稳定。解决方法不是重新焊接,而是采用软件方案:
c复制// INA226地址自动扫描函数
uint8_t INA226_Auto_Scan(void){
uint8_t scan_addr;
// 遍历所有可能的INA226地址(0x80-0x9E)
for(scan_addr=0x80;scan_addr<=0x9E;scan_addr+=2){
I2C_Start();
I2C_SendByte(scan_addr); // 发送写命令试探
if(I2C_WaitAck()==0){ // 收到ACK应答
I2C_Stop();
printf("Found INA226 at: 0x%02X\n",scan_addr);
Current_INA_Addr = scan_addr; // 保存当前地址
return 1;
}
I2C_Stop();
Delay_us(50);
}
return 0; // 未找到设备
}
3.1.2 信号完整性增强
STM32的I2C接口在长距离或高负载时容易出现通信失败。解决方法:
- 将GPIO配置为推挽输出(PP)而非开漏输出(OD)
- 适当减小上拉电阻值(可尝试2.2kΩ)
- 降低I2C时钟频率(如100kHz)
3.2 传感器校准
3.2.1 系统误差分析
实测发现INA226模块存在约5.7%的系统误差。这种误差主要来自:
- ADC基准电压偏差
- 采样电阻精度不足
- PCB走线电阻
3.2.2 线性校准实现
采用增益修正法进行软件校准:
c复制float INA226_GetVoltage_Calibrated(void){
uint16_t raw = INA226_ReadReg(REG_BUS_VOLTAGE);
float voltage_raw = (float)raw * 0.00125f; // LSB=1.25mV
// 软件线性补偿,消除系统误差
return voltage_raw * 0.9455f; // 校准系数k=2.95/3.12≈0.9455
}
校准步骤:
- 使用高精度万用表测量电池实际电压(如2.95V)
- 记录INA226原始读数(如3.12V)
- 计算校准系数k = 实际值/测量值
- 在代码中应用校准系数
4. EKF算法实现
4.1 电池建模
4.1.1 二阶RC等效电路模型
这是最常用的锂电池模型,包含:
- 开路电压(OCV)源
- 欧姆内阻R0
- 两个RC并联网络(R1C1和R2C2)
模型状态方程:
code复制dx/dt = A·x + B·u
y = C·x + D·u
其中:
- x = [SOC U1 U2]^T
- u = I (电流)
- y = U (端电压)
4.1.2 模型参数辨识
通过脉冲充放电实验获取模型参数:
- R0:电流突变时的瞬时电压变化/电流
- R1,C1:中短期动态响应
- R2,C2:长期动态响应
4.2 EKF算法设计
4.2.1 算法流程
EKF分为两个主要步骤:
-
时间更新(预测):
- 基于安时积分预测SOC
- 更新状态协方差矩阵P
-
测量更新(校正):
- 计算卡尔曼增益K
- 用电压测量值修正SOC估计
- 更新协方差矩阵P
4.2.2 离散化实现
将连续状态方程离散化为:
code复制x_k = A_d·x_{k-1} + B_d·u_k
y_k = C_d·x_k + D_d·u_k
其中离散化矩阵通过零阶保持法计算:
code复制A_d = exp(A·T)
B_d = A^{-1}·(A_d - I)·B
T为采样周期(本项目设为0.1s)
4.3 代码实现
4.3.1 数据结构设计
c复制typedef struct {
float soc; // 电池SOC(0-1)
float u1, u2; // RC网络电压
float P[3][3]; // 协方差矩阵
float Q[3][3]; // 过程噪声协方差
float R; // 观测噪声方差
} EKF_State;
4.3.2 核心算法函数
c复制float EKF_Update(EKF_State* s, float I, float V_meas){
// 1. 时间更新(预测)
float dt = 0.1f; // 采样周期100ms
s->soc -= I * dt / Q_max; // Q_max为电池容量
// RC网络状态更新
s->u1 = exp(-dt/(R1*C1)) * s->u1 + R1*(1-exp(-dt/(R1*C1))) * I;
s->u2 = exp(-dt/(R2*C2)) * s->u2 + R2*(1-exp(-dt/(R2*C2))) * I;
// 协方差矩阵更新
// ...矩阵运算代码省略...
// 2. 测量更新(校正)
float V_pred = OCV(s->soc) - s->u1 - s->u2 - I*R0;
float y_res = V_meas - V_pred; // 残差
// 卡尔曼增益计算
// ...矩阵运算代码省略...
// 状态更新
s->soc += K[0] * y_res;
s->u1 += K[1] * y_res;
s->u2 += K[2] * y_res;
return s->soc;
}
5. 系统集成与测试
5.1 主程序框架
c复制int main(void){
// 硬件初始化
Hardware_Init();
// EKF初始化
EKF_State my_ekf;
EKF_Init(&my_ekf, 0.8f); // 初始SOC设为80%
while(1){
// 1. 读取传感器数据
float vol = INA226_GetVoltage_Calibrated();
float cur = INA226_GetCurrent();
// 2. 执行EKF更新
float soc_ekf = EKF_Update(&my_ekf, cur, vol);
// 3. 对照组:普通安时积分
g_AhSOC = Ah_Integration(cur, 0.1f);
// 4. 显示结果
LCD_Show_Data(vol, cur, soc_ekf, g_AhSOC);
// 严格保持100ms周期
Delay_ms(100);
}
}
5.2 测试结果分析
通过对比EKF和普通安时积分法,可以观察到:
- 在电流波动大时,EKF能更快修正SOC误差
- 电压回弹期间,EKF能准确跟踪SOC变化
- 长期使用下,EKF的累积误差明显小于安时积分法
实测精度:
- 电压测量误差:±0.01V
- SOC估算误差:<3%(在电池中间段)
6. 常见问题与解决
6.1 INA226通信失败
可能原因:
- 地址不正确 → 使用自动扫描功能
- 上拉电阻过大 → 减小到2.2kΩ
- 线缆过长 → 缩短I2C走线
6.2 SOC估算不准确
排查步骤:
- 检查电压测量是否准确
- 验证模型参数是否正确
- 调整过程噪声Q和观测噪声R
6.3 算法实时性不足
优化方法:
- 启用STM32的FPU
- 使用查表法计算OCV
- 降低采样频率(可接受范围内)
7. 关键经验分享
-
传感器校准是基础:必须在使用前进行精确校准,特别是廉价的传感器模块
-
实时性保证:严格控制系统周期,避免因任务延迟导致算法失效
-
噪���调参技巧:Q矩阵影响算法响应速度,R矩阵影响对测量的信任程度,需要反复调试
-
温度补偿:在实际应用中还需考虑温度对电池参数的影响,可增加温度传感器进行补偿
这个项目完整展示了如何将理论算法落地到实际硬件平台。通过解决通信、校准、实时性等实际问题,最终在低成本硬件上实现了高精度的SOC估算。
