学完江科大STM32教程后,我用TB6612和HC-SR04做了个能避障的蓝牙小车(附完整代码)
从零打造STM32智能避障小车模块整合与代码架构实战刚学完STM32基础教程的你是否在寻找一个能串联GPIO、PWM、定时器等知识点的实战项目本文将带你完整实现一个融合蓝牙控制与超声波避障的智能小车重点解决模块协同、代码架构设计等实际问题。1. 项目规划与硬件选型1.1 核心功能设计智能小车需要实现三个基础功能层级运动控制层直流电机驱动与PWM调速环境感知层超声波测距与红外循迹交互控制层蓝牙指令接收与响应硬件配置方案| 模块类型 | 型号 | 关键参数 | 接口方式 | |----------------|---------------|------------------------------|------------| | 主控 | STM32F103C8T6 | 72MHz Cortex-M3, 64KB Flash | - | | 电机驱动 | TB6612FNG | 1.2A持续电流, 双H桥 | GPIOPWM | | 超声波 | HC-SR04 | 2-400cm检测范围 | 脉冲IO | | 蓝牙模块 | HC-05 | 经典蓝牙SPP协议 | USART | | 底盘套件 | 四轮驱动 | 6V减速电机 | - |提示TB6612相比L298N具有更低的热损耗PWM响应频率可达100kHz是更优的电机驱动选择1.2 引脚资源分配合理的引脚规划能避免后期功能扩展冲突// motor.c #define MOTOR_RIGHT_IN1 GPIO_Pin_4 #define MOTOR_RIGHT_IN2 GPIO_Pin_5 #define MOTOR_LEFT_IN1 GPIO_Pin_6 #define MOTOR_LEFT_IN2 GPIO_Pin_7 #define PWM_TIM TIM2 // hc-sr04.c #define TRIG_PIN GPIO_Pin_8 #define ECHO_PIN GPIO_Pin_9 #define MEASURE_TIM TIM3 // bluetooth.c #define USART_Bluetooth USART12. 电机驱动与运动控制2.1 TB6612驱动实现电机控制需要协调GPIO方向信号与PWM调速信号void Motor_SetSpeed(Motor_Type motor, int16_t speed) { GPIO_TypeDef* port MOTOR_GPIO_PORT; uint16_t in1_pin, in2_pin; if(motor MOTOR_LEFT) { in1_pin MOTOR_LEFT_IN1; in2_pin MOTOR_LEFT_IN2; PWM_SetCompare2(abs(speed)); } else { in1_pin MOTOR_RIGHT_IN1; in2_pin MOTOR_RIGHT_IN2; PWM_SetCompare1(abs(speed)); } if(speed 0) { // 正转 GPIO_SetBits(port, in1_pin); GPIO_ResetBits(port, in2_pin); } else if(speed 0) { // 反转 GPIO_ResetBits(port, in1_pin); GPIO_SetBits(port, in2_pin); } else { // 刹车 GPIO_SetBits(port, in1_pin); GPIO_SetBits(port, in2_pin); } }2.2 运动控制算法基础运动模式可通过组合电机状态实现1. **前进**左右电机同速正转 2. **后退**左右电机同速反转 3. **原地左转**左电机反转右电机正转 4. **渐进转向**单侧电机降速实现弧度转弯 5. **制动停止**双电机短接刹车注意实际测试中发现电机存在5%-10%的转速差异建议在代码中加入校准系数3. 超声波避障系统优化3.1 测距稳定性处理针对HC-SR04上电异常和测量波动问题采用三重滤波策略#define SAMPLE_TIMES 5 float GetFilteredDistance(void) { float valid_samples[SAMPLE_TIMES]; uint8_t count 0; for(int i0; iSAMPLE_TIMES2; i) { float dist HCSR04_GetRawDistance(); if(dist 2.0 dist 400.0) { // 剔除异常值 valid_samples[count] dist; if(count SAMPLE_TIMES) break; } Delay_ms(30); } // 中值平均滤波 bubbleSort(valid_samples, count); float sum 0; for(int i1; icount-1; i) { // 去掉首尾极值 sum valid_samples[i]; } return sum/(count-2); }3.2 避障决策逻辑多级距离阈值控制策略| 距离区间 | 响应策略 | 动作参数 | |----------|---------------------------|--------------------| | 10cm | 紧急制动后退 | 全速后退300ms | | 10-20cm | 减速转向避让 | 速度降至30% | | 20-50cm | 保持速度预备转向 | 开启障碍物方位检测 | | 50cm | 全速前进 | 100%占空比 |4. 蓝牙控制与系统整合4.1 协议设计自定义简洁控制指令集- F : 前进(Forward) - B : 后退(Backward) - L : 左转(Left) - R : 右转(Right) - S : 停止(Stop) - 1-9 : 速度等级(10%-90%)4.2 多任务处理架构采用状态机模式管理不同功能模块typedef enum { MODE_MANUAL, // 蓝牙遥控 MODE_AUTO, // 自动避障 MODE_LINE_TRACE // 循迹模式 } WorkMode; void Main_Decision(void) { static WorkMode mode MODE_MANUAL; if(Serial_RxFlag) { char cmd Serial_GetChar(); if(cmd A) mode MODE_AUTO; else if(cmd M) mode MODE_MANUAL; // ...其他模式切换 } switch(mode) { case MODE_MANUAL: Bluetooth_Process(); break; case MODE_AUTO: Auto_Avoidance(); break; // ...其他模式 } }5. 调试技巧与性能优化5.1 常见问题解决方案电机响应延迟检查PWM频率是否在10-20kHz最佳范围超声波误触发在Trig信号前增加50ms的模块复位间隔蓝牙连接不稳定确保模块供电电压≥3.3V且波特率匹配5.2 功耗优化措施1. 空闲时切换TIM为低功耗模式 2. 蓝牙无连接时降低广播频率 3. 采用间断式超声波检测非连续扫描 4. 电机停止时关闭TB6612使能端在最终测试中这套架构实现了200ms级别的实时响应能力超声波测距误差控制在±1cm内。一个特别实用的技巧是用LED指示灯的不同闪烁频率来标识系统当前状态这比串口打印更直观且不占用额外资源。