Этот пример показывает сравнение трех методов управления двигателем постоянного тока для отслеживания команд заданного значения и сокращения чувствительности, чтобы загрузить воздействия:
команда feedforward
интегральное управление с обратной связью
Регулирование LQR
См. "Получение Моделей Started:Building" для получения дополнительной информации о модели двигателя постоянного тока.
В управляемых арматурой двигателях постоянного тока приложенное напряжение Va управляет скоростью вращения w вала.
Этот пример показывает два метода управления двигателем постоянного тока для сокращения чувствительности w, чтобы загрузить изменения (изменения в крутящем моменте, отклоненном моторной загрузкой).
Упрощенную модель двигателя постоянного тока показывают выше. Модели Td крутящего момента загружают воздействия. Необходимо минимизировать изменения скорости, вызванные такими воздействиями.
В данном примере физические константы:
R = 2.0; % Ohms L = 0.5; % Henrys Km = 0.1; % torque constant Kb = 0.1; % back emf constant Kf = 0.2; % Nms J = 0.02; % kg.m^2/s^2
Сначала создайте модель в пространстве состояний двигателя постоянного тока с двумя входными параметрами (Va, Td) и один выход (w):
h1 = tf(Km,[L R]); % armature h2 = tf(1,[J Kf]); % eqn of motion dcm = ss(h2) * [h1 , 1]; % w = h2 * (h1*Va + Td) dcm = feedback(dcm,Kb,1,1); % close back emf loop
Примечание: Вычислите с формой пространства состояний, чтобы минимизировать порядок модели.
Теперь постройте ответ скорости вращения на ступенчатое изменение в напряжении Va:
stepplot(dcm(1));
Щелкните правой кнопкой по графику и выберите "Characteristics:Settling Time", чтобы отобразить время урегулирования.
Можно использовать эту простую управляющую структуру feedforward, чтобы управлять скоростью вращения w к данному значению w_ref.
Усиление feedforward Kff должно быть установлено в обратную величину усиления DC от Va до w.
Kff = 1/dcgain(dcm(1))
Kff = 4.1000
Чтобы оценить проект feedforward перед лицом воздействий загрузки, симулируйте ответ на команду w_ref=1 шага с воздействием Td =-0.1Nm между t=5 и t=10 секунды:
t = 0:0.1:15; Td = -0.1 * (t>5 & t<10); % load disturbance u = [ones(size(t)) ; Td]; % w_ref=1 and Td cl_ff = dcm * diag([Kff,1]); % add feedforward gain cl_ff.InputName = {'w_ref','Td'}; cl_ff.OutputName = 'w'; h = lsimplot(cl_ff,u,t); title('Setpoint tracking and disturbance rejection') legend('cl\_ff') % Annotate plot line([5,5],[.2,.3]); line([10,10],[.2,.3]); text(7.5,.25,{'disturbance','T_d = -0.1Nm'},... 'vertic','middle','horiz','center','color','r');
Очевидно feedforward управляет воздействиями загрузки указателей плохо.
Затем попробуйте структуру управления с обратной связью, показанную ниже.
Чтобы осуществить нулевую установившуюся ошибку, используйте интегральное управление формы
C(s) = K/s
where K is to be determined.
Чтобы определить усиление K, можно использовать метод корневого годографа, применился к разомкнутому циклу 1/с * передача (Va-> w):
h = rlocusplot(tf(1,[1 0]) * dcm(1)); setoptions(h,'FreqUnits','rad/s'); xlim([-15 5]); ylim([-15 15]);
Нажмите на кривые, чтобы считать значения усиления и связанную информацию. Разумным выбором здесь является K = 5. Обратите внимание на то, что Design Tool SISO предлагает интегрированный графический интерфейс пользователя, чтобы выполнить такие проекты (помогите sisotool для деталей).
Сравните этот новый проект с первоначальным проектом feedforward на том же тесте:
K = 5; C = tf(K,[1 0]); % compensator K/s cl_rloc = feedback(dcm * append(C,1),1,1,1); h = lsimplot(cl_ff,cl_rloc,u,t); cl_rloc.InputName = {'w_ref','Td'}; cl_rloc.OutputName = 'w'; title('Setpoint tracking and disturbance rejection') legend('feedforward','feedback w/ rlocus','Location','NorthWest')
Проект корневого годографа лучше в отклонении воздействий загрузки.
Чтобы далее улучшать производительность, попытайтесь проектировать линейный квадратичный регулятор (LQR) для структуры обратной связи, показанной ниже.
В дополнение к интегралу ошибки схема LQR также использует вектор состояния x = (i, w), чтобы синтезировать ведущее напряжение Va. Получившееся напряжение имеет форму
Va = K1 * w + K2 * w/s + K3 * i
where i is the armature current.
Для лучшего подавления помех используйте функцию стоимости, которая штрафует большую интегральную ошибку, например, функция стоимости
где
Оптимальное усиление LQR для этой функции стоимости вычисляется можно следующим образом:
dc_aug = [1 ; tf(1,[1 0])] * dcm(1); % add output w/s to DC motor model
K_lqr = lqry(dc_aug,[1 0;0 20],0.01);
Затем выведите модель с обратной связью в целях симуляции:
P = augstate(dcm); % inputs:Va,Td outputs:w,x C = K_lqr * append(tf(1,[1 0]),1,1); % compensator including 1/s OL = P * append(C,1); % open loop CL = feedback(OL,eye(3),1:3,1:3); % close feedback loops cl_lqr = CL(1,[1 4]); % extract transfer (w_ref,Td)->w
Этот график сравнивает диаграммы Боде с обратной связью для трех систем управления двигателя постоянного тока
bodeplot(cl_ff,cl_rloc,cl_lqr);
Нажмите на кривые, чтобы идентифицировать системы или смотреть данные.
Наконец мы сравниваем три системы управления двигателя постоянного тока на нашем тесте симуляции:
h = lsimplot(cl_ff,cl_rloc,cl_lqr,u,t); title('Setpoint tracking and disturbance rejection') legend('feedforward','feedback (rlocus)','feedback (LQR)','Location','NorthWest')
Благодаря его дополнительным степеням свободы компенсатор LQR выполняет лучше всего при отклонении воздействий загрузки (среди трех систем управления двигателя постоянного тока, обсужденных здесь).