BASIC4MCU | 질문게시판 | 엔코더 회전 시간 추가 질문
페이지 정보
작성자 starmachin 작성일2019-12-06 17:18 조회7,456회 댓글2건본문
#include <stdio.h>
//
int Enconder_1=0;
unsigned int count=0;
//
interrupt[EXT_INT0]void ext_int0(void){ //A상 외부 인터럽트 폴링
count=TCNT1; TCNT1=0;
if(PIND.2)Enconder_1++; else Enconder_1--;
}
//
interrupt[EXT_INT1]void ext_int1(void){ //B상 외부 인터럽트 폴링
if(PIND.3)Enconder_1--; else Enconder_1++;
}
//
void main(){
unsigned long us=0;
char str[20];
//초기설정
TCCR1B=5; // 16000000/1024=15625Hz=64us
SREG=0x80;
while(1){
sprintf(str,"%05d",E_conder_1);
lcd_gotoxy(0,0); lcd_puts(str);
//
us=count*64; // TCNT1 값을 us로 변환
sprintf(str,"%08d us",us);
lcd_gotoxy(0,1); lcd_puts(str);
delay_ms(100);
}
}
추가 질문을 하러 왔습니다
여기서
count=TCNT1;은 High~다음 High를 측정하기 위해 있는 것인가요? 아니면 엔코더를 회전할때 전체 시간을 측정하는 것인가요???
그리고 count=TCNT1; TCNT1=0; TCNT1은 이후에는 0부터 차례대로 시간이 측정이 되는것인가요?
댓글 2
조회수 7,456master님의 댓글
master 작성일
Q)
count=TCNT1;은 High~다음 High를 측정하기 위해 있는 것인가요? 아니면 엔코더를 회전할때 전체 시간을 측정하는 것인가요???
A)
폴링엣지 트리거모드로 엔코더 신호를 받으므로
엔코더 펄스 한 주기마다 인터럽트가 걸립니다.
A상을 측정하든, B상을 측정하든 동일합니다.
//
Q)
그리고 count=TCNT1; TCNT1=0; TCNT1은 이후에는 0부터 차례대로 시간이 측정이 되는것인가요?
A)
count=TCNT1; // 한 주기동안 증가한 TCNT1을 변수에 저장
TCNT1=0; // 다음 측정을 위해서 초기화
starmachin님의 댓글
starmachin
입에서 진심으로 유레카가 나왔어요!!! 와! 정말 감사합니다!!! 머리속에서의 고민이 한번에 싸악 없어졌어요 정말 감사합니다!!