核心内容摘要
困困:一场与睡意的温柔缠绵,找回遗失的宁静
电池管理BMS控制实现及说明 基于MBD的BMS应用层软件和设计文档。
有bmc cvs的内部通讯协议dbc 带AUTOSAR的底层的build工程目标芯片为mpc5644a。
sumlink电池管理系统策略模型。
BMS电池管理控制器 BMS INCA A2L标定文件搞BMS的兄弟都懂电池管理这事既要准又要快。
今天咱就扒一扒基于MPC5644A的BMS实战看看模型生成代码怎么和AUTOSAR底层勾搭上。
先甩个Simulink模型生成的SOC估算代码片段void BMS_SOC_Estimation(real_T voltage, real_T current, real_T* soc) { static real_T coulomb_count
0; real_T delta_t
1; // 100ms周期 // 安时积分核心算法 coulomb_count current * delta_t / 3600; *soc coulomb_count / BAT_CAPACITY * 100; // 开路电压补偿 if(fabs(current)
0.
{ // 静置状态 *soc lookup_table_SOC_OCV(voltage); } }这代码看着简单但里面的魔鬼在细节里。
比如那个
05A的电流阈值实测发现某三元锂电池在这个阈值下静置2小时后OCV误差能控制在1%以内。
模型里用到的lookup_table在生成代码时会自动展开成二分查找比手写switch-case风骚多了。
电池管理BMS控制实现及说明 基于MBD的BMS应用层软件和设计文档。
有bmc cvs的内部通讯协议dbc 带AUTOSAR的底层的build工程目标芯片为mpc5644a。
sumlink电池管理系统策略模型。
BMS电池管理控制器 BMS INCA A2L标定文件说到通讯协议DBC文件里定义的平衡指令结构特别有意思BO_ 2024 BMS_CellBalance: 8 BMS SG_ BalanceCmd : 7|641 (1,
[0|0xFFFFFFFFFFFFFFFF] VCU这64位掩码每一位对应一个电芯上位机发个0x00000001就是让1号电芯放电。
实际代码里用位域处理更带感typedef union { uint64_t raw; struct { uint64_t cell1 :1; uint64_t cell2 :1; // ...共64个电芯 } bits; } BalanceCmdType; void HandleBalanceCmd(uint64_t cmd) { BalanceCmdType bc; bc.raw cmd; for(int i0; i64; i) { if((bc.raw i) 0x
{ ActivateDischarge(i); // 具体放电电路驱动 } } }底层AUTOSAR配置才是真·玄学。
用EB tresos配置ADC组的时候得注意MPC5644A特有的交错采样模式。
比如这段ADC初始化代码void Adc_Init(void) { ADC_
CTRL
B.ADCLK_DIV 3; // 分频到8MHz ADC_
CTRL
B.ITIME 20; // 采样时间20个周期 ADC_
CTRL
B.CAL_REQ 1; // 触发自校准 while(ADC_
CTRL
B.CAL_DONE
; // 死等校准完成 }实测这个配置在-40℃时采样误差能控制在±2mV以内。
搞标定的兄弟肯定熟悉A2L文件里的这些魔法数字/begin CHARACTERISTIC CellVoltageMax VALUE 0 ECU_ADDRESS 0x80123456 FORMAT %.3f /begin AXIS_DESCR COM_AXIS // 直接标定值 0 LINEAR
0
0 // 3mV/LSB /end AXIS_DESCR /end CHARACTERISTICINCA里调参时这个3mV/LSB的系数改个小数点后第三位都能让电池包表现判若两人。
上次手滑把
0写成
001直接导致低温下SOC跳变被硬件组追杀三条街。
模型生成的代码和手写底层之间总有些相爱相杀。
比如Simulink生成的滤波器代码用递归实现但MPC5644A的定点DSP核处理浮点递归效率感人。
后来改成查表法Q格式定点数CPU负载直接从78%降到32%这事教会我一个真理模型是理想芯片是现实。