BASIC4MCU | 질문게시판 | 답변 : 아트메가 128 초음파센서 코드 질문입니다.
페이지 정보
작성자 master 작성일2023-11-30 08:44 조회1,164회 댓글0건본문
초음파 센서를 사용하여 거리에 따라 led가 켜지는 것을 만드는 중인데 작동은 다 됩니다...
하지만 거리게산이 문제가 있는지 실제 측정거리랑 조건이랑 차이가 납니다.
(50cm면 4개가 켜져야되는데 1개만 켜져있습니다.
50cm부터 led가 켜지며 점등까지 정상작동합니다...)
어디서 문제가 생기는 것일까요..?
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000L
#include <util/delay.h>
//
#define Trig_ON PORTF|= 1 // 초음파 트리거 PF0
#define Trig_OFF PORTF&=~1
#define Echo (PINF&4) // 초음파 에코 PF2
//
unsigned int getEcho(void){
Trig_ON; _delay_us(10); Trig_OFF; // 10uS
while(!Echo); TCCR1B=2; TCNT1=0;
while( Echo); TCCR1B=0;
return(TCNT1/116); // cm
}
//
int main(void){
int range=0,cnt=0;
DDRG=0xFF;
DDRD=0x0F; // PD0,PD1,PD2,PD3를 LED 출력으로 설정
DDRF=1; // PF0 트리거,PF2 에코
while(1){
range=getEcho();
if (range>100)PORTD=0x00; // LED 0개 on(-)
else if(range> 90)PORTD=0x01; // LED 1개 on(PD0)
else if(range> 75)PORTD=0x03; // LED 2개 on(PD0,PD1)
else if(range> 60)PORTD=0x07; // LED 3개 on(PD0,PD1,PD2)
else if(range> 45)PORTD=0x0F; // LED 4개 on(PD0,PD1,PD2,PD3)
else{
if(++cnt>=5){ cnt=0; // (0.5초 간격)
if(PORTD&0x0F)PORTD=0; // LED 4개 점멸(PD[0,1,2,3])
else PORTD=0x0F;
}
}
_delay_ms(100);
}
}
13년 전에 제가 타이머를 사용한 AVR용 초음파 예제를 처음 만들었습니다.58로 나누는 것이 아니고 2배인 116으로 나누어야 합니다.8분주는 0.5us 단위로 카운트가 증가하고, 1cm 의 반사파는 58us이므로 116으로 나누어야지 cm가 계산됩니다.또, 에코를 수신한 후 다음 트리거를 주기 전에 50ms 이상의 딜레이를 주어야지 거리측정 오차가 적게 발생합니다.100ms 정도의 딜레이를 주면 오차가 현저하게 줄어듭니다.딜레이 주는 목적은 먼거리에서 반사되어 늦게 도착하는 신호를 무시하기 위한 중요한 시간입니다.
댓글 0
조회수 1,164등록된 댓글이 없습니다.