BASIC4MCU | 모터 | 서보모터 | 8핀(GPIO3 + 16비트 PWM 5)으로 서보모터 40개 구동
페이지 정보
작성자 키트 작성일2017-09-05 17:18 조회2,477회 댓글0건본문
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 //#define CVAVR // 코드비젼 사용자는 제일 앞에 막은 것을 삭제하면 됩니다.//#ifdef CVAVR#include <mega128.h>#include <delay.h>#else#define F_CPU 16000000UL // 16 MHz#define delay_ms(x) _delay_ms(x)#include <avr/io.h> //16MHz#include <util/delay.h>#include <avr/interrupt.h>#endif//volatile unsigned int pwm[8][5]={{3600,2500,2500,2500,2500},{2500,2500,2500,2500,2500},{2500,2500,2500,2500,2500},{2500,2500,2500,2500,2500},{2500,2500,2500,2500,2500},{2500,2500,2500,2500,2500},{2500,2500,2500,2500,2500},{2500,2500,2500,2500,2500}};volatile unsigned char n=0;//#ifdef CVAVRinterrupt [TIM3_COMPC] void timer3_compc_isr(void){#elseISR(TIMER3_COMPC_vect){#endifPORTA=n;OCR1A=pwm[n][0]; OCR1B=pwm[n][1];OCR1CH=pwm[n][2]>>8; OCR1CL=pwm[n][2]&0xFF;OCR3AH=pwm[n][3]>>8; OCR3AL=pwm[n][3]&0xFF;OCR3BH=pwm[n][4]>>8; OCR3BL=pwm[n][4]&0xFF;if(++n>7)n=0;}//#ifdef CVAVRvoid main(void){#elseint main(void){#endifint i;unsigned char k;DDRA=0x07; DDRB=0xE0; DDRE=0x18;ICR1=4999; ICR3H=4999>>8; ICR3L=4999&0xFF; // 20ms/8=2.5msOCR3CH=4800>>8; OCR3CL=4800&0xFF;TCCR1A=0xAA; TCCR3A=0xA2;TCCR1B=0x1A; TCCR3B=0x1A;ADMUX=0x40; ADCSRA=0xE7;ETIMSK=2; SREG=0x80;while(1){for(k=0;k<8;k++){ADMUX=0x40|k; delay_ms(1); i=ADCW;pwm[k][0]=(int)((float)i*3600.0/1023.0)+1200; // 0~1023 => 1200~4800}}}cs OCR3C 인터럽트는 PWM 값을 갱신 하는데 사용합니다.AVR 리셋 기간 동안에 엉뚱한 출력이 나가지 않도록 회로를 보완한다면AVR 5개의 PWM출력핀에 10K 풀업저항을 달아주면 되겠습니다.
댓글 0
조회수 2,477등록된 댓글이 없습니다.