本项目基于 STM32F103C8T6 微控制器,结合 DengFOC 驱动板(M0 通道)、AS5600 磁编码器(I²C 接口) 及 2208 无刷电机 实现完整的 FOC(Field Oriented Control) 电机控制。 适合学习、调试与算法验证使用。
- 项目概述
- 硬件组成
- 引脚与接线说明
- 主要功能
- 控制模式
- 基本控制
- 控制时序与任务分配
- 电流采样与保护机制
- 角度与速度测量
- VOFA+ 数据输出
- 编译与烧录
- 快速上手
- 项目结构
- 调参建议
- 安全注意事项
- 未来计划
- 开源协议
本项目实现了一套完整的三相无刷电机 FOC 控制流程,包含开环速度、闭环电流、闭环位置与闭环速度控制。 系统由 STM32F103C8T6 主控驱动 DengFOC 模块,使用 AS5600 磁编码器 作为位置反馈。
主要功能包括:
- 基于 HAL 的外设初始化(PWM、ADC、I²C、USART、DMA、TIM)
- 控制算法(Clarke、Park、PI 调节、SVPWM)
- 串口命令交互与实时调参
- 过流保护与电角校准机制
- 支持 VOFA+ 波形输出
| 模块 | 型号/说明 |
|---|---|
| MCU | STM32F103C8T6(Blue Pill) |
| 驱动板 | DengFOC M0 |
| 电机 | 无刷电机 2208,7 对极 |
| 编码器 | AS5600 磁编码器(I²C 接口) |
| 电源 | 外部 12V |
| 电流采样 | 双通道(O1_CS、O2_CS) |
| 通信接口 | USART1 与上位机交互(文本/VOFA+) |
| 引脚 | 功能 | 说明 |
|---|---|---|
| PA8 | 电机使能(Motor_EN) | 上电后拉高以启用驱动 |
| TIM2_CH1/CH2/CH3 | PWM 输出 | 三相驱动输出(A/B/C) |
| PB10 (SCL), PB11 (SDA) | I²C2 | AS5600 编码器通信 |
| PB0, PB1 | ADC1_IN8/IN9 | 电流采样输入 |
| PA9, PA10 | USART1 TX/RX | 串口通信 |
⚠️ 确保 CubeMX 中的引脚配置与此表一致。
- ✅ 支持 4 种控制模式
- 🧭 零电角自动校准
- 🧮 实时 FOC 算法
- 🧾 串口命令行调参系统
- 📉 VOFA+ JustFloat 实时波形输出
- ⚡ 过流保护与电压限幅
- 🔄 I²C 总线自动恢复
- 🔧 运行时可在线修改 PID 参数与模式
| 命令 | 模式 | 说明 |
|---|---|---|
c1 |
开环速度模式 | 目标速度 → 电角积分,输出固定电压 |
c2 |
电流闭环模式 | dq 双 PI 控制电流 |
c3 |
位置闭环模式 | 目标角度 → PID 输出电压 |
c4 |
速度闭环模式 | 目标速度 → PID 输出电压 |
以下为项目支持的基础串口控制命令。 所有命令均以 字母+参数 的形式输入,命令之间可以空格分隔, 以 回车(\n) 结束发送。
| 命令 | 说明 | 示例 |
|---|---|---|
c1 |
切换为 开环速度模式 | c1 |
c2 |
切换为 电流闭环模式 | c2 |
c3 |
切换为 位置闭环模式 | c3 |
c4 |
切换为 速度闭环模式 | c4 |
t<值> |
设置目标值(不同模式下含义不同) | t5.0 |
| 命令 | 含义 | 示例 |
|---|---|---|
p<值> |
设置 Kp | p5.0 |
i<值> |
设置 Ki | i200 |
d<值> |
设置 Kd | d0.1 |
| 命令 | 含义 | 示例 |
|---|---|---|
qr<值> |
设置 q 轴 Kp | qr2.0 |
qi<值> |
设置 q 轴 Ki | qi150 |
dr<值> |
设置 d 轴 Kp | dr1.5 |
di<值> |
设置 d 轴 Ki | di150 |
q<值> |
设置 Iq_ref(电流目标) | q0.5 |
| 命令 | 含义 | 示例 |
|---|---|---|
sp<值> |
设置速度环 Kp | sp0.3 |
si<值> |
设置速度环 Ki | si5 |
sd<值> |
设置速度环 Kd | sd0 |
| 命令 | 含义 | 示例 |
|---|---|---|
y1 |
交换 A/B 相输入 | y1 |
v1 |
翻转 q 轴方向 | v1 |
w<角度> |
设置 电角偏置角度(°) | w90 |
| 命令 | 说明 | 示例 |
|---|---|---|
a |
对齐 零电角 | a |
z |
执行 电流偏置校准 | z |
u0 |
串口输出为 文本模式 | u0 |
u1 |
串口输出为 VOFA+ 模式 | u1 |
每次执行命令后,系统会通过串口返回一条确认信息:
ACK: mode=<当前模式>, Tgt=<目标值>
示例:
ACK: mode=3, Tgt=1.57
表示系统当前处于 模式 3(位置闭环),目标值为 1.57 rad。
-
命令区分大小写,建议使用小写;
-
支持一次输入多个命令:
p5 i200 d0.1 -
c3模式下自动锁定当前位置为目标; -
a与z命令执行时请保持电机静止; -
u1模式用于实时波形输出(VOFA+ 软件)。
| 任务 | 频率 | 说明 |
|---|---|---|
control_step() |
10 kHz(TIM4中断) | 主控制算法 |
| 主循环 | 1 kHz | 更新角度与速度 |
| 串口输出 | 20~100 Hz | 打印状态或VOFA数据 |
-
使用 ADC1+DMA 采样两相电流;
-
转换公式:
电流(A) = (ADC * 3.3 / 4095 - offset) / (R_shunt * AMP_gain) -
默认参数:
R_shunt = 0.01Ω,AMP_gain = 50; -
命令
z自动校准电流零偏; -
超过 2A 触发过流保护并锁存。
-
读取 AS5600 寄存器
0x0E/0x0F; -
12-bit 精度(0~4095) → 弧度;
-
连续读取判断稳定;
-
解缠绕算法保持机械角连续;
-
电角计算:
电角 = norm2pi(机械角 * 极对数 * Dir - 零电角) -
速度滤波:
vel = α * raw + (1-α) * last_vel (α=0.15)
命令:u1 开启 VOFA+ 输出模式。
| 通道 | 含义 |
|---|---|
| CH0 | 目标值 |
| CH1 | 机械角(rad) |
| CH2 | 机械速度(rad/s) |
| CH3 | 电角(rad) |
| CH4~5 | 相电流 |
| CH6~7 | Id/Iq |
| CH8~10 | Ud/Uq/电压幅值 |
| CH11 | 饱和标志 |
| CH12 | 过流标志 |
| CH13 | 模式编号 |
帧尾:00 00 80 7F
- 上电并连接串口;
- 发送
z校准电流偏置; - 执行
a对齐零电角; - 开环测试:
c1→t5; - 位置闭环:
c3→t1.57; - 速度闭环:
c4→t10; u1开启 VOFA+ 输出查看波形。
- 电流环:先调 q 轴,保持 d=0;
- 位置环:从 Kp 开始,小幅调整 Ki;
- 速度环:调节滤波系数 α 和 Kd 抑制震荡;
- 注意观察
sat_flag与fault_latched状态。
推荐使用 MIT License:
MIT License
Copyright (c) 2025 <Your Name>
Permission is hereby granted, free of charge, to any person obtaining a copy...
- ST HAL 库
- AS5600 官方文档
- DengFOC 社区资源
- VOFA+ 调试工具