2. FOC控制原理

磁场定向控制(Field Oriented Control,FOC)是现代永磁同步电机(PMSM)高性能驱动中最主流的控制策略。其核心思想是:通过数学坐标变换,将原本在静止三相坐标系下强耦合、非线性的交流电机模型,等效为旋转坐标系下相互解耦的直流电机模型,从而分别独立控制电机的励磁分量和转矩分量。对于基于GD32的嵌入式低成本实现而言,理解FOC的数学本质、坐标变换的物理意义、PI调节器的离散化设计以及SVPWM的扇区判断与矢量合成,是完成工程代码落地的前提。本章将围绕这四个核心模块展开,并结合GD32F303系列MCU的运算能力和外设资源,给出可直接指导编码的工程化解析。

FOC控制链路与坐标变换关系图 三相逆变器 6路PWM GD32 TIMER0 PMSM电机 三相绕组 电角度 θe 电流采样 ADC 注入组 Ia, Ib (Ic重建) Clark变换 3s → 2s Iα, Iβ Park变换 2s → 2r Id, Iq U/V/W 相电流 Ia/Ib Iα/Iβ PI调节器(电流环) Id_ref vs Id_fb Iq_ref vs Iq_fb 输出:Vd*, Vq* 反Park变换 2r → 2s Vα*, Vβ* SVPWM调制 扇区判断 矢量作用时间 占空比更新 GD32定时器 TIMER0 CH0-2 互补PWM输出 Id_fb, Iq_fb 反馈 Vd*, Vq* Vα*, Vβ* 占空比 PWM驱动信号(含死区) 电角度 θe(编码器/霍尔) 电流/电压信号 角度/控制反馈 PWM驱动链路

上图展示了FOC控制的核心链路:从三相电流采样开始,经过Clark变换得到两相静止坐标系下的电流分量,再经过Park变换得到旋转坐标系下的直轴电流Id和交轴电流Iq。这两个电流分量分别对应电机的励磁磁场和转矩磁场,通过PI调节器进行闭环控制后,输出电压指令Vd*和Vq*,再经过反Park变换得到两相静止坐标系下的电压矢量,最终通过SVPWM调制生成六路PWM信号驱动三相逆变器。整个过程在GD32内部以中断服务函数的形式周期性执行,典型执行频率为10kHz~20kHz。

2.1 磁场定向控制的基本原理

FOC的核心思想是"解耦"。在三相静止坐标系下,PMSM的定子电流产生的磁动势与转子永磁体磁场之间存在复杂的耦合关系,转矩表达式为:Te = 1.5 * p * [ψf * iq + (Ld - Lq) * id * iq]。对于表贴式PMSM(Ld = Lq),转矩简化为Te = 1.5 * p * ψf * iq,此时转矩只与q轴电流成正比。这就是FOC的物理基础——通过坐标变换,将定子电流分解为产生磁场的id分量和产生转矩的iq分量,实现解耦控制。

工程要点:在GD32实现中,FOC控制周期通常设定为PWM载波频率的整数分之一。例如PWM载波为20kHz时,电流环执行周期为50μs。GD32F303主频120MHz,单次FOC计算(含坐标变换、两个PI调节器、SVPWM)约需8~12μs,CPU占用率约20%,留有充足裕量处理其他任务。

FOC控制系统的整体架构包含三个闭环:电流内环(最快)、速度环(中等)、位置环(最慢)。电流环的带宽通常设计为1~2kHz,速度环带宽为50~200Hz,位置环带宽为5~20Hz。这种带宽分配保证了系统的稳定性和动态响应性能。

2.2 坐标变换:Clark变换与Park变换

坐标变换是FOC的数学桥梁,它将三相交流量转换为两相直流量,使得PI调节器可以对恒定信号进行无静差调节。

2.2.1 Clark变换(3s→2s)

Clark变换将三相静止坐标系(a-b-c)变换到两相静止坐标系(α-β)。等幅值变换的数学表达式为:

Iα = Ia
Iβ = (Ia + 2*Ib) / √3

在工程实现中,为了简化计算,通常采用以下离散化形式:

Iα = Ia
Iβ = (Ia + 2*Ib) * 0.57735   // 1/√3 ≈ 0.57735

由于三相电流满足Ia + Ib + Ic = 0,因此只需要采样两相电流(通常采样Ia和Ib),第三相电流通过计算得到:Ic = -Ia - Ib。在GD32的ADC配置中,需要至少两个ADC通道同时采样,或者使用注入组实现同步采样。

变换类型输入输出关键公式GD32实现要点
ClarkIa, IbIα, IβIα=Ia; Iβ=(Ia+2Ib)/√3使用浮点或Q15格式,注意1/√3的精度
ParkIα, Iβ, θeId, IqId=Iαcosθ+Iβsinθ; Iq=-Iαsinθ+Iβcosθ查表法或Cordic算法计算sin/cos
反ParkVd*, Vq*, θeVα*, Vβ*Vα=Vdcosθ-Vqsinθ; Vβ=Vdsinθ+Vqcosθ与Park共用sin/cos表

2.2.2 Park变换(2s→2r)

Park变换将两相静止坐标系变换到两相旋转坐标系(d-q),旋转角度为转子电角度θe。变换公式为:

Id = Iα * cos(θe) + Iβ * sin(θe)
Iq = -Iα * sin(θe) + Iβ * cos(θe)

在GD32实现中,sin/cos函数计算是主要耗时点。工程上常采用两种方案:一是查表法,将0~360°分为1024或2048个点,查表精度可达0.35°或0.18°;二是使用Cordic算法,GD32F303的硬件Cordic外设可以加速三角函数计算,但需要额外配置。对于低成本方案,推荐使用查表法,内存占用仅需4KB(2048点×2字节)。

经验提醒:电角度θe的获取方式直接影响控制精度。使用增量式编码器时,需要在上电时进行转子初始位置辨识;使用霍尔传感器时,只有60°分辨率,需要结合反电动势观测器进行角度插值。在低成本方案中,无感FOC(基于滑模观测器或磁链观测器)是主流选择,但启动阶段需要采用I/F或V/F开环策略。

2.3 PI调节器设计与离散化

PI调节器是FOC电流环的核心控制器。在旋转坐标系下,Id和Iq均为直流量,PI调节器可以实现无静差跟踪。电流环PI调节器的传递函数为:

G(s) = Kp + Ki/s

离散化方法采用后向欧拉法,得到增量式PI算法:

// 增量式PI
int32_t pi_controller(int32_t ref, int32_t fb, int32_t *integral, int32_t kp, int32_t ki, int32_t max_out)
{
    int32_t err = ref - fb;
    *integral += err;
    // 抗积分饱和
    if (*integral > max_out) *integral = max_out;
    if (*integral < -max_out) *integral = -max_out;
    int32_t out = kp * err + ki * (*integral);
    // 输出限幅
    if (out > max_out) out = max_out;
    if (out < -max_out) out = -max_out;
    return out;
}

PI参数的整定方法通常采用极点配置法。对于表贴式PMSM,电流环被控对象近似为一阶惯性环节,其传递函数为:G(s) = 1/(Ls + R),其中L为定子电感,R为定子电阻。通过零极点对消,令PI调节器的零点与被控对象的极点相等,即Ki/Kp = R/L,则闭环带宽为:BW = Kp/L。工程上,电流环带宽通常设定为1~2kHz,因此Kp = BW * L,Ki = Kp * R / L。

参数物理意义整定方法典型值(GD32F303)
Kp比例增益,决定响应速度Kp = BW * L0.5~2.0(视电机参数)
Ki积分增益,消除稳态误差Ki = Kp * R / L50~200
积分限幅防止积分饱和取额定电压的80%0.8 * Vdc
输出限幅限制电压指令受限于直流母线电压±Vdc/√3
风险提示:PI调节器在数字实现时,必须注意积分饱和问题。当电机堵转或负载突变时,积分项可能持续累积导致输出饱和,恢复时产生超调。工程上采用"积分限幅+输出限幅"双重保护,并在积分项中加入衰减系数(如0.95),防止长时间饱和。

2.4 SVPWM调制原理与实现

SVPWM(空间矢量脉宽调制)是FOC的最终执行环节,它将电压指令Vα*、Vβ*转换为三相逆变器的开关信号。SVPWM的优点是直流母线电压利用率高(比SPWM高15.47%),且谐波含量低。

2.4.1 扇区判断

首先根据Vα、Vβ判断参考电压矢量所在的扇区。定义三个中间变量:

U1 = Vβ
U2 = (√3/2)*Vα - (1/2)*Vβ
U3 = -(√3/2)*Vα - (1/2)*Vβ

扇区号N = sign(U1) + 2*sign(U2) + 4*sign(U3),其中sign(x) = 1(x>0)或0(x≤0)。N值与扇区的对应关系为:N=1→扇区II,N=2→扇区VI,N=3→扇区I,N=4→扇区IV,N=5→扇区III,N=6→扇区V。

2.4.2 矢量作用时间计算

以扇区I为例,相邻基本矢量为U4(100)和U6(110),零矢量为U0(000)和U7(111)。作用时间计算如下:

X = (√3*Vβ*T) / Vdc
Y = (1.5*Vα + √3/2*Vβ) * T / Vdc
Z = (-1.5*Vα + √3/2*Vβ) * T / Vdc

各扇区的作用时间T1、T2查表得到,然后进行饱和限幅:若T1+T2 > T,则T1 = T1*T/(T1+T2),T2 = T2*T/(T1+T2)。零矢量时间T0 = T - T1 - T2。

2.4.3 占空比计算与PWM更新

采用七段式SVPWM,在一个PWM周期内,开关序列对称分布,以降低谐波。以扇区I为例,三相占空比为:

Ta = (T - T1 - T2) / 4
Tb = Ta + T1/2
Tc = Tb + T2/2

在GD32中,通过TIMER0的通道比较寄存器实现占空比更新。需要配置为中央对齐模式(向上/向下计数),并在周期中断中更新比较值。死区时间通过TIMER0的断路和死区寄存器(BDTR)配置,典型死区时间为1~2μs。

工程实现要点:SVPWM计算涉及大量浮点运算,在GD32F303上建议使用Q15格式定点运算。例如,将Vα、Vβ归一化到[-1, 1]范围,乘以32768后使用整数运算。查表法计算sin/cos时,使用2048点表,角度索引为θe * 2048 / 360。整个SVPWM计算(含扇区判断、时间计算、占空比更新)在GD32F303上约需3~5μs。

2.5 实战案例:基于GD32F303的FOC电流环调试

下面通过一个实际调试案例,展示FOC电流环从理论到落地的完整过程。

项目背景:某机器人关节模组采用GD32F303VET6作为主控,驱动一个表贴式PMSM(额定电压24V,额定电流2A,相电阻0.5Ω,相电感0.2mH,极对数4)。要求电流环带宽1kHz,电流采样频率20kHz。

初始现象:按照理论计算PI参数(Kp = BW * L = 1000 * 0.0002 = 0.2,Ki = Kp * R / L = 0.2 * 0.5 / 0.0002 = 500),上电后电机电流振荡严重,噪声大,无法稳定运行。

分析过程:通过逻辑分析仪抓取电流波形,发现电流在设定值附近以约2kHz频率振荡。进一步检查发现,电流采样时刻与PWM开关时刻未同步,导致采样噪声混叠。此外,PI参数中的Ki值过大,积分项在几个周期内就达到饱和。

解决步骤:

  1. 调整ADC采样时刻:将ADC注入组触发时刻设置为PWM计数器的峰值点(即占空比更新点),确保采样时刻远离开关噪声。
  2. 重新整定PI参数:将Kp调整为0.15,Ki调整为300,并增加积分限幅为0.5 * Vdc。
  3. 加入低通滤波器:在电流反馈通道加入一阶低通滤波器,截止频率5kHz,滤除高频噪声。
  4. 优化SVPWM死区补偿:在低电流区域加入死区补偿电压,补偿量为死区时间 * Vdc / T。

结果对比:调整后,电流环阶跃响应超调量从35%降至8%,调节时间从2ms缩短至0.8ms,稳态误差小于1%。电机运行噪声明显降低,温升从15℃降至8℃。

复盘经验:FOC调试中,电流采样质量往往比PI参数更关键。采样时刻、滤波、死区补偿等细节决定了系统的最终性能。建议在调试初期使用示波器观察电流波形,确认采样无异常后再进行参数整定。

2.6 常见误区与总结

  • 误区一:认为PI参数越大越好。实际上,过大的Kp会导致电流环振荡,过大的Ki会导致积分饱和。正确的做法是根据电机参数和带宽要求计算初值,再通过实验微调。
  • 误区二:忽略电流采样延时。从ADC采样到PWM更新存在一个控制周期的延时,这会在系统中引入相位滞后。对于高带宽应用,需要采用预测控制或Smith预估器进行补偿。
  • 误区三:SVPWM扇区判断错误。扇区判断的边界条件(U1、U2、U3等于0时)需要特殊处理,否则会产生错误的开关序列。建议在代码中加入边界判断,当|U1|、|U2|、|U3|小于阈值时强制归零。
  • 误区四:忽视死区时间的影响。死区时间会导致输出电压畸变,尤其在低速轻载时产生电流波形畸变和转矩脉动。需要根据实际死区时间进行补偿。
总结:FOC控制的核心在于坐标变换的准确性和PI调节器的稳定性。在GD32平台上,通过合理的资源分配(ADC注入组、TIMER0互补PWM、Cordic加速)和定点数优化,可以在低成本MCU上实现高性能的FOC控制。建议初学者先使用开环I/F启动验证硬件链路,再逐步闭环调试电流环、速度环和位置环。