BASIC4MCU | 질문게시판 | 피드백 코딩 질문있습니다
페이지 정보
작성자 우왕우오옹 작성일2020-11-16 14:03 조회6,054회 댓글3건본문
짧게 설명하자면 1.모터의 속도를 PI제어를 통해 조절하려고합니다
2.리모컨의 1,2,3번 버튼을 누르게되면 500,3000,5500RPM을 출력하게 PI제어를 하려고하는데요
PI제어 코드 : L_Werr = L_Wref - L_Wr;
PI = PI + PIconstant*L_Werr - Kp*L_Werr0;
L_Werr0 = L_Werr;
if(PI > 99.) PI = 99. ;
else if(PI < -99.) PI = -99. ;
if(PI >= 0. )
{ L_PWM = PI + 0.5;
OCR3A = L_PWM;
PORTC = 0x02;
}
else
{ L_PWM = -PI + 0.5;
OCR3A = L_PWM;
PORTC = 0x01;
}
R_Werr = R_Wref - R_Wr;
PI = PI + PIconstant*R_Werr - Kp*R_Werr0;
R_Werr0 = R_Werr;
if(PI > 99.) PI = 99. ;
else if(PI < -99.) PI = -99. ;
if(PI >= 0. )
{ R_PWM = PI + 0.5;
OCR3B = R_PWM;
PORTC = 0x08;
}
else
{ R_PWM = -PI + 0.5;
OCR3B = R_PWM;
PORTC = 0x04;
메인코드 중 일부
unsigned int dutyL_PWM, dutyR_PWM;
dutyL_PWM = (unsigned int)(999.*L_PWM + 0.5);
dutyR_PWM = (unsigned int)(999.*R_PWM + 0.5);
PIconstant = Kp + Ki* Ts;
Timer3_PWM_initialize(); // initialize PWM
OCR3A = dutyL_PWM; // duty ratio = 50%
OCR3B = dutyR_PWM;
LED1_on(); // initial speed 1
while(1)
{ key = Remocon_input(); // input TV remocon
if(key == KEY1_key) // if key = 1, set speed = 1
{
LED1_on();
L_Wref = 500;
R_Wref = 500;
OCR3A = dutyL_PWM; // duty ratio = 50%
OCR3B = dutyR_PWM;
}
else if(key == KEY2_key) // if key = 2, set speed = 2
{
LED2_on();
L_Wref = 3000;
R_Wref = 3000;
OCR3A = dutyL_PWM; // duty ratio = 50%
OCR3B = dutyR_PWM;
}
else if(key == KEY3_key) // if key = 3, set speed = 3
{
LED3_on();
L_Wref = 5500;
R_Wref = 5500;
OCR3A = dutyL_PWM; // duty ratio = 50%
OCR3B = dutyR_PWM;
}
이런식으로 피드백 제어를 해봤는데 모터가 구동이 안되네요 혹시 이유를 알 수 있을까요?
댓글 3
조회수 6,054우왕우오옹님의 댓글
우왕우오옹 작성일
dutyL_PWM = (unsigned int)(999.*L_PWM/100 + 0.5);
dutyR_PWM = (unsigned int)(999.*R_PWM/100 + 0.5);으로 수정해봣는데도 안되네요
master님의 댓글
master 작성일
c 언어 처음이신 것 같은데요
PI 제어코드를 작성하기 전에 쉬운 예제부터 차근차근 공부하셔야겠습니다.
우왕우오옹님의 댓글
우왕우오옹 작성일혹시 참조할만한 예제있을까요ㅜㅜ