BASIC4MCU | 질문게시판 | 답변 : atmega128 조도센서를 이용하여 서보모터와 dc모터 제어하는거 봐주실수있나요ㅠㅠ
페이지 정보
작성자 master 작성일2022-06-02 15:32 조회2,595회 댓글4건본문
#include <mega128.h>
#include <delay.h>
//
#define ADC_VREF_TYPE 0x20
//
#define START PINA1
#define END PINA2
#define SERVO_SW PINA3
#define SERVO_BW PINA4
#define DC_FW PINA5
#define DC_BW PINA6
#define AUTO_SW PINA7
//
unsinged char read_adc(unsigned char adc_input){
ADMUX=adc_input(ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA=0x40:
while((ADCSRA&0x10)==0);
ADCSRA=0x10;
return ADCH;
}
//
void dc_forward(void) { OCR3A=1000; PORTD6=0; PORTD7=1; }
void dc_backward(void){ OCR3A=1000; PORTD6=1; PORTD7=0; }
void dc_stop(void) { OCR3A=0; }
//
void servo_fw(void){ if(OCR1A<12)OCR1A=OCR1A+1; }
void servo_bw(void){ if(OCR1A> 5)OCR1A=OCR1A-1; }
//
void servo_90(void){ OCR1A=12; }
void servo_70(void){ OCR1A=10; }
void servo_50(void){ OCR1A= 9; }
void servo_25(void){ OCR1A= 7; }
void servo_0(void) { OCR1A= 5; }
//
void main(void){
unsigned char adc_value=0; float temp=0;
DDRD=0xFF;
TCCR1A=0xA1; TCCR1B=0x03; OCR1A=5;
ACSR=0x80; SFIOR=0x04;
ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x83;
SFIOR&=0xEF;
delay_ms(1000);
while(1){
if(START==0&&END==1){
if (DC_FW==0&&DC_BW==1)dc_forward();
else if(DC_FW==1&&DC_BW==0)dc_stop();
else dc_stop();
}
else if(START==1&&END==1){
if (DC_FW==0&&DC_BW==1)dc_forward();
else if(DC_FW==1&&DC_BW==0)dc_backward();
else dc_stop();
}
else if(START==1&&END==0){
if (DC_FW==0&&DC_BW==1)dc_stop();
else if(DC_FW==1&&DC_BW==0)dc_backward();
else dc_stop();
//
if(AUTO_SW==0){
if (SERVO_FW==0&&SERVO_BW==1)servo_fw();
else if(SERVO_FW==1&&SERVO_BW==0)servo_bw();
delay_ms(100);
}
else{
delay_ms(500);
adc_value=read_adc(0);
temp=adc_value*0.004887;
//
if (temp<=1)servo_90();
else if(temp<=2)servo_70();
else if(temp<=3)servo_50();
else if(temp<=4)servo_25();
else servo_0();
//
delay_ms(500);
}
}
}
}
ADCSRA=0x40:
while((ADCSRA&0x10)==0);
ADCSRA=0x10;
비트6을 1로 만들고, 비트4를 만드는 것은 좋지만다른 비트를 모두 0으로 만들기 때문에와일문에 갇히거나, 용케 빠져나온다고 해도 제대로 된 값을 얻어오지 못하기 때문에제대로 코드가 실행되지 못합니다.//OCR1A, OCR3A 를 사용해서 PWM 출력을 하려면OC1A, OC3A 핀을 출력으로 설정해야 하는데 DDRx 핀 설정이 안보입니다.//RC서보 & DC모터 FAST PWM 모드14 구동
DC모터와 서보모터는 위 예제를 참고해서 공부하시고ADC는 프리런닝 모드를 공부해서 만들어보세요
댓글 4
조회수 2,595화니뿌뿌님의 댓글
화니뿌뿌 작성일dc모터와 서보모터가 동시에 안돌아가고 스위치로 제어가 안되는데 혹시 코딩에 무슨 문제 인지 알수있을까요ㅜㅜ 실습하는 학생이라 코딩을 볼지 몰라요ㅜㅜ
master님의 댓글
master
if~ else if~로 서보모터만 돌아라 DC모터만 돌아라~ 식으로 작성되어 있습니다.
초보 문법이므로 초보자도 볼 수 있어야 합니다.
화니뿌뿌님의 댓글
화니뿌뿌 작성일어디를 어떻게 고쳐야할까요,? 스위치가 제어될려면 출력부분을 넣으면 될ㄲ아요?
master님의 댓글
master
초보자가 작성한 코드는 이해하기 어렵습니다.
뭘 하려고 작성한 것인지 감조차 안오기 때문이죠
이해를 할 수 있도록 코드에 주석을 잘 작성 해보세요