BASIC4MCU | 질문게시판 | 센서로 서보모터 컨트롤
페이지 정보
작성자 Winavr 작성일2018-12-05 12:16 조회8,093회 댓글3건첨부파일
본문
#include <avr/io.h>
#include <avr/interrupt.h>
//
void RC_Motor(int angle){
OCR1A=angle*18+3000; //PB5
}
//
ISR(TIMER0_COMP_vect){
static char mode1=0,mode2=0; static int count1=0,count2=0; float f,S;
if(ADMUX==0x41){
f=ADCW; f=f*5.001/1024.0; ADMUX=0x42; // 전압으로 변환
if(mode1==0){ // 물이 찰 때까지 펌프 구동
if(f<1.00){ PORTE=0x04; } // 펌프 정회전 시켜서 물을 채움
else { PORTE=0x00; mode1=1; count1=1500; } // 물이 차면 모터 정지,mode=1,3초 설정
}
else if(mode1==1){ // count1 감소하면서 대기
if(count1){
if(--count1==0)mode1=2;
}
}
else if(mode1==2){ // 물이 빠질 때까지 대기
if(f>=0.5){ PORTE=0x10; } // 펌프 역회전 시켜서 물을 뺌
else { PORTE=0x00; mode1=3; count1=1500; } // 물이 빠지면 모터 정지,mode=3,3초 설정
}
else{ // mode1=3 // count1 감소하면서 대기
if(count1){
if(--count1==0)mode1=0; // 다시 처음으로
}
}
}
else{ // (ADMUX==0x42)
S=ADCW; S=S*5.001/1024.0; ADMUX=0x41;
if(mode2==0){
if(S>1.00){ RC_Motor(30); } //감지가 안되면 5V가 출력이 되므로 서보모터 작동
else { RC_Motor(0); count2=3000; mode2=1; } //감지가 되면 서보모터 동작 중지 및 3초 대기
}
if(mode2==1){
if(count2){
if(--count2==0)mode2=0;
}
}
}
}
//
int main(void){
DDRE=0xFF;
DDRB=0x20; // PB5 out
TCCR1A=0x82; TCCR1B=0x1A; OCR1A=2999; ICR1=39999;
TCCR0=0x0D; OCR0=124; TIMSK=2;
ADMUX=0x41; ADCSRA=0xE7;
sei();
while(1);
}
센서는 감지가 안되면 5V가 나옵니다. 그리고 감지가 되면 바로 0.2V정도로 낮아집니다.
ADC핀 역시 센서를 F2번에, 모터를 B5번에 연결하였습니다...
첨부파일에 부친 코드를 그대로 실행하면 작동이 90~-90으로만 계속 돌아갑니다.
그래서 그대로 적용시켜서 RC_Motor(각도) 의 값에서 각도를 조절하거나
OCR1A, ICR!을 바꿔도 아예 멈추거나 그냥 반대로 돌아가기만 합니다....
서보모터인데 왜 DC모터 마냥 돌아가는지....
댓글 3
조회수 8,093master님의 댓글
master 작성일
서보모터 모양의 DC모터도 있습니다.(일반 DC모터처럼 2선 이므로 이 모터는 아닐테고)
//
바퀴형 서보모터는 0도(1500us)에서 멈추고,
+쪽으로 일정각도 이상이면 +로 무한회전
-쪽으로 일정각도 이상이면 -로 무한회전 합니다.
모터 모델명으로 검색해서 바퀴형 서보모터인지 체크하세요
Winavr님의 댓글
Winavr
MG996R인데 바퀴형이 맞는거 같습니다. 그럼 모터를 바꿔야 하나요?
master님의 댓글
master
본인이 판단할 수 있는 문제 아닌가요?