车载BMS电池管理编程:实现高精度电芯电压采集与过充过放保护逻辑
车载BMS不能只看总压——串联包里单芯先到上限就过充,先掉下限就析锂。正确做法是AFE扫每节单体电压,MCU周期读寄存器,保护逻辑取“最高芯”判过充、“最低芯”判过放。
一、AFE采样链路
电芯串联后每节“地”都浮动,MCU直接ADC量不了,必须走专用AFE(BQ79616/LTC68xx等):内部多路复用器轮询各节→精密ADC转换→SPI或菊花链回传→MCU读VCELL寄存器。
硬件上每路输入串小电阻+电容做RC滤波,挡MOS开关和电机PWM噪声;软件再叠滑动平均。
typedef struct {
uint16_t raw[CELL_NUM];
int32_t filt[CELL_NUM]; // Q15定点滑动平均
} cell_buf_t;
void bms_sample_task(void){
afe_trigger_scan();
for(int i=0;i<CELL_NUM;i++){
uint16_t v = afe_read_vcell(i);
buf.filt[i] += ((int32_t)v << 8) - buf.filt[i]; // 简易一阶平均
cell_volt[i] = buf.filt[i] >> 8;
}
}
采样周期10~50ms足够,过流保护路径别加重滤波,否则响应被拖慢。
二、均衡时先关均衡再采
被动均衡电阻一开,采样点电压会被拉偏,扫出来数据跳变、均衡策略震荡。规范做法:采某节前关掉该节均衡FET→等1~5ms稳定→ADC采样→恢复均衡。
afe_bal_off(cell);
delay_us(2000);
v = afe_read_vcell(cell);
afe_bal_restore(cell);
滑动窗口也别太长,内部短路那种快速跌落会被平均掉,保护延迟几百毫秒就危险。
三、过充/过放判定:取极值+滞回
阈值按化学体系定:LFP过充≈3.65V、欠压≈2.5V;NMC过充≈4.20V、欠压≈2.7V。
单帧超阈值别立刻切接触器,做“持续计时+滞回恢复”,防负载移除后电压回弹导致继电器抖动:
#define OVP 3650 // mV
#define OVP_REC 3550
#define UVP 2500
#define UVP_REC 2600
#define TRIP_MS 200
void bms_protect_task(void){
int max_v=0, min_v=0xFFFF;
for(int i=0;i<CELL_NUM;i++){
if(cell_volt[i]>max_v) max_v=cell_volt[i];
if(cell_volt[i]<min_v) min_v=cell_volt[i];
}
static uint16_t ov_cnt=0, uv_cnt=0;
if(max_v >= OVP){ if(++ov_cnt*TASK_MS >= TRIP_MS){
charge_mos_off();
can_notify_charger_stop();
set_fault(F_OVERVOLT);
}} else if(max_v < OVP_REC){ ov_cnt=0; }
if(min_v <= UVP){ if(++uv_cnt*TASK_MS >= TRIP_MS){
discharge_mos_off();
contactor_open();
vcu_torque_limit(0);
set_fault(F_UNDERVOLT);
}} else if(min_v > UVP_REC){ uv_cnt=0; }
}
要点:
过充关充电MOS或通知充电机限流,别直接断放电
过放关放电回路,电机扭矩先限再断接触器
故障锁存,需充电恢复或人工复位
大电流放电时有IR压降,欠压要适当滞回,否则加速瞬间误断
四、温度联动
低温电芯电压读数偏低,容易误触发欠压;高温又可能误报过压。阈值可按NTC温度做补偿,或低温禁止快充。
if(temp_max > 60) charge_mos_off();
if(temp_min < -10) charge_current_limit(0);
五、工程落坑
只监总压:单芯到4.3V总压还正常,保护不动作
滤波太重:内部短路跌落被平均掉
无滞回:负载一松电压回弹,继电器反复吸断
均衡时采样:压差判断震荡,均衡越均衡越歪
单帧触发:CAN干扰/尖峰误断高压,必须持续计时
恢复阈值没配:过压后稍掉一点又重合闸
只关MOS不通知VCU:电机还在拽电流,电芯继续掉
AFE通信超时当0V处理:菊花链掉帧别直接进欠压保护,先标记采样无效
六、落地顺序
AFE扫描周期先跑通,示波器看建立时间
单节电压精度校到±2mV内(增益/偏移标定)
均衡避让时序加上
保护任务取max/min+持续计时
过压关充、欠压断放、CAN上报VCU
故障锁存+恢复条件
台架注电压/注故障测响应时间
按“AFE逐节扫描→滑动平均滤波→均衡前关均衡→最高芯过充/最低芯过放→滞回+去抖→MOS/接触器动作”这条链写,BMS过充过放保护才是可量产的:不是电压到了就断,而是采样准、判定稳、恢复不死锁、动作分等级。SOC只是参考,安全保护必须以单体电压为准。





