BASIC4MCU | 질문게시판 | atmega128 서보모터와 초음파센서
페이지 정보
작성자 tmiae 작성일2022-05-20 12:53 조회2,670회 댓글5건본문
안녕하세요
atmega128을 사용하여 초음파센서에서 읽는 거리를 측정해 서보모터를 동작 중입니다.
현재 초음파센서는 HC-SR04를 이용하고 있으며 서보모터는 SG-90을 사용중입니다.
50CM 이하일 때 서보모터가 좌우로 동작하고 그 외에는 멈추는 코드를 짜고 있는데
동작이 되지않아 문의드립니다.
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#define TRIG 6
#define ECHO 7
#define SOUND_VELOCCITY 340UL
unsigned char i;
unsigned int cal_distance() //장애물까지의 거리 계산
{
unsigned distance;
TCCR1B = 0x03;
PORTB &= ~(1<<TRIG);
_delay_us(10);
PORTB |= (1<<TRIG);
_delay_us(10);
PORTB &= ~(1<<TRIG);
while(!(PIND& (1<<ECHO)));
TCNT1=0x0000;
while (PIND & (1<<ECHO));
TCCR1B = 0x00;
distance = (unsigned int)(SOUND_VELOCCITY * (TCNT1*4/2) /1000);
return(distance);
}
void servoStop()
{
TCCR3A &= ~((1<<COM3A1) | (1<<COM3A0));
}
int main(void)
{
unsigned int distance;
DDRE|= 0x08;
PORTE|= 0x08;
DDRB =DDRB|(1<<TRIG);
DDRD= DDRD|~(1<<ECHO);
TCCR3A=0x82;
TCCR3B=0x1b;
ICR3 =4999; //TOP
while(1)
{
distance=cal_distance();
if(distance < 500)
{
OCR3A=125; //0도
_delay_ms(500);
OCR3A=375; //90도
_delay_ms(500);
OCR3A=625; //180도
_delay_ms(500);
}
else
{
servoStop();
}
}
}
댓글 5
조회수 2,670master님의 댓글
master 작성일
ICR3 =4999; //TOP
0.5us*5000=2500us
일반 서보모터는 20ms 주기로 만들어야 합니다.
2.5ms는 너무 짧죠
RC용 일부 서보모터는 고속응답을 하기 위해서 짧은 주기를 사용하기도 합니다.
ICR3 =39999; //TOP
0.5us*40000=20000us=20ms
master님의 댓글
master 작성일
while(1){
OCR3A=125; _delay_ms(500); //0도
OCR3A=375; _delay_ms(500); //90도
OCR3A=625; _delay_ms(500); //180도
}
}
ICR3을 수정했다면 무한루프를 이렇게 수정해서 돌리면 서보모터가 좌우로 반복하겠죠
이 때도 안 돌아간다면 서보 전원의 전류 부족인지 체크하세요
tmiae님의 댓글
tmiae
빌드는 되는데 동작을 안하는거 보니 아무래도 전류부족인거 같습니다.
트랜지스터를 연결해서 다시 동작시켜보겠습니다.
감사합니다.
master님의 댓글
master 작성일
DDRB =DDRB|(1<<TRIG);
DDRD= DDRD|~(1<<ECHO);
트리거는 맞는데 에코가 잘못되었습니다.
DDRD= DDRD&~(1<<ECHO);
입력은 없어도 전원 리셋 후 디폴트 입력이라서 안 적어도 되는데, 괜히 적어서 다른 핀을 모두 출력으로 만드는 군요