当前位置: 首页 > news >正文

学完江科大STM32教程后,我用TB6612和HC-SR04做了个能避障的蓝牙小车(附完整代码)

从零打造STM32智能避障小车:模块整合与代码架构实战

刚学完STM32基础教程的你,是否在寻找一个能串联GPIO、PWM、定时器等知识点的实战项目?本文将带你完整实现一个融合蓝牙控制与超声波避障的智能小车,重点解决模块协同、代码架构设计等实际问题。

1. 项目规划与硬件选型

1.1 核心功能设计

智能小车需要实现三个基础功能层级:

  • 运动控制层:直流电机驱动与PWM调速
  • 环境感知层:超声波测距与红外循迹
  • 交互控制层:蓝牙指令接收与响应

硬件配置方案

| 模块类型 | 型号 | 关键参数 | 接口方式 | |----------------|---------------|------------------------------|------------| | 主控 | STM32F103C8T6 | 72MHz Cortex-M3, 64KB Flash | - | | 电机驱动 | TB6612FNG | 1.2A持续电流, 双H桥 | GPIO+PWM | | 超声波 | 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 USART1

2. 电机驱动与运动控制

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 i=0; i<SAMPLE_TIMES+2; 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 i=1; i<count-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指示灯的不同闪烁频率来标识系统当前状态,这比串口打印更直观且不占用额外资源。

http://www.jsqmd.com/news/565923/

相关文章:

  • bilibili-api完全指南:评论数据爬取的4个突破式解决方案
  • Seed-Coder-8B-Base应用案例:自动生成运维脚本,提升10倍开发效率
  • MAX32630FTHR平台RF95 LoRa精简移植实战
  • 万里通积分卡回收的隐藏技巧:迅速处理用不上的卡片 - 团团收购物卡回收
  • 幼猫猫粮品牌哪家好?2026年3月推荐评测口碑对比知名五款 - 品牌推荐
  • Czkawka终极指南:如何用Rust构建的高效文件清理工具释放你的磁盘空间
  • 借力快马AI,高效生成属于你的9·1式免费效率工具代码
  • 构建AI驱动的量化交易平台:Qbot技术架构深度解析与实践指南
  • Power BI 网页数据抓取实战:以新浪外汇为例,教你5分钟搞定动态表格导入与清洗
  • 当孩子面临注意力缺陷时,如何通过ADHD运动干预提高专注力?
  • 深度学习环境搭建不再难:PyTorch 2.6镜像快速部署指南
  • 工业机器人测试:上位机指令 → EtherCAT → 伺服驱动(PWM)+ 传感器(I2C/AD)反馈,如何端到端验证?
  • 如何在Windows上使用开源工具优化你的原神游戏体验?
  • 回收揭秘:百联OK卡为什么用不上及省心的回收策略 - 团团收购物卡回收
  • OpenClaw 别碰,不安全。我不信,给老板拆解了 OpenClaw 的全部架构之后
  • Python脚本自动化Abaqus仿真:从单次建模到批量参数化分析的完整指南
  • 转行AIGC,杭州培训助你3个月入职大厂
  • 2026 年重庆泡沫箱哪家好?本地实力强口碑佳的厂家详解 - 深度智识库
  • TensorFlow实战:用CIFAR-10数据集训练你的第一个图像分类模型(附完整代码)
  • 2026年清洗设备厂家推荐:郑州广源清洗设备有限公司,路面高压/自动/工业管道清洗设备全系供应 - 品牌推荐官
  • 防脱洗发水哪个牌子的效果好?精选好口碑防脱发洗发水好口碑推荐 - 博客万
  • Czkawka终极指南:Rust编写的开源存储清理神器如何释放你的磁盘空间
  • 第3期 工程车辆目标检测数据集
  • 3步搞定长网页完整截图:这款轻量工具让你告别拼接烦恼
  • 紧急预警⚠️ 中石化加油卡别闲置!正规回收,白捡一笔零花钱 - 可可收
  • AI驱动的科研绘图革命:DeTikZify如何终结图表代码的手动时代
  • 2025-2026年全球幼猫猫粮品牌评测:五大口碑产品推荐对比领先 - 品牌推荐
  • 重庆威瑞得:深耕 EPS 材料领域 打造西南专业解决方案服务商 - 深度智识库
  • Verify开源网络验证系统深度体验:Spring Boot+Vue架构解析与二次开发指南
  • Oni-Duplicity终极指南:3分钟掌握《缺氧》存档修改,打造完美殖民地