본문 바로가기

엔코더 모터 제어 (3. PID 제어로 속도 제어 [PID 함수들 만들기 Part 01])

반응형

https://kmong.com/gig/465716?selfMarketingCode=HskZcR53S1 

 

돈이 되는 인공지능의 시대 그 다음은 | 10000원부터 시작 가능한 총 평점 0점의 전자책, 교육 전자

0개 총 작업 개수 완료한 총 평점 0점인 잡동사니아두이노의 전자책, 교육 전자책 서비스를 0개의 리뷰와 함께 확인해 보세요. 전자책, 교육 전자책 제공 등 10000원부터 시작 가능한 서비스

kmong.com

관련글


엔코더 모터 제어 (0. 소개) (tistory.com)

엔코더 모터 제어 (1. 펄스및 위치 측정) (tistory.com)

엔코더 모터 제어 (2. 속도 계산) (tistory.com)


서론


엔코더 모터는 위치 제어뿐만 아니라 속도제어도 가능합니다. 전장에서 알아 봤던 M 또는 T 방식으로 현재 RPM을 측정하고, 이를 기반으로 현재 속도를 수정하고, 목표치에 맞춰질 수 있도록 제어량을 조절하는 것입니다.

 

즉 다음과 같은 피드백 방식으로 속도를 제어합니다.

그림01

 

PWM 신호와 피드백 제어를 통해 얻은 값을 더하여 모터를 동작시킵니다. 모터가 동작되면 모터의 속도를 측정하고 피드백 제어에서 오차를 계산하여 PWM 값과 다시 결합하여 제어량을 결정합니다.

 

피드백 제어는 이러한 방식으로 동작되며, 이번 장에서는 PID 제어를 통해 모터의 속도를 제어해 보겠습니다.

 

 

 


PID 제어

  변수 생성

  에러 계산 함수

  P 제어 함수

  I 제어 함수

  D 제어 함수

  PID 함수

 

결과 영상


참고 자료


STM32F103ZET6 Reference Manual

STM32F10xxx/20xxx/21xxx/L1xxxx Cortex®-M3 programming manual

PID제어란? (tistory.com)

 

 

PID 제어


PID 제어를 하기 위해선 다음의 개념들이 필요합니다.

개념 설명 변수
목표값 우리가 목표로하는 모터의 RPM target
현재값 현재 모터의 RPM current
실시간 에러값 목표 RPM과 현재 RPM 사이의 차이값입니다. realError
누적 에러값 목표 RPM과 현재 RPM 사이의 차이를 누적한 값입니다. accError
에러 변화량 현재 에러와 이전 에러 사이의 차입니다. errorGap
P 제어량 P 제어를 통해 얻은 제어량 pControl
P gain P 제어에 사용되는 계수 (상수) P_GAIN
I 제어량 I 제어를 통해 얻은 제어량 iControl
I gain I 제어에 사용되는 계수 (상수) I_GAIN
D 제어량 D 제어를 통해 얻은 제어량 dControl
D gain D 제어에 사용되는 계수 (상수) D_GAIN
최종 제어향 P, I, D 제어량을 합친 제어향 pidControl
미분계수 값 d/dt에 해당되는 값 (상수) TIME

 

 

 

에러 계산 함수

에러의 종류가 실시간 에러, 누적 에러가 있기 때문에 이들을 계산하는 함수를 선언합니다.

void calculateErrors(void) {
	errorGap = target - current - realError;
	realError = target - current;	// 실시간 에러는 단순히 목표값 - 현재값을 의미합니다.
    accError += realError;
    /*
    	누적 에러는 실시간 에러를 계속해서 더한 값입니다.
        I 제어를 위해 사용됩니다.
	*/
    

}

errorGap는 현재 에러와 이전 에러사이의 변화량이며, D 제어를 위해 사용합니다.

realError는 목표값과 현재값 사이의 차 즉, 목표값 - 현재값을 의미합니다. P 제어를 위해 사용합니다.

accError는 realError값을 누적한 값으로 I 제어를 위해 사용됩니다.

 

 

 

변수 생성

위의 개념들을 코드로 표현하면 변수에 해당합니다. (물론 몇몇 개념들을 상수로 선언합니다.)

#define P_GAIN	1
#define	I_GAIN	1
#define D_GAIN	1
#define TIME	4

unsigned int target = 0;
unsigned int current = 0;
unsigned int pControl = 0;
unsigned int iControl = 0;
unsigned int dControl = 0;
unsigned int pidControl = 0;
unsigned int realError = 0;
unsigned int accError = 0;
unsigned int errorGap = 0;

 

수학적으로만 봤을 때는 모두 실수값인 double형으로 선언해야하지만, MCU는 기본적으로 실수 연산을 못하기 때문에 int 형으로 선언한 것입니다.

 

해당 변수들은 글로벌 변수로 선언해주셔야합니다. (main 위에다 선언)

 

P 제어 함수

unsigned int pControlSystem(void) {

	pControl = P_GAIN * realError;

	return pControl;
}

P 제어는 단순히 오차 * 계수에 해당됩니다. 

 

 

I 제어 함수

unsigned int iControlSystem(void) {

	iControl = I_GAIN * (accError * TIME);

	return iControl;
}

I 제어는 시작부터 지금까지의 오차를 기준으로하는 제어 방법입니다.

수학적으로 보면 다음과 같습니다.

그림02

여기서 realError을 누적한 값이 accError이고, dt는 TIME이니 위의 함수와 같은 수식이 나오게 됩니다.

 

 

D 제어 함수

unsigned int dControlSystem(void) {

	dControl = D_GAIN * (errorGap / TIME);

	return dControl;
}

 

 

 

 

PID 제어 함수

unsigned int pidControlSystem(void) {

	pidControl = pControl + iControl + dControl;

	return pidControl;
}

 

 

 

결과 영상


 

 

노란색 선은 목표값이고, 초록색은 현재값입니다.

50 RPM -> 100 RPM -> 150 RPM -> 200 RPM -> 250 RPM -> 300 RPM -> 0 RPM -> 50 RPM -> ...

 

 

 

 

위의 순서를 따라 목표값을 바꾸면서 모터의 현재 속도가 어떻게 반응하는지 영상을 통해 알아봤습니다.

 


Continue

 


 

 

https://kmong.com/gig/465716?selfMarketingCode=HskZcR53S1 

 

돈이 되는 인공지능의 시대 그 다음은 | 10000원부터 시작 가능한 총 평점 0점의 전자책, 교육 전자

0개 총 작업 개수 완료한 총 평점 0점인 잡동사니아두이노의 전자책, 교육 전자책 서비스를 0개의 리뷰와 함께 확인해 보세요. 전자책, 교육 전자책 제공 등 10000원부터 시작 가능한 서비스

kmong.com

 

반응형