2. Clark变换与Park变换:三相坐标系与两相坐标系
好,咱们进入FOC算法里最核心的数学基础——坐标变换。说实话,很多初学者一看到这些矩阵公式就头大,觉得抽象。但我想告诉你,坐标变换的本质,就是换个角度看问题。
你想想看,电机里实际流的是三相正弦电流,可我们控制的时候,最想要的是像直流电机那样,直接控制转矩和磁通。怎么办?那就把三相静止坐标系下的东西,先变到两相静止坐标系,再旋转到跟转子同步的两相旋转坐标系。这就是Clark和Park干的事。
一句话总结:Clark变换把三相(abc)变两相(αβ),Park变换把静止两相(αβ)变旋转两相(dq)。逆变换就是反过来走。
2.1 为什么非要从三相变两相?
我刚开始做FOC时也有这个疑问:三相好好的,为什么要折腾?
原因其实很简单——三相耦合太强了。三相电流ia、ib、ic不是独立的,它们满足ia+ib+ic=0。你控制其中一相,另外两相跟着变。这就像三个人抬一个东西,你一个人使劲,另外两个人也得配合,控制起来很麻烦。
而两相坐标系下,两个轴是正交的(相差90°),互相解耦。你可以独立控制一个轴产生转矩,另一个轴产生磁通,互不干扰。这就是FOC的精髓——解耦控制。
我记得第一次调FOC参数时,在dq坐标系下调PID,感觉就像在调直流电机,非常直观。这就是变换带来的好处。
2.2 Clark变换:从abc到αβ
Clark变换,也叫3→2变换。它把三相静止坐标系(a、b、c轴互差120°)映射到两相静止坐标系(α轴和β轴正交)。
这里有个关键点:变换前后功率不变还是幅值不变?这是工程里最容易踩的坑。
- 等幅值变换:变换前后电流/电压的幅值保持不变。工程上最常用,因为PI调节器的输出直接对应实际物理量。
- 等功率变换:变换前后功率保持不变。理论推导常用,但工程实现时系数不同。
我个人习惯用等幅值变换,因为调试时更直观。下面给出等幅值Clark变换公式:
// 等幅值Clark变换
iα = ia
iβ = (ia + 2*ib) / √3
// 矩阵形式
| iα | | 1 -1/2 -1/2 | | ia |
| iβ | = | 0 √3/2 -√3/2 | | ib |
| i0 | | 1/2 1/2 1/2 | | ic |
注意那个i0分量,它叫零序分量。对于星形连接且中线不接的电机,ia+ib+ic=0,所以i0=0,可以忽略。但如果是三角形连接或者有中线,i0就不能丢。
我的经验:在代码实现时,不要直接套矩阵乘法,那样计算量大。用简化公式:iα = ia,iβ = (ia + 2*ib) * 0.57735(1/√3的近似值)。这样只需要两次乘法和一次加法,效率高很多。
2.3 Park变换:从αβ到dq
Clark变换后,我们得到了两相静止坐标系下的电流iα、iβ。但它们还是正弦波,没法直接控制。怎么办?让坐标系跟着转子转。
Park变换就是干这个的。它把静止的αβ坐标系,旋转到与转子磁极同步的dq坐标系。d轴(直轴)对准转子磁极方向,q轴(交轴)超前d轴90°。
变换公式如下:
// Park变换
id = iα * cos(θ) + iβ * sin(θ)
iq = -iα * sin(θ) + iβ * cos(θ)
// 矩阵形式
| id | | cos(θ) sin(θ) | | iα |
| iq | = | -sin(θ) cos(θ) | | iβ |
这里的θ是转子电角度,由编码器或霍尔传感器提供。变换之后,id和iq就变成了直流量。你可以直接给它们设定目标值,用PI调节器控制。
我曾经踩过的坑:θ的零点校准。如果编码器安装时零点没对准,Park变换后的dq轴电流会耦合。表现为:你给iq设定值,id也跟着变。后来我养成了习惯——每次上电先做一次角度校准,确保d轴对准转子磁极。
2.4 逆变换:从dq回到abc
控制算法在dq坐标系下算出了目标电压ud、uq,但最终要加到电机三相绕组上。所以得变回去。
先做逆Park变换(dq→αβ):
// 逆Park变换
uα = ud * cos(θ) - uq * sin(θ)
uβ = ud * sin(θ) + uq * cos(θ)
再做逆Clark变换(αβ→abc):
// 等幅值逆Clark变换
ua = uα
ub = -0.5 * uα + (√3/2) * uβ
uc = -0.5 * uα - (√3/2) * uβ
最后得到的ua、ub、uc就是三相电压的给定值,送到SVPWM模块生成PWM波。
2.5 工程实现中的关键细节
理论讲完了,咱们聊聊实际写代码时要注意什么。
2.5.1 三角函数计算
Park变换里要用到sin和cos。如果每次都在中断里实时计算,CPU扛不住。我一般用两种方法:
- 查表法:提前算好一个周期的sin值,存成数组。运行时根据θ查表,线性插值。速度快,精度够用。
- CORDIC算法:只用移位和加减法算三角函数,适合没有FPU的MCU。
2.5.2 角度处理
θ的范围是0~2π,但编码器计数可能超过这个范围。我习惯把θ归一化到[0, 1)或[0, 2π),用取模运算处理。注意浮点数取模效率低,用定点数或整数实现更好。
2.5.3 变换顺序
FOC控制周期里,变换的顺序是固定的:
- 采样三相电流ia、ib、ic
- Clark变换:abc → αβ
- Park变换:αβ → dq
- PI调节器计算ud、uq
- 逆Park变换:dq → αβ
- 逆Clark变换:αβ → abc
- SVPWM输出
这个顺序不能乱,尤其是Park和逆Park用的θ必须是同一个时刻的角度。
核心要点:整个FOC的精度,很大程度上取决于坐标变换的精度。角度不准、系数不对、时序错乱,都会导致控制效果变差。我建议你在调试时,先把变换前后的波形打印出来,确认正弦波变直流量、直流量变正弦波都正确,再往下走。
2.6 知识体系总览
下面这张图把整个坐标变换的流程和关系画清楚了,你可以对照着看:
2.7 常见问题与避坑
| 问题 | 现象 | 原因 | 解决方法 |
|---|---|---|---|
| dq轴电流耦合 | 调iq时id跟着变 | 角度零点未校准 | 上电做角度校准,确保d轴对准转子磁极 |
| 电流波形畸变 | 三相电流不是正弦波 | 变换系数用错(等幅值vs等功率) | 确认变换系数一致,逆变换用对应系数 |
| 高频噪声大 | 电流采样值跳动 | 角度更新与电流采样不同步 | 确保Park和逆Park用同一时刻的θ |
| 电机转矩波动 | 低速时抖动明显 | 三角函数精度不够 | 提高查表点数或改用CORDIC |
我的调试习惯:先在开环模式下验证坐标变换。给一个固定的ud和uq,看三相电流是不是正弦波,频率对不对。确认变换无误后,再闭环调PI。这样能快速定位问题是出在变换还是出在控制。