1. FOC基础回顾:矢量控制原理、Clark变换与Park变换、SVPWM调制策略

各位同学,咱们今天先不急着讲故障诊断。做电机控制这么多年,我有个习惯——每次遇到疑难杂症,都会回头把基础再过一遍。FOC这东西,说白了就是一套数学魔术,把交流电机硬生生玩出了直流电机的感觉。你想想看,一个三相交流电机,本来电流电压都在那儿正弦波似的晃来晃去,怎么就能像直流电机那样精准控制转矩和转速呢?

嗯,这里面的核心思想,就是「矢量控制」。我个人理解,它就是把三相交流电机的物理模型,通过坐标变换,等效成一个直流电机模型。这样一来,控制就简单多了。

1.1 矢量控制原理:从交流到直流的“降维打击”

矢量控制,也叫磁场定向控制(FOC)。它的目标很明确:独立控制电机的转矩和磁通

直流电机为什么好控制?因为它的电枢电流和励磁电流在空间上是垂直的,互不干扰。你调电枢电流,转矩就变;调励磁电流,磁场就变。两个量解耦了,控制起来自然得心应手。

交流电机呢?三相电流在定子绕组里产生一个旋转磁场,这个磁场和转子磁场相互作用产生转矩。但问题是,三相电流产生的磁动势是耦合在一起的,你没法单独控制转矩分量和磁通分量。

矢量控制的核心思路,就是通过坐标变换,把三相静止坐标系(ABC)下的交流量,变换到两相旋转坐标系(dq)下的直流量。这样一来,d轴控制磁通,q轴控制转矩,跟直流电机一模一样。

关键点:矢量控制不是真的把交流电机变成了直流电机,而是通过数学变换,让控制方式变得跟直流电机一样直观。这是FOC的精髓所在。

我在项目中遇到过一位同事,他总觉得矢量控制很玄乎,非要去看电机内部的磁场线怎么走。我跟他说,你把它当成一个黑盒子,输入是三相电压,输出是转速和转矩,中间那套变换就是我们的“翻译官”。他后来用Simulink搭了个模型,跑了一遍,才恍然大悟。

1.2 Clark变换:从ABC到αβ的“降维”

Clark变换,也叫3/2变换。它的任务是把三相静止坐标系(A、B、C)下的电流或电压,变换到两相静止坐标系(α、β)下。

为什么要这么做?因为三相系统有冗余。你想想看,三相电流ia + ib + ic = 0(星形连接且无中线),实际上只有两个自由度。Clark变换就是去掉这个冗余,用两个正交的轴(α轴和β轴)来表示原来的三相量。

变换公式很简单(等幅值变换):

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

或者用矩阵形式:

[ iα ]   [ 1      -1/2    -1/2 ] [ ia ]
[ iβ ] = [ 0      √3/2   -√3/2 ] [ ib ]
                                 [ ic ]

嗯,这里要注意:Clark变换有两种常用形式——等幅值变换和等功率变换。我个人习惯用等幅值变换,因为这样变换后的αβ分量幅值跟原来三相的幅值一样,调试时看着直观。但如果你做功率计算,就得用等功率变换,系数会差一个√(2/3)。

小技巧:在代码实现时,我建议把Clark变换和Park变换写成独立的函数,方便调试。我曾经在一个项目里把两个变换写在一起,结果出问题时排查了半天,后来拆开就一目了然了。

1.3 Park变换:从静止到旋转的“同步”

Clark变换之后,我们得到了αβ坐标系下的两相正弦量。但正弦量还是随时间变化的,控制起来依然麻烦。Park变换就是来解决这个问题的——它把静止的αβ坐标系,变换到随转子磁场同步旋转的dq坐标系。

变换公式:

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

其中θ是转子磁场的电角度,通常由编码器或霍尔传感器提供。

经过Park变换后,id和iq就变成了直流量。id对应励磁分量,iq对应转矩分量。控制目标就变成了:让id=0(表贴式永磁同步电机),让iq跟随转矩指令

为什么会这样?因为当id=0时,定子电流全部用来产生转矩,效率最高。当然,对于内置式永磁同步电机(IPMSM),有时候需要注入负的id来利用磁阻转矩,那就是另一回事了。

避坑指南:我曾经在一个项目中,Park变换的角度搞反了符号,结果电机一启动就剧烈抖动。排查了两天才发现是角度符号问题。所以,务必确认你的角度定义和变换公式一致。建议在仿真阶段就把正方向验证清楚。

1.4 SVPWM调制策略:让电压利用率更高

好了,经过PI调节器,我们得到了dq坐标系下的电压指令Ud和Uq。再经过反Park变换(把dq变回αβ),就得到了αβ坐标系下的电压矢量Uα和Uβ。接下来,怎么用三相逆变器把这个电压矢量输出出来?

这就是SVPWM(空间矢量脉宽调制)要做的事。

传统的SPWM(正弦脉宽调制)虽然简单,但电压利用率只有约86.6%。SVPWM通过合成相邻的两个基本电压矢量,可以输出任意方向的电压矢量,电压利用率能提高到100%(即直流母线电压的1/√3倍)。

SVPWM的基本步骤:

  1. 判断扇区:根据Uα和Uβ,判断目标电压矢量在哪个扇区(共6个扇区)。
  2. 计算作用时间:计算相邻两个基本矢量的作用时间T1和T2,以及零矢量的作用时间T0。
  3. 计算占空比:根据T1、T2、T0,计算三相桥臂的占空比。
  4. 生成PWM波:用定时器生成对称的PWM波形。

扇区判断的代码示例:

// 根据Uα和Uβ判断扇区
// 参考值计算
float B1 = Ubeta;
float B2 = (sqrt3 * Ualpha - Ubeta) / 2.0f;
float B3 = (-sqrt3 * Ualpha - Ubeta) / 2.0f;

// 扇区号计算
uint8_t sector = 0;
if (B1 > 0) sector |= 0x01;
if (B2 > 0) sector |= 0x02;
if (B3 > 0) sector |= 0x04;

// 查表得到扇区号(1-6)
static const uint8_t sector_table[] = {0, 1, 5, 0, 3, 2, 4, 0};
sector = sector_table[sector];

嗯,这段代码我用了很多年,简洁高效。但要注意,不同MCU的浮点运算能力不同,如果MCU没有FPU,建议把浮点运算换成定点运算,或者用查表法加速。

SVPWM的电压利用率高,谐波含量也低。我个人在项目中几乎只用SVPWM,除非是极低成本的方案才会考虑SPWM。

调制方式 电压利用率 谐波含量 实现复杂度
SPWM 86.6% 较高
SVPWM 100% 较低 中等
特定谐波消除PWM 100% 最低

个人经验:在调试SVPWM时,我建议先用示波器看三相PWM波形,确认占空比变化是否平滑。如果出现跳变,多半是扇区判断或时间计算有误。另外,死区时间一定要加,否则上下桥臂直通,MOS管瞬间就冒烟了。我见过不止一次这样的惨剧。

好了,FOC的基础就回顾到这里。Clark变换、Park变换、SVPWM,这三板斧是FOC的基石。你想想看,从三相交流量到两相直流量,再到精确的电压输出,每一步都有它的物理意义和数学依据。搞懂了这些,后面的故障诊断才能有的放矢。

下一章,咱们聊聊FOC系统中常见的故障类型,以及怎么用这些基础知识去定位问题。