2、FOC控制环路:电流环、速度环、位置环的架构与调参思路

聊到FOC,很多人一上来就盯着SVPWM或者Clark/Park变换看。但说实话,真正决定电机转得好不好的,是那三个控制环路——电流环、速度环、位置环。这三个环路的架构和调参,才是FOC实战中的硬骨头。

我个人习惯把FOC比作一个「三层指挥系统」:最内层的电流环是执行层,速度环是管理层,位置环是决策层。每一层都有自己的任务,也有自己的脾气。今天我就把这套东西掰开了讲,顺便聊聊我在项目里踩过的坑。

2.1 电流环:FOC的「心脏」

电流环是FOC最内层的环路,也是响应最快的环路。它的任务很简单——让电机的实际电流快速、准确地跟踪你给定的电流指令。

在FOC里,我们控制的是d轴电流q轴电流。d轴电流负责励磁,q轴电流负责转矩。对于表贴式永磁同步电机(SPMSM),我们通常让Id=0,只控制Iq来产生转矩。

核心要点:电流环的带宽通常设置为速度环的5-10倍。这样才能保证速度环在调度时,电流环能「秒跟」上。

2.1.1 电流环的架构

电流环的典型架构是PI控制器 + 前馈补偿。为什么需要前馈?因为电机在高速运行时,反电动势会越来越大,如果只靠PI硬扛,积分项会饱和,动态响应会变差。

我常用的电流环控制框图是这样的:

// 电流环PI控制器 + 前馈解耦
// 伪代码示例

// 电流误差
error_d = Id_ref - Id_fb;
error_q = Iq_ref - Iq_fb;

// PI计算
Vd_pi = Kp_d * error_d + Ki_d * integral_d;
Vq_pi = Kp_q * error_q + Ki_q * integral_q;

// 前馈补偿(解耦 + 反电动势补偿)
Vd_ff = -omega_e * Lq * Iq_fb;
Vq_ff = omega_e * (Ld * Id_fb + flux_pm);

// 最终输出电压
Vd_ref = Vd_pi + Vd_ff;
Vq_ref = Vq_pi + Vq_ff;

注意看,前馈项里包含了交叉耦合项(-ωLqIq 和 ωLdId)以及反电动势项(ωψf)。如果不加这个前馈,高速时d轴和q轴会互相干扰,电流环会变得很难调。

我的经验:刚开始做FOC时,我偷懒没加前馈,结果电机转速一上3000rpm,电流波形就开始抖。后来加上前馈,波形立马干净了。这个坑我替你们踩过了。

2.1.2 电流环的调参思路

电流环调参,说白了就是调PI参数。但怎么调得快、调得稳,是有套路的。

我建议按以下步骤来:

  1. 先调Kp,再调Ki。Kp决定响应速度,Ki决定稳态精度。先让Kp大到刚好不振荡,再加Ki消除静差。
  2. 用阶跃响应看效果。给一个Iq阶跃指令,看实际电流的上升时间和超调量。上升时间一般控制在1-2ms以内。
  3. 注意带宽限制。电流环的带宽不能超过PWM开关频率的1/10。比如10kHz的PWM,电流环带宽最多设到1kHz。
参数 影响 调大后的效果 调小后的效果
Kp 响应速度 响应变快,但可能振荡 响应变慢,但更稳定
Ki 稳态精度 静差消除快,但可能超调 静差消除慢,但更平滑

注意:千万不要在电机静止时调电流环!因为静止时反电动势为零,PI参数调好了,一跑起来可能就振荡了。我建议在额定转速的30%-50%下调试。

2.2 速度环:FOC的「大脑」

速度环在电流环外面,它的输出就是电流环的指令(主要是Iq_ref)。速度环的任务是让电机转速跟踪你给定的目标转速。

速度环的响应速度比电流环慢一个数量级。电流环的带宽是kHz级别,速度环通常是几十到几百Hz。

2.2.1 速度环的架构

速度环最常用的也是PI控制器。但这里有个关键点——速度反馈的滤波

为什么?因为速度通常是从编码器或霍尔传感器计算出来的,微分运算会放大噪声。如果不滤波,速度环会抖得厉害。

// 速度环PI控制器(带滤波)
// 伪代码示例

// 速度滤波(一阶低通)
speed_fb_filtered = alpha * speed_fb + (1 - alpha) * speed_fb_prev;

// 速度误差
error_speed = speed_ref - speed_fb_filtered;

// PI计算
Iq_ref = Kp_speed * error_speed + Ki_speed * integral_speed;

// 限幅(防止电流过大)
Iq_ref = clamp(Iq_ref, -Iq_max, Iq_max);

滤波系数alpha的选择很关键。alpha越大,滤波越轻,响应越快,但噪声也越大。我一般取0.1-0.3之间,具体看编码器分辨率。

核心要点:速度环的输出一定要限幅!如果不限幅,速度误差大时Iq_ref会飙到天上去,轻则过流报警,重则炸管子。

2.2.2 速度环的调参思路

速度环调参和电流环类似,但有个区别——速度环的负载变化会影响很大。

我记得有一次调一个风机项目,空载时速度环稳得很,一加上负载就开始振荡。后来发现是Ki太大了,负载变化时积分项过冲。解决办法是加了积分分离——当速度误差超过一定阈值时,暂停积分。

调参步骤:

  1. 先空载调。让电机空载运行,调Kp和Ki直到速度响应满意。
  2. 再加负载调。带上额定负载,观察速度跌落和恢复时间。如果恢复太慢,适当增加Ki。
  3. 注意抗积分饱和。速度环的输出(Iq_ref)限幅后,积分项要跟着停,否则会「积分饱和」。

我的习惯:速度环的Ki不要给太大。Ki太大,低速时容易「爬行」——就是电机在低速时一抖一抖的。我一般把Ki设到Kp的1/10到1/5之间。

2.3 位置环:FOC的「指挥官」

位置环是最外层的环路,它的输出是速度环的指令。位置环用于需要精确定位的场景,比如机械臂、数控机床、伺服系统。

位置环的响应速度最慢,带宽通常在几Hz到十几Hz。因为位置控制不需要那么快,关键是精度和稳定性

2.3.1 位置环的架构

位置环最常用的是P控制器,甚至有些场合只用比例控制就够了。为什么不用PI?因为位置环的积分项容易引起超调和振荡——你想啊,位置误差已经很小了,积分还在累积,结果就过头了。

// 位置环P控制器
// 伪代码示例

// 位置误差
error_pos = pos_ref - pos_fb;

// P控制(只用比例)
speed_ref = Kp_pos * error_pos;

// 限幅(防止速度指令过大)
speed_ref = clamp(speed_ref, -speed_max, speed_max);

当然,如果要求位置误差严格为零(比如伺服定位),可以加一个很小的积分项,但一定要配合积分限幅

核心要点:位置环的Kp不能太大。Kp太大,位置误差稍微大一点,速度指令就飙到上限了,电机就会「咣」地一下冲过去,然后来回振荡。

2.3.2 位置环的调参思路

位置环调参,我总结了一个「三步法」:

  1. 先确定速度环带宽。位置环的带宽不能超过速度环带宽的1/5到1/3。比如速度环带宽50Hz,位置环最多设到10-15Hz。
  2. 从小到大加Kp。给一个阶跃位置指令,观察位置响应。Kp太小,响应慢;Kp太大,会超调甚至振荡。
  3. 加前馈提高响应。如果要求快速定位,可以加速度前馈和加速度前馈。前馈量直接从位置指令的微分得到。
环路 典型带宽 控制器类型 调参难点
电流环 500Hz - 2kHz PI + 前馈 高速解耦、反电动势补偿
速度环 20Hz - 200Hz PI + 滤波 负载变化、积分饱和
位置环 1Hz - 20Hz P(或PI弱积分) 超调抑制、前馈设计

曾经踩过的坑:有一次做位置控制,电机到位后总是有微小的振荡。查了半天,发现是位置反馈的量化误差太大——编码器分辨率不够。后来换了高分辨率编码器,问题解决。所以位置环对反馈精度要求很高。

2.4 三环联调:从理论到实战

三个环路单独调好了,不代表联调就OK。联调时有个顺序:先内后外。先调好电流环,再调速度环,最后调位置环。内环不稳,外环怎么调都没用。

我分享一个联调时的检查清单:

  • 电流环:阶跃响应上升时间 < 2ms,无振荡,稳态误差 < 1%
  • 速度环:阶跃响应上升时间 < 50ms,超调量 < 5%,负载突变时恢复时间 < 100ms
  • 位置环:定位精度 < 1个编码器脉冲,无稳态振荡,跟随误差在允许范围内

嗯,说到这里,我想起一个项目。当时调一个高速主轴电机,电流环怎么调都振荡。后来发现是PWM死区时间设置不对,导致电流采样有畸变。调整死区补偿后,电流环立马稳了。所以有时候问题不在环路本身,而在外围的硬件和采样上。

最后一个小建议:调参时一定要用示波器或者数据记录工具看波形。光看电机转不转是不够的,要看电流波形、速度波形、位置波形。波形会告诉你一切。

好了,FOC的三个控制环路就讲到这里。电流环是基础,速度环是核心,位置环是进阶。把这三个环路的架构和调参思路吃透了,FOC就算入门了。下一章我们聊聊MTPA——怎么让电机在同样的电流下输出更大的转矩,这才是效率优化的关键。