2. Clarke变换与Park变换:深入推导坐标变换公式,理解其在SVPWM中的作用

坐标变换,说白了就是换个角度看问题。

你想想看,电机里转的是转子,定子上缠的是三相绕组。三相电流在空间上差120°,产生的磁场是旋转的。可我们做控制,最习惯的是处理直流量——给一个值,系统就稳定在那个状态。怎么把交流的、旋转的东西变成直流的、静止的东西?这就是Clarke和Park变换干的事。

我刚开始接触伺服驱动时,总觉得这些变换就是一堆矩阵乘法,背下来就行。直到有一次调试一个高速主轴电机,转速一上去电流就震荡,怎么调PI参数都没用。后来回头仔细推了一遍变换公式,才发现是坐标系的相位没对齐。嗯,从那以后我再也不敢小看这两个变换了。

核心认知:Clarke变换把三相静止坐标系(abc)变到两相静止坐标系(αβ);Park变换再把两相静止坐标系变到两相旋转坐标系(dq)。最终目的是让交流量变成直流量,方便我们用PI控制器做无静差跟踪。

2.1 从三相到两相:Clarke变换的推导

先看电机定子。三相绕组在空间上互差120°,通入三相电流后,产生的磁动势是一个旋转矢量。我们想用两个正交的绕组(α轴和β轴)来等效这个旋转矢量。

等效的条件是什么?磁动势不变。也就是说,三相绕组产生的合成磁动势,必须等于两相绕组产生的合成磁动势。

设三相绕组的有效匝数为N₃,两相绕组的有效匝数为N₂。根据磁动势等效:

N₂·iα = N₃·(ia - ib·cos60° - ic·cos60°)
N₂·iβ = N₃·(0 + ib·sin60° - ic·sin60°)

代入cos60°=1/2,sin60°=√3/2,整理得到:

iα = (N₃/N₂)·(ia - ½·ib - ½·ic)
iβ = (N₃/N₂)·(√3/2·ib - √3/2·ic)

这里有个关键问题:匝数比怎么定?

我个人的习惯是采用等幅值变换。所谓等幅值,就是变换前后合成矢量的幅值不变。取N₃/N₂ = 2/3,得到:

iα = (2/3)·(ia - ½·ib - ½·ic)
iβ = (2/3)·(√3/2·ib - √3/2·ic)

写成矩阵形式:

| iα |   | 1    -1/2   -1/2 | | ia |
| iβ | = | 0    √3/2  -√3/2 | | ib |
| i0 |   | 1/2   1/2    1/2  | | ic |

第三行是零序分量,在三相三线制系统中通常为0。

我的经验:实际代码实现时,我一般只算α和β两路,零序分量直接忽略。但要注意,如果电机是Y型接法且中性点引出,零序电流可能会带来共模干扰,这时候就得小心了。

2.2 让坐标系转起来:Park变换的推导

Clarke变换做完,我们得到了αβ坐标系下的两相交流量。但交流量还是随时间变化的,PI控制器对交流量的跟踪效果并不好——会有稳态误差。

怎么办?让坐标系跟着转子一起转。

Park变换的本质,就是把αβ静止坐标系旋转一个角度θ,得到dq旋转坐标系。θ就是转子位置角(对于永磁同步电机)或磁链角(对于异步电机)。

从几何上看,αβ坐标系和dq坐标系的关系就是旋转:

id = iα·cosθ + iβ·sinθ
iq = -iα·sinθ + iβ·cosθ

写成矩阵:

| id |   | cosθ   sinθ | | iα |
| iq | = | -sinθ  cosθ | | iβ |

反过来,从dq变回αβ:

| iα |   | cosθ  -sinθ | | id |
| iβ | = | sinθ   cosθ | | iq |

这就是逆Park变换,在SVPWM里我们会用到它——把控制器输出的dq电压指令,变回αβ坐标系,再合成PWM波。

注意:θ的精度直接影响变换效果。我曾经在一个项目里用了霍尔传感器估算角度,低速时角度误差大,导致dq轴电流耦合严重,电机嗡嗡响。后来换成编码器,问题才解决。角度不准,Park变换就是白做。

2.3 坐标变换在SVPWM中的角色

现在我们把整个链条串起来,看看坐标变换在SVPWM里到底起了什么作用。

SVPWM的输入是电压指令,输出是六个功率管的开关时序。中间经过的路径是这样的:

  1. 电流采样:得到三相电流ia、ib、ic
  2. Clarke变换: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 → 占空比 → PWM波

你看,坐标变换出现了两次:一次在前向通道(电流反馈),一次在反向通道(电压输出)。它们共用同一个角度θ,这个角度必须实时更新。

关键点:逆Park变换输出的Vα、Vβ,就是SVPWM算法要合成的电压矢量。SVPWM不关心id、iq,它只认αβ坐标系下的两个正交分量。所以坐标变换是连接“控制算法”和“调制算法”的桥梁。

2.4 一张图看懂变换流程

下面这张SVG图,把整个变换链条画清楚了。我建议你多看几遍,把每个模块的输入输出记牢。

坐标变换在SVPWM中的完整流程 三相电流 ia, ib, ic Clarke变换 αβ电流 iα, iβ Park变换 dq电流 id, iq PI调节器 dq电压 Vd, Vq 逆Park变换 αβ Vα, Vβ SVPWM合成 角度θ (编码器/观测器) 反馈通道:电流→αβ→dq 控制通道:dq→αβ→SVPWM

2.5 等幅值 vs 等功率:选哪个?

推导Clarke变换时,我提到了匝数比的选择。实际上有两种主流方案:

对比项 等幅值变换 等功率变换
匝数比 N₃/N₂ 2/3 √(2/3)
变换后矢量幅值 与原三相合成矢量相同 变为原幅值的√(3/2)倍
功率计算 需乘以3/2系数 直接相等,无需系数
工程常用场景 电流环、SVPWM调制 功率计算、效率分析

我个人在伺服驱动里几乎只用等幅值变换。为什么?因为SVPWM的电压矢量幅值直接对应母线电压利用率,用等幅值变换后,Vα、Vβ的最大幅值就是Vdc/√3,物理意义非常清晰。等功率变换虽然功率计算方便,但幅值变了,调试时容易搞混。

避坑指南:我曾经在一个项目里,代码里用的是等幅值变换,但参考手册里给的PI参数是按等功率变换算的。结果电流环怎么调都震荡,折腾了两天才发现是变换系数不匹配。所以,一定要在代码注释里写清楚你用的是哪种变换,不然坑的是自己。

2.6 离散化实现:代码怎么写?

理论推导完了,最终要落到代码里。我给出一个典型的C语言实现片段,注意看角度更新和变换的顺序。

// 假设已经采样得到 ia, ib, ic
// 角度 theta 由编码器或观测器提供

// 1. Clarke变换(等幅值)
i_alpha = (2.0f/3.0f) * (ia - 0.5f*ib - 0.5f*ic);
i_beta  = (2.0f/3.0f) * (0.8660254f*ib - 0.8660254f*ic);  // √3/2 ≈ 0.866

// 2. Park变换
sin_theta = sinf(theta);
cos_theta = cosf(theta);
i_d = i_alpha * cos_theta + i_beta * sin_theta;
i_q = -i_alpha * sin_theta + i_beta * cos_theta;

// 3. PI调节(略),得到 Vd_ref, Vq_ref

// 4. 逆Park变换
V_alpha = Vd_ref * cos_theta - Vq_ref * sin_theta;
V_beta  = Vd_ref * sin_theta + Vq_ref * cos_theta;

// 5. 送入SVPWM模块,合成占空比
svpwm_calc(V_alpha, V_beta);

这里有个细节:角度θ必须在Park和逆Park中使用同一个值。如果PWM周期是100μs,那么每个周期开始前先更新θ,然后依次做变换和PI运算,最后更新占空比。θ的更新频率和PWM频率一致。

注意:sinf和cosf的计算比较耗时。如果MCU没有硬件三角函数加速器,建议用查表法或CORDIC算法。我在一个低成本MCU上做过测试,软件算一次sin/cos大约要5μs,两个就是10μs,占掉了PWM周期的10%。这种情况下,可以考虑用角度增量近似,或者降低三角函数更新频率。

2.7 小结:坐标变换到底解决了什么问题?

回到最开始的问题。为什么非要做坐标变换?

因为电机控制的核心是转矩控制。对于永磁同步电机,转矩正比于iq(交轴电流),而id(直轴电流)控制磁链。如果我们在abc坐标系下直接控制,三个电流都是交流量,互相耦合,根本没法独立调节转矩和磁链。

经过Clarke和Park变换后,id和iq变成了直流量。我们可以用PI控制器让id=0(或者弱磁时给负值),让iq跟随转矩指令。两个环路解耦了,控制就简单了。

而SVPWM,就是负责把PI算出来的Vd、Vq,最终变成实实在在的六个开关信号。坐标变换是连接“控制目标”和“物理实现”的桥梁——没有它,SVPWM就不知道要合成什么电压矢量。

一句话总结:Clarke变换把三相变两相,Park变换把静止变旋转。两者配合,让交流电机控制变成了直流电机控制。SVPWM站在这个链条的末端,只负责执行,不负责理解——它只需要Vα和Vβ。