서보모터 | RC서보 & DC모터 FAST PWM 모드14 구동
페이지 정보
작성자 키트 작성일17-09-05 16:22 조회1,651회 댓글0건본문
//=====================================================================//
//RC서보 - 타이머1 FAST PWM MODE14로 구동
//DC모터 - 타이머3 FAST PWM MODE14로 구동
//=====================================================================//
//전체 주기 20000usec중애서 아래 시간 만큼 high를 주면 해당 각도로 이동
// 600usec=-90도 포지션
//1500usec= 0도 포지션
//2400usec=+90도 포지션
//=====================================================================//
// 코드비젼 컴파일러
//=====================================================================//
// 코드 최적화 금지
#pragma opt-
//=====================================================================//
#include <mega128.h> //16MHz
#include <delay.h>
//=====================================================================//
void RC_Motor(int angle){ // angle : -90도 ~ +90도
int i;
if(angle<-90)angle=-90;
if(angle> 90)angle= 90;
i=(angle)*18 + 3000;
OCR1A=i; //PB5
OCR1B=i; //PB6
}
void DC_Motor(int speed){ // speed : 0% ~ 100%
if(speed>100)speed=100;
OCR3AH=0; OCR3AL=speed; //쓰기는 H먼저 L나중, 읽기는 L먼저 H나중
OCR3BH=0; OCR3BL=speed;
}
//=====================================================================//
void main(void){
//RC서보모터
DDRB=0x60; // PB5,6 out
TCCR1A=0xAA; // FAST PWM
TCCR1B=0x1A; // 8분주=0.5usec
OCR1A=3000; // 1500usec=0도
OCR1B=3000; // 1500usec=0도
ICR1=39999; // 0.5usec*40000=20000usec=50Hz
//DC모터
DDRE=0x18; // PE3,4 out
TCCR3A=0xAA; // FAST PWM
TCCR3B=0x1A;
OCR3AH=0; OCR3AL=0; // 정지
OCR3BH=0; OCR3BL=0; // 정지
ICR3L=100; // 0.5usec*100=50usec=20KHz
//
while(1){
RC_Motor(-90); DC_Motor( 50); delay_ms(1000);
RC_Motor( 0); DC_Motor(100); delay_ms(1000);
RC_Motor( 90); DC_Motor( 50); delay_ms(1000);
RC_Motor( 0); DC_Motor( 0); delay_ms(1000);
}
}
//=====================================================================//
간단한 함수 설명
void RC_Motor(int angle){ // angle : -90도 ~ +90도
int i;
if(angle<-90)angle=-90;
if(angle> 90)angle= 90;
i=(angle)*18 + 3000;
OCR1A=i; //PB5
OCR1B=i; //PB6
}
서보모터는 1500us가 센터포지션이고
600us~2400us로 +-90도를 움직이지만
일부 서보모터는 양 끝에서 걸릴 수 있어서
조금 덜 움직이도록 소스를 수정 했습니다.
타이머1의 클럭이 8분주된 0.5us이므로
i=(angle)*18 + 3000;
angle이 0도 일 때 3000이면 1500us가 됩니다.
i=(angle)*18 + 3000;
처음에는 18이 아니고 20이었지만
20일 때에 90도면 1800이되고 900us 입니다.
1500us에서 900us를 빼거나 더하면 600us~2400us가 됩니다.
위에서 언급했지만 양 끝에서 부딪히는 모터가 있어서 20을 18로 고쳐서 이동 각도를 조금 줄인 것입니다.
//=====================================================================//
//RC서보 - 타이머1 FAST PWM MODE14로 구동
//DC모터 - 타이머3 FAST PWM MODE14로 구동
//=====================================================================//
//전체 주기 20000usec중애서 아래 시간 만큼 high를 주면 해당 각도로 이동
// 600usec=-90도 포지션
//1500usec= 0도 포지션
//2400usec=+90도 포지션
//=====================================================================//
// AVRstudio
//=====================================================================//
#include <avr/io.h> //16MHz
#define F_CPU 16000000UL // 16 MHz
#include <util/delay.h>
//=====================================================================//
void RC_Motor(int angle){ // angle : -90도 ~ +90도
int i;
if(angle<-90)angle=-90;
if(angle> 90)angle= 90;
i=(angle)*18 + 3000;
OCR1A=i; //PB5
OCR1B=i; //PB6
}
void DC_Motor(int speed){ // speed : 0% ~ 100%
if(speed>100)speed=100;
OCR3AH=0; OCR3AL=speed; //쓰기는 H먼저 L나중, 읽기는 L먼저 H나중
OCR3BH=0; OCR3BL=speed;
}
//=====================================================================//
int main(void){
//RC서보모터
DDRB=0x60; // PB5,6 out
TCCR1A=0xAA; // FAST PWM
TCCR1B=0x1A; // 8분주=0.5usec
OCR1A=3000; // 1500usec=0도
OCR1B=3000; // 1500usec=0도
ICR1=39999; // 0.5usec*40000=20000usec=50Hz
//DC모터
DDRE=0x18; // PE3,4 out
TCCR3A=0xAA; // FAST PWM
TCCR3B=0x1A;
OCR3AH=0; OCR3AL=0; // 정지
OCR3BH=0; OCR3BL=0; // 정지
ICR3L=100; // 0.5usec*100=50usec=20KHz
//
while(1){
RC_Motor(-90); DC_Motor( 50); _delay_ms(1000);
RC_Motor( 0); DC_Motor(100); _delay_ms(1000);
RC_Motor( 90); DC_Motor( 50); _delay_ms(1000);
RC_Motor( 0); DC_Motor( 0); _delay_ms(1000);
}
}
//=====================================================================//
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | //=====================================================================// //RC서보 - 타이머1 FAST PWM MODE14로 구동 //=====================================================================// //전체 주기 20000usec중애서 아래 시간 만큼 high를 주면 해당 각도로 이동 // 600usec=-90도 포지션 //1500usec= 0도 포지션 //2400usec=+90도 포지션 //=====================================================================// // AVRstudio //=====================================================================// #include <avr/io.h> //16MHz #define F_CPU 16000000UL // 16 MHz #include <util/delay.h> // void RC_Motor(int angle){ // angle : -90도 ~ +90도 int i; if(angle<-90)angle=-90; if(angle> 90)angle= 90; i=(angle)*18 + 3000; OCR1A=i; //PB5 } // int main(void){ //RC서보모터 DDRB=0x20; // PB5 out TCCR1A=0x82; // FAST PWM TCCR1B=0x1A; // 8분주=0.5usec OCR1A=3000; // 1500usec=0도 ICR1=39999; // 0.5usec*40000=20000usec=50Hz while(1){ RC_Motor(-90); _delay_ms(1000); RC_Motor( 0); _delay_ms(1000); RC_Motor( 90); _delay_ms(1000); RC_Motor( 0); _delay_ms(1000); } } | cs |
댓글 : 0
조회수 : 1,651
등록된 댓글이 없습니다.