모터 > 타이머 인터럽트를 이용한 제어 - 서보모터 8축 (AVRstudio)

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

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


BASIC4MCU | 모터 | 서보모터 | 타이머 인터럽트를 이용한 제어 - 서보모터 8축 (AVRstudio)

페이지 정보

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

본문

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
//20usec 주기 인터럽트
#define F_CPU 16000000UL // 16 MHz
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
// 
#define Servo1_1  PORTA|=0x01
#define Servo1_0  PORTA&=~0x01
#define Servo2_1  PORTA|=0x02
#define Servo2_0  PORTA&=~0x02
#define Servo3_1  PORTA|=0x04
#define Servo3_0  PORTA&=~0x04
#define Servo4_1  PORTA|=0x08
#define Servo4_0  PORTA&=~0x08
#define Servo5_1  PORTA|=0x10
#define Servo5_0  PORTA&=~0x10
#define Servo6_1  PORTA|=0x20
#define Servo6_0  PORTA&=~0x20
#define Servo7_1  PORTA|=0x40
#define Servo7_0  PORTA&=~0x40
#define Servo8_1  PORTA|=0x80
#define Servo8_0  PORTA&=~0x80
// 
volatile unsigned char PWM[8]={30};
volatile int count=0;
// 
ISR(TIMER1_COMPA_vect){
  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
}
//
int main(void){
  unsigned char i,k;
  DDRA=0xFF;
  OCR1A=39; TCCR1B=0x0A; TIMSK=0x10;  //16000000/8/(1+39)=50000Hz=20usec
  _delay_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


//==========================================================================

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
//10usec 주기 인터럽트
#define F_CPU 16000000UL // 16 MHz
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
// 
#define Servo1_1  PORTA|=0x01
#define Servo1_0  PORTA&=~0x01
#define Servo2_1  PORTA|=0x02
#define Servo2_0  PORTA&=~0x02
#define Servo3_1  PORTA|=0x04
#define Servo3_0  PORTA&=~0x04
#define Servo4_1  PORTA|=0x08
#define Servo4_0  PORTA&=~0x08
#define Servo5_1  PORTA|=0x10
#define Servo5_0  PORTA&=~0x10
#define Servo6_1  PORTA|=0x20
#define Servo6_0  PORTA&=~0x20
#define Servo7_1  PORTA|=0x40
#define Servo7_0  PORTA&=~0x40
#define Servo8_1  PORTA|=0x80
#define Servo8_0  PORTA&=~0x80
//
volatile unsigned char PWM[8]={60};
volatile int count=0;
//
ISR(TIMER1_COMPA_vect){
  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
}
//
int main(void){
  unsigned char i,k;
  DDRA=0xFF;
  OCR1A=19; TCCR1B=0x0A; TIMSK=0x10;  //16000000/8/(1+19)=100000Hz=10usec
  _delay_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
//==========================================================================

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
//10usec 주기 인터럽트
#define F_CPU 16000000UL // 16 MHz
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//
#define Servo1_1  PORTA|=0x01
#define Servo1_0  PORTA&=~0x01
#define Servo2_1  PORTA|=0x02
#define Servo2_0  PORTA&=~0x02
#define Servo3_1  PORTA|=0x04
#define Servo3_0  PORTA&=~0x04
#define Servo4_1  PORTA|=0x08
#define Servo4_0  PORTA&=~0x08
#define Servo5_1  PORTA|=0x10
#define Servo5_0  PORTA&=~0x10
#define Servo6_1  PORTA|=0x20
#define Servo6_0  PORTA&=~0x20
#define Servo7_1  PORTA|=0x40
#define Servo7_0  PORTA&=~0x40
#define Servo8_1  PORTA|=0x80
#define Servo8_0  PORTA&=~0x80
//
volatile unsigned char PWM[8]={60};
volatile int count=0;
//
ISR(TIMER1_COMPA_vect){ 
  if

댓글 0

조회수 1,391

등록된 댓글이 없습니다.

모터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
모바일버전으로보기