基于STM32的自动刹车灯设计
一、系统概述与核心功能
1. 系统定位
基于STM32的自动刹车灯系统以“制动信号检测-强度判断-智能灯控-安全反馈”为核心,通过传感器实时监测车辆制动状态(踏板压力/车身减速度),自动控制刹车灯的点亮、亮度调节及闪烁模式,替代传统机械刹车灯开关,提升响应速度与制动意图表达的准确性,适用于汽车、电动车、工业车辆等场景。
2. 核心功能模块
| 模块 | 功能描述 |
|---|---|
| 制动检测 | 双传感器融合:刹车踏板压力传感器(模拟量)+ 车身加速度传感器(数字量),判断制动强度(轻刹/重刹/紧急制动) |
| 灯控逻辑 | 轻刹:刹车灯常亮(低亮度);重刹:常亮(高亮度);紧急制动:高频闪烁(警示后车) |
| 驱动电路 | 通过MOS管/继电器驱动刹车灯(12V/24V),支持PWM调光(亮度控制)与开关控制(闪烁) |
| 安全反馈 | OLED显示制动状态(压力值、减速度、灯控模式),异常时触发蜂鸣器报警(如传感器故障) |
| 低功耗设计 | 车辆熄火后进入STOP模式,仅保留传感器中断唤醒,续航≥30天(备用电池) |
二、硬件设计方案
1. 核心硬件选型
| 模块 | 型号 | 关键参数 | 接口方式 |
|---|---|---|---|
| 主控MCU | STM32F103C8T6 | 72MHz Cortex-M3,64KB Flash,20KB RAM,12位ADC,3个UART,2个I2C,支持PWM | 核心控制器 |
| 压力传感器 | MPX5700DP | 模拟输出(0.2-4.7V),量程0-700kPa(对应刹车踏板压力0-50kg),精度±2.5%FS | ADC1_IN0(PA0) |
| 加速度传感器 | ADXL345 | 3轴数字输出(±16g),I2C接口,分辨率13位,低功耗模式(<10μA) | I2C1(PB6=SCL,PB7=SDA) |
| 刹车灯驱动 | IRF540N(MOS管)+ 继电器 | MOS管驱动小功率灯(5W),继电器驱动大功率灯(21W),支持PWM调光(MOS管) | GPIO(PB0=MOS管,PB1=继电器) |
| 显示模块 | OLED 12864(I2C) | 0.96寸,128×64像素,低功耗(<10mA),显示制动参数与状态 | I2C1(复用ADXL345) |
| 电源模块 | LM2596+AMS1117 | 车辆12V→LM2596降压至5V(给传感器/STM32),AMS1117-3.3V给MCU核心 | 供电一体化(带过压保护) |
| 报警模块 | 有源蜂鸣器+LED | 5V驱动,声压≥85dB,红色LED指示故障 | GPIO(PB2=蜂鸣器,PB3=LED) |
2. 硬件电路设计要点
2.1 核心电路连接
- STM32最小系统:8MHz外部晶振+32.768kHz RTC晶振,SWD调试接口(PA13/PA14),复位电路(10kΩ上拉+0.1μF电容)。
- 压力传感器(MPX5700DP):VOUT接PA0(ADC1_IN0),VCC=5V(与STM32共电源),GND共地,输出信号经RC滤波(1kΩ+0.1μF)后接入ADC。
- 加速度传感器(ADXL345):SCL=PB6,SDA=PB7,CS=VCC(I2C模式),INT1=PA1(中断输出,可选),VCC=3.3V。
- 刹车灯驱动电路:
- MOS管驱动:PB0输出PWM信号→IRF540N栅极(串联1kΩ限流电阻),漏极接刹车灯负极,源极接地,灯正极接12V电源。
- 继电器驱动:PB1输出高电平→S8050三极管导通→继电器线圈通电(5V),触点闭合接通刹车灯12V电源。
2.2 抗干扰设计
- 电源隔离:车辆12V电源经LM2596降压至5V后,通过磁珠(600Ω@100MHz)隔离数字/模拟电源。
- 信号滤波:压力传感器输出接RC低通滤波(截止频率10Hz),加速度传感器I2C线加10pF电容抗静电。
- PCB布局:传感器信号走线短且远离开关电源,模拟地(AGND)与数字地(DGND)单点连接(通过0Ω电阻)。
三、软件设计与核心代码
1. 系统架构(FreeRTOS多任务调度)
采用FreeRTOS实时操作系统,划分4个核心任务(优先级从高到低):
- 传感器采集任务(优先级4):周期性读取压力传感器(ADC)和加速度传感器(I2C)数据,滤波后发送至消息队列。
- 制动判断任务(优先级3):根据传感器数据计算制动强度(轻/重/紧急),生成灯控指令(亮度/闪烁频率)。
- 灯控执行任务(优先级2):解析灯控指令,通过PWM控制MOS管亮度,通过GPIO控制继电器闪烁。
- 人机交互任务(优先级1):更新OLED显示(制动参数、灯控状态),处理按键输入(阈值设置)。
2. 核心代码实现(基于HAL库)
2.1 主程序框架(FreeRTOS初始化)
#include "stm32f1xx_hal.h"
#include "FreeRTOS.h"
#include "task.h"
#include "adc.h"
#include "i2c.h"
#include "pwm.h"
#include "oled.h"
#include "buzzer.h"
// 全局变量定义
float brake_pressure = 0.0; // 刹车压力(kPa)
float deceleration = 0.0; // 车身减速度(m/s²)
uint8_t brake_mode = 0; // 灯控模式:0-关闭,1-轻刹(低亮),2-重刹(高亮),3-紧急(闪烁)
int main(void) {
HAL_Init();
SystemClock_Config(); // 72MHz
MX_GPIO_Init(); // GPIO初始化(PWM、继电器、LED)
MX_ADC1_Init(); // ADC初始化(压力传感器)
MX_I2C1_Init(); // I2C初始化(ADXL345、OLED)
MX_TIM3_Init(); // TIM3初始化(PWM输出,控制MOS管)
OLED_Init(); // OLED显示初始化
ADXL345_Init(); // 加速度传感器初始化
Buzzer_Init(); // 蜂鸣器初始化
// FreeRTOS任务创建
xTaskCreate(Sensor_Task, "Sensor", 256, NULL, 4, NULL); // 传感器采集
xTaskCreate(Judge_Task, "Judge", 256, NULL, 3, NULL); // 制动判断
xTaskCreate(Light_Task, "Light", 256, NULL, 2, NULL); // 灯控执行
xTaskCreate(UI_Task, "UI", 128, NULL, 1, NULL); // 人机交互
vTaskStartScheduler(); // 启动调度器
while (1);
}
2.2 传感器采集任务(压力+加速度)
// 传感器数据结构体
typedef struct {
float pressure; // 压力值(kPa)
float accel_z; // Z轴加速度(m/s²,向下为正)
} SensorData_t;
SensorData_t sensor_data;
void Sensor_Task(void *pvParameters) {
TickType_t xLastWakeTime = xTaskGetTickCount();
const TickType_t xFrequency = pdMS_TO_TICKS(50); // 50ms采集一次
while (1) {
// 1. 读取压力传感器(ADC1_IN0,12位ADC)
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
uint16_t adc_val = HAL_ADC_GetValue(&hadc1);
sensor_data.pressure = (adc_val * 5.0f / 4095.0f - 0.2f) * (700.0f / 4.5f); // 转换为kPa(MPX5700输出0.2-4.7V对应0-700kPa)
// 2. 读取加速度传感器(ADXL345,Z轴)
int16_t accel_z = ADXL345_ReadAccel(ADXL345_AXIS_Z); // 原始值(-32768~32767)
sensor_data.accel_z = (accel_z * 16.0f) / 32768.0f; // 转换为g(±16g量程),再×9.8→m/s²(此处简化为g值,后续计算减速度)
// 3. 发送数据至消息队列
xQueueSend(sensor_queue, &sensor_data, 0);
vTaskDelayUntil(&xLastWakeTime, xFrequency);
}
}
2.3 制动判断任务(强度分级与灯控指令)
// 制动强度判断逻辑
void Judge_Task(void *pvParameters) {
SensorData_t data;
while (1) {
if (xQueueReceive(sensor_queue, &data, portMAX_DELAY) == pdPASS) {
// 1. 计算减速度(Z轴加速度,制动时为向上负加速度,取绝对值)
float decel_g = -data.accel_z; // 制动时Z轴加速度为负(向上),取正值表示减速度
if (decel_g < 0) decel_g = 0; // 过滤异常值
deceleration = decel_g * 9.8f; // 转换为m/s²(重力加速度9.8m/s²)
// 2. 融合压力与减速度判断制动强度(阈值可配置)
if (data.pressure < 50.0f && deceleration < 2.0f) { // 轻刹:压力<50kPa且减速度<2m/s²
brake_mode = 1; // 低亮度常亮
} else if (data.pressure < 200.0f && deceleration < 5.0f) { // 重刹:压力50-200kPa或减速度2-5m/s²
brake_mode = 2; // 高亮度常亮
} else { // 紧急制动:压力>200kPa或减速度>5m/s²
brake_mode = 3; // 高频闪烁(5Hz)
}
// 3. 发送灯控指令至队列
xQueueSend(light_queue, &brake_mode, 0);
}
}
}
2.4 灯控执行任务(PWM调光+闪烁控制)
void Light_Task(void *pvParameters) {
uint8_t mode;
uint8_t pwm_duty = 0; // PWM占空比(0-100)
while (1) {
if (xQueueReceive(light_queue, &mode, portMAX_DELAY) == pdPASS) {
switch (mode) {
case 0: // 关闭
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // MOS管关
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // 继电器关
break;
case 1: // 轻刹(低亮,PWM占空比30%)
pwm_duty = 30;
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pwm_duty * 10); // TIM3_CH1输出PWM(ARR=100)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // 继电器开(常亮)
break;
case 2: // 重刹(高亮,PWM占空比80%)
pwm_duty = 80;
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pwm_duty * 10);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
break;
case 3: // 紧急(闪烁,继电器5Hz通断)
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1); // 继电器翻转
HAL_Delay(100); // 100ms周期(5Hz)
break;
}
}
}
}
2.5 OLED显示任务(状态可视化)
void UI_Task(void *pvParameters) {
char buf[32];
while (1) {
// 读取当前制动参数(从全局变量)
OLED_Clear();
sprintf(buf, "Pressure: %.1f kPa", brake_pressure);
OLED_ShowString(0, 0, buf, 16);
sprintf(buf, "Decel: %.1f m/s2", deceleration);
OLED_ShowString(0, 2, buf, 16);
sprintf(buf, "Mode: %s", brake_mode==0?"Off":brake_mode==1?"Light":brake_mode==2?"High":"Flash");
OLED_ShowString(0, 4, buf, 16);
OLED_Refresh();
vTaskDelay(pdMS_TO_TICKS(200)); // 200ms刷新一次
}
}
四、关键技术与优化
1. 传感器数据融合与滤波
- 互补滤波:压力传感器易受踏板机械间隙影响(初始段无压力),加速度传感器易受路面颠簸干扰,通过加权融合(压力权重0.6,加速度权重0.4)提升判断准确性。
- 滑动平均滤波:对ADC采集的压力值和加速度原始值进行5次滑动平均,消除高频噪声。
2. 灯控逻辑优化
- 分级调光:轻刹(<50kPa)用30%亮度,重刹(50-200kPa)用80%亮度,避免后车眩目。
- 紧急闪烁:紧急制动时继电器5Hz通断(占空比50%),同时MOS管输出100%亮度,增强警示效果。
3. 低功耗设计
- 休眠模式:车辆熄火后(通过ACC信号检测),STM32进入STOP模式,关闭OLED、传感器电源,仅保留加速度传感器中断(检测碰撞唤醒)。
- 动态功耗调节:正常运行时STM32主频72MHz,休眠时降频至8MHz,关闭非必要外设时钟(ADC、I2C)。
参考代码 基于STM32的自动刹车灯设计 www.youwenfan.com/contentcnt/133743.html
五、系统调试与扩展
1. 调试步骤
| 阶段 | 操作 | 工具 |
|---|---|---|
| 硬件调试 | 测量压力传感器输出(踩踏板时0.2-4.7V)、加速度传感器Z轴数据(静止时≈1g) | 万用表、示波器(ADC信号) |
| 传感器校准 | 用标准压力源(如血压计)校准压力传感器,用离心机校准加速度传感器 | 标准仪表、串口打印原始数据 |
| 灯控测试 | 模拟轻/重/紧急制动,观察刹车灯亮度/闪烁是否符合预期 | 逻辑分析仪(PWM/继电器信号) |
| 实车测试 | 安装后路试,验证制动响应时间(≤100ms)与误触发率 | 高速摄像机(拍摄刹车灯动作) |
2. 扩展功能
- CAN总线通信:通过CAN模块(如TJA1050)与车辆ECU通信,上传制动数据,接收车速信号优化判断逻辑。
- 环境光自适应:添加光敏电阻(ADC采集),夜间自动提高刹车灯亮度(避免后车未察觉)。
- 故障自诊断:检测传感器断线(ADC值超范围)、MOS管损坏(灯不亮),触发蜂鸣器报警并记录故障码。
六、总结
基于STM32的自动刹车灯系统通过双传感器融合(压力+加速度) 精准判断制动强度,PWM调光+继电器闪烁 实现分级灯控,硬件成本低(约50元)、响应速度快(≤100ms),可显著提升行车安全性。系统扩展性强,支持CAN总线、环境光自适应等功能,适合作为汽车电子入门项目或后装改装方案。
浙公网安备 33010602011771号