基于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个核心任务(优先级从高到低):

  1. 传感器采集任务(优先级4):周期性读取压力传感器(ADC)和加速度传感器(I2C)数据,滤波后发送至消息队列。
  2. 制动判断任务(优先级3):根据传感器数据计算制动强度(轻/重/紧急),生成灯控指令(亮度/闪烁频率)。
  3. 灯控执行任务(优先级2):解析灯控指令,通过PWM控制MOS管亮度,通过GPIO控制继电器闪烁。
  4. 人机交互任务(优先级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总线、环境光自适应等功能,适合作为汽车电子入门项目或后装改装方案。

posted @ 2026-04-14 16:07  晃悠人生  阅读(41)  评论(0)    收藏  举报