【嵌入式】直流无刷电机FOC控制算法全解析
【嵌入式】直流无刷电机FOC控制算法全解析——原理、代码与实战
文章目录
- 【嵌入式】直流无刷电机FOC控制算法全解析——原理、代码与实战
引言
在直流无刷电机(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β=31Ia+32Ib
逆变换公式(从α-β到三相):
{ 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=23Iβ−IαIc=2−Iα−3Iβ
(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=23Uα−UβU3=−23Uα+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=Udc3U2TT6=Udc3U1TT0=T7=2T−T4−T6
(4)PWM占空比生成
采用七段式SVPWM(谐波失真低),以扇区I为例,占空比计算如下:
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)
#include"foc.h"#include"math.h"#definesqrt31.73205f#definePI3.14159f// Clarke变换:Ia,Ib → Iα,IβvoidClarkeTransform(float Ia,float Ib,float*Ialpha,float*Ibeta){*Ialpha = Ia;*Ibeta =(Ia +2* Ib)/ sqrt3;}// Park变换:Iα,Iβ,θ → Id,IqvoidParkTransform(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βvoidRevParkTransform(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_tSectorJudge(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;}// 矢量作用时间计算voidVectorActionTime(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){case3:// 扇区I*ta = U2 * K;*tb = U1 * K;break;case1:// 扇区II*ta =-U2 * K;*tb =-U3 * K;break;// 其他扇区省略...default:*ta =0;*tb =0;break;}}// CCR寄存器计算voidCCRCalculate(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){case3:// 扇区I*ccr1 =(uint32_t)v1;*ccr2 =(uint32_t)v2;*ccr3 =(uint32_t)v3;break;case1:// 扇区II*ccr1 =(uint32_t)v2;*ccr2 =(uint32_t)v1;*ccr3 =(uint32_t)v3;break;// 其他扇区省略...}}(2)主控制逻辑(main.c)
#include"stm32f1xx_hal.h"#include"foc.h"// 全局变量 FOC_HandleTypeDef hfoc;uint32_t tpwm =7199;// PWM周期(10kHz)uint32_t Udcbus =24;// 母线电压24VvoidSystemClock_Config(void);staticvoidMX_GPIO_Init(void);staticvoidMX_TIM1_Init(void);staticvoidMX_ADC1_Init(void);intmain(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-022025-03-092025-03-162025-03-232025-03-302025-04-062025-04-132025-04-202025-04-272025-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技术正从工业领域向消费电子领域渗透,掌握这一技术将为智能硬件开发提供核心竞争力。