4. 坐标变换(下):Park变换原理与公式推导,从两相静止到两相旋转
好,咱们接着聊。上一节我们把三相静止的ABC坐标系,硬生生掰成了两相静止的αβ坐标系。说白了,就是把三个绕组的烂摊子,简化成了两个互相垂直的线圈。
但问题来了——αβ坐标系还是静止的。你想想看,电机转子在转,定子磁场也在转,你拿个静止的坐标系去描述一个旋转的东西,那信号不还是正弦波吗?控制起来照样麻烦。
所以这一节,我们要干一件更彻底的事:把坐标系也转起来。让它跟着转子一起转。这就是Park变换。
4.1 为什么要转?——从交流变直流
我刚开始做FOC的时候,有个问题困扰了我很久:明明电机在转,为什么我看到的电流波形是正弦的?后来想明白了——因为我的坐标系是静止的。
你想象一下:你站在路边看一辆旋转木马,上面的小马在你眼里是上下起伏的。但如果你也骑上去,跟它一起转,那小马在你眼里就是静止的。
Park变换就是这个道理。我们把αβ坐标系旋转起来,让它跟转子磁场同步。这样一来,原来正弦变化的电流,在旋转坐标系里就变成了直流量。
核心思想:Park变换将两相静止坐标系(αβ)中的交流量,变换到两相旋转坐标系(dq)中的直流量。这是FOC能够实现精准扭矩控制的关键一步。
为什么要变成直流量?因为直流量的PID控制太成熟了。你调一个PI参数,就能把电流控得死死的。要是用交流量去调PID,那带宽、相位补偿什么的,够你喝一壶的。
4.2 Park变换的数学推导
好,咱们来推公式。别怕,我尽量讲得通俗点。
假设αβ坐标系里有一个矢量,它在α轴上的分量为Iα,在β轴上的分量为Iβ。现在我们要把这个矢量投影到一个旋转的dq坐标系上。
这个旋转坐标系,d轴与转子磁极方向对齐,q轴超前d轴90度。旋转角速度就是电角速度ωe,旋转角度θ = ωe·t。
说白了,就是做一个坐标旋转。你想想看,两个坐标系之间的夹角是θ,那么投影关系就是:
Id = Iα·cosθ + Iβ·sinθ
Iq = -Iα·sinθ + Iβ·cosθ
这就是Park变换的公式。写成矩阵形式更清爽:
[Id] [cosθ sinθ] [Iα]
[Iq] = [-sinθ cosθ] [Iβ]
嗯,这里要注意:θ是转子电角度,不是机械角度。电角度 = 机械角度 × 极对数。这个搞错了,电机就转不起来了。
我的小技巧:在实际代码里,我习惯把cosθ和sinθ提前算好,存成变量。因为每次变换都要用,省得重复计算。尤其是用定点MCU的时候,能省不少时钟周期。
4.3 逆变换——从dq回到αβ
有正变换就有逆变换。有时候我们需要把dq坐标系下的电压指令,变回αβ坐标系,才能送给SVPWM模块。
逆变换公式也很简单,就是正变换矩阵的逆矩阵。因为旋转矩阵是正交矩阵,逆矩阵等于转置矩阵:
[Iα] [cosθ -sinθ] [Id]
[Iβ] = [sinθ cosθ] [Iq]
这个公式在代码里也很常见。我一般把正变换和逆变换写成两个函数,参数传角度和电流值,返回变换后的结果。
4.4 知识体系与核心逻辑
为了让你更直观地理解整个坐标变换的脉络,我画了一张图。这张图展示了从三相静止到两相旋转的完整路径:
4.5 实际项目中的坑
讲完了理论,我跟你聊聊实际项目中容易踩的坑。这些可都是真金白银换来的经验。
坑一:角度对齐问题
Park变换需要转子电角度θ。这个角度从哪里来?编码器或者霍尔传感器。但问题是,传感器安装的时候,零位跟电机磁极的零位不一定对齐。
我曾经遇到过一台电机,装好编码器后,d轴电流怎么调都不对,扭矩输出忽大忽小。查了半天,发现编码器零位偏了15度。后来加了一个角度偏移校准的步骤,问题才解决。
坑二:角度更新频率
Park变换的θ需要实时更新。如果更新频率太低,坐标系就跟不上转子转速,变换出来的Id、Iq就会有纹波。
我建议:角度更新的频率至少是电流环频率的2倍。比如电流环跑10kHz,角度更新最好在20kHz以上。否则你会看到电流波形上叠加了低频振荡。
坑三:三角函数计算
嵌入式MCU算sin和cos很慢。尤其是用浮点运算的时候,一个三角函数能吃掉几十个微秒。
我的做法是:用查表法。提前算好一个周期的sin值,存成数组。运行时直接查表,线性插值。这样速度能快10倍以上。
注意:查表法要处理好角度溢出问题。角度超过360度时,要取模。否则数组越界,程序直接跑飞。我见过有人因为这个原因,电机转着转着突然失控,差点把设备搞坏。
4.6 代码示例:Park变换实现
最后,给你看一段我常用的Park变换代码。用C语言写的,适合嵌入式环境:
// Park变换:从αβ到dq
// 输入:Ialpha, Ibeta, sin_theta, cos_theta
// 输出:*Id, *Iq
void park_transform(float Ialpha, float Ibeta,
float sin_theta, float cos_theta,
float *Id, float *Iq)
{
*Id = Ialpha * cos_theta + Ibeta * sin_theta;
*Iq = -Ialpha * sin_theta + Ibeta * cos_theta;
}
// 逆Park变换:从dq到αβ
// 输入:Id, Iq, sin_theta, cos_theta
// 输出:*Ialpha, *Ibeta
void inv_park_transform(float Id, float Iq,
float sin_theta, float cos_theta,
float *Ialpha, float *Ibeta)
{
*Ialpha = Id * cos_theta - Iq * sin_theta;
*Ibeta = Id * sin_theta + Iq * cos_theta;
}
你看,代码其实很简单。核心就是那两行乘加运算。但就是这两行,把交流变直流,把复杂变简单。
好了,这一节就到这里。坐标变换的三部曲——Clark、Park、逆Park,你已经全部掌握了。接下来,我们就可以用这些变换后的直流量,去设计电流环的PID控制器了。
公众号:蓝海资料掘金营,微信deep3321