基于STM32的倒车雷达系统设计

基于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的倒车雷达系统实现了以下功能:

核心功能:

  1. 多传感器融合:4个超声波传感器全方位覆盖
  2. 精确测距:±1cm测量精度,0.02~4.0m有效范围
  3. 分级报警:红黄绿三级LED指示+蜂鸣器报警
  4. 实时显示:OLED直观显示各方向距离
  5. 快速响应:<100ms系统响应时间

技术亮点:

  1. 输入捕获测距:使用定时器输入捕获精确测量回波时间
  2. PWM蜂鸣器控制:不同报警等级对应不同频率和模式
  3. OLED图形显示:条形图直观显示障碍物距离
  4. 抗干扰设计:软件滤波提高测量稳定性
  5. 低功耗优化:可根据车辆状态调整工作模式

应用场景:

扩展方向:

  1. CAN总线集成:与车载CAN网络无缝对接
  2. 摄像头融合:视觉+超声波多传感器融合
  3. 自动刹车系统:紧急情况自动制动
  4. 手机APP互联:蓝牙/WiFi连接智能手机
  5. 云端数据分析:驾驶行为分析和远程监控

专注于matlab/simulink,电子电路,编程