文章:
這篇文章仿真和輸出U的推到有些問題,博主根據此篇文章進行修改進行對sin(t)曲線的追蹤(使用滑模控制)
1.前言
最近開始了對滑模控制的學習,使用的書籍為劉金琨的《滑膜變結構控制MATLAB仿真》,今天是按照書上的例程做了一個簡單的自適應控制系統。
2.程序解析
此程序中,電機控制系統的動態模型為:
,其中,θ為電機的角位置,J為轉動慣量,d(t)為干擾且滿足
,η為干擾上界,
為角位置跟蹤誤差
定義跟蹤誤差函數,也就是滑模面函數s為:,當s=0時,有e和edot都為0,且是按照指數收斂:
也就是說當時間趨於∞時,誤差將指數收斂到0,收斂速度取決於c,所以誤差函數s的收斂性意味着位置跟蹤誤差e和速度跟蹤誤差e'的收斂性,也就是說:s為滑膜函數。
2.1.控制器代碼
首先是控制器的S函數。控制器就是系統的輸入控制量u:
function [sys,x0,str,ts] = simple_adaptive_controller(t, x, u, flag) switch flag, case 0, [sys,x0,str,ts]=mdlInitializeSizes; % 調用初始化子函數 case 1, sys=[]; case 2, sys=[]; case 3, sys=mdlOutputs(t,x,u); %計算輸出子函數 case 4, sys=[]; %計算下一仿真時刻子函數 case 9, sys=[]; %終止仿真子函數 otherwise DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag)); end function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes %初始化子函數 sizes = simsizes; sizes.NumContStates = 0; %連續狀態變量個數 sizes.NumDiscStates = 0; %離散狀態變量個數 sizes.NumOutputs = 1; %輸出變量個數 sizes.NumInputs = 3; %輸入變量個數 sizes.DirFeedthrough = 1; %輸入信號是否在輸出端出現 sizes.NumSampleTimes = 0; % at least one sample time is needed sys = simsizes(sizes); x0 = []; %初始值 str = []; ts = []; %[0 0]用於連續系統,[-1 0]表示繼承其前的采樣時間設置 simStateCompliance = 'UnknownSimState'; function sys=mdlOutputs(t,x,u) %計算輸出子函數 J = 2; thd = u(1); th = u(2); dth = u(3); e = th - thd; de = dth; c = 10; s = c*e + de; xite = 1.1; k = 0; ut = J*(-c*dth-1/J*(k*s+xite*sign(s))); sys(1) = ut;
因為控制器不涉及到復雜的微分運算,故只用在mdlOutputs中寫控制輸入u的代碼
2.2.受控對象代碼
本例中,受控對象為電機控制系統,,需要對這個微分方程進行描述,因為要用到θ、θ',雖然方程中有θ'',但是可以通過除以J得到θ''的表達式,故代碼如下:
function [sys,x0,str,ts] = plant(t, x, u, flag) switch flag, case 0, [sys,x0,str,ts]=mdlInitializeSizes; % 調用初始化子函數 case 1, sys=mdlDerivatives(t,x,u); %調用計算微分子函數 case 2, sys=[]; case 3, sys=mdlOutputs(t,x,u); %計算輸出子函數 case 4, sys=[]; %計算下一仿真時刻子函數 case 9, sys=[]; %終止仿真子函數 otherwise DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag)); end function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes %初始化子函數 sizes = simsizes; sizes.NumContStates = 2; %連續狀態變量個數 sizes.NumDiscStates = 0; %離散狀態變量個數 sizes.NumOutputs = 2; %輸出變量個數 sizes.NumInputs = 1; %輸入變量個數 sizes.DirFeedthrough = 0; %輸入信號是否在輸出端出現 sizes.NumSampleTimes = 1; % at least one sample time is needed sys = simsizes(sizes); x0 = [0, 0]; %初始值 str = []; ts = [0 0]; %[0 0]用於連續系統,[-1 0]表示繼承其前的采樣時間設置 simStateCompliance = 'UnknownSimState'; function sys = mdlDerivatives(t, x, u) %計算微分子函數 J = 2; dt = sin(t); ut = u(1); sys(1) = x(2); sys(2) = 1/J*(ut+dt); function sys=mdlOutputs(t,x,u) %計算輸出子函數 sys(1) = x(1); sys(2) = x(2);
3.仿真結果和Simulink注意事項
Simulink建立如下模型:
將微分方程算法換為定步長fixed step中的ode4!不然仿真超級慢!
具體分析可見:https://www.ilovematlab.cn/thread-260054-1-1.html
最后結果為:
系統最終能夠跟蹤階躍信號
————————————————
版權聲明:本文為CSDN博主「PriscillaSCU」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/sinat_38887014/article/details/103115218