BASIC4MCU | 질문게시판 | 답변 2: 아트메가 서보모터 구동 질문
페이지 정보
작성자 master 작성일2018-09-02 10:49 조회6,313회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=2886
본문
//#define F_CPU 16000000UL // 16 MHz#include <avr/io.h>#include <avr/interrupt.h>#include <util/delay.h>#include <stdio.h>//#define BV(bit) (1<<(bit))/*bit processing*/#define cbi(reg,bit) reg&=~(BV(bit))#define sbi(reg,bit) reg|=(BV(bit))#define MOTOR_ON sbi(PORTG,0)#define MOTOR_OFF cbi(PORTG,0)//volatile unsigned int value,wg,wg2,H,M,L,HC,MC,LC;volatile unsigned char j=0,count,i,step,en,str[21];//volatile unsigned char lcd_flag=0;//------------------------------------------------------------------------------void LCD_cmd(char c) { PORTC=1; PORTA=c; PORTC=0; _delay_us(1); PORTC=1; _delay_us(50); }void LCD_data(char d){ PORTC=3; PORTA=d; PORTC=2; _delay_us(1); PORTC=3; _delay_us(50); }void LCD_str(char c,char *s){ LCD_cmd(c); while(*s)LCD_data(*s++); }//------------------------------------------------------------------------------void LCD_initialize(void){_delay_ms(50);PORTC=0x03; PORTC=0x02; _delay_ms(2); // E=1,Rs=1(dummy write)// E=0,Rs=1LCD_cmd(0x38); // function set(8 bit,2 line,5x7 dot)LCD_cmd(0x0C); // display control(display ON,cursor OFF)LCD_cmd(0x06); // entry mode set(increment,not shift)LCD_cmd(0x01); // clear display_delay_ms(2);}//------------------------------------------------------------------------------#define SV1_1 PORTB|=1#define SV1_0 PORTB&=~1void rc1_f(void){ for(i=0;i<50;i++){ SV1_1; _delay_us( 700); SV1_0; _delay_us(19300); } }void rc1_b(void){ for(i=0;i<50;i++){ SV1_1; _delay_us(2300); SV1_0; _delay_us(17700); } }//------------------------------------------------------------------------------#define SV2_1 PORTB|=0x20#define SV2_0 PORTB&=~0x20void rc2_f(void){ for(i=0;i<50;i++){ SV2_1; _delay_us( 700); SV2_0; _delay_us(19300); } }void rc2_b(void){ for(i=0;i<50;i++){ SV2_1; _delay_us(2300); SV2_0; _delay_us(17700); } }//------------------------------------------------------------------------------#define SV3_1 PORTB|=0x40#define SV3_0 PORTB&=~0x40void rc3_f(void){ for(i=0;i<50;i++){ SV3_1; _delay_us( 700); SV3_0; _delay_us(19300); } }void rc3_b(void){ for(i=0;i<50;i++){ SV3_1; _delay_us(2300); SV3_0; _delay_us(17700); } }//------------------------------------------------------------------------------#define SV4_1 PORTB|=0x80#define SV4_0 PORTB&=~0x80void rc4_f(void){ for(i=0;i<50;i++){ SV4_1; _delay_us( 700); SV4_0; _delay_us(19300); } }void rc4_b(void){ for(i=0;i<50;i++){ SV4_1; _delay_us(2300); SV4_0; _delay_us(17700); } }//------------------------------------------------------------------------------/*ISR(INT0_vect){}*///---------------------------------------수신-------------------------------------------// W 2 . 2//57 32 2E 32 0D 0AISR(USART1_RX_vect){ // 수신인터럽트 함수static char r,k=0,cmd_f=0;static int tpW=0;r=UDR1;if(r=='W'){ tpW=0; cmd_f=0; } // 0x57 헤더?else if(r==0x2E){ cmd_f=1; } // 0x2E '.'else if(r==0x0D){}else if(r==0x0A){ // 종료문자wg=tpW;lcd_flag=1;tpW=0; cmd_f=0;}else{if(cmd_f==0){ tpW*=10; tpW+=r&0x0F; }}}//------------------------------------------------------------------------------int main(void){MCUCR=0x00; // enable external memory and I/OXMCRA=0x44; // 0x1100-0x7FFF=1 wait,0x8000-0xFFFF=0 waitXMCRB=0x80; // enable bus keeper,use PC0-PC7 as address//DDRA=0xFF;PORTB=0xFF; DDRB=0xFF;DDRC=0xFF; // PC7-PC4=outputDDRE=0x80; // PE5-PE0=output,PE7-PE6=inputPORTG=0x02; DDRG=0xff; // PORTG=output//-----통신 설정--------------------------------------------------------UBRR1L=103; UCSR1B=0x98; // 9600 baud // 수신 완료 인터럽트 허용//--------PWM 설정 타이머 0를 사용---------------좌우 스피드TCCR0=0x61; OCR0=180;//------------------------------------------------LCD_initialize();//------기준 무게 설정---------------------------H=150; M=100; L=50;sprintf(str,"H=%4d M=%4d ",H,M); LCD_str(0x80,str);sprintf(str,"L=%4d ",L); LCD_str(0xC0,str);rc1_b(); rc2_b(); rc3_b(); rc4_b();_delay_ms(3000);//HC=0; MC=0; LC=0;sprintf(str,"H=%3d M=%3d L=%2d",HC,MC,LC); LCD_str(0x80,str);sprintf(str,"weight= 0g ",L); LCD_str(0xC0,str);wg=0; step=0;sei();while(1){//--- 중량 수신 ------------------------------if(lcd_flag){ lcd_flag=0; sprintf(str,"weight= %4d g",wg); LCD_str(0xC0,str); }//---------------------------------if(step==0){ // 무게 감지 단계if(wg>10){ // 10그람 이상되어야 함if(++count>30){if (wg<= 50){ step=1; } // L 이송단계로 이동else if(wg<=100){ step=2; } // M 이송단계로 이동//else if(wg<=150){ step=3; } // H 이송단계로 이동else { step=3; } // H 이송단계로 이동rc1_f(); _delay_ms(1000); rc1_b();MOTOR_ON;}}else{ count=0; }}//---------------------------------if(step==1){ // L 이송단계if(!(PIND&0x10)){ step=0;MOTOR_OFF; _delay_ms(1000); rc2_f(); _delay_ms(1000); rc2_b();LC++; sprintf(str,"H=%3d M=%3d L=%2d",HC,MC,LC); LCD_str(0x80,str);}}//---------------------------------if(step==2){ // M 이송단계if(!(PIND&0x20)){ step=0;MOTOR_OFF; _delay_ms(1000); rc3_f(); _delay_ms(1000); rc3_b();MC++; sprintf(str,"H=%3d M=%3d L=%2d",HC,MC,LC); LCD_str(0x80,str);}}//---------------------------------if(step==3){ // H 이송단계if(!(PIND&0x40)){ step=0;MOTOR_OFF; _delay_ms(1000); rc4_f(); _delay_ms(1000); rc4_b();HC++; sprintf(str,"H=%3d M=%3d L=%2d",HC,MC,LC); LCD_str(0x80,str);}}//-------------------------------------if(!(PIND&0x01)){ MOTOR_OFF; while(1); }//-------------------------------------_delay_ms(100);}}
타이머1과 타이머3을 사용하고 있지 않는데요
타이머1과 타이머3의 PWM을 사용해서 RC 서보모터를 구동하면 편합니다.
댓글 0
조회수 6,313등록된 댓글이 없습니다.