Hello anh em,
Em vừa hoàn thành xong cái này.
Lấy timer 500ms làm mẫu, đếm số ngắt ngoài.
Em tính theo công thức:
g_rpm=g_num_ext*12*2;
/* 12 la: 120/10. 2 so xung trong 1 vong quay */
Cái 120/10 kia là thực nghiệm em chia cho 10, cũng chả biết tại sao nữa, đo với đồng hồ của thợ xe thì chính xác. Timer cũng chính xác vì em cho thử nháy led trong ngắt timer1 thì đúng 500ms luôn
Cấu hình timer, interrupt của em:
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
GICR|=(0<<INT1) | (1<<INT0);
MCUCR=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);
GIFR=(0<<INTF1) | (1<<INTF0);
/* Timer1 Init */
/* 8mhz => 1/8000000=0,000000125 sec 1 chu ky may */
TCCR1B=(1<<CS12)|(0<<CS11)|(0<<CS10); /* prediv = 256, sau: 0,000125*256=0,032 milisec thi timer1 tang len 1 don vi */
/* Muon dem 500 milisec can: 500/0.032 = 15625 lan dem cua timer1 */
TCNT1=49911; /* 65536-15625 */
TIMSK|=(1<<TOIE1); /* enable interrupt timer1 */
Em vừa hoàn thành xong cái này.
Lấy timer 500ms làm mẫu, đếm số ngắt ngoài.
Em tính theo công thức:
g_rpm=g_num_ext*12*2;
/* 12 la: 120/10. 2 so xung trong 1 vong quay */
Cái 120/10 kia là thực nghiệm em chia cho 10, cũng chả biết tại sao nữa, đo với đồng hồ của thợ xe thì chính xác. Timer cũng chính xác vì em cho thử nháy led trong ngắt timer1 thì đúng 500ms luôn
Cấu hình timer, interrupt của em:
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
GICR|=(0<<INT1) | (1<<INT0);
MCUCR=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);
GIFR=(0<<INTF1) | (1<<INTF0);
/* Timer1 Init */
/* 8mhz => 1/8000000=0,000000125 sec 1 chu ky may */
TCCR1B=(1<<CS12)|(0<<CS11)|(0<<CS10); /* prediv = 256, sau: 0,000125*256=0,032 milisec thi timer1 tang len 1 don vi */
/* Muon dem 500 milisec can: 500/0.032 = 15625 lan dem cua timer1 */
TCNT1=49911; /* 65536-15625 */
TIMSK|=(1<<TOIE1); /* enable interrupt timer1 */
Comment