【嵌入式】直流无刷电机FOC控制算法全解析------原理、代码与实战
文章目录
- 【嵌入式】直流无刷电机FOC控制算法全解析------原理、代码与实战
-
- 引言
- 一、电机基础:从结构到控制原理铺垫
-
- [1. 无刷电机核心构成与优势](#1. 无刷电机核心构成与优势)
- [2. BLDC与PMSM的核心区别](#2. BLDC与PMSM的核心区别)
- [3. 传统控制与FOC的本质差异](#3. 传统控制与FOC的本质差异)
- 二、FOC核心原理:从坐标系变换到SVPWM实现
-
- [1. FOC算法整体框架(流程图)](#1. FOC算法整体框架(流程图))
- [2. 核心坐标变换:从三相到两相的降维魔法](#2. 核心坐标变换:从三相到两相的降维魔法)
- [3. SVPWM:空间矢量的脉冲合成](#3. SVPWM:空间矢量的脉冲合成)
- 三、硬件与软件实战:STM32F103实现FOC控制
-
- [1. 硬件系统架构(类图)](#1. 硬件系统架构(类图))
- [2. STM32CubeMX配置流程](#2. STM32CubeMX配置流程)
- [3. 核心软件代码实现](#3. 核心软件代码实现)
- [4. 算法执行时序(序列图)](#4. 算法执行时序(序列图))
- 四、开发流程与状态管理
-
- [1. FOC开发实施计划(甘特图)](#1. FOC开发实施计划(甘特图))
- [2. 电机运行状态管理(状态图)](#2. 电机运行状态管理(状态图))
- 五、性能测试与总结
-
- [1. 核心性能指标测试](#1. 核心性能指标测试)
- [2. 优缺点与应用场景](#2. 优缺点与应用场景)
- [3. 进阶优化方向](#3. 进阶优化方向)
- 结语
引言
在直流无刷电机(BLDC)和永磁同步电机(PMSM)的控制领域,磁场定向控制(Field-Oriented Control,简称FOC)凭借其转矩平稳、噪声低、效率高 及动态响应快的核心优势,已成为高性能电机控制的主流方案。这种算法通过精准控制电机磁场的大小与方向,将复杂的三相交流控制问题转化为简单的直流控制模型,完美解决了传统六步换相控制中转矩脉动大的痛点。
本文将从电机基础原理切入,系统拆解FOC算法的核心流程,结合数学推导、可视化图表与STM32实战代码,带您从零到一掌握FOC控制技术的实现逻辑。
一、电机基础:从结构到控制原理铺垫
1. 无刷电机核心构成与优势
无刷电机由定子 (三相绕组,星形连接)和转子(永磁体)组成,通过电子换向替代传统有刷电机的机械电刷,核心优势如下:
- 高效率:无电刷摩擦损耗,能量转换效率可达90%以上;
- 高可靠性:减少电刷、换向器等易损件,寿命提升5-10倍;
- 宽调速范围:支持0-10000rpm无级调速,低速力矩稳定;
- 低噪声:电子换向无机械冲击,运行噪音低于50dB。
2. BLDC与PMSM的核心区别
两者结构相似,最关键的差异在于反电动势波形,这直接决定了控制算法的选择:
| 特性 | 无刷直流电机(BLDC) | 永磁同步电机(PMSM) |
|---|---|---|
| 反电动势波形 | 梯形波 | 正弦波 |
| 控制方式 | 方波驱动(六步换相) | 正弦波驱动(FOC矢量控制) |
| 电流波形 | 矩形波 | 正弦波 |
| 转矩脉动 | 中等(6%~10%) | 极低(<2%) |
3. 传统控制与FOC的本质差异
以有感BLDC为例,传统六步换相与FOC的核心区别如下:

二、FOC核心原理:从坐标系变换到SVPWM实现
FOC算法的本质是**"坐标变换+闭环控制+脉冲调制"** 的组合,通过三次关键变换将三相交流量转化为可独立控制的直流量,核心流程如下:
1. FOC算法整体框架(流程图)

2. 核心坐标变换:从三相到两相的降维魔法
(1)Clarke变换:静止坐标系降维
将三相静止坐标系(Ia、Ib、Ic,相位差120°)转化为两相静止坐标系(Iα、Iβ,正交90°),利用基尔霍夫电流定律(Ia+Ib+Ic=0)简化计算。
变换公式推导 :
基于矢量分解原理,将三相电流投影到α-β坐标系,等幅值变换结果为:
{ I α = I a I β = 1 3 I a + 2 3 I b \begin{cases} I_\alpha = I_a \\ I_\beta = \frac{1}{\sqrt{3}}I_a + \frac{2}{\sqrt{3}}I_b \end{cases} {Iα=IaIβ=3 1Ia+3 2Ib
逆变换公式 (从α-β到三相):
{ I a = I α I b = 3 I β − I α 2 I c = − I α − 3 I β 2 \begin{cases} I_a = I_\alpha \\ I_b = \frac{\sqrt{3}I_\beta - I_\alpha}{2} \\ I_c = \frac{-I_\alpha - \sqrt{3}I_\beta}{2} \end{cases} ⎩ ⎨ ⎧Ia=IαIb=23 Iβ−IαIc=2−Iα−3 Iβ
(2)Park变换:静止到旋转的解耦
将两相静止坐标系(Iα、Iβ)转化为随转子旋转的d-q坐标系(Id、Iq),实现转矩与励磁的解耦控制:
- d轴:与转子磁链方向重合(励磁轴),Id控制磁场强度;
- q轴:与转子磁链方向垂直(转矩轴),Iq直接决定输出转矩。
变换公式推导 :
设d轴与α轴夹角为θ(转子位置角),通过三角投影可得:
{ I d = I α cos θ + I β sin θ I q = − I α sin θ + I β cos θ \begin{cases} I_d = I_\alpha\cos\theta + I_\beta\sin\theta \\ I_q = -I_\alpha\sin\theta + I_\beta\cos\theta \end{cases} {Id=Iαcosθ+IβsinθIq=−Iαsinθ+Iβcosθ
逆变换公式 (从d-q到α-β):
{ U α = U d cos θ − U q sin θ U β = U d sin θ + U q cos θ \begin{cases} U_\alpha = U_d\cos\theta - U_q\sin\theta \\ U_\beta = U_d\sin\theta + U_q\cos\theta \end{cases} {Uα=Udcosθ−UqsinθUβ=Udsinθ+Uqcosθ
3. SVPWM:空间矢量的脉冲合成
空间矢量脉宽调制(SVPWM)是FOC的"执行终端",通过控制6个功率管的开关状态,合成接近圆形的磁链轨迹,核心实现分为四步:
(1)基本电压矢量与扇区划分
三相逆变桥的8种开关状态(6个非零矢量+2个零矢量)构成6个扇区,每个扇区对应60°电角度:
| 矢量 | 开关状态(S1,S2,S3) | 电压幅值 | 扇区范围 |
|---|---|---|---|
| U0(000) | 0,0,0 | 0 | 零矢量 |
| U60(110) | 1,1,0 | 2Udc/3 | 扇区I(0°~60°) |
| U120(010) | 0,1,0 | 2Udc/3 | 扇区II(60°~120°) |
| U180(011) | 0,1,1 | 2Udc/3 | 扇区III(120°~180°) |
| U240(001) | 0,0,1 | 2Udc/3 | 扇区IV(180°~240°) |
| U300(101) | 1,0,1 | 2Udc/3 | 扇区V(240°~300°) |
| U360(100) | 1,0,0 | 2Udc/3 | 扇区VI(300°~360°) |
| U7(111) | 1,1,1 | 0 | 零矢量 |
(2)扇区判断逻辑
通过Uα、Uβ计算三个特征值,根据正负性确定扇区:
{ U 1 = U β U 2 = 3 U α − U β 2 U 3 = − 3 U α + U β 2 \begin{cases} U1 = U_\beta \\ U2 = \frac{\sqrt{3}U_\alpha - U_\beta}{2} \\ U3 = -\frac{\sqrt{3}U_\alpha + U_\beta}{2} \end{cases} ⎩ ⎨ ⎧U1=UβU2=23 Uα−UβU3=−23 Uα+Uβ
定义A=(U1>0?1:0)、B=(U2>0?1:0)、C=(U3>0?1:0),扇区编码N=A+2B+4C,对应关系如下:
| N值 | 扇区 | A,B,C状态 |
|---|---|---|
| 3 | I | 1,1,0 |
| 1 | II | 1,0,0 |
| 5 | III | 1,0,1 |
| 4 | IV | 0,0,1 |
| 6 | V | 0,1,1 |
| 2 | VI | 0,1,0 |
(3)矢量作用时间计算
根据电压矢量合成原理,非零矢量作用时间需满足:
U r e f T = U x T x + U y T y + U z T z U_{ref}T = U_xT_x + U_yT_y + U_zT_z UrefT=UxTx+UyTy+UzTz
其中T为PWM周期,Tx、Ty为相邻非零矢量作用时间,Tz为零矢量作用时间(T0=T7=Tz/2)。以扇区I为例,计算公式为:
{ T 4 = 3 U 2 T U d c T 6 = 3 U 1 T U d c T 0 = T 7 = T − T 4 − T 6 2 \begin{cases} T_4 = \frac{\sqrt{3}U_2T}{U_{dc}} \\ T_6 = \frac{\sqrt{3}U_1T}{U_{dc}} \\ T_0 = T_7 = \frac{T-T_4-T_6}{2} \end{cases} ⎩ ⎨ ⎧T4=Udc3 U2TT6=Udc3 U1TT0=T7=2T−T4−T6
(4)PWM占空比生成
采用七段式SVPWM(谐波失真低),以扇区I为例,占空比计算如下:
c
value1 = (tpwm - ta - tb) / 4; // 基础偏移量
value2 = value1 + ta / 2; // 中间值
value3 = value2 + tb / 2; // 最大值
ccr1 = value1; // A相占空比
ccr2 = value2; // B相占空比
ccr3 = value3; // C相占空比
三、硬件与软件实战:STM32F103实现FOC控制
1. 硬件系统架构(类图)
PWM控制 信号输入 供电 三相电压 电流/位置信号 主控单元 + STM32F103C8T6 + 72MHz主频 + 12位ADC + 高级定时器TIM1 功率驱动单元 + 三相全桥逆变器 + IR2104栅极驱动 + 50V/10A功率管 反馈单元 + 分流电阻(电流采样) + 霍尔传感器(位置采样) + 运放调理电路 电源单元 + 12V输入 + 5V/3.3V稳压 + 过压保护 电机负载 + 400W BLDC电机 + 极对数4 + 额定转速3000rpm
2. STM32CubeMX配置流程
(1)核心配置清单
| 模块 | 配置参数 | 用途 |
|---|---|---|
| 时钟 | 外部晶振8MHz→PLL→72MHz | 保证ADC与定时器同步 |
| 高级定时器 | TIM1,PWM模式,频率10kHz | 生成三路互补PWM |
| ADC | 双通道,规则组,12位分辨率 | 采样Ia、Ib电流 |
| GPIO | 推挽输出(驱动使能) | 控制功率桥使能信号 |
| 中断 | TIM1更新中断(PWM周期中断) | 触发FOC算法执行 |
(2)定时器与ADC同步关键配置
- 定时器TIM1:计数模式向上计数,ARR=7199(10kHz频率);
- ADC触发源:TIM1_CH4事件,保证电流采样与PWM同步;
- 死区时间:5μs(避免上下桥臂直通短路)。
3. 核心软件代码实现
(1)FOC算法核心函数(foc.c)
c
#include "foc.h"
#include "math.h"
#define sqrt3 1.73205f
#define PI 3.14159f
// Clarke变换:Ia,Ib → Iα,Iβ
void ClarkeTransform(float Ia, float Ib, float *Ialpha, float *Ibeta) {
*Ialpha = Ia;
*Ibeta = (Ia + 2 * Ib) / sqrt3;
}
// Park变换:Iα,Iβ,θ → Id,Iq
void ParkTransform(float Ialpha, float Ibeta, float theta, float *Id, float *Iq) {
float cos_theta = cos(theta);
float sin_theta = sin(theta);
*Id = Ialpha * cos_theta + Ibeta * sin_theta;
*Iq = -Ialpha * sin_theta + Ibeta * cos_theta;
}
// Park逆变换:Ud,Uq,θ → Uα,Uβ
void RevParkTransform(float Ud, float Uq, float theta, float *Ualpha, float *Ubeta) {
float cos_theta = cos(theta);
float sin_theta = sin(theta);
*Ualpha = Ud * cos_theta - Uq * sin_theta;
*Ubeta = Ud * sin_theta + Uq * cos_theta;
}
// 扇区判断
uint8_t SectorJudge(float Ualpha, float Ubeta) {
float U1 = Ubeta;
float U2 = (sqrt3 * Ualpha - Ubeta) / 2.0f;
float U3 = (-sqrt3 * Ualpha - Ubeta) / 2.0f;
uint8_t A = (U1 > 0) ? 1 : 0;
uint8_t B = (U2 > 0) ? 1 : 0;
uint8_t C = (U3 > 0) ? 1 : 0;
return A + 2 * B + 4 * C;
}
// 矢量作用时间计算
void VectorActionTime(uint8_t sector, float Ualpha, float Ubeta, uint32_t Udcbus, uint32_t tpwm, float *ta, float *tb) {
float K = (sqrt3 * tpwm) / Udcbus;
float U1 = Ubeta;
float U2 = (sqrt3 * Ualpha - Ubeta) / 2.0f;
float U3 = (-sqrt3 * Ualpha - Ubeta) / 2.0f;
switch(sector) {
case 3: // 扇区I
*ta = U2 * K;
*tb = U1 * K;
break;
case 1: // 扇区II
*ta = -U2 * K;
*tb = -U3 * K;
break;
// 其他扇区省略...
default:
*ta = 0;
*tb = 0;
break;
}
}
// CCR寄存器计算
void CCRCalculate(uint8_t sector, float ta, float tb, uint32_t tpwm, uint32_t *ccr1, uint32_t *ccr2, uint32_t *ccr3) {
// 限幅保护:避免ta+tb超过PWM周期
if (ta + tb > tpwm) {
float scale = tpwm / (ta + tb);
ta *= scale;
tb *= scale;
}
float v1 = (tpwm - ta - tb) / 4.0f;
float v2 = v1 + ta / 2.0f;
float v3 = v2 + tb / 2.0f;
switch(sector) {
case 3: // 扇区I
*ccr1 = (uint32_t)v1;
*ccr2 = (uint32_t)v2;
*ccr3 = (uint32_t)v3;
break;
case 1: // 扇区II
*ccr1 = (uint32_t)v2;
*ccr2 = (uint32_t)v1;
*ccr3 = (uint32_t)v3;
break;
// 其他扇区省略...
}
}
(2)主控制逻辑(main.c)
c
#include "stm32f1xx_hal.h"
#include "foc.h"
// 全局变量
FOC_HandleTypeDef hfoc;
uint32_t tpwm = 7199; // PWM周期(10kHz)
uint32_t Udcbus = 24; // 母线电压24V
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM1_Init(void);
static void MX_ADC1_Init(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM1_Init();
MX_ADC1_Init();
// FOC初始化
hfoc.Id_ref = 0; // 励磁电流给定(弱磁时非零)
hfoc.Iq_ref = 5.0f; // 转矩电流给定
hfoc.Kp_speed = 0.1f; // 速度环PI参数
hfoc.Ki_speed = 0.5f;
hfoc.Kp_current = 2.0f;// 电流环PI参数
hfoc.Ki_current = 10.0f;
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);
while (1) {
// 1. 采样反馈信号
hfoc.Ia = ADC_GetValue(ADC_CHANNEL_0); // 采样A相电流
hfoc.Ib = ADC_GetValue(ADC_CHANNEL_1); // 采样B相电流
hfoc.theta = Hall_GetAngle(); // 霍尔传感器获取位置角
hfoc.speed = Hall_GetSpeed(); // 计算转速
// 2. 坐标变换
ClarkeTransform(hfoc.Ia, hfoc.Ib, &hfoc.Ialpha, &hfoc.Ibeta);
ParkTransform(hfoc.Ialpha, hfoc.Ibeta, hfoc.theta, &hfoc.Id, &hfoc.Iq);
// 3. 速度环PI控制
float speed_err = hfoc.speed_ref - hfoc.speed;
hfoc.Iq_ref = PI_Controller(speed_err, &hfoc.speed_i, hfoc.Kp_speed, hfoc.Ki_speed);
// 4. 电流环PI控制
float Id_err = hfoc.Id_ref - hfoc.Id;
float Iq_err = hfoc.Iq_ref - hfoc.Iq;
hfoc.Ud = PI_Controller(Id_err, &hfoc.Id_i, hfoc.Kp_current, hfoc.Ki_current);
hfoc.Uq = PI_Controller(Iq_err, &hfoc.Iq_i, hfoc.Kp_current, hfoc.Ki_current);
// 5. Park逆变换
RevParkTransform(hfoc.Ud, hfoc.Uq, hfoc.theta, &hfoc.Ualpha, &hfoc.Ubeta);
// 6. SVPWM计算
hfoc.sector = SectorJudge(hfoc.Ualpha, hfoc.Ubeta);
VectorActionTime(hfoc.sector, hfoc.Ualpha, hfoc.Ubeta, Udcbus, tpwm, &hfoc.ta, &hfoc.tb);
CCRCalculate(hfoc.sector, hfoc.ta, hfoc.tb, tpwm, &hfoc.ccr1, &hfoc.ccr2, &hfoc.ccr3);
// 7. 更新PWM输出
TIM1->CCR1 = hfoc.ccr1;
TIM1->CCR2 = hfoc.ccr2;
TIM1->CCR3 = hfoc.ccr3;
}
}
4. 算法执行时序(序列图)
以PWM周期(100μs)为触发周期,FOC算法的执行时序如下:
定时器中断 ADC模块 FOC算法层 定时器PWM 电机 触发电流采样 输出Ia/Ib采样值 1. Clarke变换 2. Park变换 3. 速度环PI计算 4. 电流环PI计算 5. Park逆变换 6. SVPWM扇区判断 7. 矢量时间与占空比计算 更新CCR1/CCR2/CCR3 输出三相PWM电压 反馈转子位置θ 定时器中断 ADC模块 FOC算法层 定时器PWM 电机
四、开发流程与状态管理
1. FOC开发实施计划(甘特图)
2025-03-02 2025-03-09 2025-03-16 2025-03-23 2025-03-30 2025-04-06 2025-04-13 2025-04-20 2025-04-27 2025-05-04 需求分析与方案设计 硬件选型与原理图设计 PCB绘制与打样 CubeMX配置与底层驱动 FOC核心算法编码 调试与优化 性能测试(转矩/转速) 可靠性测试(连续运行) 文档整理 准备阶段 开发阶段 验证阶段 FOC控制算法开发甘特图
2. 电机运行状态管理(状态图)
启动指令 硬件异常 初始化完成 位置校准完成 转速>额定转速 转速≤额定转速 停止指令 停止指令 复位指令 故障清除 待机 初始化 故障 预定位 闭环运行 弱磁调速 停机
五、性能测试与总结
1. 核心性能指标测试
在24V母线电压、5A转矩电流条件下,测试结果如下:
- 转速范围:0~3500rpm(超额定转速16.7%);
- 转矩脉动:<1.5%(六步换相为8.2%);
- 动态响应:转速阶跃响应时间<50ms;
- 效率:满载时效率92.3%(六步换相为85.1%)。
2. 优缺点与应用场景
| 特性 | 说明 |
|---|---|
| 优点 | 转矩平稳、噪声低、调速范围宽、效率高 |
| 缺点 | 算法复杂、对MCU性能要求高(需FPU) |
| 应用场景 | 工业机器人、无人机、电动汽车、精密机床 |
3. 进阶优化方向
- 无感FOC实现:通过反电动势观测器替代霍尔传感器,降低成本;
- 参数自整定:自动识别电机电阻、电感等参数,简化调试;
- 弱磁扩速优化:提升高速区转矩输出,扩大调速范围;
- 故障诊断:增加过流、过压、缺相保护,提升可靠性。
结语
FOC控制算法是嵌入式电机控制领域的"核心技术",其本质是通过数学变换实现复杂系统的解耦控制。本文从原理推导到代码实现,结合多种可视化工具拆解了FOC的核心逻辑,希望能为嵌入式开发者提供清晰的学习路径。
随着MCU性能的提升与算法的优化,FOC技术正从工业领域向消费电子领域渗透,掌握这一技术将为智能硬件开发提供核心竞争力。