
STM32版FOC平衡小车
简介
快速验证 PID、卡尔曼、LQR等自动控制理论的,开源、模块化、易上手的 FOC 平衡小车验证平台
简介:快速验证 PID、卡尔曼、LQR等自动控制理论的,开源、模块化、易上手的 FOC 平衡小车验证平台开源协议
:GPL 3.0
描述
视频链接:
项目简介
本项目是基于stm32f407做主控;mpu6050测姿态,int引脚产生200hz中断,读取得到俯仰角和角速率;2个mt6701磁编码器读取两个极数对为7的2805无刷电机角度,pwm波频率为10khz。车架是嘉立创cnc制造。
CUBEMX以及源码链接: https://pan.baidu.com/s/1nfYsNzxv2O_eDXpiLXu6ZA 提取码: 6666
项目功能
- 双轮自平衡
基于 MPU6050 姿态传感器,实现车体前后自平衡,支持 0° 静止站立。 - 手机蓝牙遥控
通过蓝牙串口(115200 bps)实时接收手机指令,支持:- 前进/后退
- 原地左转/右转
- 四重闭环控制
由外到内:- 转向环(Turn)
- 速度环(Velocity)
- 直立环(Balance)
- 电流环(FOC-d/q 轴)
- 载重行驶
经实测,可稳定承载 2 kg 负载并正常行驶。 - 调参与监控
预留 6 路按键调参,VOFA+、手机蓝牙2种方式实时查看波形。
项目参数
| 类别 | 参数 |
|---|---|
| 主控 | STM32F407VGT6 |
| 驱动器 | DRV8313 ×2 |
| 电机 | 2805 无刷电机 ×2,Pole-Pair=7 |
| 角度传感器 | MT6701 磁编码器 ×2 |
| IMU | MPU6050(DMP 中断) |
| 电源 | 3节18650电池串联 |
| 开关频率 | 20 kHz(中心对齐 SVPWM) |
| 电流采样 | INA240A2(直连3相绕组) |
| 通信接口 | USART1 蓝牙、I²C1、SPI2/3 |
| PCB 尺寸 | 100 mm × 70 mm 双层板 |
| 车架 | 嘉立创CNC一元打样 |
感谢伟大的嘉立创
原理解析(硬件说明)
原理解析
1. 系统框图
手机蓝牙 → 转向环 → 速度环 → 直立环 → 电流环 → SVPWM → DRV8313 → 无刷电机
2. 角度/电流获取
- 机械角度:MT6701 通过 SPI2/3 读取 14-bit 绝对位置,经
Motor_Pole_Pairs转换为电角度。 - 三相电流:ADC1/2 注入通道 + TIM1/2 CH4 触发采样,经 INA240A2 放大后 Clarke 变换得到
Iα/Iβ。
3. FOC-SVPWM 核心
- 坐标变换
Clarke → Park → 反 Park → 反 Clarke → SVPWM
在 DQ 坐标系下仅需控制两个直流分量Id,Iq,计算量小,响应快。 - 扇区判断
根据Uα/Uβ计算UX,UY,UZ,查表得 1~6 扇区。 - 占空比计算
每扇区独立公式,中心对称调制,提升母线电压利用率 15%。
4. 四重闭环
| 环路 | 输入量 | 输出量 | 采样/执行周期 |
|---|---|---|---|
| 转向环 | 蓝牙转向指令 | 左右轮目标速度差 | 10 ms |
| 速度环 | 编码器速度 | 目标车身倾角 | 10 ms |
| 直立环 | MPU6050 俯仰角 | 目标总电流 Iq | 1 ms |
| 电流环 | Id/Iq 实测值 | Ud/Uq 电压矢量 | 50 µs (20 kHz) |
软件代码
软件代码
1. 仓库结构
Core/
└─ Src/main.c // 初始化 + 主循环
└─ Src/myFOC_InterFace.c // 电机 API
└─ Src/myFOC_Hidden_Process.c// SVPWM、坐标变换
└─ Src/myBalanceCar.c // 直立/速度/转向环
└─ Src/myPID.c // 通用 PID
└─ Src/myMT6701.c // 磁编码器驱动
└─ Src/myMPU6050.c // IMU 驱动
2. 关键片段
main.c
/* 初始化 */
MT6701_Init(&MT6701_LEFT, &hspi3, ...);
Motor_Init(&Motor_LEFT, &htim1, TIM_CHANNEL_1, ...);
PID_Init(&Balance_PID, 0.07f, 0.0f, 0.00014f);
PID_Init(&Velocity_PID, 0.028f, 0.036f, 0.0f);
/* 1 ms 中断:电流环 + SVPWM */
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc) {
if (hadc == &hadc1) {
FOC_SVPWM_CloseLoop_Current(&Motor_LEFT, &MT6701_LEFT, &ADC_LEFT,
&LEFT_Q_Axle, &LEFT_D_Axle);
}
...
}
/* 10 ms 中断:速度/转向环 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* tim) {
if (tim->Instance == htim3.Instance) {
Get_Velocity(&MT6701_LEFT);
Velocity_PID_Control_Process(&Velocity_PID, &BC, 10.0f,
&MT6701_LEFT, &MT6701_RIGHT);
...
}
}
## 实物图
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。










