基于 STM32F103 蓝牙遥控云台超声波避障小车

发布时间:2026/7/24 10:09:31
基于 STM32F103 蓝牙遥控云台超声波避障小车 项目概述硬件系统设计资源分配与硬件接线表定时器资源规划软件总体架构模块详细原理说明通信协议规范程序运行流程关键代码说明系统调试要点与现存问题功能扩展方案1 项目概述本系统为蓝牙遥控智能探测小车搭载 SG90 舵机云台带动 HC-SR04 超声波传感器实现多角度环境测距支持手机蓝牙单字符指令远程控制小车运动、云台定位、云台自动往复扫描搭载三色 LED 分级距离报警、0.96 寸 OLED 双页面状态显示定时向上位机回传障碍物距离、舵机角度、危险预警信息。核心功能列表HC-05 蓝牙无线指令遥控小车前进、后退、左转、右转、停止TIM2 PWM 实现电机调速支持高速 / 低速档位切换SG90 舵机云台手动角度定位0°/90°/180°、自动往复扫描HC-SR04 超声波测距测量单位 cm超时无回波标记超量程三色 LED 按照障碍物距离分级常亮 / 闪烁预警OLED 双页面循环刷新实时展示系统运行状态串口节流上报传感数据降低串口占用所有外设模块化驱动便于调试与功能拓展。2 硬件系统设计2.1 硬件清单表格序号器件名称型号功能1主控芯片STM32F103C8T6系统核心控制器2蓝牙串口模块HC-05无线通信9600 波特率3电机驱动模块L298N两路直流减速电机驱动4舵机SG909g超声波云台旋转5超声波传感器HC-SR04障碍物距离检测6显示屏0.96 寸 OLEDSSD1306软件 I2C 显示7指示灯红 / 黄 / 绿 LED距离分级报警8执行机构直流减速电机 小车底盘小车运动9供电系统锂电池组整机供电2.2 系统总体框图plaintext手机蓝牙APP ←→ HC-05 ←→ USART1 ←→ STM32F103主控 ↓ ┌────────┬────────┬────────┬────────┬────────┐ │TIM3舵机│TIM2电机│HC-SR04 │OLED屏 │三色LED │ │PWM云台 │PWM调速 │测距模块│显示模块│报警指示│ └────────┴────────┴────────┴────────┴────────┘3 引脚资源分配与硬件接线表重要预处理上电执行GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);释放 PA15 引脚用作 TIM2_CH1 PWM 输出同时保留 SWD 下载调试功能。3.1 电机控制GPIOA表格信号引脚功能MOT_IN1PA0L298N IN1 方向控制MOT_IN2PA1L298N IN2 方向控制MOT_IN3PA2L298N IN3 方向控制MOT_IN4PA3L298N IN4 方向控制PWM 调速PA15(TIM2_CH1)L298N 使能调速信号3.2 LED 报警指示灯GPIOB表格信号引脚功能LED_GREENPB0绿色安全指示灯LED_YELLOWPB1黄色预警指示灯LED_REDPB2红色危险指示灯3.3 HC-SR04 超声波模块GPIOB表格信号引脚功能TrigPB5超声波触发输出EchoPB6超声波回波输入3.4 SG90 舵机云台表格信号引脚功能舵机 PWMPA6(TIM3_CH1)50Hz 舵机控制信号3.5 HC-05 蓝牙模块 USART1表格信号引脚功能TXSTM32→蓝牙PA9 USART1_TX串口发送RX蓝牙→STM32PA10 USART1_RX串口接收中断3.6 OLED 显示屏软件 I2Coled.h 内部宏定义SDA、SCL 使用 PA 口自定义引脚由 oled 驱动文件内部宏控制。4 定时器资源规划系统时钟 72MHz表格定时器功能配置参数输出引脚SysTick系统延时 delay_ms/delay_us72MHzHCLK/8无引脚TIM3SG90 舵机 50Hz PWMPSC71ARR19999PA6 CH1TIM2电机调速 PWM 输出PSC71ARR999PA15 CH1TIM4超声波计时时基PSC71ARR9中断周期 10μs无输出引脚说明TIM4 中断服务函数代码暂时注释可根据需求开启用于超声波脉宽计时。5 软件总体架构采用前后台裸机架构后台异步中断USART1 接收中断接收蓝牙单字符指令置位接收标志位 TIM4 更新中断提供 10μs 计时基准可选开启。前台主循环 while (1) 轮询指令解析 → 超声波测距 → 云台角度控制 → 电机持续输出 → LED 报警逻辑 → 串口数据上报 → OLED 页面刷新。工程文件划分main.c应用层主逻辑、状态调度、外设初始化SystemTime.hSysTick 延时函数lanya.h/cUSART1 蓝牙通信驱动、接收中断servo.h/cTIM3 舵机 PWM 驱动、角度设置HC_SR04超声波触发、测距、距离换算oled.h/c软件 I2C OLED 显存驱动、字符 / 数字显示电机驱动函数GPIO 初始化、PWM 占空比配置、运动控制6 模块详细原理说明6.1 电机驱动与调速模块IN1~IN4 为方向控制 GPIO控制电机正反转PA15 输出 TIM2 PWM 信号接到 L298N 使能引脚实现调速PWM 配置ARR999PSC71频率 72M/(711)/(9991)1kHzSetPWM_Duty()修改 CCR1 寄存器占空比范围 0~999指令V将占空比设置为 400实现低速行驶默认占空比 600。电机动作逻辑F前进IN11,IN20IN31,IN40B后退IN10,IN21IN30,IN41L左转IN10,IN21IN31,IN40R右转IN11,IN20IN30,IN41S停止全部引脚拉低6.2 SG90 舵机云台控制SG90 标准控制50Hz PWM周期 20ms 脉宽计算公式 \(Pulse 500 angle × \frac{2000}{180}\)0° → 50090° → 1500180° → 2500自动扫描模式角度 0°↔180° 往复每 5ms 步进 10°收到定位指令自动关闭自动扫描。6.3 HC-SR04 超声波测距原理Trig 输出 15μs 高电平触发超声波发射等待 Echo 上升沿、下降沿通过 TIM4 累计 10μs 计时音速取 25℃标准 346m/s往返距离换算 \(Distance_{mm}\frac{time×346}{200}\)增加两级超时保护无有效回波返回 0上层代码将距离标记为 999.0cm超量程主循环每 5 次轮询执行一次测距降低 CPU 占用。6.4 LED 分级报警策略LED 为低电平点亮distance 100cm绿灯常亮 → 安全区域50cm ≤ distance ≤ 100cm黄灯 5ms 周期闪烁 → 预警区域distance 50cm红灯 5ms 周期闪烁 → 危险区域6.5 OLED 显示机制双页面交替刷新页面切换间隔 150ms页面 1云台角度 Angle 障碍物距离 Dist页面 2小车运动状态 MOT、云台扫描开关 SCAN、危险提示 WARN (SAFE/DANGER) 驱动采用显存缓存OLED_GRAM数组统一调用OLED_Refresh()刷新屏幕减少 I2C 频繁通信。7 通信协议规范7.1 上位机下发控制指令单字符指令表格指令功能说明0舵机定位 0°关闭自动扫描1舵机定位 90°关闭自动扫描2舵机定位 180°关闭自动扫描F小车前进B小车后退L小车左转R小车右转S小车停止K开启云台自动往复扫描G关闭自动扫描舵机归零 0°V电机调速至低速占空比 400通信机制串口中断接收单字节接收完成置usart_flag1主循环解析指令。7.2 小车向上位机主动上报数据包上报周期200ms节流控制防止串口刷屏 输出格式plaintextDIST:XX.Xcm,WARN:X,ANG:XXX\r\nDIST障碍物距离cmWARN1 距离50cm 危险0 安全ANG舵机当前角度0~1808 程序运行流程系统初始化顺序 释放 PA15 引脚 → SysTick 延时 → NVIC 优先级分组 → OLED → 舵机 → USART1 → HC-SR04 → TIM4 → 电机 GPIO → LED → TIM2 PWMOLED 打印启动提示延时 800ms 清屏上电舵机归位 0°进入主循环轮询 ① 判断蓝牙接收标志解析指令更新小车状态、云台状态 ② 定时触发超声波测距更新距离变量 ③ 若开启自动扫描持续更新舵机角度 ④ 持续输出电机控制电平 ⑤ 根据距离阈值执行 LED 亮灭 / 闪烁逻辑 ⑥ 200ms 定时向上位机发送传感数据 ⑦ OLED 双页面交替刷新 ⑧ delay_ms (150)进入下一轮循环。9 关键代码说明全局状态变量c运行u8 motor_run_state S; //小车运行状态 u8 scan_mode 0; //云台自动扫描开关 uint16_t motor_pwm_duty 600; //电机PWM占空比 u16 angle 0; //舵机角度 float distance 0.0f; //障碍物距离(cm)串口接收采用单字节接收适合蓝牙简易遥控 APP超声波测距加入超时保护避免程序卡死在 while 等待OLED 采用显存缓存机制所有绘图操作先写入数组统一刷新数据上报增加时间戳节流避免频繁占用串口总线。10 系统调试要点与现存问题调试注意事项PA15 复用冲突必须执行GPIO_Remap_SWJ_JTAGDisable否则 TIM2_CH1 无法输出 PWM整机所有模块必须共地电机大电流干扰会导致串口、超声波数据异常SG90 舵机负载不宜过重云台轻量化防止电压跌落导致单片机复位HC-SR04 存在盲区小于 2cm 无法测量软材质障碍物测距误差较大当前代码存在缺陷主循环使用delay_ms(150)阻塞延时降低系统实时响应超声波未做多次采样滤波测距数据波动较大蓝牙仅支持单字符指令无法连续调速无指令超时看门狗蓝牙断开后小车持续保持原有动作TIM4 中断函数注释若开启需要保证中断变量time使用 volatile 修饰。11 功能扩展方案移除阻塞 delay基于 tick_ms 实现非阻塞事件调度提升实时性增加超声波多次采样均值滤波稳定测距数据设计多字符通信协议支持连续调速、角度连续控制添加指令超时检测蓝牙失联后小车自动停止增加自动避障逻辑距离阈值自动转向避让增加蜂鸣器声音报警增加电池电压检测与低电量报警增加按键本地手动控制。12 核心代码#include SystemTime.h static u8 fac_us0; //us延时倍乘数 static u16 fac_ms0; //ms延时倍乘数 //初始化延迟函数 //SYSTICK的时钟固定为AHB时钟的1/8 //SYSCLK:系统时钟频率 void SysTick_Init(u8 SYSCLK) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_usSYSCLK/8; fac_ms(u16)fac_us*1000; SysTick-CTRL SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk; } //延时nus //nus为要延时的us数. void delay_us(u32 nus) { u32 temp; SysTick-LOADnus*fac_us; //时间加载 SysTick-VAL0x00; //清空计数器 SysTick-CTRL|SysTick_CTRL_ENABLE_Msk ; //开始倒数 do { tempSysTick-CTRL; }while((temp0x01)!(temp(116))); //等待时间到达 SysTick-CTRL~SysTick_CTRL_ENABLE_Msk; //关闭计数器 SysTick-VAL 0X00; //清空计数器 } //延时nms //注意nms的范围 //SysTick-LOAD为24位寄存器,所以,最大延时为: //nms0xffffff*8*1000/SYSCLK //SYSCLK单位为Hz,nms单位为ms //对72M条件下,nms1864 void delay_ms(u16 nms) { u32 temp; SysTick-LOAD(u32)nms*fac_ms; //时间加载(SysTick-LOAD为24bit) SysTick-VAL 0x00; //清空计数器 SysTick-CTRL|SysTick_CTRL_ENABLE_Msk ; //开始倒数 do { tempSysTick-CTRL; }while((temp0x01)!(temp(116))); //等待时间到达 SysTick-CTRL~SysTick_CTRL_ENABLE_Msk; //关闭计数器 SysTick-VAL 0X00; //清空计数器 }