Синтез фиксированной структуры H-бесконечности с HINFSTRUCT

Этот пример использует hinfstruct команда, чтобы настроить контроллер фиксированной структуры подвергает H ограничения.

Введение

hinfstruct команда расширяет классический H синтез (см. hinfsyn) к системам управления фиксированной структуры. Эта команда предназначается для пользователей, уже довольных hinfsyn рабочий процесс. Если вы незнакомы с H синтез или находит увеличенные объекты и функции взвешивания пугающими, использует systune и looptune вместо этого. См. "Настраивающиеся Системы управления с SYSTUNE" для systune дубликат этого примера.

Модель объекта управления

Этот пример использует модель 9-го порядка блока главного диска (HDA) в жестком диске. Эта модель получает первые несколько гибких режимов в HDA.

load hinfstruct_demo G
bode(G), grid

Мы используем обратную связь, которая, как показывают ниже, расположила голову на правильную дорожку. Эта управляющая структура состоит из ПИ-контроллера, и lowpass просачиваются обратный путь. Положение головы y должен отследить ступенчатое изменение r со временем отклика приблизительно одной миллисекунды, минимального перерегулирования и никакой установившейся ошибки.

Рисунок 1: управляющая структура

Настраиваемые элементы

Существует два настраиваемых элемента в управляющей структуре рисунка 1: ПИ-контроллер C(s) и фильтр lowpass

F(s)=as+a.

Используйте tunablePID класс, чтобы параметрировать блок PI и задать фильтр F(s) как передаточная функция в зависимости от настраиваемого действительного параметра a.

C0 = tunablePID('C','pi');  % tunable PI

a = realp('a',1);    % filter coefficient
F0 = tf(a,[1 a]);    % filter parameterized by a

Проект формирования цикла

Формирование цикла является методом частотного диапазона для осуществления требований к скорости ответа, пропускной способности управления, спаду и установившейся ошибке. Идея состоит в том, чтобы задать целевой профиль усиления или "форму цикла" для ответа разомкнутого цикла L(s)=F(s)G(s)C(s). Разумная форма цикла для этого приложения должна иметь интегральное действие и частоту среза приблизительно 1 000 рад/с (обратная величина желаемого времени отклика в 0,001 секунды). Это предлагает следующую форму цикла:

wc = 1000;  % target crossover
s = tf('s');
LS = (1+0.001*s/wc)/(0.001+s/wc);
bodemag(LS,{1e1,1e5}), grid, title('Target loop shape')

Обратите внимание на то, что мы выбрали bi-proper, бистабильная реализация, чтобы избежать технических трудностей с незначительно устойчивыми полюсами и неподходящими инверсиями. Для того, чтобы настроиться C(s) и F(s) с hinfstruct, мы должны превратить эту целевую форму цикла в ограничения на усиления с обратной связью. Систематический способ пойти об этом состоит в том, чтобы оснастить обратную связь можно следующим образом:

  • Добавьте, что шум измерения сигнализирует о n

  • Используйте целевую форму цикла LS и его обратная величина, чтобы отфильтровать сигнал ошибки e и белый источник шума nw.

Рисунок 2: формулировка с обратной связью

Если T(s) обозначает передаточную функцию с обратной связью от (r,nw) к (y,ew), ограничение усиления

T<1

защищает следующие желательные свойства:

  • В низкой частоте (w <туалет), коэффициент усиления разомкнутого контура остается выше усиления, заданного целевой формой цикла LS

  • В высокой частоте (w> туалет), коэффициент усиления разомкнутого контура остается ниже усиления, заданного LS

  • Система с обратной связью имеет соответствующие запасы устойчивости

  • Переходной процесс с обратной связью имеет маленькое перерегулирование.

Мы можем поэтому фокусироваться на настройке C(s) и F(s) осуществлять T<1.

Определение управляющей структуры в MATLAB

В MATLAB можно использовать connect команда к модели T(s) путем соединения фиксированных и настраиваемых компонентов согласно блок-схеме рисунка 2:

% Label the block I/Os
Wn = 1/LS;  Wn.u = 'nw';  Wn.y = 'n';
We = LS;    We.u = 'e';   We.y = 'ew';
C0.u = 'e';   C0.y = 'u';
F0.u = 'yn';  F0.y = 'yf';

% Specify summing junctions
Sum1 = sumblk('e = r - yf');
Sum2 = sumblk('yn = y + n');

% Connect the blocks together
T0 = connect(G,Wn,We,C0,F0,Sum1,Sum2,{'r','nw'},{'y','ew'});

Эти команды создают обобщенную модель в пространстве состояний T0 из T(s). Эта модель зависит от настраиваемых блоков C и a:

T0.Blocks
ans = struct with fields:
    C: [1x1 tunablePID]
    a: [1x1 realp]

Обратите внимание на то, что T0 получает следующую "Стандартную Форму" блок-схемы рисунка 2 где настраиваемые компоненты C,F разделяются от фиксированной динамики.

Рисунок 3: стандартная форма для формирования цикла дисковода

Настройка усилений контроллера

Мы теперь готовы использовать hinfstruct настроить ПИ-контроллер C и фильтр F для архитектуры управления рисунка 1. Чтобы снизить риск локальных минимумов, запустите три оптимизации, две из которой запускается с рандомизированных начальных значений для C0 и F0:

rng('default')
opt = hinfstructOptions('Display','final','RandomStart',5);
T = hinfstruct(T0,opt);
Final: Peak gain = 3.88, Iterations = 67
Final: Peak gain = 596, Iterations = 206
       Some closed-loop poles are marginally stable (decay rate near 1e-07)
Final: Peak gain = 597, Iterations = 168
       Some closed-loop poles are marginally stable (decay rate near 1e-07)
Final: Peak gain = 3.88, Iterations = 64
Final: Peak gain = 1.56, Iterations = 96
Final: Peak gain = 1.56, Iterations = 100

Лучшее усиление с обратной связью 1.56, таким образом, ограничение T<1 почти удовлетворен. hinfstruct команда возвращает настроенную передачу с обратной связью T(s). Используйте showTunable видеть настроенные значения C и коэффициент фильтра a:

showTunable(T)
C =
 
             1 
  Kp + Ki * ---
             s 

  with Kp = 0.000846, Ki = 0.0103
 
Name: C
Continuous-time PI controller in parallel form.
-----------------------------------
a = 5.49e+03

Используйте getBlockValue получить настроенное значение C(s) и используйте getValue оценивать фильтр F(s) для настроенного значения a:

C = getBlockValue(T,'C');
F = getValue(F0,T.Blocks);  % propagate tuned parameters from T to F

tf(F)
ans =
 
  From input "yn" to output "yf":
    5486
  --------
  s + 5486
 
Continuous-time transfer function.

Чтобы подтвердить проект, постройте ответ разомкнутого цикла L=F*G*C и сравните с целевой формой цикла LS:

bode(LS,'r--',G*C*F,'b',{1e1,1e6}), grid, 
title('Open-loop response'), legend('Target','Actual')

0dB частота среза и полная форма цикла как ожидалось. Запасы устойчивости могут быть считаны от графика путем щелчка правой кнопкой и выбора меню Characteristics. Этот проект имеет запас по амплитуде на 24 дБ и 81 запас по фазе степеней. Постройте переходной процесс с обратной связью от ссылочного r расположить y:

step(feedback(G*C,F)), grid, title('Closed-loop response')

В то время как ответ не имеет никакого перерегулирования, существует некоторое остаточное колебание из-за первого резонирующего peaks в G. Вы можете рассмотреть добавление, что метка просачивается прямой путь, чтобы удалить влияние этих режимов.

Настройка усилений контроллера от Simulink

Предположим, что вы использовали эту модель Simulink, чтобы представлять управляющую структуру. Если вам установили Simulink Control Design, можно настроить усиления контроллера из этой модели Simulink можно следующим образом. Сначала отметьте сигналы r,e,y,n когда Линейный Анализ указывает в модели Simulink.

Затем создайте экземпляр slTuner соедините интерфейсом и отметьте блоки Simulink C и F как настраиваемый:

ST0 = slTuner('rct_diskdrive',{'C','F'});

Начиная с фильтра F(s) имеет специальную структуру, явным образом задайте, как параметрировать F блок:

a = realp('a',1);    % filter coefficient
setBlockParam(ST0,'F',tf(a,[1 a]));

Наконец, используйте getIOTransfer выводить настраиваемую модель передаточной функции с обратной связью T(s) (см. рисунок 2),

% Compute tunable model of closed-loop transfer (r,n) -> (y,e)
T0 = getIOTransfer(ST0,{'r','n'},{'y','e'});

% Add weighting functions in n and e channels
T0 = blkdiag(1,LS) * T0 * blkdiag(1,1/LS);

Вы теперь готовы настроить усиления контроллера с hinfstruct:

rng(0)
opt = hinfstructOptions('Display','final','RandomStart',5);
T = hinfstruct(T0,opt);
Final: Peak gain = 3.88, Iterations = 67
Final: Peak gain = 597, Iterations = 177
       Some closed-loop poles are marginally stable (decay rate near 1e-07)
Final: Peak gain = 597, Iterations = 171
       Some closed-loop poles are marginally stable (decay rate near 1e-07)
Final: Peak gain = 1.64, Iterations = 80
Final: Peak gain = 1.56, Iterations = 92
Final: Peak gain = 1.56, Iterations = 106

Проверьте, что вы получаете те же настроенные значения как с подходом MATLAB:

showTunable(T)
C =
 
             1 
  Kp + Ki * ---
             s 

  with Kp = 0.000846, Ki = 0.0103
 
Name: C
Continuous-time PI controller in parallel form.
-----------------------------------
a = 5.49e+03