3. 矢量控制(FOC)原理:电流环、速度环、位置环控制策略,SVPWM调制技术
矢量控制,圈里人常叫它FOC。说实话,这玩意儿刚出来的时候,我觉得它就是个数学魔术。把三相交流电硬生生拆成两个直流分量来控,这想法太巧妙了。我入行那会儿,FOC还主要靠DSP跑查表法,现在MCU性能上来了,直接实时算都行。
今天咱们就把FOC的骨架拆开看看。核心就三件事:电流怎么控、速度怎么跟、位置怎么锁,再加上那个让电机转得丝滑的SVPWM。
3.1 电流环:FOC的“心脏起搏器”
电流环是FOC最内层的控制环。说白了,它就是让电机绕组里的电流,老老实实按照你给的指令走。
为什么要控电流?因为电机的转矩和电流直接挂钩。你想想看,电流控不准,转矩就抖,电机就会“哮喘”。
FOC里,我们通过Clark变换和Park变换,把三相电流ia、ib、ic,变成旋转坐标系下的id和iq。这两个量,一个管励磁,一个管转矩,互不干扰。
核心公式(Park逆变换):
Vd = Rs * Id + Ld * dId/dt - ωe * Lq * Iq
Vq = Rs * Iq + Lq * dIq/dt + ωe * (Ld * Id + ψf)
嗯,这里要注意,实际代码里我们用的是PI调节器,直接怼误差,算出Vd和Vq。
电流环的PI参数整定,我踩过不少坑。有一次在高速电机项目上,电流环带宽设得太高,结果系统直接啸叫。后来我学乖了,一般把电流环带宽设在开关频率的1/10到1/20之间。
我的习惯:先让电机空转,给一个阶跃电流指令,看响应波形。超调量控制在5%以内,调节时间控制在1-2个PWM周期。这样出来的手感最跟脚。
3.2 速度环:让电机“听话”地转
速度环套在电流环外面。它的输入是目标转速和实际转速的差值,输出是电流环的q轴电流指令。
为什么是q轴?因为q轴电流直接产生转矩,转矩大了转速就提得快。d轴电流一般给0(表贴式永磁电机),或者给负值(内嵌式,用来弱磁升速)。
速度环的PI设计,我个人习惯用对称最优法。先整定电流环,然后把电流环等效成一阶惯性环节,再设计速度环。
我曾经踩过的坑:速度环积分饱和。有一次做电动工具,启动时速度指令给得很大,积分项直接飞到天花板。等速度追上来,积分项半天退不下来,导致严重超调。解决方案很简单——加抗积分饱和(Anti-Windup),或者用积分分离法。
速度环的采样周期一般比电流环慢5-10倍。电流环跑10kHz,速度环跑1-2kHz就够。为什么?因为机械时间常数比电气时间常数大得多,你没必要那么快地去调节速度。
3.3 位置环:伺服系统的“定海神针”
位置环是最外层的环。它用在需要精确定位的场合,比如机器人关节、数控机床主轴。
位置环的输入是目标位置和实际位置的差值,输出是速度环的转速指令。说白了,位置环就是告诉速度环:“你该往哪转,转多快。”
位置环一般用P控制器就够了,很少加I。为什么?因为位置误差的积分会导致系统响应变慢,而且容易产生震荡。我见过有人给位置环加了个大I,结果电机在目标位置附近来回晃,跟得了帕金森似的。
位置环设计要点:
- 位置环带宽通常设为速度环的1/5到1/10
- 前馈补偿很关键:把速度前馈加进去,能大幅减小跟踪误差
- 注意位置传感器的分辨率:编码器线数不够,位置环精度就上不去
我记得有一次做AGV小车,位置环怎么调都抖。查了半天,发现是编码器安装有偏心,导致位置反馈有周期性误差。后来换了高精度编码器,问题迎刃而解。所以说,硬件基础决定软件上限。
3.4 SVPWM调制技术:把电压指令变成开关信号
SVPWM,全称空间矢量脉宽调制。它和传统的SPWM(正弦脉宽调制)比,最大的优势是母线电压利用率高。SPWM最高只能用到母线电压的0.866倍,而SVPWM能用到1.0倍。这意味着同样的母线电压,SVPWM能让电机跑得更快。
SVPWM的原理,说白了就是:把三相逆变器的8种开关状态,映射到复平面上的8个电压矢量(6个非零矢量+2个零矢量)。然后通过合成,让平均电压矢量去逼近你想要的任意方向和大小的电压。
实现步骤(我习惯的流程):
- 判断目标电压矢量落在哪个扇区(共6个扇区)
- 计算相邻两个非零矢量的作用时间T1、T2
- 计算零矢量的作用时间T0 = Ts - T1 - T2
- 分配开关序列(七段式或五段式)
- 生成PWM比较值,喂给定时器
代码实现上,我一般用查表法算扇区,用CORDIC或者直接三角函数算时间。现在MCU都有硬件乘加单元,直接算也不慢。
// 伪代码示例:SVPWM扇区判断
// 输入:Valpha, Vbeta(旋转坐标系下的电压)
// 输出:扇区号 (1-6)
float V1 = Vbeta;
float V2 = 0.866 * Valpha - 0.5 * Vbeta;
float V3 = -0.866 * Valpha - 0.5 * Vbeta;
int sector = 0;
if (V1 > 0) sector |= 0x01;
if (V2 > 0) sector |= 0x02;
if (V3 > 0) sector |= 0x04;
// 然后根据sector值查表得到实际扇区号
七段式SVPWM的谐波特性比五段式好,但开关损耗大一点。五段式开关次数少,适合对效率要求高的场合。怎么选?看你项目更看重EMC还是效率。
注意死区时间:上下桥臂不能同时导通,否则会炸管子。死区时间一般设0.5-2微秒,具体看IGBT或MOSFET的关断延迟。死区补偿是个大话题,以后有机会再细聊。
3.5 三环联调:从理论到实践的最后一公里
三个环都设计好了,怎么把它们串起来?顺序是:位置环 → 速度环 → 电流环。从外到内,一层层往下发指令。
调试顺序反过来:先调电流环,再调速度环,最后调位置环。千万别一上来就调位置环,否则系统会乱跳,搞不好还会烧东西。
我刚开始做FOC时,犯过一个低级错误:电流环还没调稳,就急着看速度环响应。结果电机一启动就过流保护,查了半天发现是电流环PI参数没整对,导致q轴电流震荡。从那以后,我老老实实按顺序来。
联调检查清单:
- 电流环:给定阶跃,看Id和Iq能否快速跟踪,无静差
- 速度环:给定转速斜坡,看实际转速是否平滑,无超调
- 位置环:给定位置阶跃,看定位精度和稳定时间
- 全环联动:跑一个完整的加减速-定位周期,看各环配合是否协调
最后说一句,FOC不是万能的。在极低速或者零速时,反电动势信号太弱,无传感器FOC很难做。这时候要么加高频注入,要么上编码器。选哪种?看你的成本预算和性能要求。
好了,FOC的原理就聊到这儿。下一章咱们会深入代码层面,手把手教你搭一个FOC控制框架。到时候我会把我在项目里踩过的坑、总结的经验,一股脑全倒出来。