Устойчивая настройка контроллера двигателя постоянного тока

В этом примере показано, как надежно настроить ПИД-регулятор для двигателя постоянного тока недостаточно хорошо известными параметрами.

Моделирование двигателя постоянного тока

Неопределенная модель двигателя постоянного тока выведена в "Робастности Контроллера Сервомотора для двигателя постоянного тока" пример. Передаточной функцией от приложенного напряжения до скорости вращения дают

$$P(s) = {K_m \over J L s^2 + (J R + L K_f) s + K_m K_b + R K_f}$$

где сопротивление$R$, индуктивность$L$, постоянный EMF$K_b$, арматура постоянное$K_m$, вязкое трение $K_f$и инерционная загрузка$J$ являются физическими параметрами двигателя. Эти параметры не отлично известны и подвергаются изменению, таким образом, мы моделируем их как неопределенные значения с неопределенностью процента или заданной областью.

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 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 1:
Soft: [0.838,1.96], Hard: [-Inf,-Inf], Iterations = 65
Soft: [0.875,1.75], Hard: [-Inf,-Inf], Iterations = 30
Soft: [1.02,2.98], Hard: [-Inf,-Inf], Iterations = 34
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 3:
Soft: [0.914,2.35], Hard: [-Inf,-Inf], Iterations = 58
Soft: [0.998,2.83], Hard: [-Inf,-Inf], Iterations = 60
Soft: [0.948,2.32], Hard: [-Inf,-Inf], Iterations = 55
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 = 225

Окончательное значение близко к 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 объекты и программное обеспечение автоматически пытаются достигнуть настраивающихся целей для целой области значений неопределенности.

Связанные примеры

Больше о