Этот пример показывает, как использовать 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 рад/с. Команда 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.949, Iterations = 26 Achieved target gain value TargetGain=1.
Окончательное значение ниже или около 1 указывает на успех. Осмотрите настроенные значения фильтра вывода/задержки и усиления:
showTunable(ST1)
Block 1: rct_dmc/Tunable Digital Controller/Gain = D = u1 y1 1.551e-05 Name: Gain Static gain. ----------------------------------- Block 2: rct_dmc/Tunable Digital Controller/Leadlag = 5.044 s + 8.239 --------------- s + 14.93 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.
Рисунок 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
, чтобы совместно настроить "Усиление", "Leadlag" и блоки "Метки" с целевой перекрестной частотой на 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
и сравните Предвещать ответы 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. Сравните ответы Simulink и MATLAB:
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
rad/s. По умолчанию метка дискретизируется с помощью метода 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 имеет значительное искажение и предварительно деформировался, Тастин должен использоваться вместо этого. Для этого задайте желаемый метод преобразования уровня для блока фильтра метки:
setBlockRateConversion(ST2,'Notch','tustin',wn(1)) writeBlockValue(ST2)
writeBlockValue
теперь использует Тастин, предварительно деформированный на частоте метки, чтобы дискретизировать фильтр метки и записать его обратно к 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 = 39
% 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
На этот раз гибридный ответ тесно совпадает со своим приближением дискретного времени, и никакая дальнейшая корректировка фильтра метки не требуется.