В этом примере показано, как использовать 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.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.
Рисунок 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
рад/с. По умолчанию метка дискретизируется с помощью метода 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 = 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
На этот раз гибридный ответ тесно совпадает со своим приближением дискретного времени, и никакая дальнейшая корректировка фильтра метки не требуется.