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的输入是电压指令,输出是六个功率管的开关时序。中间经过的路径是这样的:
- 电流采样:得到三相电流ia、ib、ic
- Clarke变换:ia、ib、ic → iα、iβ
- Park变换:iα、iβ → id、iq(用当前角度θ)
- PI调节:对id、iq分别做闭环控制,输出Vd_ref、Vq_ref
- 逆Park变换:Vd_ref、Vq_ref → Vα_ref、Vβ_ref(用当前角度θ)
- SVPWM合成:Vα_ref、Vβ_ref → 占空比 → PWM波
你看,坐标变换出现了两次:一次在前向通道(电流反馈),一次在反向通道(电压输出)。它们共用同一个角度θ,这个角度必须实时更新。
关键点:逆Park变换输出的Vα、Vβ,就是SVPWM算法要合成的电压矢量。SVPWM不关心id、iq,它只认αβ坐标系下的两个正交分量。所以坐标变换是连接“控制算法”和“调制算法”的桥梁。
2.4 一张图看懂变换流程
下面这张SVG图,把整个变换链条画清楚了。我建议你多看几遍,把每个模块的输入输出记牢。
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β。