3. 电机控制基础回顾:FOC、Clark/Park变换与SVPWM

做电机控制这些年,我见过不少工程师一上来就调PI参数,结果调得满头大汗,波形还是乱七八糟。其实问题往往出在基础上——FOC的原理没吃透,变换矩阵写错了符号,SVPWM的扇区判断搞反了。今天咱们就把这三个核心模块彻底捋一遍。

核心观点:FOC的本质是把交流电机“伪装”成直流电机来控制。Clark和Park变换就是那套“翻译器”,SVPWM则是把控制指令变成实际电压的“执行器”。三者缺一不可。

3.1 FOC——磁场定向控制的核心思想

FOC,全称Field-Oriented Control。说白了,就是让电机的磁场和电流始终保持在最佳角度——90度。为什么是90度?因为这时候产生的转矩最大。

我记得刚入行时,师傅跟我说:“你想想看,直流电机为什么好控?因为它的励磁和电枢是分开的,你调一个,另一个基本不受影响。”交流电机就不一样了,定子电流既产生磁场又产生转矩,搅在一起,很难独立控制。

FOC的思路很巧妙:

  • 先把三相电流分解——通过Clark变换,从abc坐标系变到αβ坐标系
  • 再旋转一下——通过Park变换,从αβ坐标系变到dq坐标系
  • 在dq坐标系里——d轴控制磁通,q轴控制转矩,互不干扰

这样一来,交流电机就“看起来”像直流电机了。你调q轴电流,转矩就变;调d轴电流,磁场就变。简单粗暴,但极其有效。

我的经验:在C2000上实现FOC时,我习惯把电流环频率设在10kHz以上。低于这个值,转矩脉动会明显变大,尤其是在低速重载工况下。

3.2 Clark变换——从三相到两相

Clark变换,也叫3s/2s变换。它的任务是把三相静止坐标系(a, b, c)下的电流,映射到两相静止坐标系(α, β)下。

公式其实不复杂:

iα = ia
iβ = (ia + 2*ib) / √3

等等,这里有个坑。上面的公式是等幅值变换,还有一种叫等功率变换,系数不一样。我在项目里吃过这个亏——用了等幅值变换的公式,但后面SVPWM的系数是按等功率算的,结果电流波形一直不对。

变换类型 α轴系数 β轴系数 适用场景
等幅值变换 1 1/√3 电流环调试、标幺化
等功率变换 √(2/3) √(1/2) 功率计算、效率分析

注意:在TI的C2000例程中,默认使用等幅值变换。如果你自己写代码,一定要和后面的Park变换、SVPWM系数保持一致。我曾经见过有人混用两种变换,结果电机转起来嗡嗡响,电流波形像锯齿。

3.3 Park变换——从静止到旋转

Park变换,也叫2s/2r变换。它把αβ坐标系下的量,旋转到与转子磁场同步的dq坐标系下。

公式长这样:

id = iα * cos(θ) + iβ * sin(θ)
iq = -iα * sin(θ) + iβ * cos(θ)

这里的θ是转子位置角,通常由编码器或观测器提供。没有准确的θ,Park变换就是白搭。

我遇到过一个问题:编码器安装有偏差,导致θ始终差了5度电角度。结果q轴电流调上去了,转矩却出不来。后来用自整定程序校准了一下,问题才解决。所以,角度精度直接决定FOC的性能。

3.4 SVPWM——空间矢量脉宽调制

SVPWM,全称Space Vector Pulse Width Modulation。它的目标很明确:用八个基本电压矢量,合成任意方向、任意大小的目标电压矢量。

为什么是八个?因为三相逆变器有六个开关管,每个桥臂有两种状态(上管通或下管通),一共2³=8种组合。其中两个是零矢量(000和111),剩下六个是非零矢量,相隔60度。

SVPWM的步骤大致如下:

  1. 判断扇区——根据Uα和Uβ的符号和大小,确定目标矢量落在哪个60度扇区
  2. 计算作用时间——用相邻两个非零矢量和零矢量来合成目标矢量,算出各自的作用时间T1、T2、T0
  3. 生成PWM波形——根据作用时间,分配各桥臂的导通占空比

这里有个关键点:扇区判断的边界条件。我刚开始写SVPWM时,在扇区边界附近总会出现毛刺,后来发现是浮点运算精度问题。改用IQmath定点库后,问题就消失了。

避坑指南:我曾经在C2000上直接用浮点运算做SVPWM,结果在高速时PWM波形出现抖动。后来改用TI的IQmath库,把计算全部转成定点,波形干净多了。对于F28004x这类带FPU的芯片,浮点没问题;但如果是F2803x,建议用IQmath。

3.5 三者之间的关系

FOC、Clark/Park变换、SVPWM不是孤立的。它们是一条完整的链路:

  • 采样:ADC采集三相电流ia、ib、ic
  • Clark变换:得到iα、iβ
  • Park变换:得到id、iq
  • PI调节:在dq坐标系下分别控制id和iq
  • 反Park变换:得到Uα、Uβ
  • SVPWM:生成六路PWM信号

下面这张图可以帮你理清思路:

FOC控制链路总览 三相电流采样 Clark变换 Park变换 PI调节(id/iq) 反Park变换 SVPWM 六路PWM输出 说明:整个链路中,Clark/Park变换是“翻译官”,把物理量从三相空间转换到旋转坐标系; SVPWM是“执行官”,把控制指令变成实际的开关信号。任何一个环节出错,电机都跑不好。

3.6 在C2000上的实现要点

在C2000上实现FOC,有几个地方需要特别注意:

  • ADC触发与PWM同步:我习惯用PWM的时基计数器作为ADC触发源,在PWM载波峰值或谷值处采样,这样可以避免开关噪声干扰
  • 坐标变换的定点化:如果芯片不带FPU,所有三角函数和开方运算都要用查表法或IQmath库
  • SVPWM的过调制处理:当目标电压超过六边形内切圆时,需要进行过调制处理。我一般用最小相位误差法,简单且有效

小技巧:在调试阶段,我习惯把Clark和Park变换的结果通过DAC输出,用示波器观察。如果id和iq波形平滑,说明变换没问题;如果出现毛刺,大概率是角度或采样时序的问题。