본문 바로가기
Embedded SW/Control Theory

PI 제어기 설계 (PI Controller DC Motor Design)

by 방구석 임베디드 2022. 10. 1.
반응형

안녕하세요.

앞의 글에 이어서,

이제 PI 제어기를 설계하는 과정을 글로 적어 보도록 하겠습니다.

 

1) 제어란 무엇인가?
https://embeddedchallenge.tistory.com/475

​2) 매트랩이란? 매트랩 학생용 다운로드 및 라이센스 받는 방법
https://embeddedchallenge.tistory.com/477

​3) 매트랩 기초 연습 (행렬 연산, 데이터 나누기, 그래프 그리기)
https://embeddedchallenge.tistory.com/478

4) 지수함수, 모터 모델링, 전달함수, 시간함수 정리
https://embeddedchallenge.tistory.com/479

5) DC모터 모델링, 매트랩 전달함수 생성 후 그래프 확인
https://embeddedchallenge.tistory.com/480

6) Simulink를 이용한 전달함수 시뮬레이션 수행 방법 정리
https://embeddedchallenge.tistory.com/481

7) DAQ? Data Acquisition? DC모터 전달함수의 K와 Tau 값을 계산, 확인하는 방법 정리
https://embeddedchallenge.tistory.com/482

8) Feedback Controller 설계 방법 정리 (ex DC모터 제어, P Controller)
https://embeddedchallenge.tistory.com/484

9) Pole이란 무엇이고, 1차 전달함수에서 Pole에 위치에 따른 응답특성은?
https://embeddedchallenge.tistory.com/485

 

10) P controller 정상오차 분석 정리 (DC모터 P 제어기 Steady State Error 분석)

https://embeddedchallenge.tistory.com/490

 

그런데, P 제어기의 정상상태 Error가 

왜 이렇게 나오는지 궁금하신 분들이 있어서,

아래와 같이 최종치 정리를 추가로 정리합니다.

라플라스 변환과정에서

아래와 같이 라플라스 변환을 거치게 됩니다.

여기서 S가 0으로 수렴한다고 생각하면

아래 수식을 정리할수 있습니다.

 

다시 정리하면 아래와 같은 수식이 나오는 것입니다.

그러면 이제 P 제어기는 정상상태 Erorr가 존재할수 밖에 없음을 이전 글에서 증명을 했습니다.

그러면 

이제 PI 제어기를 설계한다고 할때

어떻게 달라질까요?

sE(s) = s*(1/s)  /   (C(s) * G(s) + 1)

결국 C(s)는 결국 I controller가 추가가 되기 때문에

C(s) = Kp + Ki/s 가 되게 됩니다.

그렇다면 아래 수식에 대입해서 증명해 보도록 하겠습니다.

sE(s) = s*(1/s)  /   (C(s) * G(s) + 1)

결국 I gain을 추가하면 Error의 값은 0으로 수렴하도록 증명을 할 수 있습니다.

 

그렇다면 이제 Simulation을 이용해서 확인해 보도록 하겠습니다.

Simulation 작업한것은 첨부해서 올릴게요.

한번 돌려보세요!

1) P Controller (Kp = 0.2)

우선 아래와 같이 간단히 설계를 하였습니다.

그리고 이 시뮬레이션을 돌리고, 그래프를 그리기 위해

아래와 같이 간단히 m 파일을 작성하였습니다.

clear;
close all;
clc

StepTime = 10.05;
K = 44.3222;
Tau = 0.8689;

Kp = 0.2;
Ki = 0;

% Simulation Operation
sim('PID.slx');
%Plot
plot(ans.Sim_R(:,1), ans.Sim_R(:,2), 'b');
hold on;
plot(ans.Sim_Y(:,1), ans.Sim_Y(:,2), 'r');
xlim([6 15]);
ylim([100 240]);
title('PI Controller');
xlabel('Time [s]');
ylabel('Motor Speed [RPM]');
grid on;
legend('Target Speed [RPM]', 'Simulation Motor Speed [RPM]');

P Controller만 수행할때 아래와 같이 정상상태 오차가 존재합니다.

 

 

2) PI Controller (Kp = 0.2, Ki = 0.2)

m파일에서

Ki의 값을 0 에서 0.2로 변경해 보았습니다.

그러면 이제 아래와 같이 이제 PI 제어기 동작하게 됩니다.

보이시나요?

정상상태 Error가 개선되고 있습니다.

처음 P Gain의 힘으로 쭉 올라가고

나머지는 I Gain의 힘으로 Error를 적분해서

목표값을 따라가고 있는것을 볼 수 있습니다.

 

 

3) PI Controller (Kp = 0.2, Ki = 0.35)

아래와 같은 그림이 그려지고 있습니다.

Overshoot가 발생하였습니다.

하지만 목표값을 조금더 빠르게 추종하고 있는것을 볼  수 있습니다.

 

최종적으로 기존 제어기 없이

Open Loop 제어를 수행하였을 경우에 비해서

Feedback 제어기(PI Controller)를 추가하였을때

아래와 같이 

Overshoot : 1.26%

Settling Time : 0.23s

Rising Time : 0.2s

가 걸리는 것을 확인 할 수 있습니다.

이제 시뮬레이션을 끝내고 실제 모터에 

위의 제어기 Gain을 적용하여 Feedback Controller를 만들어 보도록 하겠습니다.

실제로 코드를 만들어서 적용하는 부분은 추후에 더 다루어 보도록 하겠습니다.

 

이것은 위의 시뮬레이션으로 얻은 Gain을 실제 DC 모터에 적용하여 그래프로 뽑은 결과 입니다.

제어기의 응답성능이 개선이 된것을 확인 할 수 있습니다.

이제 DC 모터에 원하는 지령을 주게 되면

바로 따라오는 DC모터 속도 제어기가 완성이 되었습니다.

 

해당 작업코드는 아래와 같이 첨부하니 참고해주세요!

01_Motor_PID.zip
0.03MB

반응형

댓글