去年接手了一个电动叉车电池管理系统的项目,客户要求支持16串锂电池组管理,具备电压采集、主动均衡和232通信功能。经过多轮方案对比,最终选择了TI的BQ76940+TMS570开发板的组合方案。这个方案最大的特点是把硬件设计和软件开发分离——客户可以直接使用我们验证过的采样电路和通信协议,再根据实际需求移植到自己的主控平台上。
整个系统架构分为三层:
实测这套系统在-20℃~60℃环境下,电压采样精度能稳定在±5mV以内,均衡电流最大支持2A,完全满足工业级应用需求。下面我就从硬件设计、软件实现和调试经验三个方面,详细拆解这个项目的技术细节。
核心器件选用了TI的BQ76940模拟前端芯片,这颗芯片有三大优势:
具体电路设计上有几个关键细节:
RC滤波网络:每个电池正极接入100Ω电阻与10nF电容组成的低通滤波器,截止频率计算如下:
code复制f_c = 1/(2πRC) = 1/(2*3.14*100*10e-9) ≈ 160kHz
这个设计能有效抑制电机运行时产生的高频干扰(实测可衰减30dB以上的噪声)
PCB布局要点:
保护电路:
采用MAX3232实现232电平转换,这里有几个容易踩坑的地方:
引脚连接:
电源滤波:
波特率配置:
TMS570的UART时钟源来自VCLK,以80MHz系统时钟为例,计算115200bps对应的BRS值:
code复制BRS = VCLK/(16*波特率) -1 = 80e6/(16*115200) -1 ≈ 52
采用MOSFET+功率电阻方案,关键参数计算如下:
MOSFET选型:
均衡电流计算:
code复制当PWM占空比70%时,等效电阻 R_eq = 2.2Ω/0.7 ≈ 3.14Ω
均衡电流 I = V_cell / R_eq ≈ 3.7V/3.14Ω ≈ 1.18A
散热设计:
c复制void BMS_Init(void) {
// 1. 时钟配置
Configure_PLL(80); // 设置系统时钟80MHz
// 2. GPIO初始化
Init_GPIO();
// 3. UART初始化
UART_Init(115200);
// 4. BQ76940初始化
BQ76940_Config();
// 5. 定时器初始化
Init_Timer();
// 6. 看门狗使能
Enable_Watchdog(3000); // 3秒超时
}
采用滑动窗口滤波算法提升采样稳定性:
c复制#define FILTER_SIZE 8
uint16_t Read_Cell_Voltage(uint8_t cell_num) {
static uint16_t voltage_buffer[16][FILTER_SIZE] = {0};
static uint8_t index[16] = {0};
uint32_t sum = 0;
// 读取原始ADC值
uint16_t raw = BQ76940_ReadADC(cell_num);
// 更新缓冲区
voltage_buffer[cell_num][index[cell_num]] = raw;
index[cell_num] = (index[cell_num]+1) % FILTER_SIZE;
// 计算平均值
for(int i=0; i<FILTER_SIZE; i++) {
sum += voltage_buffer[cell_num][i];
}
return sum / FILTER_SIZE;
}
自定义的通信协议格式如下:
| 字节位置 | 内容 | 说明 |
|---|---|---|
| 0 | 0xA5 | 帧头 |
| 1 | CMD | 命令字 |
| 2 | LEN | 数据长度 |
| 3~N | DATA | 数据内容 |
| N+1 | CHECKSUM | 校验和(反码+1) |
协议处理流程:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 通信乱码 | 232芯片引脚接反 | 检查T2IN/R2OUT连接 |
| 采样值跳变 | RC滤波参数不当 | 调整RC时间常数 |
| 均衡时通信中断 | 电源纹波过大 | 增加储能电容 |
| 看门狗频繁复位 | 任务执行时间过长 | 优化代码结构或延长超时时间 |
| 温度读数异常 | NTC电阻接触不良 | 检查连接器并重新焊接 |
在初期测试时,发现当所有16路均衡同时开启时,系统会出现以下现象:
通过示波器捕获的电源纹波达到300mVpp,远超100mV的设计要求。改进措施包括:
改进后测试数据对比:
| 参数 | 改进前 | 改进后 |
|---|---|---|
| 电压跌落 | 200mV | 50mV |
| 纹波峰峰值 | 300mV | 80mV |
| 通信误码率 | 1e-4 | <1e-6 |
ADC校准:
GPIO驱动能力:
时序约束:
用Python开发的上位机主要功能包括:
关键代码片段:
python复制class BMS_Protocol:
def __init__(self, port):
self.ser = serial.Serial(port, 115200, timeout=0.1)
def send_cmd(self, cmd, data=[]):
frame = [0xA5, cmd, len(data)] + data
checksum = (~sum(frame) + 1) & 0xFF
frame.append(checksum)
self.ser.write(bytes(frame))
def parse_data(self, raw):
if len(raw) < 4 or raw[0] != 0xA5:
return None
length = raw[2]
if len(raw) != length + 4:
return None
checksum = (~sum(raw[:-1]) + 1) & 0xFF
if checksum != raw[-1]:
return None
return {
'cmd': raw[1],
'data': raw[3:-1]
}
工具使用技巧:
经过半年实际运行,总结出以下优化空间:
采样精度提升:
通信可靠性增强:
均衡效率改进:
这套系统目前已在电动叉车、AGV等场景批量应用,最长的已经无故障运行超过8000小时。对于想自己动手实现的工程师,建议先从我们提供的测试板开始验证,再根据实际需求调整硬件参数。