FOC磁场定向控制深度指南 | 深入讲解FOC原理、SVPWM、MTPA、弱磁控制、龙贝格观测器,配合实测案例、C代码和PI整定脚本
面向电机工程实践,系统讲解 FOC 磁场定向控制的原理、实现、调参要点。
新增:PI自动整定脚本、弱磁深度控制、故障诊断完整流程。
三相静止坐标系 (ABC)
↓ Clarke 变换
两相静止坐标系 (α, β)
↓ Park 变换
两相旋转坐标系 (d, q)
关键公式:
Clarke: Iα = Ia
Iβ = (Ia + 2Ib)/√3
Park: Id = Iα·cos(θ) + Iβ·sin(θ)
Iq = -Iα·sin(θ) + Iβ·cos(θ)
逆变换:
Iα = Id·cos(θ) - Iq·sin(θ)
Iβ = Id·sin(θ) + Iq·cos(θ)
三相重构:
Ia = Iα
Ib = -Iα/2 + Iβ·√3/2
Ic = -Iα/2 - Iβ·√3/2
┌──────────────────────────────────────────┐
│ │
Iq_ref ──→ ┌────┐ ┌────┐ ┌────┐ ┌─────┐ │
│ PI │───→│ SVPWM │──→│ 逆变器 │──→│ 电机 │ │
└────┘ └────┘ └─────┘ │ │ │
↑ PI ↑ ↑ │ │
Id_ref ───→┌────┐ │ │ ↓ ↓
│ PI │────┘ │ ┌────────┐ │
└────┘ │ │ 三相输出 │ │
↑ │ └────────┘ │
0 ───→┌────┐ │ ↑ │
┌─→│ −ωLqIq │←───────┘ │ │
│ └────┘ │ │
┌────┐│ │ │
θe ←│ PLL│←─────────────────────────────────┘ │
└────┘ │
(磁链观测器) │
│
←←←←←← 转速环 ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
c
// 8个基本空间矢量(6个非零 + 2个零矢量)
// U0(000): 000, U1(100): 100, U2(110): 110, ...
// U3(010): 010, U4(011): 011, U5(001): 001
// U6(101): 101, U7(111): 111
typedef struct {
float alpha;
float beta;
} SpaceVector;
// 合成任意方向电压矢量
SpaceVector sv_ref = {
.alpha = Uref * cos(theta_e),
.beta = Uref * sin(theta_e)
};
c
// 判断参考电压矢量所在扇区
int sv_sector(SpaceVector *sv) {
float a = sv->beta;
float b = sv->alpha 0.866 - sv->beta 0.5;
float c = -sv->alpha 0.866 - sv->beta 0.5;
int N = 0;
if (a > 0) N |= 1;
if (b > 0) N |= 2;
if (c > 0) N |= 4;
// N → 扇区号 (1~6)
const int sector_table[8] = {0, 2, 6, 1, 4, 3, 5, 0};
return sector_table[N];
}
c
// 在扇区 k 中,计算相邻矢量作用时间
// T0 = (T - Ta - Tb) / 2
// Ta, Tb 根据扇区查表
typedef struct {
float Ualpha;
float Ubeta;
float T; // PWM周期
float Udc; // 母线电压
} SVPWM_Handle;
void svpwmcalc(SVPWMHandle h, float Ta, float *Tb) {
float X = h->Ubeta;
float Y = h->Ualpha 0.866 + h->Ubeta 0.5;
float Z = -h->Ualpha 0.866 + h->Ubeta 0.5;
int sector = sv_sector((SpaceVector*)h);
switch(sector) {
case 1: Ta = Z; Tb = Y; break;
case 2: Ta = Y; Tb = -X; break;
case 3: Ta = -Z; Tb = X; break;
case 4: Ta = -X; Tb = Z; break;
case 5: Ta = X; Tb = -Y; break;
case 6: Ta = -Y; Tb = -Z; break;
}
// 过调制处理
float T_sum = Ta + Tb;
if (T_sum > h->T) {
Ta = Ta * h->T / T_sum;
Tb = Tb * h->T / T_sum;
}
// 零矢量分配(7段式对称PWM)
float T0 = (h->T - Ta - Tb) / 2;
float T7 = T0;
// 计算三相占空比
// DPA, DPB, DPC 存入比较寄存器
}
c
// 各扇区占空比计算
// Tcm1, Tcm2, Tcm3 → 对应 ABC 三相比较值
void svpwmduty(SVPWMHandle h, float Tcm) {
float Ta, Tb;
svpwm_calc(h, &Ta, &Tb);
float T0 = (h->T - Ta - Tb) / 2;
int sector = sv_sector((SpaceVector*)h);
switch(sector) {
case 1: // U4(100), U6(110), U0(000)
Tcm[0] = (h->T + Ta + Tb) / 2; // A: 先断后通
Tcm[1] = (h->T - Ta + Tb) / 2; // B
Tcm[2] = (h->T - Ta - Tb) / 2; // C
break;
case 2: // U6(110), U2(010), U0(000)
Tcm[0] = (h->T - Ta + Tb) / 2;
Tcm[1] = (h->T + Ta + Tb) / 2;
Tcm[2] = (h->T - Ta - Tb) / 2;
break;
case 3: // U2(010), U3(011), U0(000)
Tcm[0] = (h->T - Ta - Tb) / 2;
Tcm[1] = (h->T + Ta + Tb) / 2;
Tcm[2] = (h->T + Ta - Tb) / 2;
break;
case 4: // U3(011), U1(001), U0(000)
Tcm[0] = (h->T - Ta - Tb) / 2;
Tcm[1] = (h->T - Ta + Tb) / 2;
Tcm[2] = (h->T + Ta + Tb) / 2;
break;
该技能支持在以下平台通过对话安装:
帮我安装 SkillHub 和 motor-foc-control-1776030444 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 motor-foc-control-1776030444 技能
skillhub install motor-foc-control-1776030444
文件大小: 13.62 KB | 发布时间: 2026-4-13 11:06