Этот пример показывает, как надежно настроить ПИД-регулятор для двигателя постоянного тока с недостаточно хорошо известными параметрами.
Неопределенная модель двигателя постоянного тока выведена в "Робастности Контроллера Сервомотора для двигателя постоянного тока" пример. Передаточной функцией от приложенного напряжения до угловой скорости дают
где сопротивление, индуктивность, постоянный EMF, арматура постоянное, вязкое трение и инерционная загрузка являются физическими параметрами двигателя. Эти параметры не отлично известны и подвергаются изменению, таким образом, мы моделируем их как неопределенные значения с заданной областью значений или неуверенностью процента.
R = ureal('R',2,'Percentage',40); L = ureal('L',0.5,'Percentage',40); K = ureal('K',0.015,'Range',[0.012 0.019]); Km = K; Kb = K; Kf = ureal('Kf',0.2,'Percentage',50); J = ureal('J',0.02,'Percentage',20); P = tf(Km,[J*L J*R+Kf*L Km*Kb+Kf*R]); P.InputName = 'Voltage'; P.OutputName = 'Speed';
Время и функции частотной характеристики как step
или bode
автоматически выбирают неопределенные параметры в их области значений. Это полезно, чтобы измерить влияние неуверенности. Например, постройте переходной процесс неопределенного объекта P
и отметьте большое изменение в усилении DC объекта.
step(P,getNominal(P),3) legend('Sampled uncertainty','Nominal')
Чтобы надежно настроить ПИД-регулятор для этого двигателя постоянного тока, создайте настраиваемый блок PID C
и создайте модель CL0
с обратной связью обратной связи в рисунке 1. Добавьте, что анализ указывает dLoad
на объект вывод, чтобы измерить чувствительность, чтобы загрузить воздействие.
C = tunablePID('C','pid'); AP = AnalysisPoint('dLoad'); CL0 = feedback(AP*P*C,1); CL0.InputName = 'SpeedRef'; CL0.OutputName = 'Speed';
Рисунок 1: управление ПИДом двигателя постоянного тока
Существует много способов задать желаемую производительность. Здесь мы фокусируемся на чувствительности, чтобы загрузить воздействие, спад и динамику с обратной связью.
R1 = TuningGoal.Sensitivity('dLoad',tf([1.25 0],[1 2])); R2 = TuningGoal.MaxLoopGain('dLoad',10,1); R3 = TuningGoal.Poles('dLoad',0.1,0.7,25);
Первый целевой R1
задает желаемый профиль для функции чувствительности. Чувствительность должна быть низкой в низкой частоте для хорошего подавления помех. Второй целевой R2
налагает спад на-20 дБ/десятилетие прошлые 10 рад/с. Третий целевой R3
задает минимальное затухание, минимальное затухание и максимальную собственную частоту для полюсов с обратной связью.
viewGoal(R1)
viewGoal(R2)
viewGoal(R3)
Можно теперь использовать systune
, чтобы надежно настроить коэффициенты ПИД, то есть, попытаться достигнуть целей проекта для всех возможных значений неопределенных параметров двигателя постоянного тока. Поскольку локальные минимумы могут существовать, выполните три отдельных настройки от трех различных наборов начальных значений усиления.
opt = systuneOptions('RandomStart',2);
rng(0), [CL,fSoft] = systune(CL0,[R1 R2 R3],opt);
Nominal tuning: Design 1: Soft = 0.838, Hard = -Inf Design 2: Soft = 0.838, Hard = -Inf Design 3: Soft = 0.914, Hard = -Inf Robust tuning of Design 1: Soft: [0.838,2.02], Hard: [-Inf,-Inf], Iterations = 74 Soft: [0.875,1.76], Hard: [-Inf,-Inf], Iterations = 29 Soft: [1.02,2.98], Hard: [-Inf,-Inf], Iterations = 31 Soft: [1.34,1.36], Hard: [-Inf,-Inf], Iterations = 32 Soft: [1.35,1.35], Hard: [-Inf,-Inf], Iterations = 20 Final: Soft = 1.35, Hard = -Inf, Iterations = 186 Robust tuning of Design 2: Soft: [0.838,2.08], Hard: [-Inf,-Inf], Iterations = 40 Soft: [0.875,1.76], Hard: [-Inf,-Inf], Iterations = 28 Soft: [0.935,2.77], Hard: [-Inf,-Inf], Iterations = 27 Soft: [1.35,1.35], Hard: [-Inf,-Inf], Iterations = 35 Final: Soft = 1.35, Hard = -Inf, Iterations = 130 Robust tuning of Design 3: Soft: [0.914,2.38], Hard: [-Inf,-Inf], Iterations = 50 Soft: [1.01,3.32], Hard: [-Inf,-Inf], Iterations = 27 Soft: [0.948,2.32], Hard: [-Inf,-Inf], Iterations = 107 Soft: [1.32,1.41], Hard: [-Inf,-Inf], Iterations = 30 Soft: [1.35,1.35], Hard: [-Inf,-Inf], Iterations = 22 Final: Soft = 1.35, Hard = -Inf, Iterations = 236
Окончательное значение близко к 1, таким образом, настраивающиеся цели почти достигаются в области значений неуверенности. Настроенный ПИД-регулятор
showTunable(CL)
C = 1 s Kp + Ki * --- + Kd * -------- s Tf*s+1 with Kp = 33.8, Ki = 83.2, Kd = 2.34, Tf = 0.028 Name: C Continuous-time PIDF controller in parallel form.
Затем проверяйте, как этот ПИД отклоняет воздействие загрузки шага для 30 случайным образом выбранных значений неопределенных параметров.
S = getSensitivity(CL,'dLoad'); clf, step(usample(S,30),getNominal(S),3) title('Load disturbance rejection') legend('Sampled uncertainty','Nominal')
Производительность отклонения остается универсальной несмотря на большие изменения объекта. Можно также проверить, что функция чувствительности надежно остается в связанном предписанном.
viewGoal(R1,CL)
Устойчивая настройка с systune
легка. Только включайте неуверенность объекта в настраиваемую модель с обратной связью с помощью объектов ureal
, и программное обеспечение автоматически пытается достигнуть настраивающихся целей для целой области значений неуверенности.