모터 > ATmega2560 - 85개의 서보모터 구동

TODAY204 TOTAL2,275,313
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 모터 | 서보모터 | ATmega2560 - 85개의 서보모터 구동

페이지 정보

작성자 키트 작성일2017-09-05 17:08 조회1,153회 댓글0건

본문

//

// pwm 배열 88(11byte*8bit)개 중에서 포트G가 5개라서 85개의 전체 포트에 PWM출력을 합니다.
// PORTA : 0~7
// PORTB : 8~15
// PORTC : 16~23
// PORTD : 24~31
// PORTE : 32~39
// PORTF : 40~47
// PORTG : 48~52 (53,54,55는 없슴)
// PORTH : 56~63
// PORTJ : 64~71
// PORTK : 72~79
// PORTL : 80~87
// 
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//--------------------------------------------------------
// CVAVR
//--------------------------------------------------------
#include <mega2560.h>
#include <delay.h>
//
#define U_C unsigned char
// 
U_C PWM[11][241]={0,}; //11*241=2651byte
U_C g_cnt=0,count=0;
// 
interrupt [TIM0_COMPA] void timer0_compa_isr(void){ //10usec 주기
    if(count<=240){ count++;
        switch(g_cnt){
            case  0: PORTA=PWM[ 0][count]; PORTB=PWM[ 1][count]; break
            case  1: PORTC=PWM[ 2][count]; PORTD=PWM[ 3][count]; break
            case  2: PORTE=PWM[ 4][count]; PORTF=PWM[ 5][count]; break
            case  3: PORTG=PWM[ 6][count]; break
            case  4: PORTH=PWM[ 7][count]; break
            case  5: PORTJ=PWM[ 8][count]; break
            case  6: PORTK=PWM[ 9][count]; break
            case  7: PORTL=PWM[10][count]; break
        } 
    }
    else if(count<250){
        switch(g_cnt){
            case  0: PORTA=0; PORTB=0break
            case  1: PORTC=0; PORTD=0break
            case  2: PORTE=0; PORTF=0break
            case  3: PORTG=0break
            case  4: PORTH=0break
            case  5: PORTJ=0break
            case  6: PORTK=0break
            case  7: PORTL=0break
        } 
        if(++count>=250){ count=0if(++g_cnt>7)g_cnt=0; }
    }
}
//
void servo(U_C no,U_C angle){ // no:0~87 // angle: 0~180
    char pos[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
    char neg[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
    U_C i,index,m;
    index=no/8; m=no%8;
    for(i=0;i<   60;i++)PWM[index][i   ]|=pos[m]; // 0    ~ 600us : high
    for(i=0;i<angle;i++)PWM[index][i+60]|=pos[m]; // 0    ~ angle : high
    for(   ;i<= 180;i++)PWM[index][i+60]&=neg[m]; // angle~180(2400us) : low
}
//
void main(void){
  U_C i, no;
  DDRA=0xFF; DDRB=0xFF; DDRC=0xFF; DDRD=0xFF; DDRE=0xFF; DDRF=0xFF; DDRG=0xFF; DDRH=0xFF; DDRJ=0xFF; DDRK=0xFF; DDRL=0xFF;
  TCCR0A=2; TCCR0B=2; OCR0A=19; TIMSK0=2// 16000000/8/(1+19),10us
  SREG=0x80;
  while(1){
      for(i=0;i<180;i++){ // 600usec~2400usec까지 1도 단위로 증가
          for(no=0;no<88;no++)servo(no,i); delay_ms(10); // 88개 PWM값 설정
      }
      for(i=180;i>0;i--){ // 600usec~2400usec까지 1도 단위로 증가
          for(no=0;no<88;no++)servo(no,i); delay_ms(10); // 88개 PWM값 설정
      }
  }
}
cs
cs
 

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//--------------------------------------------------------
// AVRStudio
//--------------------------------------------------------
#define F_CPU 16000000UL // 16 MHz
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//
#define U_C unsigned char
// 
volatile U_C PWM[11][241]; //11*241=2651byte
volatile U_C g_cnt=0,count=0;
// 
ISR(TIMER0_COMPA_vect){ //10usec 주기
    if(count<=240){ count++;
        switch(g_cnt){
            case  0: PORTA=PWM[ 0][count]; PORTB=PWM[ 1][count]; break
            case  1: PORTC=PWM[ 2][count]; PORTD=PWM[ 3][count]; break
            case  2: PORTE=PWM[ 4][count]; PORTF=PWM[ 5][count]; break
            case  3: PORTG=PWM[ 6][count]; break
            case  4: PORTH=PWM[ 7][count]; break
            case  5: PORTJ=PWM[ 8][count]; break
            case  6: PORTK=PWM[ 9][count]; break
            case  7: PORTL=PWM[10][count]; break
        } 
    }
    else if(count<250){
        switch(g_cnt){
            case  0: PORTA=0; PORTB=0break
            case  

댓글 0

조회수 1,153

등록된 댓글이 없습니다.

모터HOME > 모터 > 서보모터 목록

게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기