为水箱系统设计自抗扰控制
此示例说明如何为非线性水箱系统设计自抗扰控制 (ADRC)。
水箱系统模型
此模型使用 ADRC 控制器来控制非线性水箱系统被控对象的水位。该模型包含一个可变子系统,该子系统具有两个选择项:ADRC 控制器和增益调度 PID 控制器。ADRC Control
子系统设置为默认活动变体。该模型还包括一个手动开关,用于在开环和闭环配置中操作该模型。默认情况下,它设置为开环配置。
尽管增益调度 PID 控制器是在较宽的工作范围内控制被控对象输出的有效方法,但设计试验和使用闭环 PID 自动调节器调节 PID 增益需要大量的工作。使用 ADRC,您可以获得非线性控制器,并以更简单的设置和更少的调节工作实现更好的性能。有关如何调节增益调度 PID 控制器的详细信息,请参阅Tune Gain-Scheduled Controller Using Closed-Loop PID Autotuner Block。
打开模型。
mdl = 'WatertankADRC';
open_system(mdl)
此示例中的水位参考信号与增益调度控制器自动调节示例中的参考信号相同。参考水位从 = 1 逐渐上升到 = [5, 10, 15, 20] 处的四个工作点。每步水位变化需要 600 秒。
设计 ADRC 控制器
ADRC 是功能强大的工具,适用于具有未知动态特性以及内外部扰动的被控对象的控制器设计。该模块将未知动态特性和扰动建模为被控对象的扩张状态,并使用观测器对其进行估计。通过 ADRC 模块,您仅使用控制算法的几个关键调节参数即可设计控制器:
模型阶数类型(一阶或二阶)
模型响应的临界增益
控制器和观测器带宽
此外,还要指定时域参数以匹配被控对象模型的时域。在此示例中,将其设置为连续时间。以下各节描述如何找到在此模型的 ADRC 模块参数中指定的其余调节参数。
模型阶数和临界增益
对于此水箱模型,这些参数很容易调节。将振幅为 1 的阶跃输入注入 Water-Tank System
子系统,注意开环水位响应显示一阶动态系统行为。
sim(mdl); figure; plot(logsout{2}.Values.Time,logsout{2}.Values.Data... ,logsout{3}.Values.Time,logsout{3}.Values.Data) grid on ylim([0 7]) xlabel('Time (s)') ylabel('Height (m)') legend('Ref','Output')
要确定临界增益值 b0
,请在阶跃引用输入后 0.5 秒的短时间间隔内检查水位响应。
x = logsout{3}.Values.Time(1:57); y = logsout{3}.Values.Data(1:57); figure; plot(x,y) xlabel('Time (s)') ylabel('Height (m)') grid on
现在,您可以根据一阶响应 确定系统的临界增益。在 0.5 秒的持续时间内,水位上升约 0.075 米。
找到控制器带宽和观测器带宽
控制器带宽通常取决于频域或时域的性能设定。此示例使用 0.8 弧度/秒的松弛控制器带宽 。观测器需要比控制器收敛得更快,因此观测器带宽通常设置为控制器带宽的 5 到 10 倍。在最初尝试调节时,您可以选择 弧度/秒。
将手动开关切换到在闭环配置中操作模型。
set_param('WatertankADRC/Manual Switch','sw','1')
仿真该模型以检查对应于阶跃参考变化的水位,例如从 15 到 20。
set_param(mdl,'SignalLoggingName','adrcOut'); sim(mdl); figure plot(adrcOut{1}.Values.Time,adrcOut{1}.Values.Data... ,adrcOut{3}.Values.Time,adrcOut{3}.Values.Data) grid on ylim([14 21]) xlim([1700 1950]) xlabel('Time (s)') ylabel('Height (m)') legend('Ref','Output')
基于响应,可以看到水位响应足够快,超调量极小。因此,ADRC 模块设置和参数调节完成。
ADRC 和 PID 控制器的性能比较
使用具有多个工作点的水位参考信号检查经过调节的控制器的性能。
选择 PID Control
子系统并仿真模型。
set_param([mdl,'/Controller'],'LabelModeActiveChoice','PID') set_param(mdl,'SignalLoggingName','pidOut'); sim(mdl);
比较两个控制器的性能。
figure; plot(adrcOut{1}.Values.Time,adrcOut{1}.Values.Data... ,adrcOut{3}.Values.Time,adrcOut{3}.Values.Data) hold on plot(pidOut{3}.Values.Time,pidOut{3}.Values.Data) hold off grid on xlabel('Time (s)') ylabel('Height (m)') legend('Ref','ADRC','PID')
水位响应表明,ADRC 控制器的性能明显优于增益调度 PID 控制器,超调也小得多且更紧密地跟随水位参考信号。
当水位响应从 15 增大到 20 时,您可以进一步放大以查看性能改进情况。
figure; plot(adrcOut{1}.Values.Time,adrcOut{1}.Values.Data... ,adrcOut{3}.Values.Time,adrcOut{3}.Values.Data) hold on plot(pidOut{3}.Values.Time,pidOut{3}.Values.Data) hold off grid on xlabel('Time (s)') ylabel('Height (m)') legend('Ref','ADRC','PID') ylim([14 21]) xlim([1700 1950])
关闭模型。
close_system(mdl,0);
另请参阅
Active Disturbance Rejection Control