BASIC4MCU | 모터 | 서보모터 | 타이머 인터럽트를 이용한 제어 - 서보모터 8축
페이지 정보
작성자 키트 작성일2017-09-05 16:23 조회1,338회 댓글0건첨부파일
본문
1234567891011121314151617181920212223242526272829303132333435363738394041 /20usec 주기 인터럽트#include <mega128.h>#include <delay.h>//#define Servo1 PORTA.0#define Servo2 PORTA.1#define Servo3 PORTA.2#define Servo4 PORTA.3#define Servo5 PORTA.4#define Servo6 PORTA.5#define Servo7 PORTA.6#define Servo8 PORTA.7//unsigned char PWM[8]={30};int count=0;//interrupt [TIM1_COMPA] void timer1_compa_isr(void){if(count<PWM[0])Servo1=1; else Servo1=0;if(count<PWM[1])Servo2=1; else Servo2=0;if(count<PWM[2])Servo3=1; else Servo3=0;if(count<PWM[3])Servo4=1; else Servo4=0;if(count<PWM[4])Servo5=1; else Servo5=0;if(count<PWM[5])Servo6=1; else Servo6=0;if(count<PWM[6])Servo7=1; else Servo7=0;if(count<PWM[7])Servo8=1; else Servo8=0;if(++count>=1000)count=0; //20ms}//void main(void){unsigned char i,k;DDRA=0xFF;OCR1A=39; TCCR1B=0x0A; TIMSK=0x10; //16000000/8/(1+39)=50000Hz=20usecdelay_ms(1000);SREG=0x80;while(1){for(i=30;i<=120;i++){ // 600usec~2400usec까지 2도 단위로 증가for(k=0;k<8;k++)PWM[k]=i; // 8개 PWM값 설정delay_ms(20); // 서보 이동 시간을 위한 딜레이}}}cs
//==========================================================================
123456789101112131415161718192021222324252627282930313233343536373839404142 //10usec 주기 인터럽트#include <mega128.h>#include <delay.h>//#define Servo1 PORTA.0#define Servo2 PORTA.1#define Servo3 PORTA.2#define Servo4 PORTA.3#define Servo5 PORTA.4#define Servo6 PORTA.5#define Servo7 PORTA.6#define Servo8 PORTA.7//unsigned char PWM[8]={60};int count=0;//interrupt [TIM1_COMPA] void timer1_compa_isr(void){if(count<PWM[0])Servo1=1; else Servo1=0;if(count<PWM[1])Servo2=1; else Servo2=0;if(count<PWM[2])Servo3=1; else Servo3=0;if(count<PWM[3])Servo4=1; else Servo4=0;if(count<PWM[4])Servo5=1; else Servo5=0;if(count<PWM[5])Servo6=1; else Servo6=0;if(count<PWM[6])Servo7=1; else Servo7=0;if(count<PWM[7])Servo8=1; else Servo8=0;if(++count>=2000)count=0; //20ms}//void main(void){unsigned char i,k;DDRA=0xFF;OCR1A=19; TCCR1B=0x0A; TIMSK=0x10; //16000000/8/(1+19)=100000Hz=10usecdelay_ms(1000);SREG=0x80;while(1){for(i=60;i<=240;i++){ // 600usec~2400usec까지 2도 단위로 증가for(k=0;k<8;k++)PWM[k]=i; // 8개 PWM값 설정delay_ms(20); // 서보 이동 시간을 위한 딜레이}}}cs
//==========================================================================
123456789101112131415161718192021222324252627282930313233343536373839 //10usec 주기 인터럽트#include <mega128.h>#include <delay.h>//#define Servo1 PORTA.0#define Servo2 PORTA.1#define Servo3 PORTA.2#define Servo4 PORTA.3#define Servo5 PORTA.4#define Servo6 PORTA.5#define Servo7 PORTA.6#define Servo8 PORTA.7//unsigned char PWM[8]={60};int count=0;//interrupt [TIM1_COMPA] void timer1_compa_isr(void){if(count<PWM[0])Servo1=1; else Servo1=0;if(count<PWM[1])Servo2=1; else Servo2=0;if(count<PWM[2])Servo3=1; else Servo3=0;if(count<PWM[3])Servo4=1; else Servo4=0;if(count<PWM[4])Servo5=1; else Servo5=0;if(count<PWM[5])Servo6=1; else Servo6=0;if(count<PWM[6])Servo7=1; else Servo7=0;if(count<PWM[7])Servo8=1; else Servo8=0;if(++count>=2000)count=0; //20ms}//void main(void){signed char i,k; // <=== 부호타입 변수 사용DDRA=0xFF;OCR1A=19; TCCR1B=0x0A; TIMSK=0x10;#asm("sei")SREG=0x80;while(1){for(i=-90;i<=90;i++){ for(k=0;k<8;k++)PWM[k]=150+i; delay_ms(20); }for(i=90;i>=-90;i--){ for(k=0;k<8;k++)PWM[k]=150+i; delay_ms(20); }}}cs
댓글 0
조회수 1,338등록된 댓글이 없습니다.