这是一篇可直接用于项目开发、量产调试的 FOC 移植与调试指南,面向STM32/GD32 + 三相 BLDC/PMSM 无刷马达驱动板,包含移植步骤、关键参数、调试流程、波形判断、常见故障,完全匹配你前面设计的MT6835 磁编码器、MOS 驱动、电流采样、过流保护硬件体系。
一、前言:FOC 控制的核心价值
FOC(Field Oriented Control)矢量控制是目前无刷电机最平滑、最高效、最低噪音的控制方案,相比传统方波 6 步换相:
低速无抖动、高速平稳
转矩脉动小、效率提升 5%~15%
支持高精度位置 / 速度闭环
适配 MT6835 等高精度磁编码器
本文目标:从零完成 FOC 移植 → 快速调参 → 电机平稳运行 → 量产级稳定。
二、FOC 算法移植前提(硬件与软件条件)
2.1 必须具备的硬件
三相全桥 MOS 驱动电路(上一下一结构)
双电阻 / 三电阻电流采样(FOC 必需)
绝对式磁编码器(MT6835 SPI/ABZ)
三路互补 PWM + 死区
ADC 同步采样(与 PWM 中心对齐同步)
2.2 必须具备的软件模块
PWM 配置(中心对齐,16kHz~20kHz)
ADC 多通道 + DMA + 定时器触发
磁编码器角度读取(21bit 高精度)
电流采样偏置校准
SVPWM 输出
过流 / 过压 / 过温硬件保护
只要你前面的驱动板设计完成,即可直接移植 FOC。
三、FOC 算法标准架构(5 大核心模块)
移植时按顺序实现,不可跳过:
电流采集与偏置校准
Clarke 变换(三相电流→两相静止坐标系)
Park 变换(两相静止→两相旋转 d/q 坐标系)
PI 调节器(Id/Iq)
反 Park + SVPWM(输出 6 路 PWM)
控制目标:
Id=0(永磁体磁场方向不励磁,效率最高)
Iq = 转矩电流(控制力度)
四、FOC 算法完整移植步骤(工程可直接照做)
步骤 1:电机与系统参数定义
// 电机极对数(非常重要!)#define MOTOR_POLE_PAIRS 7// PWM频率 & 控制周期#define PWM_FREQ 16000#define CONTROL_PERIOD (1.0f / PWM_FREQ)// 电流采样增益#define CURRENT_GAIN 0.01f#define VOLTAGE_BUS 24.0f
步骤 2:电流采集与零点校准
FOC 对电流采样零偏极其敏感,必须上电静止校准:
void Current_Offset_Calibrate(void){ for(int i=0; i< 1024; i++){ Iu_Offset += Get_ADC_Iu(); Iv_Offset += Get_ADC_Iv(); } Iu_Offset /= 1024; Iv_Offset /= 1024;}
步骤 3:Clark 变换(三相→二相静止)
void Clarke_Transform(float Iu, float Iv, float *Ialpha, float *Ibeta){ *Ialpha = Iu; *Ibeta = (Iu + 2 * Iv) * 0.57735f;}
步骤 4:Park 变换(二相静止→d/q 旋转)
void Park_Transform(float Ialpha, float Ibeta, float theta, float *Id, float *Iq){ float sin_theta = sin(theta); float cos_theta = cos(theta); *Id = Ialpha * cos_theta + Ibeta * sin_theta; *Iq = -Ialpha * sin_theta + Ibeta * cos_theta;}
步骤 5:Id/Iq PI 控制器(核心)
void PI_Controller(PI_TypeDef *pi, float target, float feedback){ pi- >err = target - feedback; pi- >integral += pi- >err * CONTROL_PERIOD; pi- >out = pi- >Kp * pi- >err + pi- >Ki * pi- >integral; // 限幅防止饱和 if(pi- >out > MAX_VOLTAGE) pi- >out = MAX_VOLTAGE; if(pi- >out < -MAX_VOLTAGE) pi- >out = -MAX_VOLTAGE;}
Id 目标 = 0
Iq 目标 = 速度环输出
步骤 6:反 Park + SVPWM
输出 7 段式 SVPWM,产生平滑正弦波。
步骤 7:速度环 PI(外层)
目标转速 → 速度PI → Iq目标 → 电流环
步骤 8:角度采集(MT6835)
theta = MT6835_Read_Angle() * 2 * PI / 2097152.0f;
五、FOC 关键参数清单(调试必备)
5.1 电机固定参数
极对数 P
相电阻 Rs
相电感 Ld、Lq
母线电压 Vbus
5.2 电流环 PI(内环,最重要)
Kp:比例增益(响应速度)
Ki:积分增益(消除静差)
5.3 速度环 PI(外环)
Kp:转速响应
Ki:转速稳速
5.4 限制参数
最大电流 I_max
最大电压 V_max
最大转速 Speed_max
斜坡上升时间
六、FOC 标准调试流程(最快 30 分钟调完)
第一步:硬件检查(必做!)
电流采样正常、无漂移
编码器角度递增 / 递减正常
PWM 无异常、死区正常
电机无短路、无卡死
第二步:开环调试(强制角度)
角度固定递增 → 电机按磁场旋转
目的:
确认相序 U/V/W 正确
确认电流采样方向正确
确认 SVPWM 正常
现象:电机平滑旋转,无啸叫、无抖动。
第三步:切入闭环(Id=0 控制)
先关闭速度环,只开电流环
给一个微小 Iq(如 0.1A)
电机应极平滑自转
第四步:速度环 PI 调试
先小 Kp,小 Ki
逐步加大 Kp,直到转速无静差
增加 Ki,消除稳态误差
第五步:抗干扰与稳定性优化
加积分限幅
加电流斜坡
加死区补偿
加低速滤波
七、FOC 调试波形判断(工程师核心技能)
7.1 正常波形
Iq 平滑跟随
Id 稳定 = 0
三相电流为完美正弦波
无尖峰、无抖动、无噪声
7.2 异常波形
电流尖峰:采样噪声 / 滤波不足
电机啸叫:PI 过大 / 相序错误
电机抖动:角度读取错误 / 极对数错误
电流失真:死区不对 / ADC 不同步
八、最常见问题与 100% 解决方法
1. 电机抖动、不转
原因:
极对数错误
编码器方向反
相序 U/V/W 接错
解决:调换任意两相。
2. 电流大、发热严重
原因:
Id≠0
零偏未校准
采样方向反
解决:重新校准电流偏置。
3. 高速丢步、失步
原因:
速度环 PI 太小
电流环响应不足
编码器噪声
解决:增大电流环 Kp。
4. 低速抖动
原因:
角度采样噪声
死区补偿缺失
解决:增加角度滤波。
5. SVPWM 输出异常
原因:
ADC 与 PWM 不同步
解决:配置为PWM 中心对齐触发 ADC。
九、量产级稳定化配置(最终优化)
电流采样滑动平均滤波
角度一阶低通滤波
死区时间自动补偿
积分抗饱和(Anti-Windup)
过流立即封锁 PWM
启动开环拖动 + 平滑切入闭环
堵转保护、过载保护、过温保护
完成后电机表现:
0 速~最高速全程平滑
无抖动、无啸叫、无发热
定位精准、响应快
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !