☰
永磁同步电机FOC核心:Clarke与Park坐标变换详解及工程实践
2026/9/29 18:28:31 网站建设 项目流程

做电机控制的工程师,十有八九都经历过这种场景:板子焊好了,程序烧进去了,电机也能哼哼地转,但电流波形就是一股怪味,相电流幅值忽大忽小,转矩忽高忽低,带点负载就抖给你看。翻来覆去查了一整天,最后发现根本不是高档问题——就是坐标变换的矩阵系数写错了一位。永磁同步电机矢量控制(FOC)的底层,其实就是和坐标变换打交道的过程。从三相静止坐标系到d-q坐标系,中间要过Clarke变换和Park变换两道数学关卡,这两关过不明白,后面什么电流环、转速环、参数辨识全是空中楼阁。

这篇文章想把永磁同步电机矢量控制里从三相静止坐标系到d-q坐标系的数学转换彻底讲透,包括变换矩阵怎么推、等幅值和等功率怎么选、反变换和SVPWM怎么衔接、以及对编码器零位和角度处理的工程经验。内容既有推导也有调试心得,适合刚接触FOC的学生、正在调板子的一线工程师,以及想把手里的电机驱动代码从"能转"升级到"能做好"的嵌入式开发者。

1. 被方程逼出来的坐标变换:先搞懂为什么非转不可

1.1 三相PMSM的数学模型为什么"难搞"

先说一个新手经常问的问题:三相电机的电压方程本来就清清楚楚写在教科书上,为什么非要费劲吧啦地做坐标变换?直接解三相方程不行吗?

行,但很痛苦。你看永磁同步电机在三相静止坐标系下的定子电压方程和磁链方程,写出来长这个样子:

$$u_a = R_s i_a + \frac{d\psi_a}{dt}$$

$$u_b = R_s i_b + \frac{d\psi_b}{dt}$$

$$u_c = R_s i_c + \frac{d\psi_c}{dt}$$

看起来还算清爽,但磁链方程一展开就麻烦了。A相绕组的磁链不只是由A相电流产生,B相、C相电流也在A相绕组里产生互感磁链,更关键的是,转子永磁体产生的磁链在A相绕组中的投影是随转子位置连续变化的。也就是说,电感矩阵里到处都是$\cos\theta$、$\sin\theta$、$\cos(2\theta)$这类项,而且每一项的大小还和转子位置有关。

想象一下这个场景:你写一个方程组,里面的系数会随着电机的转动不断变化,而且三个方程之间互相耦合,A相的变化会牵扯B相和C相,B相的变化又反过来影响A相。想在这种方程上直接设计线性PI控制器?根本无从下手,因为被控对象的传递函数里有一堆时变系数,没有任何经典控制理论能直接处理这种系统。

很多入门文档会一笔带过"三相耦合严重"这个说法,但我想把它说得更直白一点:三相静止坐标系下的PMSM模型,电流之间互相拉扯,电感参数随角度波动,转子磁链方向也在变,整个系统是一个多输入多输出的非线性时变系统。你在相电压上单独加一个直流量,电流响应根本不是一个稳定的直流量能描述的——因为转子位置在动,电感在变,反电动势也在变。

1.2 "降维打击"的思路:先合三为一,再化动为静

既然三相坐标这么别扭,那干脆换一个坐标系。核心思路分两步:

第一步,Clarke变换。把空间上相差120°的三相绕组,投影到两相静止坐标系$\alpha\beta$上。这一步的本质是"合并"——三相互差120°的正弦量,可以用两个互相垂直的正弦量完全表示,第三个分量(零序分量)在三相三线制系统里基本为零。打个比方,三根绳子朝着三个方向拉,合力其实可以分解成水平和垂直两个方向上的两个力,只要合成结果一样,对负载来说就没有区别。

第二步,Park变换。把$\alpha\beta$两相静止坐标系旋转起来,让它跟着转子同步转,转成d-q坐标系。这一步的本质是"化动为静"——坐标轴本身在旋转,只要旋转速度和转子同步,那么原本在静止坐标系下观察到的交流量,在旋转坐标系下就变成了直流量。你坐在旋转木马上看地面上的人,会觉得人是在绕着你转;你站在地面上看旋转木马,看到的是木马的圆周运动。两种视角都没错,但站在木马上去控制站在木马上的人,显然更容易。

这两步合起来,就是矢量控制里最核心的坐标变换链路。经过这两步之后,原本随角度变化的互感项变成了常数,原本互相耦合的三相电流变成了两个独立的直流量$i_d$和$i_q$,这时候PI控制器才终于有了用武之地——对直流量做PI控制,那是经典控制理论的舒适区。

2. Clarke变换:三相静止到两相静止的投影

2.1 从几何投影推导Clarke变换矩阵

Clarke变换的任务,是把三相静止坐标系下的量变换到两相静止坐标系。三相绕组在空间上互差120°,两相绕组在空间上互差90°,它们描述的是同一个合成磁动势。

假设三相电流分别为$i_a$、$i_b$、$i_c$,合成电流矢量为:

$$\vec{i_s} = k\left(i_a + i_b e^{j\frac{2\pi}{3}} + i_c e^{j\frac{4\pi}{3}}\right)$$

注意这里有个系数$k$,它的取值决定了变换是等幅值还是等功率,后面细说。把这个复矢量投影到$\alpha$轴和$\beta$轴上:

$$i_\alpha = k\left(i_a - \frac{1}{2}i_b - \frac{1}{2}i_c\right)$$

$$i_\beta = k\left(\frac{\sqrt{3}}{2}i_b - \frac{\sqrt{3}}{2}i_c\right)$$

如果取$k=\frac{2}{3}$,就是等幅值Clarke变换,写成矩阵形式:

$$ \begin{bmatrix} i_\alpha \ i_\beta \ i_0 \end{bmatrix}

\frac{2}{3} \begin{bmatrix} 1 & -\frac{1}{2} & -\frac{1}{2} \ 0 & \frac{\sqrt{3}}{2} & -\frac{\sqrt{3}}{2} \ \frac{1}{2} & \frac{1}{2} & \frac{1}{2} \end{bmatrix} \begin{bmatrix} i_a \ i_b \ i_c \end{bmatrix} $$

注意第三行是零序分量。对于三相三线制电机驱动,由于$i_a+i_b+i_c=0$,零序恒为零,所以工程上经常直接省略这一行,只算前两行。

这时候有一个非常优雅的性质:在对称三相电流($i_a+i_b+i_c=0$)条件下,$i_\alpha = i_a$。也就是说,A相电流的瞬时值直接就是$\alpha$轴电流,这把调试时的观测难度大大降低了。而$\beta$轴电流则可以简化为:

$$i_\beta = \frac{1}{\sqrt{3}}(i_b - i_c)$$

把互差120°的两相相减,正好得到相位超前90°的分量。这个简化式在很多代码里直接用来写Clarke变换,省一行矩阵运算,效果完全一样。

2.2 等幅值与等功率:两套约定怎么选

Clarke变换的系数$k$不只可以取$\frac{2}{3}$,还可以取$\sqrt{\frac{2}{3}}$,这就是等功率变换。这两种约定没有对错之分,但直接影响后续所有公式的形式和工程调试时的读数习惯。

对比项等幅值变换等功率变换
变换系数$\frac{2}{3}$$\sqrt{\frac{2}{3}}$
$\alpha\beta$分量幅值与相幅值关系相等,便于示波器观察是相幅值的$\sqrt{\frac{3}{2}}$倍
三相总功率与$\alpha\beta$功率关系$P = \frac{3}{2}(u_\alpha i_\alpha + u_\beta i_\beta)$$P = u_\alpha i_\alpha + u_\beta i_\beta$
常见使用场景工业控制、DSP代码习惯Simulink仿真、功率计算
变换矩阵的正交性非正交,逆矩阵不等于转置正交,逆矩阵等于转置

工程上我个人的习惯是:代码里用等幅值变换,因为调试时我想从示波器上直接读出电机的真实相电流幅值,一眼就能看出来有没有过流、电流环响应到底有多快。如果用了等功率变换,所有波形幅值都带着$\sqrt{1.5} \approx 1.225$倍的系数,虽然换算也不复杂,但调试效率低一些。

等功率变换的优势在于它的正交性:变换矩阵的逆矩阵等于转置矩阵,数学处理上更简洁,而且变换前后的功率表达式不加系数,这在推导功率公式、构建仿真模型时非常方便。很多Simulink官方模型默认用等功率变换,所以如果你拿仿真模型里的数据对照自己代码的实测结果,一定要先确认两边用的是同一套约定,否则会出现1.225倍或者1.5倍的偏差,这个问题我见过不下十次。

2.3 零序分量和反变换的细节

很多人学到Clarke变换会忽略零序分量那一行,这本身没错,但要理解为什么能忽略。零序分量对应的是三相电流中的共模部分,在三相三线制电机驱动中,因为没有中线,共模电流没有通路,所以$i_0=0$。但在三相四线制或者故障工况(比如匝间短路)下,零序分量不再为零,这时候如果要建立匝间短路模型或者诊断故障,就必须完整保留第三行。

反Clarke变换同样重要。既然是等幅值变换,逆矩阵直接求就行。从$\alpha\beta$回到abc的等幅值变换是:

$$ \begin{bmatrix} i_a \ i_b \ i_c \end{bmatrix}

\begin{bmatrix} 1 & 0 \ -\frac{1}{2} & \frac{\sqrt{3}}{2} \ -\frac{1}{2} & -\frac{\sqrt{3}}{2} \end{bmatrix} \begin{bmatrix} i_\alpha \ i_\beta \end{bmatrix} $$

注意这个逆变换在省略零序的前提下才成立。如果输入$\alpha\beta$分量对应的是三相平衡系统,反变换出来的三相量自然也是平衡的。在后续SVPWM生成时,反Clarke变换的输出会直接给到三相调制波计算,所以它和PWM模块的衔接精度直接影响电压输出质量。

3. Park变换:两相静止到两相旋转的关键一跳

3.1 从旋转磁场到静止直流的数学映射

Clarke变换做完之后,我们得到了两相静止坐标系下的电流$i_\alpha$、$i_\beta$。这两个量仍然是交流量,频率和电机同步转速一致。对交流量做PI控制依然麻烦——PI控制器对直流的跟踪是无静差的,但对抗动交流量的跟踪会存在幅值和相位误差。

Park变换就是来解决这个问题的:把$\alpha\beta$坐标系整体旋转起来,让它以电角速度$\omega_e$跟随转子旋转。旋转角度记为$\theta$,d轴与$\alpha$轴之间的夹角就是$\theta$。把$\alpha\beta$平面上的电流矢量投影到旋转的d轴和q轴上:

$$i_d = i_\alpha \cos\theta + i_\beta \sin\theta$$

$$i_q = -i_\alpha \sin\theta + i_\beta \cos\theta$$

写成矩阵形式:

$$ \begin{bmatrix} i_d \ i_q \end{bmatrix}

\begin{bmatrix} \cos\theta & \sin\theta \ -\sin\theta & \cos\theta \end{bmatrix} \begin{bmatrix} i_\alpha \ i_\beta \end{bmatrix} $$

这就是Park变换。你可以把它理解成一个"旋转的投影仪"——坐标系跟着转子一起转,原本在静止坐标系里看到的旋转矢量,在旋转坐标系里看就是一个固定点。如果电流矢量和d轴方向一致,那么$i_q=0$,这就是励磁电流和转矩电流分离的状态。

这里有个新手特别容易转不过来的点:Park变换里输入的角度是电角度,不是机械角度。电角度跟机械角度之间差一个极对数倍数,后面细讲。

3.2 电角度与机械角度换算、转子位置获取

转子位置$\theta$从哪里来?两种方式:有传感器方案用旋变或者编码器读取机械角度,再乘以极对数得到电角度;无传感器方案通过观测器(如滑模观测器、扩展卡尔曼滤波器)估算反电动势来推算电角度。

电角度和机械角度的关系是:

$$\theta_e = n_p \cdot \theta_m$$

其中$n_p$是电机的极对数。一个4极对电机,转子转一圈,电角度变化$4 \times 360° = 1440°$,也就是4个电周期。这直接决定了变换的精度要求——电角度差1°电角度,在4极对电机上对应机械角度只有0.25°,编码器分辨率不够的话,电流波形上会看到明显的高频纹波。

实际工程中,电角度的获取通常有两种方式:增量式编码器加Z脉冲校准,或者绝对值编码器直接输出绝对角度。增量式的处理方法是每次上电先找Z脉冲,建立机械零位,然后从码盘计数累加角度,再换算成电角度。这里有个隐患:如果你在调试中改了电机接线顺序或者换向,极对数和角度零点都会变,坐标变换就会错位——角度对不齐,d和q轴就分不清,电流环能稳住才怪。

为了帮助理解又补充一个细节:表贴式永磁同步电机(SPMSM)因为$L_d = L_q$,d轴和q轴电感相等,所以转子位置对电感没有影响,磁阻转矩为零,转矩只和$i_q$有关。内置式永磁同步电机(IPMSM)因为$L_d < L_q$,会多出一项磁阻转矩,控制策略上需要做最大转矩电流比(MTPA),但坐标变换本身的数学形式是一样的,只是$i_d$、$i_q$的分配策略不同。

3.3 变换后方程为何"变简单":磁链和电磁转矩的直观表达

做完两次变换后,PMSM在d-q坐标系下的电压方程变成:

$$u_d = R_s i_d + L_d \frac{di_d}{dt} - \omega_e L_q i_q$$

$$u_q = R_s i_q + L_q \frac{di_q}{dt} + \omega_e (L_d i_d + \psi_f)$$

表面上还是两个耦合的方程,但注意耦合项已经变成了代数项($\omega_e L_q i_q$和$\omega_e L_d i_d$),不再是时变系数。对电流环控制器来说,这意味着只要在控制中引入解耦补偿(前馈补偿掉这两个交叉耦合项),d轴和q轴就可以当作两个独立的直流系统来设计PI参数。

电磁转矩方程更关键:

$$T_e = \frac{3}{2} n_p \left[\psi_f i_q + (L_d - L_q)i_d i_q\right]$$

这个式子说明了两件事:第一,转矩由q轴电流主导,$\psi_f i_q$是永磁转矩分量;第二,对于内置式电机,$(L_d - L_q)i_d i_q$是磁阻转矩分量,可以通过注入负的$i_d$来增加总转矩,这就是MTPA控制的理论基础。

对于表贴式电机,$L_d = L_q$,转矩方程退化为:

$$T_e = \frac{3}{2} n_p \psi_f i_q$$

转矩和$i_q$严格成正比。这就是为什么FOC能实现高性能转矩控制——你把一个复杂的交流电机模型,通过坐标变换变成了一个"直流电机模型":$i_d$管磁场,$i_q$管转矩,完全解耦。

4. 反变换一族的工程意义:从控制器输出回到逆变器

4.1 逆Park变换和逆Clarke变换的实现

控制环输出的$u_d^$、$u_q^$是d-q坐标系下的直流量,但逆变器要的是三相桥臂的占空比——也就是说,要把指令电压从d-q坐标系一路反变换回三相静止坐标系。

逆Park变换就是把d-q矢量投影回静止$\alpha\beta$坐标系:

$$ \begin{bmatrix} u_\alpha \ u_\beta \end{bmatrix}

\begin{bmatrix} \cos\theta & -\sin\theta \ \sin\theta & \cos\theta \end{bmatrix} \begin{bmatrix} u_d \ u_q \end{bmatrix} $$

注意这个矩阵恰好是正变换矩阵的转置,因为Park变换矩阵是正交矩阵,逆就等于转置。然后通过逆Clarke变换(或者直接给SVPWM)得到三相调制电压。这就是为什么SVPWM的输入通常是$u_\alpha$和$u_\beta$——整个后续的扇区判断、作用时间计算都基于这两个静止坐标系分量。

常见的一个疑问是:为什么很多代码里逆Park之后直接进SVPWM,而不显式做逆Clarke?原因在于SVPWM本身已经隐含了逆Clarke变换的概念——它的输入是$\alpha\beta$分量,内部通过扇区判断和电压矢量合成来得到三相占空比,不需要先把三相电压一个个算出来。

4.2 从d-q指令电压到三相桥臂PWM的完整链路

完整的电压链路是:

$$u_d^, u_q^\xrightarrow{\text{逆Park}} u_\alpha, u_\beta \xrightarrow{\text{SVPWM}} T_a, T_b, T_c \xrightarrow{\text{PWM比较器}} \text{桥臂开关}$$

其中$T_a, T_b, T_c$是三个比较器的装载值,对应各相占空比。这一条链路上最容易出问题的就是角度同步——你用来做逆Park变换的角度,必须和这一拍PWM实际输出时的转子位置一致,否则输出的电压矢量方向就是错的。

4.3 数字控制中的一拍延迟和角度补偿

在DSP或者MCU里做FOC,每个PWM周期执行一次电流采样和电流环计算。从采样到输出有一个固有的一拍延迟:第$k$拍采到的电流,经过计算后在$k+1$拍才更新到PWM比较器。也就是说,逆变器实际输出的电压对应的是转子在$k+1$拍时刻的位置,而如果你直接用$k$拍采到的角度去做逆Park变换,角度就滞后了。

补偿方法很朴素:估算一拍延迟对应的角度增量,在用逆Park变换时把角度往后推一拍:

$$\theta_{comp} = \theta_{current} + \omega_e \cdot T_{pwm}$$

工程上如果$T_{pwm}$很小(比如10kHz载频对应$100\mu s$),而转速也不高,这个角度修正量很小,有人会忽略。但在高速电机(比如2万转以上,极对数4,电频率超过1.3kHz)上,一拍延迟对应的电角度可能达到几十度,不补偿的话电流环会明显变差,甚至发散。我在实际项目中就遇到过高速段电流振荡的问题,最后就是加了这个一拍角度补偿才压下来。

5. 变换矩阵在工程落地时的坑与验证方法

5.1 用示波器和仿真核对变换矩阵是否正确

坐标变换写对了没有?有一个立竿见影的验证方法用示波器就能做。

给电机通一组平衡的三相正弦电流(或者直接在对拖实验里看正常运行的电流波形),同时把程序里的$i_\alpha$、$i_\beta$用DAC输出到示波器。如果用的是等幅值变换,那么$i_\alpha$波形的幅值应该和$i_a$相电流幅值完全一致,$i_\beta$的幅值和前者相同,只是相位滞后90°。如果你观察到$\alpha\beta$电流幅值是相电流幅值的1.225倍,那你大概率把变换系数写成了$\sqrt{\frac{2}{3}}$,即用了等功率约定,但代码里其他地方还是按等幅值在算——这就是错位了。

一个用Python验证Clarke矩阵的简单脚本:

import numpy as np T_clarke = np.array([ [1.0, -0.5, -0.5], [0.0, np.sqrt(3)/2, -np.sqrt(3)/2] ]) theta = np.linspace(0, 2*np.pi, 2000) ia = np.cos(theta) ib = np.cos(theta - 2*np.pi/3) ic = np.cos(theta + 2*np.pi/3) alpha_beta = T_clarke @ np.vstack([ia, ib, ic]) print("alpha幅值:", np.max(alpha_beta[0])) print("beta幅值:", np.max(alpha_beta[1])) print("beta相对alpha的相位差(度):", np.degrees(np.angle(np.mean(np.exp(1j * ( np.angle(alpha_beta[1] + 1j * alpha_beta[0]) - np.angle(ia + 1j * (ib - ic) / np.sqrt(3)) ))))))

跑出来的$\alpha$幅值应该是1.0,和相电流幅值一致;$\beta$幅值也是1.0,但相位滞后$\alpha$约90°。这个小小的脚本在换电路板、换代码架构后非常管用——五分钟就能确认变换链路没被改坏。

5.2 角度对齐:编码器零位与A相绕组的对齐

坐标变换的矩阵公式本身不难,难的是把变换里的角度和实际电机的物理位置对齐。这一步做不对,整个系统就是"带病运行"。

角度对齐要做的事情是:让编码器的零位(或某个已知角度)正好对应A相绕组的磁轴方向,确保在$\theta=0$时,Park变换输出的$i_q$是真实的转矩电流,$i_d$是真实的励磁电流。

最常用的对齐方法之一:给电机通一个固定的d轴电流矢量(先不给q轴电流),把电流环的目标角度固定为0。此时合成电流矢量方向就是d轴方向,也就是A相绕组的磁轴方向。调整编码器安装或者把编码器零位偏移值写到程序里,让此时的编码器读数归零。下次上电,角度基准就对了。

这个过程的常见错误是:有人觉得"反正内部会自学习角度偏移",就用电流环硬拉,结果角度偏差大时,$i_d$和$i_q$之间互相耦合,电流环根本收敛不出来。正确做法是先手动开环给一个固定电压矢量(而不是电流闭环),用万用表或者示波器观察三相电流的合成矢量方向,逐步逼近编码器零位。

5.3 标幺值系统下的变换要不要改

很多FOC代码会把电流、电压、转速做标幺化。标幺化之后,坐标变换矩阵需不需要改?这是个高频问题。

结论是:标幺化应该放在变换之后,或者放在变换之前但用统一的标幺系数,变换矩阵本身不需要改。原因是坐标变换是线性变换,如果$i_a$、$i_b$、$i_c$都除以同一个基准值$I_{base}$,那么变换后的$i_\alpha$、$i_\beta$也自动除以了$I_{base}$,矩阵系数不受影响。

但有一个容易踩的坑:如果你的代码先做了标幺化,用了错误的基准值,比如电流基准取了峰值而电压基准取了有效值,变换后的量纲就乱了,后续的PI参数和功率计算全部对不上。所以在做标幺化时,先统一基准体系,再确认变换是否使用标幺值输入。最好的办法是写一个自检函数,输入已知幅值的三相正弦,看标幺化前后变换结果是否符合预期。

5.4 开环拖动验证:不给电流环,先验证角度和变换

调FOC最忌讳一上来就闭环。我的建议是先做开环拖动验证,把坐标变换和角度链路的正确性确认了再谈PI参数。

开环验证步法:

  1. 给定一个固定的电角度$\theta = 0$,通过逆Park变换输出一个固定的电压矢量$u_d = 3V$,$u_q = 0$。
  2. 用示波器看三相PWM占空比,应该是对称的三相正弦调制(因为SVPWM合成出的矢量方向固定)。
  3. 保持$\theta$不变,缓慢增大角度值(比如每秒递增$1°$),此时电压矢量会缓慢旋转,电机应该跟着缓慢匀速转动。如果电机不转或者抖动,检查角度方向是否和电机旋转方向一致。
  4. 手动把角度增量方向反过来,电机应该反转。如果正反方向和预期不一致,说明极对数或者相序接线有误。
  5. 当电机以极低转速转动时,用示波器测反电动势过零点和编码器Z脉冲的相对位置,确认角度基准是否正确。

这套测试做下来,基本能排除80%的接线和变换错误。我见过很多人跳过这一步直接上电流环,结果角度反向、相序接错、零位不对三个问题叠加在一起,排查了一周才找到方向。先花半小时做开环验证,效率高得多。

5.5 和参数辨识、故障诊断的联动关系

坐标变换的精度还直接影响永磁同步电机参数辨识和故障诊断的结果。你说要辨识$L_d$、$L_q$、$\psi_f$,如果不通过坐标变换把电压电流准确投影到d-q轴上,辨识算法拿到的是畸变的输入数据,辨识出来的电感、磁链自然全是错的。同样,匝间短路模型的构建也依赖于在d-q坐标系下观察故障特征量(比如负序电流、零序电压),坐标变换错位的话,故障特征会被淹没在变换误差里。

所以别把坐标变换当成"一个数学小工具"。它是整个FOC系统的地基,角度、系数、对齐任何一个环节有偏差,都不只是波形难看的问题,而是会让上层所有算法一起失真。

我在实际项目里最后还养成了一个习惯:无论换板子、换电机、还是改代码架构,先把坐标变换自检跑一遍,再谈后面的调参。这套在模拟仿真和实物验证上多花的那点时间,后面会在排查问题上十倍赚回来。坐标变换这关过了,FOC才算真正迈进了门槛。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询