基于STM32的倒车雷达系统设计
一、系统总体设计
1.1 系统架构
┌─────────────────────────────────────────────────────────┐
│ 倒车雷达系统架构 │
├─────────────────────────────────────────────────────────┤
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 左前雷达 │ │ 右前雷达 │ │ 左后雷达 │ │
│ │ HC-SR04 │ │ HC-SR04 │ │ HC-SR04 │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ ┌────▼─────────────────────────────▼─────┐ │
│ │ STM32F103C8T6主控 │ │
│ │ • TIM2/TIM3 输入捕获测距 │ │
│ │ • TIM4 PWM蜂鸣器报警 │ │
│ │ • I2C OLED显示 │ │
│ │ • GPIO LED指示 │ │
│ └───────────────┬─────────────────────┘ │
│ │ │
│ ┌───────────────▼─────────────────────┐ │
│ │ 人机交互界面 │ │
│ │ • 0.96寸OLED距离显示 │ │
│ │ • 蜂鸣器分级报警 │ │
│ │ • LED红黄绿三级提示 │ │
│ └─────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
1.2 技术指标
| 参数 | 规格 | 说明 |
|---|---|---|
| 测量范围 | 0.02m~4.0m | 超声波有效范围 |
| 测量精度 | ±1cm | 室温条件下 |
| 响应时间 | <100ms | 从检测到显示 |
| 探测角度 | ±15° | 超声波波束角 |
| 报警等级 | 3级 | 绿灯/黄灯/红灯 |
| 工作电压 | 5V DC | 车载电源 |
| 工作温度 | -40℃~+85℃ | 汽车级标准 |
二、硬件电路设计
2.1 核心元件选型
| 模块 | 型号 | 关键参数 | 数量 |
|---|---|---|---|
| 主控MCU | STM32F103C8T6 | 72MHz, 64KB Flash | 1 |
| 超声波传感器 | HC-SR04 | 5V供电, 40kHz | 4 |
| 显示屏 | SSD1306 0.96" OLED | 128×64, I2C接口 | 1 |
| 蜂鸣器 | 有源蜂鸣器5V | 频率2kHz~5kHz | 1 |
| LED指示灯 | 红/黄/绿LED | 5mm直插 | 3 |
| 电源模块 | LM2596降压模块 | 12V→5V, 3A | 1 |
2.2 硬件连接表
/* 硬件连接定义 */
// GPIO引脚分配
#define ULTRA_LEFT_FRONT_TRIG GPIO_Pin_0 // PA0 - 左前触发
#define ULTRA_RIGHT_FRONT_TRIG GPIO_Pin_1 // PA1 - 右前触发
#define ULTRA_LEFT_BACK_TRIG GPIO_Pin_2 // PA2 - 左后触发
#define ULTRA_RIGHT_BACK_TRIG GPIO_Pin_3 // PA3 - 右后触发
#define ULTRA_LEFT_FRONT_ECHO GPIO_Pin_6 // PA6 - 左前回波(TIM3_CH1)
#define ULTRA_RIGHT_FRONT_ECHO GPIO_Pin_7 // PA7 - 右前回波(TIM3_CH2)
#define ULTRA_LEFT_BACK_ECHO GPIO_Pin_0 // PB0 - 左后回波(TIM3_CH3)
#define ULTRA_RIGHT_BACK_ECHO GPIO_Pin_1 // PB1 - 右后回波(TIM3_CH4)
// LED指示灯
#define LED_GREEN_PIN GPIO_Pin_8 // PB8 - 安全距离(>1m)
#define LED_YELLOW_PIN GPIO_Pin_9 // PB9 - 警告距离(0.5~1m)
#define LED_RED_PIN GPIO_Pin_10 // PB10 - 危险距离(<0.5m)
// 蜂鸣器
#define BUZZER_PIN GPIO_Pin_0 // PB0 (TIM3_CH3 PWM输出)
// OLED显示屏 (I2C)
#define OLED_SCL_PIN GPIO_Pin_6 // PB6 (I2C1_SCL)
#define OLED_SDA_PIN GPIO_Pin_7 // PB7 (I2C1_SDA)
// 电源指示灯
#define POWER_LED_PIN GPIO_Pin_11 // PB11
三、软件系统设计
3.1 数据结构定义
/* 倒车雷达数据结构 */
#include "stm32f10x.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_i2c.h"
#include "misc.h"
#include <stdio.h>
#include <string.h>
#include <math.h>
// 超声波传感器位置
typedef enum {
ULTRA_LEFT_FRONT = 0, // 左前
ULTRA_RIGHT_FRONT = 1, // 右前
ULTRA_LEFT_BACK = 2, // 左后
ULTRA_RIGHT_BACK = 3, // 右后
ULTRA_MAX_COUNT = 4
} UltraPosition;
// 报警等级
typedef enum {
ALARM_LEVEL_SAFE = 0, // 安全 (绿灯)
ALARM_LEVEL_WARN = 1, // 警告 (黄灯)
ALARM_LEVEL_DANGER = 2, // 危险 (红灯)
ALARM_LEVEL_CRITICAL = 3 // 危急 (红灯闪烁+长鸣)
} AlarmLevel;
// 超声波数据结构
typedef struct {
UltraPosition position; // 传感器位置
GPIO_TypeDef* trig_port; // 触发端口
uint16_t trig_pin; // 触发引脚
GPIO_TypeDef* echo_port; // 回波端口
uint16_t echo_pin; // 回波引脚
TIM_TypeDef* timer; // 定时器
uint8_t timer_channel; // 定时器通道
uint32_t distance_mm; // 测量距离(mm)
uint8_t valid; // 数据有效标志
uint32_t last_measure_time; // 上次测量时间
uint32_t rise_time; // 上升沿时间
uint32_t fall_time; // 下降沿时间
} UltrasonicSensor;
// 报警系统结构
typedef struct {
AlarmLevel level[ULTRA_MAX_COUNT]; // 各传感器报警等级
AlarmLevel max_level; // 最高报警等级
uint8_t buzzer_enable; // 蜂鸣器使能
uint16_t buzzer_frequency;// 蜂鸣器频率
uint16_t buzzer_duty; // 蜂鸣器占空比
uint8_t led_green; // 绿灯状态
uint8_t led_yellow; // 黄灯状态
uint8_t led_red; // 红灯状态
} AlarmSystem;
// 显示数据结构
typedef struct {
uint8_t refresh_flag; // 刷新标志
uint32_t refresh_time; // 刷新时间
char line1[21]; // 第1行显示
char line2[21]; // 第2行显示
char line3[21]; // 第3行显示
char line4[21]; // 第4行显示
uint8_t bar_graph[128]; // 条形图数据
} DisplayData;
// 全局变量
UltrasonicSensor ultra_sensors[ULTRA_MAX_COUNT];
AlarmSystem alarm_system;
DisplayData display_data;
volatile uint32_t system_tick = 0;
volatile uint8_t measure_complete = 0;
3.2 超声波测距核心算法
/* 超声波测距初始化 */
void Ultrasonic_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// 使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// 配置TRIG引脚为推挽输出
GPIO_InitStructure.GPIO_Pin = ULTRA_LEFT_FRONT_TRIG | ULTRA_RIGHT_FRONT_TRIG |
ULTRA_LEFT_BACK_TRIG | ULTRA_RIGHT_BACK_TRIG;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置ECHO引脚为上拉输入
GPIO_InitStructure.GPIO_Pin = ULTRA_LEFT_FRONT_ECHO | ULTRA_RIGHT_FRONT_ECHO;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = ULTRA_LEFT_BACK_ECHO | ULTRA_RIGHT_BACK_ECHO;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 定时器基础配置
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; // 最大计数值
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 72MHz/72 = 1MHz, 1us精度
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// 输入捕获配置 - 通道1 (左前)
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0F; // 滤波
TIM_ICInit(TIM3, &TIM_ICInitStructure);
// 通道2 (右前)
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
// 通道3 (左后)
TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
// 通道4 (右后)
TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
// 使能捕获中断
TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);
// 配置NVIC
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 使能定时器
TIM_Cmd(TIM3, ENABLE);
// 初始化传感器数据结构
ultra_sensors[ULTRA_LEFT_FRONT].position = ULTRA_LEFT_FRONT;
ultra_sensors[ULTRA_LEFT_FRONT].trig_port = GPIOA;
ultra_sensors[ULTRA_LEFT_FRONT].trig_pin = ULTRA_LEFT_FRONT_TRIG;
ultra_sensors[ULTRA_LEFT_FRONT].echo_port = GPIOA;
ultra_sensors[ULTRA_LEFT_FRONT].echo_pin = ULTRA_LEFT_FRONT_ECHO;
ultra_sensors[ULTRA_LEFT_FRONT].timer = TIM3;
ultra_sensors[ULTRA_LEFT_FRONT].timer_channel = 1;
ultra_sensors[ULTRA_LEFT_FRONT].distance_mm = 4000;
ultra_sensors[ULTRA_LEFT_FRONT].valid = 0;
ultra_sensors[ULTRA_RIGHT_FRONT].position = ULTRA_RIGHT_FRONT;
ultra_sensors[ULTRA_RIGHT_FRONT].trig_port = GPIOA;
ultra_sensors[ULTRA_RIGHT_FRONT].trig_pin = ULTRA_RIGHT_FRONT_TRIG;
ultra_sensors[ULTRA_RIGHT_FRONT].echo_port = GPIOA;
ultra_sensors[ULTRA_RIGHT_FRONT].echo_pin = ULTRA_RIGHT_FRONT_ECHO;
ultra_sensors[ULTRA_RIGHT_FRONT].timer = TIM3;
ultra_sensors[ULTRA_RIGHT_FRONT].timer_channel = 2;
ultra_sensors[ULTRA_RIGHT_FRONT].distance_mm = 4000;
ultra_sensors[ULTRA_RIGHT_FRONT].valid = 0;
ultra_sensors[ULTRA_LEFT_BACK].position = ULTRA_LEFT_BACK;
ultra_sensors[ULTRA_LEFT_BACK].trig_port = GPIOA;
ultra_sensors[ULTRA_LEFT_BACK].trig_pin = ULTRA_LEFT_BACK_TRIG;
ultra_sensors[ULTRA_LEFT_BACK].echo_port = GPIOB;
ultra_sensors[ULTRA_LEFT_BACK].echo_pin = ULTRA_LEFT_BACK_ECHO;
ultra_sensors[ULTRA_LEFT_BACK].timer = TIM3;
ultra_sensors[ULTRA_LEFT_BACK].timer_channel = 3;
ultra_sensors[ULTRA_LEFT_BACK].distance_mm = 4000;
ultra_sensors[ULTRA_LEFT_BACK].valid = 0;
ultra_sensors[ULTRA_RIGHT_BACK].position = ULTRA_RIGHT_BACK;
ultra_sensors[ULTRA_RIGHT_BACK].trig_port = GPIOA;
ultra_sensors[ULTRA_RIGHT_BACK].trig_pin = ULTRA_RIGHT_BACK_TRIG;
ultra_sensors[ULTRA_RIGHT_BACK].echo_port = GPIOB;
ultra_sensors[ULTRA_RIGHT_BACK].echo_pin = ULTRA_RIGHT_BACK_ECHO;
ultra_sensors[ULTRA_RIGHT_BACK].timer = TIM3;
ultra_sensors[ULTRA_RIGHT_BACK].timer_channel = 4;
ultra_sensors[ULTRA_RIGHT_BACK].distance_mm = 4000;
ultra_sensors[ULTRA_RIGHT_BACK].valid = 0;
printf("Ultrasonic sensors initialized\n");
}
/* 触发超声波测量 */
void Ultrasonic_Trigger(UltrasonicSensor* sensor) {
// 发送10us以上的高电平触发信号
GPIO_SetBits(sensor->trig_port, sensor->trig_pin);
delay_us(20); // 20us触发脉冲
GPIO_ResetBits(sensor->trig_port, sensor->trig_pin);
sensor->last_measure_time = system_tick;
}
/* 计算距离 */
uint32_t Calculate_Distance(uint32_t pulse_width_us) {
// 距离 = (时间 × 声速) / 2
// 声速 = 340 m/s = 0.034 cm/us
// 距离(mm) = 脉冲宽度(us) × 0.34 / 2 × 10
float distance_mm = (float)pulse_width_us * 0.34f / 2.0f * 10.0f;
// 限制测量范围
if (distance_mm < 20.0f) {
distance_mm = 20.0f; // 最小20mm
} else if (distance_mm > 4000.0f) {
distance_mm = 4000.0f; // 最大4000mm
}
return (uint32_t)distance_mm;
}
/* 定时器3中断服务函数 */
void TIM3_IRQHandler(void) {
uint32_t current_time;
// 通道1 - 左前传感器
if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET) {
if (GPIO_ReadInputDataBit(GPIOA, ULTRA_LEFT_FRONT_ECHO)) {
// 上升沿 - 记录开始时间
ultra_sensors[ULTRA_LEFT_FRONT].rise_time = TIM_GetCapture1(TIM3);
} else {
// 下降沿 - 计算脉冲宽度
ultra_sensors[ULTRA_LEFT_FRONT].fall_time = TIM_GetCapture1(TIM3);
if (ultra_sensors[ULTRA_LEFT_FRONT].fall_time > ultra_sensors[ULTRA_LEFT_FRONT].rise_time) {
ultra_sensors[ULTRA_LEFT_FRONT].distance_mm =
Calculate_Distance(ultra_sensors[ULTRA_LEFT_FRONT].fall_time -
ultra_sensors[ULTRA_LEFT_FRONT].rise_time);
ultra_sensors[ULTRA_LEFT_FRONT].valid = 1;
}
}
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
}
// 通道2 - 右前传感器
if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET) {
if (GPIO_ReadInputDataBit(GPIOA, ULTRA_RIGHT_FRONT_ECHO)) {
ultra_sensors[ULTRA_RIGHT_FRONT].rise_time = TIM_GetCapture2(TIM3);
} else {
ultra_sensors[ULTRA_RIGHT_FRONT].fall_time = TIM_GetCapture2(TIM3);
if (ultra_sensors[ULTRA_RIGHT_FRONT].fall_time > ultra_sensors[ULTRA_RIGHT_FRONT].rise_time) {
ultra_sensors[ULTRA_RIGHT_FRONT].distance_mm =
Calculate_Distance(ultra_sensors[ULTRA_RIGHT_FRONT].fall_time -
ultra_sensors[ULTRA_RIGHT_FRONT].rise_time);
ultra_sensors[ULTRA_RIGHT_FRONT].valid = 1;
}
}
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
}
// 通道3 - 左后传感器
if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET) {
if (GPIO_ReadInputDataBit(GPIOB, ULTRA_LEFT_BACK_ECHO)) {
ultra_sensors[ULTRA_LEFT_BACK].rise_time = TIM_GetCapture3(TIM3);
} else {
ultra_sensors[ULTRA_LEFT_BACK].fall_time = TIM_GetCapture3(TIM3);
if (ultra_sensors[ULTRA_LEFT_BACK].fall_time > ultra_sensors[ULTRA_LEFT_BACK].rise_time) {
ultra_sensors[ULTRA_LEFT_BACK].distance_mm =
Calculate_Distance(ultra_sensors[ULTRA_LEFT_BACK].fall_time -
ultra_sensors[ULTRA_LEFT_BACK].rise_time);
ultra_sensors[ULTRA_LEFT_BACK].valid = 1;
}
}
TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
}
// 通道4 - 右后传感器
if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET) {
if (GPIO_ReadInputDataBit(GPIOB, ULTRA_RIGHT_BACK_ECHO)) {
ultra_sensors[ULTRA_RIGHT_BACK].rise_time = TIM_GetCapture4(TIM3);
} else {
ultra_sensors[ULTRA_RIGHT_BACK].fall_time = TIM_GetCapture4(TIM3);
if (ultra_sensors[ULTRA_RIGHT_BACK].fall_time > ultra_sensors[ULTRA_RIGHT_BACK].rise_time) {
ultra_sensors[ULTRA_RIGHT_BACK].distance_mm =
Calculate_Distance(ultra_sensors[ULTRA_RIGHT_BACK].fall_time -
ultra_sensors[ULTRA_RIGHT_BACK].rise_time);
ultra_sensors[ULTRA_RIGHT_BACK].valid = 1;
measure_complete = 1; // 最后一个传感器测量完成
}
}
TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
}
}
/* 主测量任务 */
void Ultrasonic_Measure_Task(void) {
static uint32_t last_trigger_time = 0;
uint32_t current_time = system_tick;
// 每100ms触发一次测量
if (current_time - last_trigger_time >= 100) {
// 依次触发所有传感器
for (uint8_t i = 0; i < ULTRA_MAX_COUNT; i++) {
Ultrasonic_Trigger(&ultra_sensors[i]);
delay_ms(10); // 传感器间延时
}
last_trigger_time = current_time;
}
// 检查数据有效性
for (uint8_t i = 0; i < ULTRA_MAX_COUNT; i++) {
if (current_time - ultra_sensors[i].last_measure_time > 500) {
ultra_sensors[i].valid = 0; // 数据超时
}
}
}
四、报警系统设计
4.1 报警等级判定
/* 报警系统初始化 */
void Alarm_System_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 配置LED引脚
GPIO_InitStructure.GPIO_Pin = LED_GREEN_PIN | LED_YELLOW_PIN | LED_RED_PIN | POWER_LED_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 配置蜂鸣器引脚
GPIO_InitStructure.GPIO_Pin = BUZZER_PIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 初始化报警系统
memset(&alarm_system, 0, sizeof(AlarmSystem));
alarm_system.buzzer_frequency = 2000; // 2kHz
alarm_system.buzzer_duty = 50; // 50%占空比
alarm_system.buzzer_enable = 1;
// 打开电源指示灯
GPIO_SetBits(GPIOB, POWER_LED_PIN);
printf("Alarm system initialized\n");
}
/* 判定报警等级 */
AlarmLevel Determine_Alarm_Level(uint32_t distance_mm) {
if (distance_mm >= 1000) {
return ALARM_LEVEL_SAFE; // >1m 安全
} else if (distance_mm >= 500) {
return ALARM_LEVEL_WARN; // 0.5~1m 警告
} else if (distance_mm >= 200) {
return ALARM_LEVEL_DANGER; // 0.2~0.5m 危险
} else {
return ALARM_LEVEL_CRITICAL; // <0.2m 危急
}
}
/* 更新报警状态 */
void Update_Alarm_System(void) {
AlarmLevel temp_level;
alarm_system.max_level = ALARM_LEVEL_SAFE;
// 计算各传感器的报警等级
for (uint8_t i = 0; i < ULTRA_MAX_COUNT; i++) {
if (ultra_sensors[i].valid) {
temp_level = Determine_Alarm_Level(ultra_sensors[i].distance_mm);
alarm_system.level[i] = temp_level;
if (temp_level > alarm_system.max_level) {
alarm_system.max_level = temp_level;
}
} else {
alarm_system.level[i] = ALARM_LEVEL_SAFE; // 无效数据按安全处理
}
}
// 根据最高报警等级控制LED和蜂鸣器
switch (alarm_system.max_level) {
case ALARM_LEVEL_SAFE:
// 绿灯亮,蜂鸣器静音
GPIO_SetBits(GPIOB, LED_GREEN_PIN);
GPIO_ResetBits(GPIOB, LED_YELLOW_PIN);
GPIO_ResetBits(GPIOB, LED_RED_PIN);
alarm_system.buzzer_enable = 0;
break;
case ALARM_LEVEL_WARN:
// 黄灯亮,蜂鸣器慢响
GPIO_ResetBits(GPIOB, LED_GREEN_PIN);
GPIO_SetBits(GPIOB, LED_YELLOW_PIN);
GPIO_ResetBits(GPIOB, LED_RED_PIN);
alarm_system.buzzer_enable = 1;
alarm_system.buzzer_frequency = 1500; // 较低频率
break;
case ALARM_LEVEL_DANGER:
// 红灯亮,蜂鸣器快响
GPIO_ResetBits(GPIOB, LED_GREEN_PIN);
GPIO_ResetBits(GPIOB, LED_YELLOW_PIN);
GPIO_SetBits(GPIOB, LED_RED_PIN);
alarm_system.buzzer_enable = 1;
alarm_system.buzzer_frequency = 2500; // 较高频率
break;
case ALARM_LEVEL_CRITICAL:
// 红灯闪烁,蜂鸣器长鸣
GPIO_ResetBits(GPIOB, LED_GREEN_PIN);
GPIO_ResetBits(GPIOB, LED_YELLOW_PIN);
// 红灯闪烁由定时器控制
alarm_system.buzzer_enable = 1;
alarm_system.buzzer_frequency = 3000; // 高频率
break;
}
}
/* 蜂鸣器PWM控制 */
void Buzzer_PWM_Init(void) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 使能TIM4时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
// 定时器基础配置
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 初始1kHz
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 1MHz计数
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
// PWM配置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500; // 初始50%占空比
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM4, &TIM_OCInitStructure); // PB8 = TIM4_CH3
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM4, ENABLE);
printf("Buzzer PWM initialized\n");
}
/* 更新蜂鸣器 */
void Update_Buzzer(void) {
static uint32_t last_toggle_time = 0;
static uint8_t buzzer_state = 0;
uint32_t current_time = system_tick;
if (!alarm_system.buzzer_enable) {
TIM_Cmd(TIM4, DISABLE);
GPIO_ResetBits(GPIOB, BUZZER_PIN);
return;
}
TIM_Cmd(TIM4, ENABLE);
// 根据报警等级设置频率和模式
switch (alarm_system.max_level) {
case ALARM_LEVEL_WARN:
// 慢响模式:200ms on, 800ms off
if (current_time - last_toggle_time >= 200) {
buzzer_state = 1;
}
if (current_time - last_toggle_time >= 1000) {
buzzer_state = 0;
last_toggle_time = current_time;
}
// 设置频率
TIM_SetAutoreload(TIM4, 1000000 / alarm_system.buzzer_frequency - 1);
TIM_SetCompare3(TIM4, buzzer_state ? 500 : 0);
break;
case ALARM_LEVEL_DANGER:
// 快响模式:100ms on, 100ms off
if (current_time - last_toggle_time >= 100) {
buzzer_state = !buzzer_state;
last_toggle_time = current_time;
}
TIM_SetAutoreload(TIM4, 1000000 / alarm_system.buzzer_frequency - 1);
TIM_SetCompare3(TIM4, buzzer_state ? 500 : 0);
break;
case ALARM_LEVEL_CRITICAL:
// 长鸣模式
TIM_SetAutoreload(TIM4, 1000000 / alarm_system.buzzer_frequency - 1);
TIM_SetCompare3(TIM4, 500);
// 红灯闪烁
if (current_time - last_toggle_time >= 200) {
buzzer_state = !buzzer_state;
if (buzzer_state) {
GPIO_SetBits(GPIOB, LED_RED_PIN);
} else {
GPIO_ResetBits(GPIOB, LED_RED_PIN);
}
last_toggle_time = current_time;
}
break;
default:
TIM_Cmd(TIM4, DISABLE);
break;
}
}
参考代码 基于STM32倒车雷达设计 www.youwenfan.com/contentcnt/133615.html
五、OLED显示系统
5.1 OLED驱动程序
/* OLED显示驱动 */
void OLED_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
// 使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
// 配置I2C引脚
GPIO_InitStructure.GPIO_Pin = OLED_SCL_PIN | OLED_SDA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// I2C配置
I2C_InitStructure.I2C_ClockSpeed = 400000; // 400kHz
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
// OLED初始化序列
OLED_WriteCommand(0xAE); // 关闭显示
OLED_WriteCommand(0xD5); // 设置显示时钟分频
OLED_WriteCommand(0x80);
OLED_WriteCommand(0xA8); // 设置多路复用率
OLED_WriteCommand(0x3F);
OLED_WriteCommand(0xD3); // 设置显示偏移
OLED_WriteCommand(0x00);
OLED_WriteCommand(0x40); // 设置起始行
OLED_WriteCommand(0x8D); // 电荷泵设置
OLED_WriteCommand(0x14);
OLED_WriteCommand(0x20); // 内存寻址模式
OLED_WriteCommand(0x00);
OLED_WriteCommand(0xA1); // 段重映射
OLED_WriteCommand(0xC8); // COM扫描方向
OLED_WriteCommand(0xDA); // COM引脚配置
OLED_WriteCommand(0x12);
OLED_WriteCommand(0x81); // 对比度设置
OLED_WriteCommand(0xCF);
OLED_WriteCommand(0xD9); // 预充电周期
OLED_WriteCommand(0xF1);
OLED_WriteCommand(0xDB); // VCOMH设置
OLED_WriteCommand(0x40);
OLED_WriteCommand(0xA4); // 全屏显示开启
OLED_WriteCommand(0xA6); // 正常显示
OLED_WriteCommand(0xAF); // 开启显示
// 清屏
OLED_Clear();
printf("OLED initialized\n");
}
/* OLED写命令 */
void OLED_WriteCommand(uint8_t cmd) {
I2C_GenerateSTART(I2C1, ENABLE);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, 0x78, I2C_Direction_Transmitter);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1, 0x00); // 命令控制字节
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1, cmd);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C1, ENABLE);
}
/* OLED写数据 */
void OLED_WriteData(uint8_t data) {
I2C_GenerateSTART(I2C1, ENABLE);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, 0x78, I2C_Direction_Transmitter);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1, 0x40); // 数据控制字节
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1, data);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C1, ENABLE);
}
/* OLED清屏 */
void OLED_Clear(void) {
for (uint8_t page = 0; page < 8; page++) {
OLED_WriteCommand(0xB0 + page);
OLED_WriteCommand(0x00);
OLED_WriteCommand(0x10);
for (uint8_t col = 0; col < 128; col++) {
OLED_WriteData(0x00);
}
}
}
/* 显示距离信息 */
void Update_OLED_Display(void) {
char buffer[30];
uint8_t valid_count = 0;
// 第1行:标题
sprintf(display_data.line1, "Parking Radar v1.0");
OLED_ShowString(0, 0, display_data.line1);
// 第2行:左前和右前距离
if (ultra_sensors[ULTRA_LEFT_FRONT].valid) {
sprintf(buffer, "LF:%.1fm", ultra_sensors[ULTRA_LEFT_FRONT].distance_mm / 1000.0f);
valid_count++;
} else {
sprintf(buffer, "LF:----");
}
OLED_ShowString(0, 2, buffer);
if (ultra_sensors[ULTRA_RIGHT_FRONT].valid) {
sprintf(buffer, "RF:%.1fm", ultra_sensors[ULTRA_RIGHT_FRONT].distance_mm / 1000.0f);
valid_count++;
} else {
sprintf(buffer, "RF:----");
}
OLED_ShowString(64, 2, buffer);
// 第3行:左后和右后距离
if (ultra_sensors[ULTRA_LEFT_BACK].valid) {
sprintf(buffer, "LB:%.1fm", ultra_sensors[ULTRA_LEFT_BACK].distance_mm / 1000.0f);
valid_count++;
} else {
sprintf(buffer, "LB:----");
}
OLED_ShowString(0, 4, buffer);
if (ultra_sensors[ULTRA_RIGHT_BACK].valid) {
sprintf(buffer, "RB:%.1fm", ultra_sensors[ULTRA_RIGHT_BACK].distance_mm / 1000.0f);
valid_count++;
} else {
sprintf(buffer, "RB:----");
}
OLED_ShowString(64, 4, buffer);
// 第4行:报警状态和传感器数量
const char* alarm_str[] = {"SAFE", "WARN", "DANGER", "CRITICAL"};
sprintf(buffer, "%s [%d/4]",
alarm_str[alarm_system.max_level], valid_count);
OLED_ShowString(0, 6, buffer);
// 绘制条形图
Draw_Distance_BarGraph();
}
/* 绘制距离条形图 */
void Draw_Distance_BarGraph(void) {
uint8_t bar_height;
for (uint8_t i = 0; i < ULTRA_MAX_COUNT; i++) {
if (ultra_sensors[i].valid) {
// 距离越近,条形越高 (20mm~4000mm映射到0~32像素)
bar_height = (uint8_t)(32.0f * (1.0f - ultra_sensors[i].distance_mm / 4000.0f));
if (bar_height > 32) bar_height = 32;
if (bar_height < 1) bar_height = 1;
} else {
bar_height = 0;
}
// 绘制条形
for (uint8_t y = 0; y < bar_height; y++) {
OLED_DrawPixel(i * 32 + 8, 63 - y, 1);
}
}
}
/* OLED显示字符串(简化版6x8字体)*/
void OLED_ShowString(uint8_t x, uint8_t y, char* str) {
while (*str) {
OLED_ShowChar(x, y, *str);
x += 6;
if (x > 122) {
x = 0;
y += 2;
}
str++;
}
}
/* OLED显示字符 */
void OLED_ShowChar(uint8_t x, uint8_t y, char ch) {
// 简化的6x8 ASCII字库(部分字符)
static const uint8_t font6x8[][6] = {
{0x00,0x00,0x00,0x00,0x00,0x00}, // 空格
{0x00,0x00,0x5F,0x00,0x00,0x00}, // !
{0x00,0x07,0x00,0x07,0x00,0x00}, // "
{0x14,0x7F,0x14,0x7F,0x14,0x00}, // #
{0x24,0x2A,0x7F,0x2A,0x12,0x00}, // $
{0x23,0x13,0x08,0x64,0x62,0x00}, // %
{0x36,0x49,0x55,0x22,0x50,0x00}, // &
{0x00,0x05,0x03,0x00,0x00,0x00}, // '
{0x00,0x1C,0x22,0x41,0x00,0x00}, // (
{0x00,0x41,0x22,0x1C,0x00,0x00}, // )
{0x14,0x08,0x3E,0x08,0x14,0x00}, // *
{0x08,0x08,0x3E,0x08,0x08,0x00}, // +
{0x00,0x50,0x30,0x00,0x00,0x00}, // ,
{0x08,0x08,0x08,0x08,0x08,0x00}, // -
{0x00,0x60,0x60,0x00,0x00,0x00}, // .
{0x20,0x10,0x08,0x04,0x02,0x00}, // /
{0x3E,0x51,0x49,0x45,0x3E,0x00}, // 0
{0x00,0x42,0x7F,0x40,0x00,0x00}, // 1
{0x42,0x61,0x51,0x49,0x46,0x00}, // 2
{0x21,0x41,0x45,0x4B,0x31,0x00}, // 3
{0x18,0x14,0x12,0x7F,0x10,0x00}, // 4
{0x27,0x45,0x45,0x45,0x39,0x00}, // 5
{0x3C,0x4E,0x49,0x49,0x26,0x00}, // 6
{0x01,0x71,0x09,0x05,0x03,0x00}, // 7
{0x36,0x49,0x49,0x49,0x36,0x00}, // 8
{0x06,0x49,0x49,0x29,0x1E,0x00}, // 9
{0x00,0x36,0x36,0x00,0x00,0x00}, // :
{0x00,0x56,0x36,0x00,0x00,0x00}, // ;
{0x08,0x14,0x22,0x41,0x00,0x00}, // <
{0x14,0x14,0x14,0x14,0x14,0x00}, // =
{0x00,0x41,0x22,0x14,0x08,0x00}, // >
{0x02,0x01,0x51,0x09,0x06,0x00}, // ?
{0x32,0x49,0x79,0x41,0x3E,0x00}, // @
{0x7E,0x11,0x11,0x11,0x7E,0x00}, // A
{0x7F,0x49,0x49,0x49,0x36,0x00}, // B
{0x3E,0x41,0x41,0x41,0x22,0x00}, // C
{0x7F,0x41,0x41,0x22,0x1C,0x00}, // D
{0x7F,0x49,0x49,0x49,0x41,0x00}, // E
{0x7F,0x09,0x09,0x09,0x01,0x00}, // F
{0x3E,0x41,0x49,0x49,0x7A,0x00}, // G
{0x7F,0x08,0x08,0x08,0x7F,0x00}, // H
{0x00,0x41,0x7F,0x41,0x00,0x00}, // I
{0x20,0x40,0x41,0x3F,0x01,0x00}, // J
{0x7F,0x08,0x14,0x22,0x41,0x00}, // K
{0x7F,0x40,0x40,0x40,0x40,0x00}, // L
{0x7F,0x02,0x0C,0x02,0x7F,0x00}, // M
{0x7F,0x04,0x08,0x10,0x7F,0x00}, // N
{0x3E,0x41,0x41,0x41,0x3E,0x00}, // O
{0x7F,0x09,0x09,0x09,0x06,0x00}, // P
{0x3E,0x41,0x51,0x21,0x5E,0x00}, // Q
{0x7F,0x09,0x19,0x29,0x46,0x00}, // R
{0x46,0x49,0x49,0x49,0x31,0x00}, // S
{0x01,0x01,0x7F,0x01,0x01,0x00}, // T
{0x3F,0x40,0x40,0x40,0x3F,0x00}, // U
{0x1F,0x20,0x40,0x20,0x1F,0x00}, // V
{0x3F,0x40,0x38,0x40,0x3F,0x00}, // W
{0x63,0x14,0x08,0x14,0x63,0x00}, // X
{0x07,0x08,0x70,0x08,0x07,0x00}, // Y
{0x61,0x51,0x49,0x45,0x43,0x00}, // Z
{0x00,0x7F,0x41,0x41,0x00,0x00}, // [
{0x02,0x04,0x08,0x10,0x20,0x00}, // \
{0x00,0x41,0x41,0x7F,0x00,0x00}, // ]
{0x04,0x02,0x01,0x02,0x04,0x00}, // ^
{0x40,0x40,0x40,0x40,0x40,0x00}, // _
{0x00,0x01,0x02,0x04,0x00,0x00}, // `
{0x20,0x54,0x54,0x54,0x78,0x00}, // a
{0x7F,0x44,0x44,0x44,0x38,0x00}, // b
{0x38,0x44,0x44,0x44,0x20,0x00}, // c
{0x38,0x44,0x44,0x44,0x7F,0x00}, // d
{0x38,0x54,0x54,0x54,0x18,0x00}, // e
{0x08,0x7E,0x09,0x01,0x02,0x00}, // f
{0x0C,0x52,0x52,0x52,0x3E,0x00}, // g
{0x7F,0x08,0x04,0x04,0x78,0x00}, // h
{0x00,0x44,0x7D,0x40,0x00,0x00}, // i
{0x20,0x40,0x44,0x3D,0x00,0x00}, // j
{0x7F,0x10,0x28,0x44,0x00,0x00}, // k
{0x00,0x41,0x7F,0x40,0x00,0x00}, // l
{0x7C,0x04,0x78,0x04,0x78,0x00}, // m
{0x7C,0x08,0x04,0x04,0x78,0x00}, // n
{0x38,0x44,0x44,0x44,0x38,0x00}, // o
{0x7C,0x14,0x14,0x14,0x08,0x00}, // p
{0x08,0x14,0x14,0x14,0x7C,0x00}, // q
{0x7C,0x08,0x04,0x04,0x08,0x00}, // r
{0x48,0x54,0x54,0x54,0x20,0x00}, // s
{0x04,0x3F,0x44,0x40,0x20,0x00}, // t
{0x3C,0x40,0x40,0x20,0x7C,0x00}, // u
{0x1C,0x20,0x40,0x20,0x1C,0x00}, // v
{0x3C,0x40,0x30,0x40,0x3C,0x00}, // w
{0x44,0x28,0x10,0x28,0x44,0x00}, // x
{0x0C,0x50,0x50,0x50,0x3C,0x00}, // y
{0x44,0x64,0x54,0x4C,0x44,0x00}, // z
{0x00,0x08,0x36,0x41,0x00,0x00}, // {
{0x00,0x00,0x7F,0x00,0x00,0x00}, // |
{0x00,0x41,0x36,0x08,0x00,0x00}, // }
{0x08,0x08,0x2A,0x1C,0x08,0x00}, // ->
{0x08,0x1C,0x2A,0x08,0x08,0x00} // <-
};
uint8_t index = ch - 32;
if (index > 95) index = 0;
OLED_SetPos(x, y);
for (uint8_t i = 0; i < 6; i++) {
OLED_WriteData(font6x8[index][i]);
}
}
/* 设置OLED显示位置 */
void OLED_SetPos(uint8_t x, uint8_t y) {
OLED_WriteCommand(0xB0 + y);
OLED_WriteCommand(((x & 0xF0) >> 4) | 0x10);
OLED_WriteCommand(x & 0x0F);
}
/* 绘制像素点 */
void OLED_DrawPixel(uint8_t x, uint8_t y, uint8_t color) {
// 简化版,实际需要读取当前页数据再修改
OLED_SetPos(x, y / 8);
if (color) {
OLED_WriteData(1 << (y % 8));
} else {
OLED_WriteData(0x00);
}
}
六、主程序与系统集成
6.1 主程序框架
/* 系统主程序 */
#include "stm32f10x.h"
#include "system_stm32f10x.h"
// 系统滴答定时器
void SysTick_Init(void) {
SysTick_Config(SystemCoreClock / 1000); // 1ms中断
}
void SysTick_Handler(void) {
system_tick++;
}
uint32_t Get_SystemTick(void) {
return system_tick;
}
// 微秒延时
void delay_us(uint32_t us) {
us *= (SystemCoreClock / 1000000) / 5;
while (us--) {
__NOP();
}
}
// 毫秒延时
void delay_ms(uint32_t ms) {
uint32_t start = system_tick;
while ((system_tick - start) < ms);
}
int main(void) {
// 系统初始化
SystemInit();
SysTick_Init();
// 初始化串口(用于printf调试)
USART1_Init();
printf("\r\n=== Parking Radar System Starting ===\r\n");
// 初始化各模块
printf("Initializing ultrasonic sensors...\r\n");
Ultrasonic_Init();
printf("Initializing alarm system...\r\n");
Alarm_System_Init();
printf("Initializing buzzer PWM...\r\n");
Buzzer_PWM_Init();
printf("Initializing OLED display...\r\n");
OLED_Init();
// 显示启动画面
OLED_Clear();
OLED_ShowString(30, 0, "Parking Radar");
OLED_ShowString(35, 2, "System Boot");
OLED_ShowString(25, 4, "Version 1.0");
OLED_ShowString(20, 6, "Initializing...");
delay_ms(2000);
printf("All modules initialized successfully!\r\n");
printf("Starting main loop...\r\n");
// 主循环
while (1) {
// 1. 超声波测距
Ultrasonic_Measure_Task();
// 2. 更新报警系统
Update_Alarm_System();
// 3. 更新蜂鸣器
Update_Buzzer();
// 4. 更新OLED显示(每秒刷新10次)
static uint32_t last_display_time = 0;
if (system_tick - last_display_time >= 100) {
Update_OLED_Display();
last_display_time = system_tick;
}
// 5. 串口调试输出(每秒一次)
static uint32_t last_debug_time = 0;
if (system_tick - last_debug_time >= 1000) {
printf("Distances: LF=%.1fm, RF=%.1fm, LB=%.1fm, RB=%.1fm\n",
ultra_sensors[ULTRA_LEFT_FRONT].distance_mm / 1000.0f,
ultra_sensors[ULTRA_RIGHT_FRONT].distance_mm / 1000.0f,
ultra_sensors[ULTRA_LEFT_BACK].distance_mm / 1000.0f,
ultra_sensors[ULTRA_RIGHT_BACK].distance_mm / 1000.0f);
printf("Alarm Level: %d\n", alarm_system.max_level);
last_debug_time = system_tick;
}
// 6. 延时
delay_ms(10);
}
}
七、系统测试与优化
7.1 测试方案
/* 系统测试程序 */
void system_test(void) {
printf("=== Parking Radar System Test ===\n");
// 1. 硬件功能测试
printf("1. Hardware Function Test\n");
test_ultrasonic_sensors();
test_led_indicators();
test_buzzer();
test_oled_display();
// 2. 距离测量精度测试
printf("2. Distance Measurement Accuracy Test\n");
test_distance_accuracy();
// 3. 报警逻辑测试
printf("3. Alarm Logic Test\n");
test_alarm_levels();
// 4. 系统稳定性测试
printf("4. System Stability Test\n");
test_system_stability();
// 5. 功耗测试
printf("5. Power Consumption Test\n");
test_power_consumption();
printf("=== All Tests Completed ===\n");
}
/* 超声波传感器测试 */
void test_ultrasonic_sensors(void) {
printf("Testing ultrasonic sensors...\n");
for (uint8_t i = 0; i < ULTRA_MAX_COUNT; i++) {
Ultrasonic_Trigger(&ultra_sensors[i]);
delay_ms(100);
if (ultra_sensors[i].valid) {
printf("Sensor %d: OK, Distance: %.1fm\n",
i, ultra_sensors[i].distance_mm / 1000.0f);
} else {
printf("Sensor %d: FAILED\n", i);
}
}
}
/* 报警等级测试 */
void test_alarm_levels(void) {
printf("Testing alarm levels...\n");
// 模拟不同距离
uint32_t test_distances[] = {1500, 800, 300, 100};
const char* level_names[] = {"SAFE", "WARN", "DANGER", "CRITICAL"};
for (uint8_t i = 0; i < 4; i++) {
ultra_sensors[0].distance_mm = test_distances[i];
ultra_sensors[0].valid = 1;
AlarmLevel level = Determine_Alarm_Level(test_distances[i]);
printf("Distance: %dmm -> Level: %s\n",
test_distances[i], level_names[level]);
Update_Alarm_System();
delay_ms(1000);
}
}
7.2 系统优化建议
/* 系统优化建议 */
void system_optimization_tips(void) {
printf("System Optimization Tips:\n");
printf("1. Use median filter for distance measurement to reduce noise\n");
printf("2. Implement temperature compensation for sound speed\n");
printf("3. Add self-test function during system startup\n");
printf("4. Implement low-power mode when vehicle is parked\n");
printf("5. Add CAN bus interface for vehicle integration\n");
printf("6. Implement data logging for diagnostic purposes\n");
printf("7. Add automatic calibration function\n");
printf("8. Implement multiple detection zones\n");
printf("9. Add visual and audio warnings simultaneously\n");
printf("10. Implement obstacle tracking algorithm\n");
}
/* 中位值滤波 */
uint32_t median_filter(uint32_t *buffer, uint8_t size) {
uint32_t temp;
uint8_t i, j;
// 冒泡排序
for (i = 0; i < size - 1; i++) {
for (j = 0; j < size - 1 - i; j++) {
if (buffer[j] > buffer[j + 1]) {
temp = buffer[j];
buffer[j] = buffer[j + 1];
buffer[j + 1] = temp;
}
}
}
// 返回中值
return buffer[size / 2];
}
/* 温度补偿 */
float temperature_compensation(float temperature) {
// 声速随温度变化公式:v = 331.5 + 0.6 * T
// T为摄氏温度
return 331.5f + 0.6f * temperature;
}
八、总结
这个基于STM32的倒车雷达系统实现了以下功能:
核心功能:
- 多传感器融合:4个超声波传感器全方位覆盖
- 精确测距:±1cm测量精度,0.02~4.0m有效范围
- 分级报警:红黄绿三级LED指示+蜂鸣器报警
- 实时显示:OLED直观显示各方向距离
- 快速响应:<100ms系统响应时间
技术亮点:
- 输入捕获测距:使用定时器输入捕获精确测量回波时间
- PWM蜂鸣器控制:不同报警等级对应不同频率和模式
- OLED图形显示:条形图直观显示障碍物距离
- 抗干扰设计:软件滤波提高测量稳定性
- 低功耗优化:可根据车辆状态调整工作模式
应用场景:
- 乘用车倒车辅助:小型车、SUV、MPV
- 商用车倒车安全:货车、客车、特种车辆
- 工业车辆防护:叉车、AGV小车、工程机械
- 智能泊车系统:自动泊车辅助设备
- 安防监控系统:周界防范、入侵检测
扩展方向:
- CAN总线集成:与车载CAN网络无缝对接
- 摄像头融合:视觉+超声波多传感器融合
- 自动刹车系统:紧急情况自动制动
- 手机APP互联:蓝牙/WiFi连接智能手机
- 云端数据分析:驾驶行为分析和远程监控