尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

永磁同步电机FOC核心:Clarke与Park坐标变换详解及工程实践

永磁同步电机FOC核心:Clarke与Park坐标变换详解及工程实践 做电机控制的工程师十有八九都经历过这种场景板子焊好了程序烧进去了电机也能哼哼地转但电流波形就是一股怪味相电流幅值忽大忽小转矩忽高忽低带点负载就抖给你看。翻来覆去查了一整天最后发现根本不是高档问题——就是坐标变换的矩阵系数写错了一位。永磁同步电机矢量控制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_ai_bi_c0$零序恒为零所以工程上经常直接省略这一行只算前两行。这时候有一个非常优雅的性质在对称三相电流$i_ai_bi_c0$条件下$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_00$。但在三相四线制或者故障工况比如匝间短路下零序分量不再为零这时候如果要建立匝间短路模型或者诊断故障就必须完整保留第三行。反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_q0$这就是励磁电流和转矩电流分离的状态。这里有个新手特别容易转不过来的点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$拍采到的电流经过计算后在$k1$拍才更新到PWM比较器。也就是说逆变器实际输出的电压对应的是转子在$k1$拍时刻的位置而如果你直接用$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相绕组的磁轴方向确保在$\theta0$时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参数。开环验证步法给定一个固定的电角度$\theta 0$通过逆Park变换输出一个固定的电压矢量$u_d 3V$$u_q 0$。用示波器看三相PWM占空比应该是对称的三相正弦调制因为SVPWM合成出的矢量方向固定。保持$\theta$不变缓慢增大角度值比如每秒递增$1°$此时电压矢量会缓慢旋转电机应该跟着缓慢匀速转动。如果电机不转或者抖动检查角度方向是否和电机旋转方向一致。手动把角度增量方向反过来电机应该反转。如果正反方向和预期不一致说明极对数或者相序接线有误。当电机以极低转速转动时用示波器测反电动势过零点和编码器Z脉冲的相对位置确认角度基准是否正确。这套测试做下来基本能排除80%的接线和变换错误。我见过很多人跳过这一步直接上电流环结果角度反向、相序接错、零位不对三个问题叠加在一起排查了一周才找到方向。先花半小时做开环验证效率高得多。5.5 和参数辨识、故障诊断的联动关系坐标变换的精度还直接影响永磁同步电机参数辨识和故障诊断的结果。你说要辨识$L_d$、$L_q$、$\psi_f$如果不通过坐标变换把电压电流准确投影到d-q轴上辨识算法拿到的是畸变的输入数据辨识出来的电感、磁链自然全是错的。同样匝间短路模型的构建也依赖于在d-q坐标系下观察故障特征量比如负序电流、零序电压坐标变换错位的话故障特征会被淹没在变换误差里。所以别把坐标变换当成一个数学小工具。它是整个FOC系统的地基角度、系数、对齐任何一个环节有偏差都不只是波形难看的问题而是会让上层所有算法一起失真。我在实际项目里最后还养成了一个习惯无论换板子、换电机、还是改代码架构先把坐标变换自检跑一遍再谈后面的调参。这套在模拟仿真和实物验证上多花的那点时间后面会在排查问题上十倍赚回来。坐标变换这关过了FOC才算真正迈进了门槛。
返回列表