В этом примере показано, как надежно настроить ПИД-регулятор для двигателя постоянного тока недостаточно хорошо известными параметрами.
Неопределенная модель двигателя постоянного тока выведена в "Робастности Контроллера Сервомотора для двигателя постоянного тока" пример. Передаточной функцией от приложенного напряжения до скорости вращения дают
где сопротивление, индуктивность, постоянный EMF, арматура постоянное, вязкое трение и инерционная загрузка являются физическими параметрами двигателя. Эти параметры не отлично известны и подвергаются изменению, таким образом, мы моделируем их как неопределенные значения с неопределенностью процента или заданной областью.
R = ureal('R',2,'Percentage',40); L = ureal('L',0.5,'Percentage',40); K = ureal('K',0.015,'Range',[0.012 0.019]); Km = K; Kb = K; Kf = ureal('Kf',0.2,'Percentage',50); J = ureal('J',0.02,'Percentage',20); P = tf(Km,[J*L J*R+Kf*L Km*Kb+Kf*R]); P.InputName = 'Voltage'; P.OutputName = 'Speed';
Время и частотная характеристика функционируют как step
или bode
автоматически произведите неопределенные параметры в их области значений. Это полезно, чтобы измерить удар неопределенности. Например, постройте переходной процесс неопределенного объекта P
и отметьте большое изменение усиления DC объекта.
step(P,getNominal(P),3) legend('Sampled uncertainty','Nominal')
Чтобы надежно настроить ПИД-регулятор для этого двигателя постоянного тока, создайте настраиваемый блок PID C
и создайте модель CL0
с обратной связью из обратной связи в рисунке 1. Добавьте, что анализ указывает
dLoad
на объекте выход, чтобы измерить чувствительность, чтобы загрузить воздействие.
C = tunablePID('C','pid'); AP = AnalysisPoint('dLoad'); CL0 = feedback(AP*P*C,1); CL0.InputName = 'SpeedRef'; CL0.OutputName = 'Speed';
Рисунок 1: управление ПИДом двигателя постоянного тока
Существует много способов задать желаемую эффективность. Здесь мы фокусируемся на чувствительности, чтобы загрузить воздействие, спад и динамику с обратной связью.
R1 = TuningGoal.Sensitivity('dLoad',tf([1.25 0],[1 2])); R2 = TuningGoal.MaxLoopGain('dLoad',10,1); R3 = TuningGoal.Poles('dLoad',0.1,0.7,25);
Первый целевой R1
задает желаемый профиль для функции чувствительности. Чувствительность должна быть низкой в низкой частоте для хорошего подавления помех. Второй целевой R2
налагает спад на-20 дБ/десятилетие прошлые 10 рад/с. Третий целевой R3
задает минимальное затухание, минимальное затухание и максимальную собственную частоту для полюсов с обратной связью.
viewGoal(R1)
viewGoal(R2)
viewGoal(R3)
Можно теперь использовать systune
надежно настроить коэффициенты ПИД, то есть, попытаться достигнуть целей проекта для всех возможных значений неопределенных параметров двигателя постоянного тока. Поскольку локальные минимумы могут существовать, выполните три отдельных настройки от трех различных наборов начальных значений усиления.
opt = systuneOptions('RandomStart',2);
rng(0), [CL,fSoft] = systune(CL0,[R1 R2 R3],opt);
Nominal tuning: Design 1: Soft = 0.838, Hard = -Inf Design 2: Soft = 0.838, Hard = -Inf Design 3: Soft = 0.914, Hard = -Inf Robust tuning of Design 1: Soft: [0.838,1.99], Hard: [-Inf,-Inf], Iterations = 65 Soft: [0.875,1.76], Hard: [-Inf,-Inf], Iterations = 29 Soft: [1.02,2.98], Hard: [-Inf,-Inf], Iterations = 35 Soft: [1.34,1.36], Hard: [-Inf,-Inf], Iterations = 32 Soft: [1.35,1.35], Hard: [-Inf,-Inf], Iterations = 20 Final: Soft = 1.35, Hard = -Inf, Iterations = 181 Robust tuning of Design 2: Soft: [0.838,2.01], Hard: [-Inf,-Inf], Iterations = 40 Soft: [0.875,1.76], Hard: [-Inf,-Inf], Iterations = 29 Soft: [0.935,2.77], Hard: [-Inf,-Inf], Iterations = 27 Soft: [1.35,1.35], Hard: [-Inf,-Inf], Iterations = 35 Final: Soft = 1.35, Hard = -Inf, Iterations = 131 Robust tuning of Design 3: Soft: [0.914,2.38], Hard: [-Inf,-Inf], Iterations = 57 Soft: [1.01,3.29], Hard: [-Inf,-Inf], Iterations = 28 Soft: [0.948,2.32], Hard: [-Inf,-Inf], Iterations = 98 Soft: [1.32,1.41], Hard: [-Inf,-Inf], Iterations = 30 Soft: [1.35,1.35], Hard: [-Inf,-Inf], Iterations = 22 Final: Soft = 1.35, Hard = -Inf, Iterations = 235
Окончательное значение близко к 1, таким образом, настраивающиеся цели почти достигаются в области значений неопределенности. Настроенный ПИД-регулятор
showTunable(CL)
C = 1 s Kp + Ki * --- + Kd * -------- s Tf*s+1 with Kp = 33.8, Ki = 83.2, Kd = 2.34, Tf = 0.028 Name: C Continuous-time PIDF controller in parallel form.
Затем проверяйте, как этот ПИД отклоняет воздействие загрузки шага для 30 случайным образом выбранных значений неопределенных параметров.
S = getSensitivity(CL,'dLoad'); clf, step(usample(S,30),getNominal(S),3) title('Load disturbance rejection') legend('Sampled uncertainty','Nominal')
Эффективность отклонения остается универсальной несмотря на большие изменения объекта. Можно также проверить, что функция чувствительности надежно остается в связанном предписанном.
viewGoal(R1,CL)
Устойчивая настройка с systune
легко. Только включайте неопределенность объекта в настраиваемую модель с обратной связью с помощью ureal
объекты и программное обеспечение автоматически пытаются достигнуть настраивающихся целей для целой области значений неопределенности.