pulse 출력 프로그래밍 : 타이머 / 카운터 0 overflow interrupt를 이용한 주기 및 파형 발생으로 서보모터를 구동시킨다. lsignal 함수를 이용하여 오버플로우시 인터럽트를 발생하여 일정한 주기를 생성 SIGNAL(SIG_OVERFLOW0) //타이머/카운터0 오버플로우 인터럽트를 사용 { if(sv1_flag0){ // flag 에0 즉, low pulse 일시 if(sv1_low1000){ // 오버플로우가 100발생시 대략 20ms if(sec>49)// delay time sec=0; else sec++; sv1_flag=1;// high pulse 시작 부분 sv1_low=0; // 주기 다시 시작 Dout=Dout|0x08; // D port 3번 핀에 high 출력 } else sv1_low++; } else { sv1_high++;// 지정된 값보다 즉, range 보다 작을 때까지 출력 sv1_low++; if(sv1_high>sv1_range){ sv1_flag=0; sv1_high=0; Dout=Dout&~0x08;// D port 3번 핀에 low 펄스 출력 } } outp(0,TCNT0); }
이 방식을 사용하였을 때 모터는 지정된 범위로 작동하나 나중에 통신 부분과 결합을 시킨 결과 동작이 되지 않았다. 동작이 안 되는 이유를 살펴본 결과 통신부분의 인터럽트와 충돌을 일으킴을 알 수 있었다. 따라서 우리는 이 방법을 사용하지 않고 128의 출력포트에다 강제적으로 파형을 집어 넣는 방법을 택하기로 하였다. 직접적으로 출력포트에 파형 발생 : Delay 구문을 적용하여 서보모터에 출력을 주는 포트에 강제적으로 주기를 발생시켰다.
//출력 파형 발생 function(임의로 정의한)// void c100(void){ int m; for(m=1;m<=20;m++){// m은 서보가 원하는 각도에 자리잡을수 PORTB |= 0x02; // 있는 시간을 벌어주기 위해 주기를 돌림 Delay_us(250);// high 구간 Delay_us(250); Delay_us(250); Delay_us(152);
댓글 없음:
댓글 쓰기