1. 项目背景与核心目标
去年夏天,我在自家车库折腾出一辆能自动循迹的STM32智能车,整个过程踩坑无数却也收获颇丰。这种基于微控制器的智能小车,本质上是一个移动的嵌入式系统开发平台,它完美融合了硬件设计、传感器应用和运动控制三大技术模块。
对于电子爱好者而言,智能车项目就像"电子工程师的乐高积木"——通过组装轮子、电机、电路板和各种传感器,再编写控制程序,就能实现自动避障、巡线行驶甚至无线遥控等功能。我选择STM32F103C8T6作为主控,这款Cortex-M3内核的MCU性价比极高,72MHz主频足够处理多路传感器数据,丰富的GPIO和PWM资源也方便驱动电机。
新手常见误区:很多人以为智能车必须用树莓派这类Linux板子,其实基础功能用STM32完全够用,而且实时性更好,成本更低。
2. 硬件架构设计与选型
2.1 主控板选型对比
我对比了三款主流开发板:
- 正点原子MiniSTM32:资源丰富但体积较大
- 野火指南者:集成电机驱动接口
- 自制的核心板:最小系统+电平转换
最终选择自制核心板,主要考虑:
- 车体空间有限(15cm×10cm)
- 需要直接控制电机驱动芯片
- 降低成本(BOM成本控制在50元内)
2.2 关键传感器配置
巡线功能需要5路红外对管(TCRT5000):
- 安装高度距地面1.5cm最佳
- 每路间隔2cm可覆盖8cm检测宽度
- 通过比较器输出数字信号减少MCU负担
避障模块选用HC-SR04超声波:
- 触发信号需要至少10μs高电平
- 回响信号测量需开启输入捕获
- 实测3cm-400cm检测范围够用
2.3 动力系统设计
电机选型经过三次迭代:
- 最初用N20减速电机(扭矩不足)
- 换装TT马达(转速不稳定)
- 最终选定JGA25-370直流电机:
- 额定电压6V
- 空载转速200rpm
- 加装编码器实现闭环控制
驱动芯片用L298N双H桥:
- 使能端接PWM实现调速
- IN1/IN2控制转向逻辑
- 需加装散热片防止过热
3. 软件系统实现细节
3.1 开发环境搭建
使用Keil MDK+STM32CubeMX组合:
- CubeMX配置时钟树(72MHz主频)
- 生成带HAL库的基础工程
- 添加FreeRTOS实现多任务调度
关键外设初始化:
c复制// PWM配置(10kHz频率)
htim3.Instance = TIM3;
htim3.Init.Prescaler = 72-1;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 100-1;
HAL_TIM_PWM_Init(&htim3);
// 超声波GPIO设置
GPIO_InitStruct.Pin = TRIG_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(TRIG_PORT, &GPIO_InitStruct);
3.2 巡线算法实现
采用加权平均值算法:
- 给每路红外分配权重值(-2,-1,0,1,2)
- 计算当前位置偏差:
c复制error = (s1*(-2) + s2*(-1) + s4*1 + s5*2) / (s1+s2+s3+s4+s5) - PID控制器输出:
- KP=0.8(比例项)
- KI=0.01(积分项)
- KD=0.3(微分项)
实测发现积分项容易累积误差,最终采用PD控制更稳定。
3.3 无线遥控功能
通过HC-05蓝牙模块实现:
- 配置AT指令设置为从机模式
- 串口中断接收手机APP指令
- 协议设计示例:
code复制F100B050 // 前进速度100,转向角50 S000B000 // 停车
4. 调试过程与问题排查
4.1 电机异常抖动问题
现象:PWM占空比>70%时电机剧烈震动
排查过程:
- 用示波器检查PWM波形正常
- 测量电源电压发现跌落严重
- 更换4节18650电池为2S锂电
- 在电机两端并联100μF电容
根本原因:电源内阻过大导致电压骤降
4.2 巡线丢线问题
当遇到直角弯时经常冲出赛道:
解决方案:
- 增加外侧轮差速(差速比1.5:1)
- 检测到全白信号时保持最后有效转向
- 加入陀螺仪辅助判断车身姿态
4.3 功耗优化技巧
待机电流从120mA降至35mA:
- 关闭未用外设时钟
c复制
__HAL_RCC_TIM4_CLK_DISABLE(); - 传感器供电改用MOS管控制
- 空闲任务进入STOP模式
5. 进阶改进方向
5.1 视觉方案升级
测试过OpenMV模块:
- 优点:可直接识别颜色和形状
- 缺点:30fps帧率导致响应延迟
- 折中方案:STM32+OV7725摄像头
- 仅提取赛道边界特征点
- 用DMA传输图像数据
5.2 运动控制优化
实现闭环速度控制:
- 电机加装AB相编码器
- 定时器编码器接口模式
c复制TIM_Encoder_InitTypeDef sConfig = {0}; sConfig.EncoderMode = TIM_ENCODERMODE_TI12; - 位置式PID算法调节
5.3 上位机调试工具
基于Qt开发监控界面:
- 实时显示传感器数据曲线
- 动态调整PID参数
- 保存运行日志分析
6. 项目心得与建议
-
机械结构决定性能上限:
- 车轮间距建议12-15cm
- 重心位置要低于轮轴
- 使用3D打印件减重
-
电源管理容易被忽视:
- 各模块独立滤波
- 总开关要能切断所有电路
- 预留电压检测接口
-
调试阶段必备工具:
- 逻辑分析仪(抓取多路信号)
- 串口WiFi模块(无线打印日志)
- 可调电源(观察电流变化)
这个项目最让我意外的是,原本以为最难的是编程部分,实际上70%的时间都花在解决机械和电源问题上。建议后来者一定要先搭好稳定的车体框架,再逐步添加功能模块。