1. 项目概述:从零打造STM32智能小车底盘
作为一名嵌入式开发老鸟,我始终认为底盘是智能小车的"脊椎骨"。这次要分享的是一个经过实战检验的STM32小车底盘方案,采用TB6612电机驱动+三轮架构,特别适合作为各类智能车项目的通用基础平台。这个方案最大的特点是模块化设计——PCB供电与驱动板可复用,机械结构支持快速拆装,代码架构清晰易扩展。
先说说为什么选择三轮结构:相比四轮方案,三轮车架成本降低40%(约80元即可配齐),减少了电机同步控制的复杂度,特别适合新手入门。实测在1.5kg载重下,使用7.4V 2S锂电池时,这套底盘可实现0.8m/s的稳定移动速度,转向角度误差控制在±5°以内。
2. 硬件设计全解析
2.1 供电系统设计要点
供电模块采用三级稳压方案:
- 第一级:7.4V锂电池直通电机驱动
- 第二级:MP1584稳压至5V(给传感器等外设)
- 第三级:AMS1117-3.3V给STM32核心供电
关键参数计算:
- 电机峰值电流:2A×2电机=4A
- MP1584最大输出电流:3A(需加散热片)
- 总功率需求:7.4V×4A=29.6W(建议选择2000mAh以上电池)
实际调试中发现,当PWM占空比超过85%时,MP1584会出现过热保护。解决方法是在电机启动阶段采用软启动策略,分阶段提升PWM占空比。
2.2 电机驱动电路详解
TB6612驱动方案相比传统L298N有三大优势:
- 效率提升:MOSFET内阻仅0.5Ω(L298N达3Ω)
- 体积缩小:SOP24封装比L298N的Multiwatt15节省60%面积
- 保护完善:内置短路/过温保护电路
典型接线配置:
c复制// STM32与TB6612连接方式
#define AIN1_PIN GPIO_Pin_4 // PB4
#define AIN2_PIN GPIO_Pin_5 // PB5
#define PWMA_PIN GPIO_Pin_0 // PA0(TIM2_CH1)
#define BIN1_PIN GPIO_Pin_6 // PB6
#define BIN2_PIN GPIO_Pin_7 // PB7
#define PWMB_PIN GPIO_Pin_1 // PA1(TIM2_CH2)
2.3 机械结构优化方案
推荐的三轮车架配置:
- 驱动轮:TT马达+橡胶轮胎(直径65mm)
- 万向轮:不锈钢牛眼轮(直径32mm)
- 底盘材质:2mm亚克力板(CNC切割)
装配技巧:
- 电机轴与轮毂连接处点少量螺纹胶防滑
- 万向轮安装高度比驱动轮高1-2mm避免抖动
- 电池位置应靠近驱动轮降低重心
3. 软件架构与核心代码
3.1 电机控制底层驱动
采用分层设计架构:
code复制App Layer(运动控制)
└── HAL Layer(电机抽象)
└── Driver Layer(PWM/GPIO)
关键代码实现:
c复制// 电机控制状态机
typedef enum {
MOTOR_BRAKE = 0, // 急停模式
MOTOR_FORWARD, // 正转
MOTOR_REVERSE, // 反转
MOTOR_SOFT_STOP // 软停止
} MotorState;
void Motor_Execute(MotorState state, uint8_t speed)
{
static uint8_t last_speed = 0;
// 速度渐变处理(防止突变)
if(abs(speed - last_speed) > 10) {
uint8_t step = (speed > last_speed) ? 5 : -5;
while(last_speed != speed) {
last_speed += step;
_SetPWM(last_speed);
Delay_ms(20);
}
}
// 状态执行
switch(state) {
case MOTOR_FORWARD:
GPIO_SetBits(IN1_PORT, IN1_PIN);
GPIO_ResetBits(IN2_PORT, IN2_PIN);
break;
// ...其他状态处理
}
}
3.2 运动控制算法
基础运动函数库包含:
- 直线运动(带PID速度补偿)
- 差速转向(角度闭环控制)
- 定点停车(减速曲线控制)
典型运动控制参数:
c复制typedef struct {
float Kp; // 比例系数(建议0.5-1.2)
float Ki; // 积分系数(建议0.01-0.1)
float Kd; // 微分系数(建议0-0.05)
uint16_t max_pwm; // PWM上限(建议80-90)
} MotionParams;
// 示例参数(针对1kg负载优化)
const MotionParams default_params = {
.Kp = 0.8,
.Ki = 0.05,
.Kd = 0.02,
.max_pwm = 85
};
4. 调试技巧与问题排查
4.1 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 电机抖动 | PWM频率过低 | 调整至15-20kHz |
| 直线跑偏 | 电机参数差异 | 在代码中设置L/R补偿系数 |
| 启动瞬间复位 | 电源电流不足 | 增加大容量电容(1000μF以上) |
| 遥控响应延迟 | 控制周期过长 | 确保主循环<50ms |
4.2 进阶调试方法
-
电机特性测试:
python复制# 用Python绘制电机响应曲线 import matplotlib.pyplot as plt pwm = range(0, 101, 5) speed = [0, 0.12, 0.25, 0.38, 0.51, 0.63, 0.72, 0.79, 0.85, 0.89, 0.92] plt.plot(pwm[:len(speed)], speed) plt.xlabel('PWM(%)') plt.ylabel('Speed(m/s)') plt.show() -
运动轨迹记录:
- 在底盘安装蓝牙模块
- 通过手机APP记录实时坐标
- 分析转向半径与理论值的偏差
5. 项目扩展方向
这个基础底盘可以延伸出多个进阶玩法:
- 自动循迹版:增加4路红外传感器(约30元成本)
- 视觉导航版:搭配OpenMV摄像头(H7版本最佳)
- 机械臂载具:扩展6DOF机械臂控制接口
我在实际项目中发现,当增加陀螺仪模块(MPU6050)后,通过融合编码器数据,可将转向精度提升至±1°以内。具体实现需要用到卡尔曼滤波算法,这部分代码已经开源在我的GitHub仓库。
最后分享一个焊接小技巧:TB6612的引脚间距较密,建议使用刀头烙铁,先在所有焊盘上锡,然后用吸锡带去除多余焊锡,最后用放大镜检查桥接。这样焊接的成功率比直接拖焊提高至少50%。
