1. 项目概述:基于STM32的车载CAN总线监控系统
这个项目是我去年为某商用车队设计的车载状态监控方案,核心目标是实现车辆运行参数的实时采集、显示与异常报警。系统采用双板架构:采集板负责获取电机转速和温度数据,显示板则提供人机交互界面。两者通过CAN总线通信,实测在12V车载环境下传输距离可达30米无丢包。
选择STM32F103C8T6作为主控主要基于三点考量:首先其72MHz主频足够处理传感器数据;其次内置CAN控制器简化了硬件设计;最后性价比突出(批量采购价<20元)。实际部署时,我们还在PCB上增加了TVS二极管阵列,有效抑制了车辆点火时的浪涌冲击。
2. 硬件设计详解
2.1 CAN采集板关键电路
采集板的核心是STM32F103C8T6最小系统,其外围电路设计有几个技术要点:
电源部分:
- 采用LM2596-5.0将车载12V降压至5V
- 再通过AMS1117-3.3转换为MCU工作电压
- 每个电源入口处并联100uF电解电容+100nF陶瓷电容
传感器接口:
- 霍尔传感器使用3144E,通过10kΩ上拉电阻连接PA0
- DS18B20数据线接PA1,外接4.7kΩ上拉电阻
- 电机驱动采用L298N模块,PWM信号来自TIM1_CH1
CAN通信电路:
- TJA1050T的TXD/RXD分别接PB9/PB8
- CANH/CANL间并联120Ω终端电阻
- 总线加装共模电感抑制干扰
实际调试中发现,若不添加磁珠滤波,发动机工作时CAN通信误码率会上升3个数量级
2.2 显示报警板设计要点
显示板的特殊设计在于人机交互部分:
- TFT彩屏选用ST7735S驱动,SPI接口时钟设为18MHz
- 蜂鸣器驱动电路使用S8050三极管,基极串联2kΩ电阻
- 按键电路采用10kΩ下拉电阻,软件实现消抖
- 外置DS1302时钟芯片,备用电池选用CR2032
3. 软件实现关键逻辑
3.1 数据采集处理流程
采集板的软件工作流程如下:
-
初始化阶段:
- 配置GPIO(霍尔输入、PWM输出)
- 初始化TIM2用于转速测量
- 设置CAN波特率为500kbps
- 启动DS18B20温度转换
-
主循环任务:
c复制while(1) {
// 每100ms执行一次
if(htim3_flag) {
htim3_flag = 0;
read_hall_speed(); // 捕获TIM2输入脉冲
read_ds18b20(); // 读取温度值
can_send_data(); // 发送CAN帧
}
can_receive_process(); // 处理控制指令
}
转速测量采用输入捕获方式:
- 霍尔传感器每转输出8个脉冲
- 在TIM2中断中记录脉冲间隔时间T
- 转速 = 1/(8*T) r/s
3.2 显示板程序设计
显示板的核心状态机设计:
mermaid复制stateDiagram
[*] --> Boot
Boot --> ClockSet: 按下K1
Boot --> MainUI: 超时1s
ClockSet --> MainUI: 完成设置
MainUI --> ParamSet: 按下K1
ParamSet --> MainUI: 再次按K1
关键显示函数示例:
c复制void refresh_speed(uint16_t rpm) {
if(rpm > threshold) {
LCD_SetTextColor(RED);
} else {
LCD_SetTextColor(GREEN);
}
sprintf(buf, "Speed:%4d r/s", rpm);
LCD_DisplayString(30, 50, buf);
}
4. CAN通信协议设计
本系统采用标准帧格式(11位ID),具体报文定义:
| 报文类型 | CAN ID | 数据内容 | 发送周期 |
|---|---|---|---|
| 状态数据 | 0x101 | 转速(2B)+温度(1B)+方向(1B)+PWM(1B) | 100ms |
| 控制命令 | 0x102 | 方向(1B)+PWM(1B) | 事件触发 |
| 时间同步 | 0x103 | 年月日时分秒(各1B) | 上电时 |
数据打包示例:
c复制uint8_t can_data[5];
can_data[0] = speed >> 8; // 转速高字节
can_data[1] = speed & 0xFF; // 转速低字节
can_data[2] = temperature; // 温度值
can_data[3] = direction; // 电机方向
can_data[4] = pwm_duty; // PWM占空比
CAN_Transmit(CAN_ID_STATUS, can_data);
5. 实际调试经验
5.1 常见问题排查
-
CAN通信失败:
- 检查终端电阻是否安装
- 用示波器观察CANH-CANL差分信号
- 确认波特率设置一致
-
转速测量不准:
- 检查霍尔传感器安装间隙(建议1-3mm)
- 测量TIM2输入捕获配置
- 添加硬件滤波电路
-
TFT显示异常:
- 检查SPI时钟相位配置
- 确认复位时序满足芯片要求
- 调整背光电压(通常3.0-3.3V)
5.2 性能优化技巧
- 在CAN发送前关闭中断,避免时间抖动
- DS18B20温度转换期间让MCU进入Stop模式
- 使用DMA加速TFT屏幕刷新
- 对Flash参数存储区添加CRC校验
6. 系统扩展建议
在实际部署后,我们还做了以下增强:
- 增加GPS模块,通过CAN扩展ID发送位置信息
- 开发上位机配置工具,支持参数无线更新
- 添加SD卡日志功能,记录历史运行数据
- 实现OTA升级,通过CAN总线更新固件
这个项目最让我意外的是CAN总线的可靠性——在柴油发动机强干扰环境下,500kbps速率下连续运行3个月未出现通信故障。不过建议在软件层面还是要做好超时重传机制,我们在协议中预留了序列号字段就是为了应对极端情况。