27届秋招已经进入白热化阶段,嵌入式岗位的简历里如果只有一个流水账项目,面试官基本聊不了十分钟就会放你走。而BMS(Battery Management System,电池管理系统)恰好是目前新能源汽车、储能、消费电子都在大量招人的方向,做为一个嵌入式项目来讲,它既有硬件、又有软件、还有算法和通信,信息密度很高,非常适合作为秋招项目来写进简历。

这次我们直接看一个适合嵌入式秋招落地的BMS电池管理项目,从硬件选型、软件架构、状态机设计、SOC估算到面试答辩重点,把整个项目的技术链路和面试讲解思路都过一遍。如果你正在准备25/26/27届嵌入式软件、嵌入式linux、单片机开发方向,这篇文章可以收藏备用。

1. BMS电池管理项目核心能力速览

在展开具体设计之前,先给项目定个位。这个BMS项目不是要把车规级电池管理系统的所有功能全部复刻,而是要在一个可控的硬件平台上,把BMS的核心功能链路完整实现,并且能够向面试官讲清楚每一层的设计理由。

项目能力 说明
功能范围 单体电压采集、温度采集、总电流采集、SOC估算、充放电状态管理、故障保护、CAN/串口通信上报
主控平台 可选用STM32F103系列入门,进阶可换STM32F407或GD32,低成本、资料多、适合秋招快速验证
采样方案 方案一:MCU内部ADC分时采集;方案二:外置模拟前端AFE芯片,如BQ76940、ADBMS1818等
通信方式 CAN总线用于模拟整车/储能主控交互,UART用于调试日志和上位机数据上报
状态机设计 待机、预充电、充电、放电、故障保护、下电,共六个核心状态
SOC算法 安时积分法作为主推算,OCV查表校准,进阶可仿真卡尔曼滤波修正
硬件门槛 核心板加采样板,整体成本可控,不需要真实高压电池包即可完成功能验证
是否支持批量任务 支持,通信协议和测试脚本设计为批量上报、批量诊断模式
是否支持接口API 支持串口/网口转上位机接口,可对接Python脚本做数据分析和自动化测试
适合场景 秋招简历项目、嵌入式综合实训、新能源BMS入门、面试项目深挖

从材料信息来看,BMS相关的热门方向包括BMS嵌入式架构设计、新能源汽车BMS算法、BMS硬件、BMS测试等,这个项目正好把硬件、软件和算法串在一起。对于嵌入式岗位的求职者来说,它不只是一个“单片机外设练习”,而是一条完整的电池管理技术链。

2. 适用场景与项目边界

BMS项目适合谁?首先明确一点:它不是适合所有人的万能项目。如果你投的是纯Linux驱动岗,那BMS项目只能作为辅助加分项,核心还是驱动和内核;如果你投的是嵌入式软件、嵌入式应用开发、单片机开发、新能源BMS软件工程师,那这个项目的匹配度就非常高。

这个项目能解决什么问题?从秋招角度讲,它至少解决了三个问题:

  1. 简历上有一个“完整系统”而非“单个模块”的项目。单体采集、SOC估算、CAN上报、故障保护,是一条完整的数据链路。
  2. 面试时能讲出“为什么这么做”。比如为什么用状态机管理充放电、为什么SOC要用安时积分加OCV校准、为什么故障保护要分级处理。
  3. 手撕代码时有素材。状态机切换、CRC校验、环形缓冲区、ADC滤波、CAN报文解析,都是嵌入式面试高频手写题。

不适合什么场景?如果你对硬件完全不感兴趣,只想纯写上层应用,那BMS项目会让你比较痛苦,因为它涉及采样电路、电气参数、保护逻辑,完全没有硬件概念很难深入。另外,不要试图在真实的高压电池包上做实验,这是安全红线。

BMS项目有明确的合规边界:电池管理系统涉及电气安全,所有实验应该在低压模拟环境、电池模拟器或经过安全评估的测试平台上完成,不能将个人DIY的BMS直接接入真实车辆或储能系统。涉及电池数据、车辆数据、用户数据时,需要遵守隐私保护和数据安全要求。面试中展示的是工程能力和设计方法,不是鼓励冒险操作。

3. BMS嵌入式项目硬件方案设计

3.1 主控选型

主控是整个BMS项目的核心。对于秋招项目,推荐分两档:

  • 入门档:STM32F103C8T6或RCT6,Cortex-M3内核,主频72MHz,资源足够跑完整个BMS逻辑,资料极度丰富,遇到问题好排查。
  • 进阶档:STM32F407VET6或GD32F407,Cortex-M4内核,带FPU,主频168/200MHz,后续做SOC算法浮点运算、扩展FreeRTOS时更从容。

不建议一上来就上带板级管理系统的车规级MCU,调试难度大、资料少、周期长。秋招项目最重要的是在可控时间内完整跑通。

3.2 采样方案选择

BMS的核心是采集每节电芯的电压和温度。这里有两种典型方案:

方案A:MCU内部ADC直接采集。使用STM32的ADC1多通道采样,配合GPIO模拟多路选择开关。优点是电路简单,缺点是精度一般、通道隔离麻烦,只适合模拟验证,不适合真实电池组。

方案B:外置电池监控AFE芯片。如TI的BQ76940(支持9到15节)、BQ76952,或是ADI的ADBMS1818(最多18节)。AFE芯片内部集成ADC、均衡开关、温度采集和通信接口,MCU通过I2C或SPI读取数据。这个方案更接近真实BMS,面试时也能体现出你对工业级方案的了解。

秋招建议:时间充裕用方案B,时间紧张用方案A,但要在文档里写明方案B的选型和原因,面试官更关注你是否知道真实产品怎么做。

3.3 传感器与执行器

BMS不只是采集电压,还需要采集电流和温度:

  • 电流采样:使用分流电阻加运算放大器,或者霍尔电流传感器。分流电阻方案精度高、成本低,但要考虑共模电压;霍尔方案隔离性好,适合大电流。这个项目的电流采样主要用于安时积分法计算SOC。
  • 温度采样:NTC热敏电阻,通过分压电路接入MCU ADC,或者接入AFE芯片的温感通道。需要做查表标定和滤波。
  • 执行器:放电MOS、充电MOS、预充继电器、加热继电器等。通过MCU GPIO控制,重点设计预充电回路,避免上电瞬间的冲击电流。

从热搜词里看到有“bms系统中配套的分流器”,这说明分流器(Shunt)在BMS电流采样中确实是关键配套器件,面试时能主动提一句“电流采样用分流器加运放,和霍尔方案做过对比”,是很加分的细节。

3.4 通信接口

BMS需要把数据上报给整车控制器或上位机。

  • CAN总线:BMS和整车/储能主控之间最常用的通信方式。STM32F103C8T6的bxCAN外设可以完成基础CAN通信,配一个TJA1050收发器即可。
  • UART:调试和上位机数据透传。建议预留一个调试串口,打印状态机切换日志和故障码。
  • 预留升级口:如BOOT0跳线或I2C/SPI固件升级接口,展示工程意识。

4. BMS嵌入式软件架构设计

4.1 前后台与RTOS的选择

BMS软件可以分为两层:

  • 简单版:前后台循环 + 定时器中断。一个主循环跑状态机,ADC完成中断里做数据采集,定时器中断里做调度标志位置位。优点是逻辑简单、容易调试,适合第一版。
  • 进阶版:FreeRTOS。创建电量采集任务、状态管理任务、通信任务、均衡控制任务。任务间通过队列传递数据,通过事件标志组或二值信号量实现状态切换。面试时能讲清楚RTOS任务划分和同步机制,说服力会更强。

如果项目定位是秋招展示,建议至少完成前后台版本,再用FreeRTOS重构一版。这本身就是很好的面试素材:你可以说“第一版用裸机跑通了功能,第二版用FreeRTOS划分任务,解决了XX问题”,这说明你有工程迭代意识。

4.2 任务划分示例

以下是一个基于FreeRTOS的任务划分伪代码示例:

// 任务1:电量采集任务,周期20ms,优先级高
void vTask_AdcSample(void *params) {
    while (1) {
        // 读取AFE或ADC通道:单体电压、温度、总压、电流
        bms_sample_all();
        // 通过队列发给状态管理任务
        xQueueSend(g_bms_data_queue, &bms_raw_data, 0);
        vTaskDelay(pdMS_TO_TICKS(20));
    }
}

// 任务2:BMS状态管理和保护逻辑,周期50ms,优先级中
void vTask_BmsState(void *params) {
    while (1) {
        bms_state_machine_run();   // 状态机切换
        bms_fault_check();          // 过压/欠压/过温/过流检查
        vTaskDelay(pdMS_TO_TICKS(50));
    }
}

// 任务3:CAN和UART上报任务,周期100ms,优先级低
void vTask_Report(void *params) {
    while (1) {
        bms_build_can_frame();
        can_send_message(&tx_msg);
        bms_debug_uart_log();
        vTaskDelay(pdMS_TO_TICKS(100));
    }
}

这个任务划分的好处是:采集实时性最高,状态管理次之,通信上报可以稍微延迟。任务间不直接操作共享变量,而是通过队列传递,避免竞争问题。

4.3 状态机设计

BMS的核心控制逻辑是状态机。推荐实现以下六个状态:

状态 含义 进入条件 退出条件
IDLE 待机 系统上电初始化完成 收到充电/放电指令
PRECHARGE 预充电 要闭合主继电器前 母线电压达到目标值90%以上或超时
CHARGE 充电 充电指令且无故障 充满/故障/停止指令
DISCHARGE 放电 放电指令且无故障 低压/故障/停止指令
FAULT 故障保护 出现过压/欠压/过温/过流 故障清除且人工复位
POWER_DOWN 下电 系统关机指令或故障无法恢复 重新上电

状态机代码如果直接写成switch-case,会比较零散,建议封装成“事件驱动”的形式,这和热搜里“从超级大循环到事件驱动:嵌入式架构升级的分水岭”不谋而合。

typedef struct {
    bms_state_t state;
    bms_event_t event;
    void (*handle)(void *arg);
} bms_transition_t;

// 状态迁移表
const bms_transition_t bms_trans_table[] = {
    {STATE_IDLE,       EVENT_CHARGE_REQ,      handle_idle_to_charge},
    {STATE_IDLE,       EVENT_DISCHARGE_REQ,   handle_idle_to_discharge},
    {STATE_PRECHARGE,  EVENT_PRECHARGE_DONE,  handle_precharge_to_discharge},
    {STATE_CHARGE,     EVENT_FAULT,           handle_to_fault},
    {STATE_DISCHARGE,  EVENT_FAULT,           handle_to_fault},
    {STATE_CHARGE,     EVENT_FULL_CHARGED,    handle_charge_done},
};

void bms_event_dispatch(bms_state_t current_state, bms_event_t event) {
    for (int i = 0; i < ARRAY_SIZE(bms_trans_table); i++) {
        if (bms_trans_table[i].state == current_state &&
            bms_trans_table[i].event == event) {
            bms_trans_table[i].handle(NULL);
            return;
        }
    }
    // 未匹配到的状态迁移,打印错误日志
    bms_debug_log("no transition for state=%d event=%d", current_state, event);
}

这种表驱动方式的优势很明显:状态迁移关系一目了然,新增状态不需要改动核心逻辑,只需要往表里加一行。面试官看到这种写法,会认为你具备可维护性意识,而不是只会写流水账代码。

5. 关键功能实现与测试验证

5.1 单体电压采集测试

测试目标:验证多通道电压采集的准确性和稳定性。

测试方法:在采样通道输入已知电压,比如使用可调电源输出3.5V,观察MCU读到的ADC值,计算误差。

实现时要注意ADC滤波。单次采样值波动可能很大,推荐做滑动平均滤波或中值滤波:

#define ADC_FILTER_LEN 8

uint16_t adc_filter(uint16_t new_value) {
    static uint16_t buf[ADC_FILTER_LEN];
    static uint8_t index = 0;
    static uint32_t sum = 0;

    sum -= buf[index];
    buf[index] = new_value;
    sum += new_value;
    index = (index + 1) % ADC_FILTER_LEN;

    return (uint16_t)(sum / ADC_FILTER_LEN);
}

判断成功标准:连续采集100次,电压波动在设定阈值以内,且与万用表读数误差小于目标精度。以BMS项目为例,精度目标可以设定为±20mV以内,如果你使用的是高精度基准源,可以重点记录实测精度结果。具体数值以你的实际硬件测试为准。

5.2 SOC估算验证

SOC是全项目最容易被追问的部分,因为它涉及算法思维。最基础的方法是安时积分法:

SOC = SOC_initial - (∫I dt) / Q_total

由于电流采样存在积分漂移,长时间运行后SOC会漂移,所以需要OCV校准。具体做法是:当系统处于IDLE状态并且静置超过一定时间(比如2小时)后,通过开路电压查表修正SOC初始值。

代码上可以这样组织:

float soc_calculate_with_ah_integral(float soc_last, float current_a, float interval_s, float q_total_ah) {
    float delta_ah = current_a * interval_s / 3600.0f;
    float soc_new = soc_last - delta_ah / q_total_ah;
    if (soc_new < 0.0f) soc_new = 0.0f;
    if (soc_new > 100.0f) soc_new = 100.0f;
    return soc_new;
}

float soc_ocv_calibrate(float soc_ah, float measured_ocv_v, const float *ocv_table, int table_len) {
    float soc_ocv = ocv_lookup(measured_ocv_v, ocv_table, table_len);
    // 简单加权,也可以根据静置时间调整权重
    return 0.7f * soc_ah + 0.3f * soc_ocv;
}

面试时可能被问:

  • 安时积分法积累误差怎么消除?回答OCV校准、电池模型修正、定期满充满放校准。
  • SOC初始值怎么确定?回答通过OCV查表结合电池静置状态。
  • 如果电流采样噪声大,积分会怎样?回答SOC波动大,需要滤波和防积分饱和。

实际验证时,可以用电子负载或恒流源做充放电测试,记录SOC计算值和实际放出容量做对比。如果没有真实电池,可以用电池模拟器或模拟电压源演示流程,重点验证状态切换和保护逻辑。

5.3 故障保护测试

BMS的故障保护是岗位面试的重头戏,因为它直接关系到安全性。建议实现以下保护逻辑:

故障类型 判定条件 处理动作
单体过压 单体电压高于保护阈值 停止充电,置FAULT状态
单体欠压 单体电压低于保护阈值 停止放电,置FAULT状态
过温 NTC温度高于阈值 停止充放电,记录故障码
充放电过流 电流超过阈值持续一定时间 分级保护,延迟断开MOS
通信超时 CAN报文超时 进入安全状态,上报错误

保护逻辑要区分“立即保护”和“延时保护”。比如出现瞬时大电流时,不能立刻断开MOS,要加一个软件滤波窗口,防止误动作。代码中可以用一个故障计数器:

#define FAULT_COUNT_LIMIT 5

uint8_t fault_cnt = 0;

if (voltage > OVP_THRESHOLD) {
    if (fault_cnt < FAULT_COUNT_LIMIT) {
        fault_cnt++;
    } else {
        bms_enter_fault_state(BMS_FAULT_OVP);
    }
} else {
    fault_cnt = 0;
}

这个逻辑很简单但很实用,能有效避免噪声导致误触发。面试官问到“怎么防止保护误动作”,直接回答防抖加窗口计数。

5.4 通信与数据上报测试

BMS的CAN报文需要设计协议,例如:

  • 报文ID:0x0A1 - BMS状态,0x0A2 - 最高/最低单体电压,0x0A3 - SOC和电流,0x0A4 - 故障码。
  • 数据格式:Intel小端,字节0为状态码,字节1-3为电压值,缩放因子1000,即1V = 1000。

用Python写一个简单的串口接收脚本,可以用来做批量数据记录:

import serial
import csv
import time

ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
csv_file = open('bms_data.csv', 'w', newline='')
writer = csv.writer(csv_file)
writer.writerow(['timestamp', 'voltage_mv', 'current_ma', 'soc'])

try:
    while True:
        line = ser.readline().decode('utf-8', errors='ignore').strip()
        if line.startswith('DATA:'):
            parts = line.split(',')
            if len(parts) >= 4:
                row = [time.time(), parts[0], parts[1], parts[2]]
                writer.writerow(row)
                print(row)
except KeyboardInterrupt:
    print('stop logging')
finally:
    csv_file.close()
    ser.close()

串口日志建议采用“KEY:VALUE”或“DATA:”前缀的数据格式,方便脚本解析。批量录制数据之后,可以再用Python画电压曲线、SOC曲线,这些图表放在简历附件或项目文档里会非常出彩。

6. 面试答辩重点与高频问题

BMS项目写进简历后,面试官大概率会深挖。以下是高频提问方向:

6.1 基础八股

  • BMS是什么?包含哪些核心功能?
    • 答:BMS是电池管理系统,核心包括电芯状态监测(电压、电流、温度)、SOC/SOH估算、均衡管理、热管理、故障保护、通信交互。
  • 为什么需要均衡?
    • 答:电芯存在一致性差异,长期充放电会导致部分电芯过充或过放,均衡可以让电芯SOC趋于一致,提升电池组可用容量和寿命。常见被动均衡是电阻放电,主动均衡是能量转移。
  • SOC估算有哪些方法?
    • 答:安时积分、OCV查表、卡尔曼滤波、神经网络等方法,工程上常组合使用。
  • CAN通信的帧格式有哪些?
    • 答:标准帧、扩展帧;数据帧、远程帧;每个数据帧最多8字节数据,包含仲裁段、控制段、数据段、CRC段、ACK段。
  • 保保护需要几级?
    • 答:一级预警、二级降功率、三级断开接触器/断开MOS,具体根据安全等级设计。

6.2 项目深挖问题

  • 你的采样精度是多少?误差来源有哪些?
    • 答:可以从基准电压、PCB布线压降、ADC参考电压噪声、滤波算法角度逐步分析,要能说出自己做过的改进措施。
  • 状态机状态迁移为什么这样设计?
    • 答:结合预充电回路、负载接入时序、故障复位机制说明。
  • 如果多个故障同时发生,你怎么处理?
    • 答:定义故障优先级,设计故障管理模块,一个故障码进入后锁定状态,排查完才能复位。
  • 你的代码如何测试?
    • 答:模块化单元测试、模拟量输入测试、故障注入测试、长时间跑机测试。如果会使用Unity或者Ceedling做嵌入式单元测试,在C语言面试中是加分项。

6.3 手撕代码风险点

面试手撕题目中,和BMS项目相关的常见题有:

  • 写一个环形缓冲区。
  • 写一个状态机,解析按键短按/长按。
  • 写一个滑动平均滤波函数。
  • 写一个CRC8或CRC16校验实现。
  • 写一个CAN数据解析函数,把字节数组转为int32。

由于BMS项目里本身就在用这些组件,面试时可以说“这个和我在BMS项目里处理串口协议/CAN报文时遇到的场景一样”,把项目经验自然带入。

7. 环境准备与开发调试建议

7.1 开发环境

  • 开发软件:STM32CubeIDE或Keil MDK,推荐CubeIDE,免费且自带STM32CubeMX图形化配置。
  • 调试工具:ST-Link或DAP-Link,串口转USB模块。
  • 上位机:串口调试助手即可,进阶可以用Qt或Python自写简单上位机。
  • 版本管理:Git仓库从第一天就建立,每完成一个功能点打一个tag,这是展示工程素养的重要细节。

7.2 硬件调试注意事项

在真实硬件上调试BMS项目时,有几个安全事项要特别注意:

  • 不要用真实的高压电池包或大容量锂电池做未经安全评估的实验,尤其是涉及MOS通断和充电控制时,错误操作可能导致冒烟、火灾等严重后果。
  • 建议使用低压锂电池模拟器、数字电源、电子负载或者经过安全设计的小型电池组(比如单节18650配合保护板)完成功能验证。
  • 所有测试在防火防爆环境或实验室安全指导下进行,不要在家居环境里使用大功率电池做实验。
  • 调试过程中要随时监控电流和温度,发现发热异常立即断电。

7.3 调试手段

调试BMS项目最有效的手段是日志分级输出:

#define DEBUG_LEVEL_INFO  0
#define DEBUG_LEVEL_WARN  1
#define DEBUG_LEVEL_ERROR 2

#define LOG_LEVEL DEBUG_LEVEL_INFO

#define LOG_INFO(fmt, ...)  do { if (LOG_LEVEL <= DEBUG_LEVEL_INFO)  printf("[INFO]  " fmt "\r\n", ##__VA_ARGS__); } while(0)
#define LOG_ERROR(fmt, ...) do { if (LOG_LEVEL <= DEBUG_LEVEL_ERROR) printf("[ERROR] " fmt "\r\n", ##__VA_ARGS__); } while(0)

状态切换、故障触发、指令接收处都要留有日志,跑机后直接看日志还原现场。批量任务建议把所有日志落盘,便于后续分析。

8. 常见问题与排查方法

下面是BMS嵌入式项目里最容易遇到的问题汇总:

问题现象 可能原因 排查方式 解决方案
ADC采到的电压跳变严重 采样通道未滤波、电源纹波大、参考电压不稳 示波器查看ADC引脚波形,检查电源纹波 增加滑动平均滤波、加RC滤波电容、使用独立基准源
状态机停在PRECHARGE不切换 母线电压未达到阈值、预充继电器/回路异常 打印母线电压和状态日志 检查预充回路和电压判定阈值
SOC长时间运行漂移 电流积分误差累积、未做OCV校准 对比实际放出容量 做OCV表格标定,静置后校准SOC
过压/过流保护误触发 故障判定没有防抖、电流尖峰噪声干扰 看故障日志中的判定值和阈值 增加故障计数窗口,做软件滤波
CAN收不到报文 波特率配置不一致、收发器收发方向、终端电阻缺失 用CAN分析仪抓总线 统一波特率,确认120欧终端电阻
UART日志乱码 波特率不匹配、共地问题 检查串口配置和接线 统一波特率,确保参考地一致
程序跑一段时间死机 堆栈溢出、任务优先级反转 查看HardFault,分析栈使用情况 加大任务栈、优化优先级设计
继电器动作时MCU复位 驱动电路电源不足、电磁干扰 示波器观察电源轨跌落 增加续流二极管、TVS管、独立驱动电源

排查问题的核心思路:先看日志,再量波形,最后改代码。不要盲目改参数,要给问题加“判定条件”,比如连续几次超阈值才进入故障,这样既能挡噪声,又能尽快定位问题。

9. 最佳实践与秋招简历呈现建议

9.1 项目文档管理

建议为BMS项目准备以下文档:

  • README.md:项目说明、硬件框图、软件架构、使用方法。
  • docs/hardware_design.md:硬件选型、原理图要点、PCB布局注意事项。
  • docs/software_design.md:任务划分、状态机定义、数据流图。
  • docs/test_report.md:测试记录、数据图表、问题及解决过程。
  • docs/interview_prep.md:项目面试可能被追问的问题和答案整理。

面试官看到完整文档,通常会对你的工程能力有更好的印象,因为大多数学生项目只停留在代码层面,没有文档意识。

9.2 简历中的项目描述模板

简历上不要只写“使用STM32做BMS项目”,建议按这个结构写:

项目名称:车用/储能BMS电池管理系统原型 技术栈:STM32F407 + FreeRTOS + BQ76940 + CAN + 自研Python上位机 项目内容:

  1. 完成12串锂电池组BMS原型设计,实现单体电压、温度、充放电电流采集与滤波,精度满足项目需求;
  2. 设计IDLE/PRECHARGE/CHARGE/DISCHARGE/FAULT/POWER_DOWN六状态管理机,基于表驱动方式实现状态迁移;
  3. 实现基于安时积分和OCV查表校准的SOC估算方法,完成充放电测试和误差分析;
  4. 设计CAN通信协议和自定义串口调试协议,实现故障码上报、批量数据记录和上位机监控;
  5. 完成过压、欠压、过温、过流分级保护逻辑,加入防抖动故障计数机制,并通过故障注入测试验证。

这五句话基本覆盖了硬件、软件、算法、通信、测试五个维度,是面试官最希望看到的项目完整度。

9.3 合规与安全提醒

最后再强调一次:BMS项目涉及电池和电气安全。无论是个人练习还是毕业设计,都应该在低压模拟环境、电池模拟器或实验室安全条件下进行,不要使用未经评估的真实高压电池组做个人实验,不要将DIY系统直接用于真实车辆、电动车、储能设备等场景。涉及真实车辆数据、电池数据的内容,都要先获得授权,注意隐私保护和数据安全。面试和博客分享中展示的是设计方法和工程能力,安全合规是底线。

10. 总结与下一步

这个BMS项目最值得尝试的点在于,它把一个嵌入式系统该有的核心要素都覆盖了:采集、算法、状态机、通信、保护、调试、文档。它不是那种“照着开发板例程改改LED”的玩具项目,而是能让你在秋招面试中持续输出半小时的真实系统。

最先要验证的功能是单体电压采集和状态机迁移。先把这两个功能跑通,整个项目的骨架就起来了,后续再逐步加SOC估算、CAN上报和故障保护。最容易踩的坑是采样噪声和故障误触发,所以ADC滤波和故障防抖一定要早早设计好,不要等出了问题再补。

后续可以扩展的方向很多:把上位机从串口换成基于TCP/IP的远程监控,加入QT开发的BMS上位机界面,把SOC算法升级为带电池等效电路模型的卡尔曼滤波,或者把平台从裸机迁移到嵌入式Linux,形成从MCU到MPU的完整技术栈。这些扩展方向本身也是面试中动态加分的内容。

建议先选择一款低成本开发板开始搭建原型,把基础功能和日志系统搭好,再逐步深入。觉得文章有帮助的话,可以收藏备用,后面继续更新BMS项目的具体代码拆分和面试追问整理。

更多推荐