int main(void)
{
// 포트 설정
DDRA = 0xFF;
DDRB = 0x10;
DDRG = 0x03;
DDRF = 0x01;
// 인터럽트 설정
EICRA = 0x29;
EICRB = 0x30;
EIMSK = 0x4F;
// 모터제어용 PWM 설정
TCCR0 = 0x00;
TCNT0 = 0;
TIMSK = 0x00;
//OCR0 = 200;
// 10MS 타이머 인터럽트 설정
TCCR2 = 0x0B;
TCNT2 = 0;
OCR2 = 156;
TIMSK |= 1<<OCIE2;
sei();
LCD_InitDriver();
while (1)
{
// RPM 값 출력
LCD_CMD(LINE1);
printf("RPM : %2d",RPM);
// PWM 값 출력
LCD_CMD(LINE2);
printf("OCR : %2d",OCR0);
//FRPM 값 출력
LCD_CMD(LINE3);
printf("FRPM : %2d",FRPM);
if (RPM>=FRPM)
OCR0 = 0;
if (RPM<FRPM)
OCR0 = FRPM/RPM*0.2;
}
}
ISR (TIMER2_COMP_vect ) {
// 10MS 인터럽트
static aa=0;
aa++;
if ( aa>=100) {
// 매 1초마다 실행 RPM 계산
RPM = counter*2;
counter = 0;
aa = 0;
}
}
On/Off제어는 할줄 알겠는데 ..
P제어를 할려고 하는데 ..
저기 빨간색으로 칠해져있는 부분을 어떻게 해야할지를 모르겠네요
아무리 해봐도 ㅠ안되네요 목표값에 가까울수록 속도가 늦춰지고 목표값에 멀어질수록 빨라지도록 할려고 하는데
고수님들 도와주세요 ㅠ
PWM으로 모터의 속도를제어 하려 하시는 건가요?
PWM의 원리는 이해를 하셨는지요?
모터에 걸리는 전압은 원래 고정전압이지만 PWM를 사용하게 되면 고정전압이 구형파형테의 짧은 펄스로 바뀌게 됩니다.
즉 펄스갑(PWM)의 반복적인 출력값의 양에 의해 속도를 제어하게 되는거지요
p제어라면
출력을 ( 입력-출력) 으로 하시면 피드백이 걸리는효과가 있지요...
여기서 입력이란 기준치에 해당하는 것을 의미합니다.
즉 ..출력 = 기준치(입력) - 현재출력; <-- 당연히 현제 출력에 출력이 기준치에 도달하면 P제어기는 작동은 되지 않게 되지요..
if (RPM>=FRPM) <--- 이런 것은 의미가 없는 루틴입니다.
이렇게 프로그램이 되어야 피드백이 걸리는 효과가 있지요.