ADRC-active disturbance rejection control-自抗扰控制器

ADRC自抗扰控制基本思想要点:

1.标准型与总扰动扩张状态与扰动整体辨识微分信号生成与安排过渡过程以及扰动的消减与控制量产生

ADRC主要构成:

1)跟踪微分器(TD)---the tracking differentiator –跟踪微分器

 解决由不连续或带随机噪声的量测信号,合理提取连续信号(跟踪给定)及微分信号的问题。

 根据微分输出与最速综合函数,可以安排闭环系统的过渡过程。

以单位阶跃信号为例,经过跟踪微分器的过渡,产生的输出效果为:

特点:1>使误差反馈增益和误差微分增益选取范围扩大

           2>使给定的反馈增益所适应的对象参数范围扩大,提高鲁棒性

扫描二维码关注公众号,回复: 3926546 查看本文章

        

2)扩张状态观测器(ESO)--extended state observer –扩展状态观测器

      状态观测器将影响被控对象输出的扰动作用扩张成新的状态变量,通过特殊的反馈机制观测被扩张的总扰动信号

通过输入,输出构建总扰动为一个状态变量,二阶的系统,他的扩张观测器达到三阶,加入了总扰动的状态。

     总扰动中包含系统内部扰动和外部高频噪声干扰,

      扩张状态观测器的输出为:Z1=y ,Z2=dy  ,Z3(观测到的系统总扰动)‘

           

3)非线性状态误差反馈控制律(NLSEF)--nonlinear state error feedback –非线性状态误差反馈

              

           根据跟踪微分器(TD)得出的给定信号和给定信号的微分与状态观测器观测到的系统输出和输出的导数的误差,进而进行控制和扰动补偿,非线性控制方法由fal或最速控制综合函数Fhan构造。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

经典PID

 

                     优点 :

                                1.仅由误差来决定控制

                                2.运算量低,可以以极高的速率运行

                      缺点:

                                1.误差函数采用

                                                         e=v−y
                                   的形式不太合理,比如输入阶跃信号的时候,会导致误差函数也是一个阶跃信号,对控制的稳定性有影响
                                 2.在经典PID里面需要计算误差信号的微分,但是根本无法严格的计算微分信号,只能使用近似计算
                                 3.经典PID的比例、误差、积分项是线性组合输出最后的控制量的,线性组合并不是一个最优的组合方案
                                 4.严格上来说,积分项虽然消除了静态固有误差,但是会大大影响控制的稳定性能

针对上面的四个缺点,ADRC分别提出了改进方法,如下:

1》transient profile generator–经典微分器 

     为了防止跳变信号,对信号作如下处理,其实也就是下面的跟踪微分器:

如下图所示,使用这种变换实际上是模仿最短时间到达一个点的概念,在到达平衡位置处前恒定加速运动,过平衡位置后恒定减速运动,使目标点在规定的加速度下以最短的时间到达目标点,并且到达速度为零,其中v是当前位置 

此外在计算机中或者仿真中只能使用离散时间的解决方案,因此,解决方案可以表示为 

其中,

1》--1)跟踪微分器(TD)---the tracking differentiator –跟踪微分器

这里解释为什么要改进经典的微分器,实际上,使用经典PID里面的微分器会很大的放大信号噪声。如果使用经典的微分器,当附加上噪声n(t)的时候

 

 即:采样周期越短,噪声被放大越大,因此采用如下改进:

nonlinear weighted sum--非线性加权和

在使用了跟踪微分器之后,一个输入实际上变成了两个输入e1=v1−x1,e2=v2−x2,为信号的误差和信号误差的微分,这里利用这两个信号来组合得到控制输出,ADRC里面采用非线性的组合方式,使用了一个函数如下所示

fal函数具有小误差,大增益;大误差,小增益的特性,十分适合用于控制,可以减少控制误差,最后的非线性PID可以写作 

这是跟踪微分控制器的离散方程,看方程其实就很直接。 
h:为时间尺度 MATLAB的仿真步长为0.001   所以 h = 0.001

Simulink 模型里的TD 有一个输入状态,经过TD安排过渡时间,计算fst(快速控制最优综合函数)后,会得到两个输出v1 目标状态,v2系统的微分。

这是TD的内部结构,和公式里面的一样,就是跟踪微分的阶跃响应公式。fst 输入的第一个参数为 
v1(t) - v0(t).在结构图里,就是v1-v,之后的结构对照公式即可看明白。 

这里看一下对TD的仿真波形图:

基本上很好的跟踪上了正弦波。 
这里提示一下TD模型里的参数修改的地方。在这个模型里只有两个参数r,h. 

 

双击1,再选择2的地方就可以了。然后设置3处的两个参数;

 2)扩张状态观测器(ESO)--extended state observer –扩展状态观测器

 最后的扩张状态观测器也是最重要的一个模块,此处不需要误差积分模块了,ESO给出了系统未知状态和未知干扰的估计和补偿。假设外部的干扰为f(x1,x2,ω,t)控制信号为u,系统可以被表示为

 

之后增加一个新的状态x3用于表示干扰,最后ESO可以被写作

其中参数一个例子是β01=1,β02=1/2h0.5,β03=2/25*h1.2.输入输出如下图所示

 

最终整个系统函数和框图如下图所示 
ADRC系统函数表示 

整个ADRC系统框图表示 

这里综合参考资料里面的结论,提炼几点:
1. ADRC系统的系统阶数由系统的相对阶数决定
2. 安排过渡过程解决快速控制和超调的矛盾
3. 不适用积分项也可以消除静态误差,避免积分副作用
4. ADRC的关键创新点其实在与ESO模块,也就是扩展状态观测器模块,他将所有不知道的影响归纳为一个中间控制量加入系统之中,可以很好的提高系统的抗干扰性能
5. ADRC中系统分类,不是按照线性、非线性、时变和时不变来分,而是按照系统的”时间尺度”来分类

参考资料:

1.韩京清.从PID技术到“自抗扰控制”技术[J].控制工程,2002,9(3):13-18

2.韩京清. 非线性PID控制器[J]. 自动化学报, 1994, 20(4):487-490.

3.韩京清. 自抗扰控制技术[J]. 前沿科学,2007,1(1):24-31

转载自:https://blog.csdn.net/mrhcat/article/details/71424198,https://blog.csdn.net/qq_34445388/article/details/79705968  仅为学习使用!

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

产品化ADRC:SpinTAC Motion Control  Suite (Featuring  ADRC)

SpinTAC使用了自抗扰控制器(ADRC,Active Disturbance Rejection Control),自抗扰控制器能够对系统扰动进行实时估算并补偿,其所要整定的参数只有一个即带宽,一旦整定,控制器可以工作在较宽的转速和负载范围内。

观察TI提供的Demo程序,可以发现,ADC中断中,在FOC运行之前运行了SpinTAC控制。

// Run the SpinTAC Components
if(stCnt++ >= ISR_TICKS_PER_SPINTAC_TICK) 
{
  ST_runVelCtl(stHandle, ctrlHandle);
  stCnt = 1;
}
 
// run the controller
CTRL_run(ctrlHandle,halHandle,&gAdcData,&gPwmData);

进入ST_runVelCtl()函数,可以发现其输出就是转矩参考值,即Iq参考值,作为q轴电流PI调节器的输入。

void ST_runVelCtl(ST_Handle handle, CTRL_Handle ctrlHandle)
{
  _iq speedFeedback, iqReference;
  ST_Obj *stObj = (ST_Obj *)handle;
  CTRL_Obj *ctrlObj = (CTRL_Obj *)ctrlHandle;
 
  // Get the mechanical speed in pu
  speedFeedback = EST_getFm_pu(ctrlObj->estHandle);
 
  // Run the SpinTAC Controller
  // Note that the library internal ramp generator is used to set the speed reference
  STVELCTL_setVelocityReference(stObj->velCtlHandle, TRAJ_getIntValue(ctrlObj->trajHandle_spd));
  STVELCTL_setAccelerationReference(stObj->velCtlHandle, _IQ(0.0)); 
  STVELCTL_setVelocityFeedback(stObj->velCtlHandle, speedFeedback);
  STVELCTL_run(stObj->velCtlHandle);
 
  // select SpinTAC Velocity Controller
  iqReference = STVELCTL_getTorqueReference(stObj->velCtlHandle);
  
  // Set the Iq reference that came out of SpinTAC Velocity Control
  CTRL_setIq_ref_pu(ctrlHandle, iqReference);
}

猜你喜欢

转载自www.cnblogs.com/kui-sdu/p/9903738.html
今日推荐