1.传统的无模型预测控制存在的问题
在下面这篇知乎,讲到了基于扩张状态观测器(Extended State Observer/ESO)的无模型预测控制(Model-Free Predictive Control/MFPC)。
这几年来无模型预测控制在电机控制领域也算是一个非常非常大的热点了。张老师这篇无模型论文的被引量也来到了两百多。
虽然说是“无模型(Model-Free)”,但是其实这篇文章里面还是用到了电机的参数。
在张老师的论文里也说了,这个无模型有个参数α(我下面就都用中文“阿尔法”吧),这个阿尔法取的就是电感的倒数。
那假如我现在不知道电机的电感参数,或者说我电机的电感参数经常变化。那该怎么办呢?
当时也有朋友在评论区问了这个问题。我的看法就是即使这个参数阿尔法不准确,只要这个阿尔法与实际的电感倒数差距不太大,扩展状态观测器ESO也是可以抵消数阿尔法不准确带来的扰动。
我当时回复的时间是23年12底。今年我在华科的一篇TIE中看到了相同的解释。
最后这个高亮的句子说,“只要线性扰动观测器的带宽选择合适,系统仍可以保证令人满意的性能”
这篇文章的实验部分也做了对比。即使电感变化两倍,无模型的电流THD还是很小的,只有2.9%。
在模型预测控制中,电感的变化对控制性能的影响是最大的。为什么电感影响最大,其实很多文章都有分析了,具体也可以看看下面这篇文章的分析。
我这里直接截图这篇文章的实验结果来解释吧。在下面这个图控制,(a)就是控制器中的电感数值没有失配下的图,(b)是控制器中的电感数值偏小的图,(c)是控制器中的电感数值偏大的图。(虽然这里还涉及电阻和磁链的失配,这里就不管了,因为无模型不需要电阻以及磁链参数)
可以看到:
(1)无电感失配的话,电流的阶跃响应速度是最快的。
(2)控制器电感偏小的话,不会使得电流振荡,但是会降低电流的响应速度。
(3)控制器电感偏大的话,会使得电流出现振荡,产生非常大的电流纹波。
为什么会出现这样的现象,看看预测控制中的公式就可以知道了。
我这里用传统的MFPCC来仿真试试(这里就看启动波形就好了),传统的MFPCC指的是基于线性LESO的MFPCC。
仿真参数:
Tpwm = 1e-4;%开关周期
Tspeed = 5e-4;%转速采样周期,在实际DSP系统中,Tspeed会小于Tpwm
Pn = 4;%电机极对数
Vdc = 311;%直流母线电压
iqmax = 25;%额定电流
%这是电机实际参数
Ls = 8.5e-3;%定子电感,采用隐极的,Ld=Lq=Ls
Rs = 2;%定子电阻
flux = 0.1688;%永磁体磁链
J = 0.005;%转动惯量
B = 1e-4;%阻尼系数
%扩展观测器极点参数配置
c1 = 2*(500*2*pi);
c2 = (500*2*pi)^2;



因为我这个是隐极PMSM,所以转矩正比于q轴电流iq。所以可以从转矩波形看出iq的波形。我的额定转矩和iq都是25。
从上面三个仿真可以看到:
(1)控制器电感设置为实际电感的0.3,转矩/iq会出现超调,转矩/iq最大值达到了30,而我设定的最大值是25。
(2)控制器电感设置为等于实际电感,转矩/iq没有出现超调。
(3)控制器电感设置为实际电感的3倍,转矩/iq出现了非常大的脉动。
因此,那我肯定还是希望能够在无模型预测控制的运行过程中,加入电感辨识,以无模型预测控制的动稳态性能。
2.基于自适应扩张状态观测器的无模型预测控制仿真搭建
参考文献:(这两篇参考文献的方法基本上是完全一致的,都是用了“有限时间梯度法”(Finite-Time Gradient Method)。我下面的仿真是参考的第二篇文献)
文章中给的公式无模型公式如下:
我觉得这里需要注意的一点是。这篇文章里面采用的无模型公式,与张老师的公式略有区别。如下图所示,就是这个we*i有点不同。
文章中Fd和Fq的表达式也给了出来。注意,文章中采用的都是SPMSM,所以Ld=Lq=Ls,且采用id=0控制。所以下图的红框这一项就是0。
那么我们可以大概知道,如果控制器中的电感倒数aerfa_c,与实际电机的电感倒数aerfa_0,有差值,那么这个Fd就不为0。因此可以通过Fd的数值来辨识电感的倒数。
然后下面是文章中提供的公式推导,我这里就不过多解释了,直接贴出文章内容。
这里说一下复现这篇文章要注意的两个问题:
(1)这篇文章相对于传统的无模型而言,还多了三个参数,其中两个是和“有限时间梯度法”有关的,还有一个参数是文章作者定义的p。我发现这个p值也会影响电感辨识的速度。(感兴趣的就自己看看文章好了)
(2)“有限时间梯度法”涉及的公式中有很多除法,那在simulink中就要看这些除法有没有出现“x/0”的情况,如果出现“除以0”的情况,simulink不会报错,但是数值会显示“NaN”.
最后做完仿真我发现,这个方法虽然是有效果的,但提高了调参的难度。我自己调了好一会才调好参数的。
3.仿真结果
我发现,这个方法好像在完全空载(也就是q轴电流非常小的时候)以及减速的时候效果不太好呢。
下图我也是把控制器电感参数设置为实际电感参数的三倍,在0.2s之前是空载,然后0.2s后加5Nm负载。
(1)可以看到,在启动阶段,电机有较大的启动电流,然后该方法辨识的电感快速到达了实际电机电感的附近。
(2)但是在0.1s,也就是电机开始空载稳定运行一段时间之后,估计的电感数值与实际的电感数值发生了较大的偏差。
(3)在0.2s施加5Nm负载之后,辨识的电感数值又回到了实际电感数值的附近。
(4)在0.35s减速之后,辨识的电感数值就非常大!甚至辨识结果都到了50mH,是电机实际电感的六倍了!这时候的转矩脉动也非常大。

问题探究:
我把公式重新推导了一下,发现文章中式子(19)和我推导结果是有的出入的。
而且我推导了一下文章说的p值。在iq为正数的时候,p值应该是负数,而文章说是正数。但是这个对文章的运行结果确实没有影响。
为什么上面的错误对文章的运行结果确实没有影响呢?从辨识电感的关键式子(26)来看,文章推导的F和p都差了一个负号,那么负负得正,就相互抵消了。
但是再注意看上面我推导的p值,p值的正负应该和iq的正负有关系。如果iq变号的话,p值也应该变号才对。
(由于减速的时候iq为负数,按照文章一直取p符号不变的话,就会导致辨识出错。所以这就解释了为什么刚才在减速的效果并不好。)
然后我把p的正负号改成随iq正负号变化而变化,这时候的仿真效果就好了很多,转矩也没有很大的脉动了,辨识的电感也比较准确了。
下面看看不同控制器电感参数下的仿真结果吧。
仿真工况:
(1)控制器电感参数设置为实际电感参数的三倍

(2)控制器电感参数设置为实际电感参数的0.3

可以看到,即使设置一个偏差较大的初始电感,该方法仍可以在动态过程中有效辨识电感数值。
4.仿真对比分析
我这里做三个方法的对比。一个是传统的FOC,采用PI调节器作为电流调节器,简称为“PI”;一个是基于传统ESO的无模型控制,简称“ESO-MFC”;还有一个就是上文的基于自适应增益ESO的无模型控制,简称“AGESO-MFC”。
这里要注意的是,PI的电流环也需要电感参数啊,因为电流环的P增益通常设置为2*pi*fc*Ls,2*pi*fc是电流环带宽,Ls是电感参数。
4.1控制器电感参数设置为实际电感参数的0.3



上面的波形主要是看转矩波形。PI对应的转矩波形,在减速的时候超调量最大;其次到ESO-MFC;而AGESO-MFC对应的转矩波形,在减速的时候没有超调量。
4.2控制器电感参数设置为实际电感参数的3倍






从上面的仿真波形和FFT分析来看。
转矩脉动方面:AGESO-MFC除了在启动阶段有点转矩脉动之外(AGESO需要一定时间来辨识电感),其他时候都不存在转矩脉动;ESO-MFC的转矩脉动最大;PI的转矩脉动一般。
相电流THD方面:AGESO-MFC最优、PI次之、ESO-MFC最次。
5.文章中的问题
文章当时说,因为Ud这个电压数值总是波动,所以文章才设计了一个p值,以抵抗Ud的波动,保证辨识的电感数值没有太大波动。但是我感觉他这里是有问题的,说法不对,(25)(26)这两个公式也不太对。
我自己重新整了整了,用我自己的公式搞了搞仿真。
我下面做个仿真验证一下我的想法。
仿真工况是:在0.2s之前是空载,然后0.2s后加10Nm负载;0.35s之前的给定转速是1200RPM,0.35s之后是600RPM。(初始电感设置为实际电感的三倍)
注意,上文的方法在空载时的辨识效果并不好,我们主要看看空载时的辨识结果。




可以看到,采用我改进的计算公式时,即使电机空载,也能实现很好的辨识效果。