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

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

Введение

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

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

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

load hinfstruct_demo G
bode(G), grid

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

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

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

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

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, чтобы настроить контроллер PI C и фильтр F для архитектуры управления рисунка 1. Чтобы снизить риск локальных минимумов, запустите три оптимизации, две из которой запускается с рандомизированных начальных значений для C0 и F0:

rng('default')
opt = hinfstructOptions('Display','final','RandomStart',5);
T = hinfstruct(T0,opt);
Final: Peak gain = 1.56, Iterations = 70
Final: Peak gain = 597, Iterations = 189
       Some closed-loop poles are marginally stable (decay rate near 1e-07)
Final: Peak gain = 596, Iterations = 188
       Some closed-loop poles are marginally stable (decay rate near 1e-07)
Final: Peak gain = 3.88, Iterations = 62
Final: Peak gain = 1.56, Iterations = 85
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 = 1.56, Iterations = 70
Final: Peak gain = 597, Iterations = 182
       Some closed-loop poles are marginally stable (decay rate near 1e-07)
Final: Peak gain = 597, Iterations = 164
       Some closed-loop poles are marginally stable (decay rate near 1e-07)
Final: Peak gain = 3.88, Iterations = 62
Final: Peak gain = 1.56, Iterations = 98
Final: Peak gain = 1.56, Iterations = 92

Проверьте, что вы получаете те же настроенные значения как с подходом 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