做Simulink电力电子控制仿真到这个系列的第6篇,你大概率已经把坐标变换、SVPWM、FOC、传统模型预测电流控制(MPC)都搭建并跑通过了。传统MPC在仿真里初期效果很理想,但只要你把电机参数人为改掉15%到20%,电流预测就会开始偏差,严重时稳态误差直接拉满,系统甚至振荡。今天这篇要聊的PMSM无模型预测电流控制(Model-Free Predictive Current Control,MFPCC)就是来解决这个问题的:它不再把电阻、电感、磁链当成精确已知量去查公式,而是用一个超局部模型在线估计未知动态,把“模型失配”这件事从根上绕开。这篇适合已经跑过FOC或MPC、想进一步提升鲁棒性的朋友,也适合刚接触预测控制、想在第一性原理层面理解“预测控制为什么怕参数不准”的初学者。
我会直接给出无模型预测控制的核心原理、离散化公式、一拍延迟补偿方法,以及一套能在基础Simulink环境里完整复现的仿真框架,包括控制器代码、参数表、调参顺序和常见坑。整个搭建过程不需要额外的Simscape电气库也能完成,因为这里用的是信号级电机模型加理想逆变器,重点验证控制算法本身。
1. 为什么在PMSM控制里要绕开精确模型
1.1 传统模型预测电流控制的参数依赖问题
传统有限集模型预测电流控制(FCS-MPC)的思路很直白:在dq旋转坐标系下写出PMSM的电压方程,用当前电流采样值预测下一个控制周期的电流,再把所有可能的逆变器开关状态对应的电压矢量代入代价函数,选一个让预测电流最接近参考值的开关组合输出。
看起来没什么问题,但这里有一个隐藏前提:预测方程里的电阻Rs、交直轴电感Ld/Lq、永磁磁链ψf、甚至转子磁链位置θe,都被当成准确已知量带入计算。实际工况中,这些参数没有一个是恒定不变的。电机温度一上来,电阻可能变化20%以上;磁链会随温度升高而下降;电感更夸张,不仅随电流饱和变化,还会随转子位置变化,尤其是在内嵌式永磁电机里。参数一旦失配,预测出来的电流轨迹就会偏离实际,代价函数选出来的“最优电压矢量”实际并不最优。仿真里你可能感受不深,因为在Simulink中电机模型参数和控制器用的是同一组数值,这在现实中是几乎不存在的理想化情况。
这也是为什么工程现场做传统MPC时,往往要先花大量时间做参数辨识,还要在运行中用查表或者在线辨识去修正参数。而无模型预测电流控制的核心思想很简单:我不再去精确辨识Rs、L、ψf,而是把电流变化率拆成两部分——一个“可以归总为未知动态和扰动的F项”加上“输入电压项”。实时用上一拍的电流电压数据把F估出来,预测时直接用这个F。这样,不管参数怎么变,F都会自动把变化量吞进去。
1.2 超局部模型:把所有未知量装进一个变量
所谓超局部模型(ultra-local model),最早是控制领域里针对“模型未知系统”提出的简化建模思路。它不在机理层面追求精确,而是用一个一阶微分方程去逼近被控对象的动态:
[ \frac{di_d}{dt} = F_d + \alpha_d u_d ]
[ \frac{di_q}{dt} = F_q + \alpha_q u_q ]
这里的F_d和F_q就是“总扰动”,包含了反电势、电阻压降、交叉耦合、参数变化、未建模动态、外部扰动等所有说不清道不明的部分。α是一个人为设定的输入比例系数,直观上对应着电感的倒数,但不需要精确。这个模型远没有传统PMSM方程那么“物理”,但它的好处是:只要能实时估计出F,预测精度就不依赖具体参数。
你在Simulink里搭建的时候,可以把F当成一个带未知动态的黑盒状态。控制任务从“精确建模再预测”变成“先估计F,再基于F做预测”。这种思路和自抗扰控制(ADRC)里的扩张状态观测器如出一辙,只不过预测控制把它和代价函数、电压矢量枚举结合在了一起。
1.3 利用上一拍数据在线辨识F
F怎么来?最直接的办法是反向利用离散化的超局部模型。用前向欧拉离散:
[ i(k+1) = i(k) + T_s F(k) + T_s \alpha u(k) ]
移项后就能从上一拍的数据推算当前的F:
[ F_d(k) = \frac{i_d(k)-i_d(k-1)}{T_s} - \alpha_d u_d(k-1) ]
[ F_q(k) = \frac{i_q(k)-i_q(k-1)}{T_s} - \alpha_q u_q(k-1) ]
这里的u(k-1)是上一拍实际施加到电机上的dq电压,i(k)和i(k-1)是相邻两个采样周期的电流。仿真里这些信号都拿得到,所以F的估计非常简单。但直接这么算出来的F会有大量高频噪声,因为电流差分对采样噪声很敏感。实际中我会对F做一阶低通滤波,形式如下:
[ F_{filt}(k) = k_f \cdot F_{raw}(k) + (1-k_f) \cdot F_{filt}(k-1) ]
滤波系数k_f取值一般在0.05到0.3之间。k_f越大,F跟随越快,但噪声也越大;k_f越小,F越平滑,但动态响应会变缓。这个参数是后面调仿真的重点。
这里要特别提醒:如果直接套用上面的差分公式,电流采样的量化噪声会被放大,甚至导致F估计值来回跳变。所以第一次搭建时建议先加滤波,再把滤波前的F和滤波后的F同时接到Scope里对比观察,这样能直观看到滤波的效果。F估计的准确性决定了无模型预测控制的整体性能,这一点怎么强调都不过分。
2. 核心控制细节:预测、延迟补偿与代价函数
2.1 数字控制器的一拍延迟补偿
很多人在Simulink里跑MPC,把控制器输出直接连到逆变器上,仿真波形看起来完美,但实际硬件上根本不可能这样工作。DSP从采样电流到输出开关信号,需要完成AD转换、坐标变换、F估计、代价函数遍历等一整套计算,这些都需要时间。所以在k时刻采样计算得到的开关状态,最早也要到k+1时刻才能施加到逆变器上。也就是说,当前采样周期内电机实际承受的电压,是上一拍计算出来的那个值。
如果预测模型不考虑这个一拍延迟,控制器就会用一个“过时”的电压状态去做预测,电流会出现周期性脉动,严重时直接发散。标准的补偿做法是两步预测:
第一步,用当前实际电压u(k-1)和估计出的F(k),从当前电流预测到k+1时刻:
[ i_d^{p}(k+1) = i_d(k) + T_s F_d(k) + T_s \alpha_d u_d(k-1) ]
[ i_q^{p}(k+1) = i_q(k) + T_s F_q(k) + T_s \alpha_q u_q(k-1) ]
第二步,用待评估的候选电压u_c(k+1),从k+1时刻继续预测到k+2时刻:
[ i_d^{p}(k+2) = i_d^{p}(k+1) + T_s F_d(k) + T_s \alpha_d u_{cd}(k+1) ]
[ i_q^{p}(k+2) = i_q^{p}(k+1) + T_s F_q(k) + T_s \alpha_q u_{cq}(k+1) ]
选择使代价函数最小的那个候选电压作为本拍输出,这个输出将在下一个采样周期真正生效。在Simulink里,这对应着控制器输出端必须加一个Unit Delay环节,模拟真实硬件一拍延迟。我在第一次搭的时候图省事没加这个延迟,结果电流在参考值附近持续高频振荡,怎么调参数都压不下去。后来把Unit Delay加上,再把预测步数改成两步,问题立刻消失。这个坑后面会单独列进排查表。
2.2 有限集七矢量枚举与dq电压计算
PMSM无模型预测电流控制里,最常用的就是有限集方案,也就是枚举逆变器的开关状态。两电平三相逆变器一共有8种开关组合,其中6个有效电压矢量,2个零矢量,对应8个开关状态:
- 000
- 100
- 110
- 010
- 011
- 001
- 101
- 111
严格说零矢量有两个,000和111,产生的相电压都为零,所以在实际遍历时往往只保留一个,也就是7个候选矢量。用开关状态计算三相相电压的公式如下,Vdc是直流母线电压,S取1代表上桥臂导通、下桥臂关断:
[ v_{an} = \frac{V_{dc}}{3}(2S_a - S_b - S_c) ]
[ v_{bn} = \frac{V_{dc}}{3}(-S_a + 2S_b - S_c) ]
[ v_{cn} = \frac{V_{dc}}{3}(-S_a - S_b + 2S_c) ]
有了三相相电压,再用等幅值Clarke变换转到静止两相坐标系:
[ v_\alpha = \frac{2}{3}\left(v_{an} - \frac{1}{2}v_{bn} - \frac{1}{2}v_{cn}\right) ]
[ v_\beta = \frac{2}{3}\left(\frac{\sqrt{3}}{2}v_{bn} - \frac{\sqrt{3}}{2}v_{cn}\right) ]
最后用转子电角度θe做Park变换,得到dq轴电压候选值:
[ u_{cd} = v_\alpha \cos\theta_e + v_\beta \sin\theta_e ]
[ u_{cq} = -v_\alpha \sin\theta_e + v_\beta \cos\theta_e ]
很多人在dq模型里直接枚举“dq电压矢量”,忽略了转子的旋转,这会导致预测结果和实际逆变器输出完全对不上。候选电压必须是从静止坐标系旋转到旋转坐标系后的值,因为它作用到电机上时,实际效果就取决于当前转子位置。
2.3 代价函数设计与开关频率惩罚
传统的FCS-MPC代价函数就两项:
[ g = (i_d^* - i_d^p(k+2))^2 + (i_q^* - i_q^p(k+2))^2 ]
哪个开关状态算出来的预测电流误差最小,就选哪个。这样实现简单,但也有一个众所周知的毛病:开关频率不固定。因为在没有惩罚项时,控制器会为了逼近参考电流频繁切换开关状态,导致开关频率可能很高,电流谐波很分散。这在实机上会带来开关损耗和噪声问题。
要抑制这个问题,我会在代价函数里加入一个开关切换次数惩罚项:
[ g = (i_d^* - i_d^p(k+2))^2 + (i_q^* - i_q^p(k+2))^2 + \lambda \cdot n_{sw} ]
其中n_sw是当前候选开关状态相对上一拍开关状态的切换次数,取值0到3;λ是权重系数。λ设成0时动态响应最好但开关频率高;λ逐步增大,开关频率下降,但电流跟踪会变钝。我从经验出发的建议是,先把λ设成0跑通,再以0.01的步长往上加,直到开关频率落在你想要的范围。不要一开始就带着惩罚项调参数,否则无法区分是预测算法问题还是权重抑制问题。
2.4 α参数怎么选,F为什么要滤波
α在整个控制器里是唯一需要人工指定的“输入比例系数”,它不要求精确,但它的取值直接影响F估计和预测效果。从超局部模型看,α的量纲是1/(V·s/A),直观对应电感的倒数。实际中我会直接取:
[ \alpha_d = \frac{1}{L_{d_nom}}, \quad \alpha_q = \frac{1}{L_{q_nom}} ]
这里的L_nom是铭牌值或者粗略估算的电感值。即使真实电感变化了30%,α保持不变,F也会把变化量吸纳进来,所以稳态性能不会崩。但α也不能乱取。α偏大会让F估计中的高频分量被放大,电流噪声变大;α偏小会让控制的“输入增益”不足,F项被迫承担过多的动态补偿,动态响应变慢,甚至出现超调。
从我的调参经验看,α在实际值的0.7到1.3倍之间,系统都能稳定工作。所以无模型预测控制对α的敏感度远低于传统MPC对电感精确值的敏感度。这也就是它“无模型”的底气所在。但请注意,α必须保持正数,方向反了控制就全乱了。
F滤波这一节再补充一点:直接差分得到的F_raw本质上是一个高增益放大器,它把“电流变化率”从微小的电流差值中提取出来,噪声会被放大到无法直接使用的程度。所以我通常会在F估计后面跟一个低通滤波器,甚至在采样电流进入控制器前就先经过一个截止频率为开关频率1/10左右的一阶低通滤波器。仿真中的噪声虽然不如硬件那么明显,但你要是搭建了带测量噪声的模型,滤波器就必不可少。
3. 在Simulink中一步步搭出无模型预测电流控制
3.1 顶层结构和模块连接
整个仿真顶层可以分为三块:被控对象、测量反馈、控制算法。被控对象我选择信号级dq模型加理想逆变器,原因有两个。第一,它不依赖Simscape电气库,任何有基础Simulink环境的机器都能直接跑;第二,无模型预测电流控制验证的是算法鲁棒性,不是逆变器开关细节,信号级模型足以说明问题。
顶层连接关系如下:
- 直流母线电压常数Vdc,输入到理想逆变器计算模块;
- 三相开关信号Sa、Sb、Sc由控制器输出,经过一个Unit Delay后送入理想逆变器模块;
- 理想逆变器模块根据开关状态和Vdc计算出三相相电压;
- 三相相电压经过Clarke和Park变换得到ud、uq,送入PMSM的dq模型;
- PMSM模块输出id、iq、机械角速度ωm和转子电角度θe;
- id、iq、θe反馈给控制器;ωm经过转速PI外环生成iq_ref,id_ref直接给0。
这里用Unit Delay模拟数字控制的一拍延迟,这一步千万不能少。很多仿真里不接这个延迟看着也稳定,但那是假象,后续只要把采样频率降低或者加入测量噪声,问题立刻暴露。
3.2 信号级PMSM模型搭建方法
如果你有Simscape电气库,可以直接拖Permanent Magnet Synchronous Machine模块,配合Universal Bridge搭物理模型,原理上和信号级模型等价。这里我给出不依赖Simscape的搭法,方便在单机基础Simulink环境里复现。
PMSM在dq旋转坐标系下的电压方程为:
[ 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 + \omega_e \psi_f ]
写成积分形式:
[ \frac{di_d}{dt} = \frac{1}{L_d}(u_d - R_s i_d + \omega_e L_q i_q) ]
[ \frac{di_q}{dt} = \frac{1}{L_q}(u_q - R_s i_q - \omega_e L_d i_d - \omega_e \psi_f) ]
在Simulink里用Integrator搭建:每个电流放在一个积分器里,积分器输入由电压、电阻压降、交叉耦合项通过加减和增益模块组合而成。机械部分:
[ \frac{d\omega_m}{dt} = \frac{1}{J}(T_e - T_L - B\omega_m) ]
[ T_e = \frac{3}{2}n_p(\psi_f i_q + (L_d - L_q)i_d i_q) ]
电角度:
[ \theta_e = n_p \int \omega_m dt ]
最终PMSM模块的输入是ud、uq和负载转矩TL,输出是id、iq、ωm、θe。搭建时注意单位,Simulink默认用国际单位制,角度用弧度,转矩用牛米。
3.3 控制器MATLAB Function完整代码
控制器用MATLAB Function实现,内部包含F估计、低通滤波、一拍延迟补偿、七矢量枚举和代价函数选择五部分。下面是一份可直接放到MATLAB Function里使用的代码。
function [Sa, Sb, Sc] = mfppc_controller(id_ref, iq_ref, id, iq, theta_e, Ts, Vdc) persistent id_old iq_old ud_old uq_old Fd_f Fq_f Sa_old Sb_old Sc_old alpha = 120.0; % 输入比例系数,约等于标称电感倒数 lambda = 0.01; % 开关频率惩罚权重 kf = 0.15; % F低通滤波系数 % 初始化 if isempty(id_old) id_old = id; iq_old = iq; ud_old = 0; uq_old = 0; Fd_f = 0; Fq_f = 0; Sa_old = 0; Sb_old = 0; Sc_old = 0; end % 1. 通过上一拍数据和当前电流估算F Fd_raw = (id - id_old) / Ts - alpha * ud_old; Fq_raw = (iq - iq_old) / Ts - alpha * uq_old; Fd_f = kf * Fd_raw + (1 - kf) * Fd_f; Fq_f = kf * Fq_raw + (1 - kf) * Fq_f; % 2. 考虑一拍延迟,预测k+1时刻电流 id1 = id + Ts * (Fd_f + alpha * ud_old); iq1 = iq + Ts * (Fq_f + alpha * uq_old); % 3. 枚举7种候选开关状态 sw_table = [0 0 0; 1 0 0; 1 1 0; 0 1 0; 0 1 1; 0 0 1; 1 0 1]; % 零矢量只用000,111与000等效 g_best = inf; Sa = 0; Sb = 0; Sc = 0; ud_opt = 0; uq_opt = 0; for k = 1:size(sw_table, 1) s1 = sw_table(k, 1); s2 = sw_table(k, 2); s3 = sw_table(k, 3); % 由开关状态计算三相相电压 van = Vdc / 3 * (2*s1 - s2 - s3); vbn = Vdc / 3 * (-s1 + 2*s2 - s3); vcn = Vdc / 3 * (-s1 - s2 + 2*s3); % 等幅值Clarke变换到静止两相 valpha = 2/3 * (van - 0.5*vbn - 0.5*vcn); vbeta = 2/3 * (sqrt(3)/2*vbn - sqrt(3)/2*vcn); % Park变换到dq旋转坐标系 vd = valpha * cos(theta_e) + vbeta * sin(theta_e); vq = -valpha * sin(theta_e) + vbeta * cos(theta_e); % 4. 用候选电压预测k+2时刻电流 id2 = id1 + Ts * (Fd_f + alpha * vd); iq2 = iq1 + Ts * (Fq_f + alpha * vq); % 5. 计算代价函数 g = (id_ref - id2)^2 + (iq_ref - iq2)^2; % 加开关切换惩罚 n_sw = abs(s1 - Sa_old) + abs(s2 - Sb_old) + abs(s3 - Sc_old); g = g + lambda * n_sw; % 记录最优候选 if g < g_best g_best = g; Sa = s1; Sb = s2; Sc = s3; ud_opt = vd; uq_opt = vq; end end % 6. 更新持久变量 id_old = id; iq_old = iq; ud_old = ud_opt; uq_old = uq_opt; Sa_old = Sa; Sb_old = Sb; Sc_old = Sc; end注意时序问题:这里的ud_old和uq_old在每次函数调用结束时记录的是本拍选出的最优电压,下个周期进入函数时它正好表示“当前实际作用在电机上的电压”。但前提是函数输出经过Unit Delay送给逆变器,否则函数内ud_old的物理含义和电机实际承受的电压会错位一拍。
代码里的alpha取值120,对应标称电感约8.3mH。如果你的电机电感是其他值,就用1000除以电感毫亨数,得到近似alpha。比如8.5mH对应117.6,7.5mH对应133.3。这个值不需要精确,但要在合理范围内。
3.4 仿真参数表与步长配置
仿真参数我建议直接用一组常见的表贴式永磁同步电机参数,这样方便和FOC、MPC的结果横向对比。
| 参数 | 数值 | 单位 |
|---|---|---|
| 直流母线电压Vdc | 310 | V |
| 定子电阻Rs | 2.98 | Ω |
| d轴电感Ld | 8.5 | mH |
| q轴电感Lq | 8.5 | mH |
| 永磁磁链ψf | 0.175 | Wb |
| 极对数np | 4 | - |
| 转动惯量J | 0.003 | kg·m² |
| 阻尼系数B | 0.0008 | N·m·s |
| 采样周期Ts | 1e-4 | s |
| 仿真算法 | ode4(定步长) | - |
| 仿真步长 | 1e-4 | s |
| 仿真时长 | 0.3 | s |
| 额定电流参考 | 5 | A |
| 转速外环Kp | 0.15 | - |
| 转速外环Ki | 5 | - |
配置仿真参数时,求解器必须选定步长,步长和采样周期保持一致,也就是1e-4秒。不要用变步长求解器去跑离散控制器和连续电机模型的混合系统,否则某些采样时刻会错位,波形看起来没问题,但控制逻辑已经不是一个严格的离散控制系统。
转速外环PI的输出作为iq_ref,并做限幅。限幅可以设在±10A,防止启动阶段电流冲击过大。id_ref简单设为0,按表贴式电机最大转矩电流比控制,也就是最常用的id=0控制。速度环参数不需要整定得太精确,因为电流环用无模型预测控制之后,响应速度远快于外环,外环只需要保证转速稳态和抗负载扰动即可。
4. 调参过程与仿真结果解读
4.1 空载启动与电流阶跃响应
第一次仿真建议先开环固定控制器不使能,只跑通逆变器加电机模型的空载电枢响应。确认三相电流没有发散后,再使能控制器。使能后先把iq_ref设为阶跃信号,从0直接跳到5A,id_ref保持0,观察dq电流的跟踪情况。
无模型预测电流控制最明显的特点是响应快。传统FOC电流环要调PI,带宽一般就几百赫兹,而预测控制在一个采样周期内就可以把电流拉近参考值。正常情况下,iq会在1到3个采样周期内到达5A附近,超调量很小。id能稳定在0附近,但会有小幅波动,这是有限集MPC固有的电流纹波,来源于7个离散电压矢量无法持续输出精确电压这一事实。
如果你发现iq响应很慢,优先怀疑F低通滤波系数kf太小,F更新跟不上电流变化。把kf从0.05逐步调到0.2,动态会有明显改善。如果响应快但噪声大,再把kf调回去。
4.2 参数失配测试,这是无模型控制的主场
传统模型预测控制在参数失配时表现会变差,无模型预测控制应该几乎不受影响。验证方法很简单:把PMSM模型里的电感参数Ld、Lq从8.5mH改到6mH,电阻从2.98Ω改到4.5Ω,控制器的alpha和F估计逻辑完全不动,再跑一次同样的电流阶跃。
我在实测中看到的结果是,稳态电流误差基本不变,动态过程略有变慢但很快恢复。因为控制器里的F会把“模型参数变了”这一事实全部吸收进F项。换句话说,无模型预测控制不是不需要模型,而是它用一个在线估计的F代替了离线精确参数。这也是它最核心的工程价值:参数漂移不再致命。
但注意,如果失配过于极端,比如电感从8.5mH改到1mH,alpha已经远小于真实增益,F估计会变得很大,系统可能出现高频噪声放大。这说明无模型方法有“容忍窗口”,不是无限鲁棒。
4.3 闭环转速工况与加载测试
把控制器接上转速外环后,给定转速设为1000rpm,空载启动。启动瞬间iq_ref会被推到限幅值,电机加速,转速接近给定后iq_ref回落。在0.15秒处突加5Nm负载,转速会略微跌落,然后外环PI把它拉回1000rpm。整个过程dq电流跟随电机实际工况变化,稳态时id保持为0,iq稳定在约4.8A附近。
这里有一个值得观察的细节:突加负载时,F_d和F_q会迅速变化,它们在扰动发生后的一个采样周期内就能给出反馈,不需要等待电流误差积分。这就是无模型预测控制的动态优势来源。用Scope同时观察Fq和电机反电势项,你会发现当转速和电流变化时,Fq的变化趋势和真实反电势变化一致,这说明F估计确实捕捉到了系统动态。
5. 常见问题速查与避坑技巧
5.1 典型问题与处理方法
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| 电流直接发散 | 控制器输出没加Unit Delay,预测与实际错拍 | 在输出到逆变器之间加一拍延迟 |
| 电流高频振荡 | F差分噪声太大,或kf过大 | 降低kf,或在电流反馈端加一阶低通 |
| 稳态电流误差大 | F估计被滤波压得太慢,α偏小 | 增大kf,适当增大α |
| 开关频率过高 | 代价函数没加开关惩罚项 | 增加lambda,从0.01逐步上调 |
| 启动瞬间电流冲击过大 | iq_ref阶跃太猛,外环限幅不够 | 限制iq_ref变化率,或缩小PI输出限幅 |
| 加载后转速恢复慢 | 速度环Kp太小或Ki不合适 | 增大Kp到0.2左右,Ki在5到8之间调 |
| 空载时dq电流纹波很大 | 采样周期过长或Vdc偏低 | 减小Ts到5e-5,或适当提高Vdc |
5.2 我踩过的几个仿真坑
第一个坑是\alpha符号问题。第一次搭的时候我习惯性把alpha写成了负的,仿真电流很快飞掉。原因是PMSM电压方程里电感项是正增益,输入电压增大电流变化率增大,如果alpha用负值,预测方向全反,控制器会在错误的候选矢量里选“最优”,本质上是正反馈。
第二个坑是F估计用原始差分值时噪声爆炸。一开始我以为Simulink里的数据是干净的,不需要滤波,结果Fq波形全是毛刺,代价函数在各候选矢量之间乱跳。后来给F加了低通滤波,开关切换明显稳定。这里建议把滤波系数kf先取大一点,保证F不抖,再逐步减小kf提升动态。
第三个坑是控制器函数内部persistent变量和外部Unit Delay的节奏不一致。如果函数输出经过Unit Delay,而函数内部又用persistent记录了上一拍输出作为“当前电压”,时序上是对的。但如果哪次调试我把Unit Delay去掉,或者额外加了一个Memory模块,整个预测就全部错位。排查这类问题最有效的方法是把电机的实际dq电压和控制器里的ud_old、uq_old同时画到Scope里,两者应该完全重合且滞后一拍。对不上,时序一定有问题。
5.3 推荐调试顺序
先跑纯电流阶跃,不开速度环。设置iq_ref从0跳到5A、id_ref=0,观察dq电流。稳定后加入速度外环,跑空载启动。稳定后加负载,观察抗扰特性。最后做参数失配对比实验,把电机模块里的L和R改大改小,看控制器是否依然稳定。
按这个顺序,可以把“控制器没写对”“时序有错”“外环参数不对”“鲁棒性不够”四类问题分开排查,避免所有问题同时出现时无从下手。
最后说一点我自己的体会。无模型预测电流控制最有价值的场景,是电机参数难以精确辨识或者运行中变化明显的场合,比如大转矩区间电感饱和、温度升高导致磁链下降。它用极小的实现代价换来了参数鲁棒性的巨大提升。但它也不是银弹,有限集MPC固有的开关频率不固定、电流纹波偏大等问题依然存在。如果你后续想进一步压稳态纹波,可以考虑在无模型框架下做无差拍预测再加SVPWM调制,这等于把“无模型”的优势和“固定开关频率”的优势结合起来。这一步做出来,整套控制的工程实用性还会再上一个台阶。