2. 空间矢量基础:三相坐标系与两相静止坐标系(Clark变换)、两相静止坐标系与两相旋转坐标系(Park变换)、电压空间矢量的概念。

好,咱们正式开始啃SVPWM的第一块硬骨头——空间矢量基础。

说实话,很多做FOC的朋友一开始就被这些变换绕晕了。什么Clark、Park,听起来像两个人名,其实就是两套坐标变换工具。我个人习惯把这三部分串起来理解:先有物理世界(三相),再映射到数学平面(两相静止),最后跟着转子转起来(两相旋转)。

2.1 为什么非要从三相变到两相?

你想想看,电机里三个绕组,通上三相对称电流,产生的是一个旋转磁场。但三个变量(Ia, Ib, Ic)控制起来太麻烦了。能不能用两个变量来描述同一个磁场?

能。这就是Clark变换的初衷——降维。

我在项目中遇到过一位同事,死活不肯做变换,直接用三个PID去调三相电流。结果呢?电流环带宽上不去,电机嗡嗡响。后来我帮他改成Clark+Park,问题立马解决。说白了,控制两相永远比控制三相简单。

核心思想: 三相电流 Ia + Ib + Ic = 0(星形连接,无中线),所以实际上只有两个自由度。Clark变换就是把这个约束条件显式地利用起来。

2.2 Clark变换:从ABC到αβ

Clark变换,也叫3s/2s变换(三相静止→两相静止)。它把三相坐标系(A, B, C,互差120°)映射到两相直角坐标系(α, β,互差90°)。

公式其实很简单,就是投影。我习惯用等幅值变换,因为这样变换后的电流幅值跟实际相电流幅值一样,调试时心里有数。

// 等幅值Clark变换(C语言实现)
void clark_transform(float Ia, float Ib, float Ic, float *Ialpha, float *Ibeta) {
    *Ialpha = Ia;                              // α轴 = A相
    *Ibeta  = (Ia + 2.0f * Ib) / 1.732f;       // β轴 = (Ia + 2*Ib) / √3
    // 注意:这里利用了 Ia + Ib + Ic = 0,所以 Ic = -Ia - Ib
}

嗯,这里要注意:等幅值变换和等功率变换的系数不同。等幅值变换的系数是2/3,等功率变换的系数是√(2/3)。我建议初学者先用等幅值,因为调试时看电流波形更直观。

变换类型 α轴公式 β轴公式 特点
等幅值 Iα = Ia Iβ = (Ia + 2Ib)/√3 变换后幅值不变,调试直观
等功率 Iα = √(2/3)·Ia Iβ = (Ia + 2Ib)/√2 变换前后功率守恒,理论分析常用

避坑指南: 我曾经在代码里把Clark变换的系数写错了,结果电流环怎么调都震荡。后来用示波器抓了αβ轴的波形,发现幅值不对。记住:等幅值变换的逆变换系数是1,不是2/3。很多教材只给正变换,逆变换要自己推,容易出错。

2.3 Park变换:从αβ到dq

Clark变换之后,我们得到了两个正交的正弦波(Iα, Iβ)。但正弦波还是交流量,PID跟踪交流量会有静差。怎么办?

让坐标系跟着转子转起来!

Park变换(2s/2r变换)就是把静止的αβ坐标系,旋转到与转子磁场同步的dq坐标系。旋转角度就是转子位置角θ。

变换之后,Id和Iq就变成了直流量。PID控制直流量,那叫一个稳。

// Park变换(C语言实现)
void park_transform(float Ialpha, float Ibeta, float theta, float *Id, float *Iq) {
    float sin_theta = sinf(theta);
    float cos_theta = cosf(theta);
    *Id =  Ialpha * cos_theta + Ibeta * sin_theta;
    *Iq = -Ialpha * sin_theta + Ibeta * cos_theta;
}

这里有个关键点:θ从哪里来? 有传感器(编码器、霍尔)就直接读,无传感器就用观测器估算。我早期做无感FOC时,θ估算不准,Park变换出来的Id/Iq全是噪声。后来换了滑模观测器,才算搞定。

警告: Park变换的θ必须与转子磁极位置严格对齐。如果θ偏差超过90°,Id和Iq会完全反号,电机不但不转,还会剧烈抖动。我见过有人把编码器AB相接反了,结果电机像抽风一样。排查了半天才发现是θ符号反了。

2.4 电压空间矢量:SVPWM的“原材料”

好,Clark和Park都是对电流做的变换。那电压呢?

SVPWM的核心,就是用六个功率管(三相全桥)的开关状态,合成一个任意方向的电压矢量。这个矢量在αβ平面上旋转,就产生了旋转磁场。

电压空间矢量的概念其实很直观:

  • 六个基本矢量:V1(100)到V6(101),对应六个非零开关状态,互差60°。
  • 两个零矢量:V0(000)和V7(111),对应上桥全关或全开,输出电压为0。
  • 合成矢量:通过控制基本矢量的作用时间,可以合成任意方向和幅值的电压矢量。

我个人习惯把电压空间矢量想象成一个“六边形蛋糕”。每个基本矢量是一块,通过切分和组合,就能得到任意角度的“蛋糕片”。

电压空间矢量六边形与扇区划分 扇区I (0°~60°) 扇区II (60°~120°) 扇区III (120°~180°) 扇区IV (180°~240°) 扇区V (240°~300°) 扇区VI (300°~360°) V1(100) V2(110) V3(010) V4(011) V5(001) V6(101) V0(000)/V7(111) Vref (合成矢量) 说明:六个基本矢量将平面分为6个扇区。通过相邻两个基本矢量与零矢量的时间组合,可合成任意Vref。

2.5 三个变换的完整链路

把上面三个变换串起来,就是FOC的完整电流采样链路:

  1. ADC采样:得到三相电流 Ia, Ib, Ic(Ic = -Ia - Ib,可省一路ADC)
  2. Clark变换:Ia, Ib, Ic → Iα, Iβ
  3. Park变换:Iα, Iβ, θ → Id, Iq
  4. PI调节器:对Id, Iq分别做闭环控制,输出Vd_ref, Vq_ref
  5. 逆Park变换:Vd_ref, Vq_ref, θ → Vα_ref, Vβ_ref
  6. SVPWM:Vα_ref, Vβ_ref → 三相占空比 → 驱动功率管

你看,Clark和Park是正向链路,逆Park和SVPWM是反向链路。整个环路的精度,取决于每一步的计算精度和θ的准确性。

我的经验: 在嵌入式MCU上实现时,建议把所有变换写成定点数或Q格式,避免浮点运算拖慢中断。我曾在STM32F103上跑浮点Clark+Park,中断周期只能做到100μs。改成定点后,直接压到50μs,电流环带宽翻了一倍。

2.6 本章小结

这一章我们搞清楚了三个核心问题:

  • Clark变换:把三相交流量变成两相交流量,降维打击。
  • Park变换:把两相交流量变成两相直流量,方便PID控制。
  • 电压空间矢量:六个基本矢量+两个零矢量,通过时间合成任意电压。