#include<avr/io.h> #include<avr/interrupt.h> unsigned int angle1,angle2,angle3,angle4,angle5,angle6,angle7,angle8; unsigned int int_count,int_count1; SIGNAL(TIMER0_OVF_vect) { int_count++; if(int_count++>=250){ //이값도 대충사용 컴파일을 위해서 실제 0.1us만들어야함 PORTB=0xFF; int_count=0; int_count1++; } if(int_count1>=angle1) PORTB = PORTB&0xFE; if(int_count1>=angle2) PORTB = PORTB&0xFD; if(int_count1>=angle3) PORTB = PORTB&0xFB; if(int_count1>=angle4) PORTB = PORTB&0xF7; if(int_count1>=angle5) PORTB = PORTB&0xEF; if(int_count1>=angle6) PORTB = PORTB&0xDF; if(int_count1>=angle7) PORTB = PORTB&0xBF; if(int_count1>=angle8) PORTB = PORTB&0x7F; } void survo(int moter,int count) { switch(moter){ case 1: angle1=count; break; case 2: angle2=count; break; case 3: angle3=count; break; case 4: angle4=count; break; case 5: angle5=count; break; case 6: angle6=count; break; case 7: angle7=count; break; case 8: angle8=count; default : break; } } int main(void) { DDRB=0xFF; TCNT0=256-250; //0.7~2.3ms만들어야하지만 계산법을몰라 대출적었음 TCCR0=0x04; //프리스케일 256 이것도 대충넣어났음 TIMSK=0x01; //오버플로워 사용 sei(); while(1){ survo(1,7); survo(2,7); survo(3,7); survo(4,7); survo(5,7); survo(6,7); survo(7,7); //delay() } }
//결론 음~~ 0.1ms를만들어야하는데 계산법을 잘몰라 헤매는중입니다
서보 8개를사용 할라고 하는데 패스트pwm사용할려니 pwm이 나오는 핀이 한정 되어 있어
위에 보시는 바와같이 프로그램 짜봤는데요
저게 먹히 겠습니까?시간 주기를 아지 미흡하여 값은 맘대로 주었습니다
타이머 설정하는 부분은 아래글을 참조하세요.
http://www.micombox.com/?mid=avr_qna&page=1&document_srl=37289
시간 주기가 정확해야 서보가 원하는 방향으로 움직이겠지요?^^;
int_count, int_count1 두개를 사용하시네요.. 0.1us가 아니라 0.1ms를 만든다면 변수만 카운트하면 됩니다.
굳이 0.1us 해상도로 하실 필요가 있으신가요??
건투를 빕니다. 제가 avr로 서보모터 제어하는 프로그램도 avr자료실에 있으니 참고하시고요..
완벽하게 제어하면 자료정리해서 올리겠습니당 그럼 화이링 !!!