BASIC4MCU | 센서 | 초음파센서 | SRF-04 (SRF-05, HC-SR04) 초음파센서 인터럽트로 읽기 - 16비트 타이머
페이지 정보
작성자 키트 작성일2017-08-23 14:43 조회2,498회 댓글0건본문
SRF-04 파형입니다.
트리거 펄스를 PWM으로 구동 시켜보죠
주기는 50ms로 하겠습니다.
참고예제는 RC서보모터 구동에 사용한 FAST PWM 모드14로 하고
DDRB=0x20; // PB5 out
TCCR1A=0x82; // FAST PWM
TCCR1B=0x1B; // 64분주=4usec
OCR1A=2; // 4usec*3=12usec, 트리거 펄스폭
ICR1=12499; // 4usec*12500=50000usec=50ms, pwm주기
//에코는 외부 인터럽트4를 사용해서 받고
high 구간의 시간을 측정 하려면
초기 조건은 라이징엣지 트리거 모드로 시작하고
그 후엔 폴링엣지 트리거 모드로 시간을 측정하면 됩니다.
//
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 //=====================================================================//// 코드비젼 컴파일러//=====================================================================//#include <mega128.h> //16MHz#include <delay.h>//unsigned int start=0,end=0,dist=0;//interrupt [EXT_INT4] void ext_int4_isr(void){if(EICRB==3){ // 라이징엣지에서 인터럽트가 걸리면start=TCNT1; // TCNT1값을 저장해두고EICRB=2; // 다음번 인터럽트는 폴링엣지로 설정}else{ // 폴링엣지에서 인터럽트가 걸리면end=TCNT1; // TCNT1값을 저장해두고EICRB=3; // 다음번 인터럽트는 라이징엣지로 설정dist= (int)( (float)(end-start) / 14.5 ); // 58us / 4us = 14.5, cm로 변환}}//void main(void){DDRB=0x20; TCCR1A=0x82; TCCR1B=0x1B; OCR1A=2; ICR1=12499;EICRB=3; EIMSK=0x10; EIFR=0x10; SREG=0x80;while(1){}}//=====================================================================////=====================================================================//// AVRstudio//=====================================================================//#define F_CPU 16000000UL // 16 MHz#include <avr/io.h>#include <util/delay.h>#include <avr/interrupt.h>//volatile unsigned int start=0,end=0,dist=0;//ISR(INT4_vect){if(EICRB==3){ start=TCNT1; EICRB=2; }else { end=TCNT1; EICRB=3; dist=(int)((float)(end-start)/14.5); }}//int main(void){DDRB=0x20; TCCR1A=0x82; TCCR1B=0x1B; OCR1A=2; ICR1=12499;EICRB=3; EIMSK=0x10; EIFR=0x10; SREG=0x80;while(1){}}//=====================================================================//cs
거리값 dist를 LCD에 표시하든 시리얼통신으로 전송하든
if()문으로 체크해서 LED로 표시하든
소스를 추가해서 사용하세요^^
댓글 0
조회수 2,498등록된 댓글이 없습니다.