Main Content

DC 모터 제어

이 예제에서는 세트포인트 명령을 추적하고 부하 외란에 대한 민감도를 줄이는 3가지 DC 모터 제어 기술을 비교합니다.

  • 피드포워드 명령

  • 적분 피드백 제어

  • LQR 조절

DC 모터 모델에 관한 자세한 내용은 "시작하기:모델 작성하기"를 참조하십시오.

문제 설명

전기자 제어 DC 모터에서는 인가 전압 Va가 축의 각속도 w를 제어합니다.

이 예제에서는 부하 변동(즉, 모터 부하에 반하는 토크의 변화)에 대한 w의 민감도를 줄이는 두 가지 DC 모터 제어 기법을 보여줍니다.

DC 모터의 단순화한 모델을 위에서 확인할 수 있습니다. 토크 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

먼저 입력 2개(Va,Td)와 출력 1개(w)가 있는 DC 모터의 상태공간 모델을 만듭니다.

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));

플롯을 마우스 오른쪽 버튼으로 클릭하고 "특성:정착 시간"을 선택하여 정착 시간을 표시합니다.

피드포워드 DC 모터 제어 설계

이 단순한 피드포워드 제어 구조를 사용하여 각속도 w를 지정된 값 w_ref로 명령할 수 있습니다.

피드포워드 이득 Kff는 Va에서 w로의 DC 이득의 역수로 설정되어야 합니다.

Kff = 1/dcgain(dcm(1))
Kff =

    4.1000

부하 외란 상황에서 피드포워드 설계를 평가하기 위해, t=5에서 t=10초 사이 외란 Td = -0.1Nm으로 계단 명령 w_ref=1에 대한 응답을 시뮬레이션합니다.

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');

피드포워드 제어가 부하 외란을 잘 처리하지 못하는 게 분명합니다.

피드백 DC 모터 제어 설계

이번에는 아래에 표시된 피드백 제어 구조를 시도해 보겠습니다.

정상 상태 오차가 0이 되도록 만들기 위해 다음 형식의 적분 제어를 사용합니다.

     C(s) = K/s
     where K is to be determined.

이득 K를 결정하려면 개루프 1/s * transfer(Va->w)에 적용된 근궤적 기법을 사용하면 됩니다.

h = rlocusplot(tf(1,[1 0]) * dcm(1));
setoptions(h,'FreqUnits','rad/s');
xlim([-15 5]);
ylim([-15 15]);

곡선을 클릭하여 이득 값과 관련 정보를 읽습니다. 여기서 합리적인 선택은 K = 5입니다. 제어 시스템 디자이너 앱은 이러한 설계를 수행하기 위한 대화형 UI입니다.

이 새로운 설계를 같은 테스트 사례의 최초 피드포워드 설계와 비교해 보십시오.

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 DC 모터 제어 설계

성능을 더 개선하기 위해 아래에 표시된 피드백 구조에 대한 선형 2차 조절기(LQR)를 설계해 보십시오.

LQR 체계는 오차 적분은 물론 상태 벡터 x=(i,w)를 사용하여 구동 전압 Va를 합성합니다. 그 결과, 전압의 형식은 다음과 같습니다.

     Va = K1 * w + K2 * w/s + K3 * i
     where i is the armature current.

외란 제거를 개선하려면 큰 적분 오차에 페널티를 적용하는 비용 함수를 사용하십시오. 비용 함수의 예는 다음과 같습니다.

$$ C = \int^\infty_0 (20q(t)^2+\omega(t)^2+0.01V_a(t)^2) dt $$

여기서,

$$ q(s) = \omega(s)/s. $$

이 비용 함수의 최적 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

이 플롯은 3가지 DC 모터 제어 설계용 폐루프 보드 다이어그램을 비교합니다.

bodeplot(cl_ff,cl_rloc,cl_lqr);

곡선을 클릭하여 시스템을 식별하거나 데이터를 검사합니다.

DC 모터 제어 설계 비교

마지막으로 시뮬레이션 테스트 사례에서 3가지 DC 모터 제어 설계를 비교합니다.

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 보상기는 추가적인 자유도로 인해 부하 외란 제거 시 (여기서 논의한 3가지 DC 모터 제어 설계 중에서) 가장 뛰어난 성능을 발휘합니다.