모터 > RC서보 & DC모터 FAST PWM 모드14 구동

인기검색어 > 아두이노 센서 ATMEGA128

최신글 질문게시판 동영상강좌 가입하기

▼ BASIC4MCU 후원업체 신제품 정보 ▼

▲ BASIC4MCU 후원업체 신제품 정보 ▲

BASIC4MCU > 모터

서보모터 | 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

등록된 댓글이 없습니다.

게시물 검색

모터 목록

게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전