BASIC4MCU | 모터 | 서보모터 | RC서보 & DC모터 FAST PWM 모드14 구동
페이지 정보
작성자 키트 작성일2017-09-05 16:22 조회1,746회 댓글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);
}
}
//=====================================================================//
123456789101112131415161718192021222324252627282930313233343536 //=====================================================================////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 outTCCR1A=0x82; // FAST PWMTCCR1B=0x1A; // 8분주=0.5usecOCR1A=3000; // 1500usec=0도ICR1=39999; // 0.5usec*40000=20000usec=50Hzwhile(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,746등록된 댓글이 없습니다.