BASIC4MCU | 모터 | 서보모터 | 3핀(GPIO 1 + 16비트 PWM 2)으로 서보모터 16개 구동
페이지 정보
작성자 키트 작성일2017-09-05 17:19 조회2,641회 댓글0건본문
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 //#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[2][8]={{1200,1800,2400,3000,3450,3900,4350,4800},{1200,1800,2400,3000,3450,3900,4350,4800}};volatile unsigned char n=0;//#ifdef CVAVRinterrupt [TIM1_COMPC] void timer1_compc_isr(void){#elseISR(TIMER1_COMPC_vect){#endifif(++n>7){ PORTA&=~1; n=0; PORTA|=1; }OCR1A=pwm[0][n]; OCR1B=pwm[1][n];}//#ifdef CVAVRvoid main(void){#elseint main(void){#endifint i;unsigned char k;PORTA=0x03; DDRA=0x01; DDRB=0x60;ICR1=4999; OCR1CH=4800>>8; OCR1CL=4800&0xFF; TCCR1A=0xA2; TCCR1B=0x1A; ETIMSK=1; // 20ms/8=2.5msADMUX=0x40; ADCSRA=0xE7;SREG=0x80;while(1){for(k=0;k<8;k++){ADMUX=0x40|k; delay_ms(1); i=ADCW;i=(int)((float)i*3600.0/1023.0)+1200; // 0~1023 => 1200~4800if(PINA&2)pwm[0][k]=i; else pwm[1][k]=i;}}}cs 앞의 예제와 비슷한데 달라진점은 OCR1B를 추가해서 16개의 서보모터를 구동합니다.
댓글 0
조회수 2,641등록된 댓글이 없습니다.