Этот пример показов, как использовать Control System Toolbox™ для настройки цифровой системы управления движением.
Система движения под фактор показана ниже.
Фигура 1: Цифровое оборудование управления движением
Это устройство может быть частью некоторой производственной машины и предназначено для перемещения некоторой нагрузки (захват, инструмент, сопло или что-либо еще, что вы можете себе представить) из одного углового положения в другое и обратно снова. Эта задача является частью «производственного цикла», который должен быть завершен для создания каждого продукта или партии продуктов.
Цифровой контроллер должен быть настроен, чтобы максимизировать скорость производства машины без ущерба для точности и качества продукта. Для этого мы сначала моделируем систему управления в Simulink с помощью модели инерции 4-го порядка и гибкого вала:
open_system('rct_dmc')
«Настраиваемый Цифровой Контроллер» состоит из усиления последовательно с контроллером вывода/задержки.
Фигура 2: Цифровой контроллер
Настройка осложняется наличием гибкого режима около 350 рад/с на объекте:
G = linearize('rct_dmc','rct_dmc/Plant Model'); bode(G,{10,1e4}), grid
Мы ищем время отклика 0,5 секунды на команду шага в угловом положении с минимальным перерегулированием. Это соответствует целевой полосе пропускания приблизительно 5 рад/с. The looptune
команда предлагает удобный способ настройки компенсаторов фиксированной структуры, как в этом приложении. Как использовать looptune
, сначала создайте экземпляр slTuner
интерфейс для автоматического получения структуры управления из Simulink. Обратите внимание, что интересующие сигналы уже помечены как точки линейного анализа в модели Simulink.
ST0 = slTuner('rct_dmc',{'Gain','Leadlag'});
Следующее использование looptune
для настройки параметров компенсатора на целевую частоту среза коэффициента усиления 5 рад/с:
Measurement = 'Measured Position'; % controller input Control = 'Leadlag'; % controller output ST1 = looptune(ST0,Control,Measurement,5);
Final: Peak gain = 0.979, Iterations = 19 Achieved target gain value TargetGain=1.
Окончательное значение ниже или около 1 указывает на успех. Осмотрите настроенные значения фильтра усиления и вывода/задержки:
showTunable(ST1)
Block 1: rct_dmc/Tunable Digital Controller/Gain = D = u1 y1 1.869e-05 Name: Gain Static gain. ----------------------------------- Block 2: rct_dmc/Tunable Digital Controller/Leadlag = 3.855 s + 6.322 --------------- s + 13.35 Name: Leadlag Continuous-time transfer function.
Чтобы подтвердить проект, используйте slTuner
интерфейс для быстрого доступа к интересующим вас передаточным функциям с обратной связью и сравнения ответов до и после настройки.
T0 = getIOTransfer(ST0,'Reference','Measured Position'); T1 = getIOTransfer(ST1,'Reference','Measured Position'); step(T0,T1), grid legend('Original','Tuned')
Настроенный ответ имеет значительно меньше перерегулирования и удовлетворяет требованию времени отклика. Однако эти симуляции получаются с помощью компенсатора вывода/задержки в непрерывном времени (looptune
работает в непрерывном времени) поэтому нам нужно дополнительно подтвердить проект в Simulink с помощью цифровой реализации опережающего/запаздывающего компенсатора. Использование writeBlockValue
применить настроенные значения к модели Simulink и автоматически дискретизировать компенсатор вывода/задержки по скорости, указанной в Simulink.
writeBlockValue(ST1)
Теперь можно симулировать ответ объекта непрерывного времени с помощью цифрового контроллера:
sim('rct_dmc'); % angular position logged in "yout" variable t = yout.time; y = yout.signals.values; step(T1), hold, plot(t,y,'r--') legend('Continuous','Hybrid (Simulink)')
Current plot held
Симуляции тесно совпадают, и коэффициенты цифрового вывода/задержки могут быть считаны из блока «Leadlag» в Simulink.
Далее попробуйте увеличить пропускную способность управления с 5 до 50 рад/с. Из-за резонанса объекта около 350 рад/с, компенсатор свинца/задержки больше не достаточен, чтобы получить адекватные запасы устойчивости и небольшой перерегулирование. Одним из средств является добавление узкополосного фильтра, как показано фигура.
Фигура 3: Цифровой контроллер с узкополосным фильтром
Чтобы настроить эту измененную архитектуру управления, создайте slTuner
образец с тремя настраиваемыми блоками.
ST0 = slTuner('rct_dmcNotch',{'Gain','Leadlag','Notch'});
По умолчанию блок «Notch» параметризован как любая передаточная функция второго порядка. Чтобы сохранить структуру с надрезом
задайте коэффициенты как действительные параметры и создайте параметрическую модель N передаточной функции, показанной выше:
wn = realp('wn',300); zeta1 = realp('zeta1',1); zeta2 = realp('zeta2',1); zeta1.Minimum = 0; zeta1.Maximum = 1; % 0 <= zeta1 <= 1 zeta2.Minimum = 0; zeta2.Maximum = 1; % 0 <= zeta2 <= 1 N = tf([1 2*zeta1*wn wn^2],[1 2*zeta2*wn wn^2]); % tunable notch filter
Затем связайте эту параметрическую модель выреза с блоком «Notch» в модели Simulink. Поскольку система управления настраивается за непрерывное время, можно использовать параметризацию узкополосного фильтра в непрерывном времени, хотя сам блок «Notch» дискретен.
setBlockParam(ST0,'Notch',N);
Следующее использование looptune
совместная настройка блоков «Gain», «Leadlag» и «Notch» с частотой среза цели 50 рад/с. Чтобы исключить остаточные колебания от резонанса объекта, задайте целевую форму цикла с поворотом -40 дБ/десятилетие за 50 рад/с.
% Specify target loop shape with a few frequency points Freqs = [5 50 500]; Gains = [10 1 0.01]; TLS = TuningGoal.LoopShape('Notch',frd(Gains,Freqs)); Measurement = 'Measured Position'; % controller input Control = 'Notch'; % controller output ST2 = looptune(ST0,Control,Measurement,TLS);
Final: Peak gain = 1.05, Iterations = 60
Конечный коэффициент усиления близок к 1, что указывает на выполнение всех требований. Сравните переходную характеристику с обратной связью с предыдущими проектами.
T2 = getIOTransfer(ST2,'Reference','Measured Position'); clf step(T0,T1,T2,1.5), grid legend('Original','Lead/lag','Lead/lag + notch')
Чтобы убедиться, что узкополосный фильтр работает должным образом, вычислите общую компенсацию C
и отклика без разомкнутого контура L
и сравните Bode-ответы G
, C
, L
:
% Get tuned block values (in the order blocks are listed in ST2.TunedBlocks) [g,LL,N] = getBlockValue(ST2,'Gain','Leadlag','Notch'); C = N * LL * g; L = getLoopTransfer(ST2,'Notch',-1); bode(G,C,L,{1e1,1e3}), grid legend('G','C','L')
Эта диаграмма Боде подтверждает, что резонанс объекта был правильно «вырезан».
Снова используйте writeBlockValue
дискретизировать настроенные фильтры вывода/задержки и надреза и записать их значения обратно в Simulink. Сравните ответы MATLAB и Simulink:
writeBlockValue(ST2) sim('rct_dmcNotch'); t = yout.time; y = yout.signals.values; step(T2), hold, plot(t,y,'r--') legend('Continuous','Hybrid (Simulink)')
Current plot held
Реакция Simulink показывает небольшие остаточные колебания. Дискретизация узкополосного фильтра является вероятным виновником, потому что частота узкополосного сигнала близка к частоте Найквиста pi/0.002=1570
рад/с. По умолчанию надрез дискретизируется с помощью метода ZOH. Сравните это с методом Тастина, предварительно разработанным на частоте узкого интервала:
wn = damp(N); % natural frequency of the notch filter Ts = 0.002; % sample time of discrete notch filter Nd1 = c2d(N,Ts,'zoh'); Nd2 = c2d(N,Ts,'tustin',c2dOptions('PrewarpFrequency',wn(1))); clf, bode(N,Nd1,Nd2) legend('Continuous','Discretized with ZOH','Discretized with Tustin',... 'Location','NorthWest')
Метод ZOH имеет значительное искажение, и вместо него следует использовать предварительно обработанный Tustin. Для этого задайте требуемый метод преобразования скорости для блока узкополосного фильтра:
setBlockRateConversion(ST2,'Notch','tustin',wn(1)) writeBlockValue(ST2)
writeBlockValue
теперь использует Tustin prewarped на частоте узких чисел, чтобы дискретизировать фильтр узких чисел и записать его обратно в Simulink. Проверьте, что это избавляет от колебаний.
sim('rct_dmcNotch'); t = yout.time; y = yout.signals.values; step(T2), hold, plot(t,y,'r--') legend('Continuous','Hybrid (Simulink)')
Current plot held
Кроме того, можно настроить контроллер непосредственно за дискретное время, чтобы избежать проблем дискретизации с узкополосным фильтром. Для этого укажите, что модель Simulink должна быть линеаризирована и настроена во шаге расчета контроллера 0,002 секунды:
ST0 = slTuner('rct_dmcNotch',{'Gain','Leadlag','Notch'}); ST0.Ts = 0.002;
Чтобы предотвратить управление и насыщение с высоким усилением, добавьте требование, которое ограничивает коэффициент усиления от опорного сигнала до управляющего сигнала (выход блока Notch).
GL = TuningGoal.Gain('Reference','Notch',0.01);
Теперь восстановите контроллер с заданной частотой дискретизации и проверьте настроенные отклики в разомкнутом и замкнутом циклах.
ST2 = looptune(ST0,Control,Measurement,TLS,GL); % Closed-loop responses T2 = getIOTransfer(ST2,'Reference','Measured Position'); clf step(T0,T1,T2,1.5), grid legend('Original','Lead/lag','Lead/lag + notch')
Final: Peak gain = 1.04, Iterations = 38
% Open-loop responses [g,LL,N] = getBlockValue(ST2,'Gain','Leadlag','Notch'); C = N * LL * g; L = getLoopTransfer(ST2,'Notch',-1); bode(G,C,L,{1e1,2e3}), grid legend('G','C','L')
Результаты аналогичны результатам, полученным при настройке контроллера за непрерывное время. Теперь проверьте соответствие цифрового контроллера объекту непрерывного времени в Simulink.
writeBlockValue(ST2) sim('rct_dmcNotch'); t = yout.time; y = yout.signals.values; step(T2), hold, plot(t,y,'r--') legend('Discrete','Hybrid (Simulink)')
Current plot held
На этот раз гибридная характеристика тесно совпадает с ее приближением в дискретном времени, и дальнейшая регулировка узкополосного фильтра не требуется.