RPM ( round per minute ) adalah angka yang menunjukkan banyaknya putaran suatu system dalam 1 menit. Biasanya dimanfaatkan sebagai penunjuk putaran mesin pada kendaraan bermotor, sehingga mempermudah dalam pengaturan tenaga dan bahan bakar. Alat pengukur ini lazim disebut TACHOMETER.
Pada sebuah kendaraan roda 2, putaran mesin dapat diperoleh dengan menghitung pulsa pada dinamo, tetapi hal ini susah karena harus membuka blok mesin. Cara paling mudah adalah dengan memanfaatkan radiasi dari CDI ke BUSI yang dapat dihitung jumlah pulsanya. Jadi dengan menggunakan prinsip radiasi elektromagnet, cukup dengan melilitkan kawat tembaga/email/enamel/kabel dinamo ke kabel di dekat ujung tutup busi, maka tegangan yang konstan (pulsa) dapat diperoleh. Jumlah lilitan tidaklah penting, cukup dikira-kira saja sampai tegangan yg dihasilkan dapat mengaktifkan transistor sebagai switch penghitung.
Tidak perlu menunggu 1 menit untuk mengeluarkan nilai RPM, dengan memanfaatkan fasilitas counter pada microcontroller maka nilai RPM dapat diperoleh. Semisal kita melakukan sampling pengambilan data RPM per 1 detik. Maka RPM didapat melalui rumus :
Skematik dibawah ini memanfaatkan microcontroller attiny2313, dan menggunakan transistor sebagai switch pulsa.
sedangkan scriptnya seperti berikut ini (revised version):
#define F_CPU 1000000UL // frek clock internal#include <avr/io.h>#include <util/delay.h>#include <avr/eeprom.h>#include <avr/interrupt.h>#include <avr/pgmspace.h>uint8_t angka1=10 ;uint8_t angka2=10 ;uint8_t angka3=10 ;uint8_t angka4=10 ;uint8_t segstep=0;uint8_t kalibrasi=3;int number=0;void conv_segmen(uint8_t digit)//nampilin segmen{switch (digit){case 0 :{PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB4) & ~_BV(PB5);PORTB |= _BV(PB6) ;break;}case 1 :{PORTB &= ~_BV(PB1) & ~_BV(PB2) ;PORTB |= _BV(PB0) | _BV(PB3) | _BV(PB4) | _BV(PB5) | _BV(PB6) ;break;}case 2 :{PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB3) & ~_BV(PB4) & ~_BV(PB6) ;PORTB |= _BV(PB2) | _BV(PB5) ;break;}case 3 :{PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB6) ;PORTB |= _BV(PB4) | _BV(PB5) ;break;}case 4 :{PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB5) & ~_BV(PB6) ;PORTB |= _BV(PB0) | _BV(PB3) | _BV(PB4) ;break;}case 5 :{PORTB &= ~_BV(PB0) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB5) & ~_BV(PB6) ;PORTB |= _BV(PB1) | _BV(PB4) ;break;}case 6 :{PORTB &= ~_BV(PB0) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB4) & ~_BV(PB5) & ~_BV(PB6) ;PORTB |= _BV(PB1) ;break;}case 7 :{PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB2) ;PORTB |= _BV(PB3) | _BV(PB4) | _BV(PB5)| _BV(PB6) ;break;}case 8 :{PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB4) & ~_BV(PB5) & ~_BV(PB6);break;}case 9 :{PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB5) & ~_BV(PB6);PORTB |= _BV(PB4) ;break;}case 10 :{PORTB |= _BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB3) | _BV(PB4) | _BV(PB5) | _BV(PB6) ;break;}}}void init_ctr(void) //counter tampilan{TCCR0A |= (1 << WGM01); // Configure timer 0 for CTC modeTIMSK |= (1 << OCIE0A); // Enable CTC interruptOCR0A = 50; // Set CTC compare value till blink disapear at 1MHz AVR clock, with a prescaler of 64TCCR0B |= (1 << CS01)|(1 << CS00); // Start timer at Fcpu/64}void init_ctr1(void)//counter perhitungan 600ms sampling{TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC modeTIMSK |= (1 << OCIE1A); // Enable CTC interruptOCR1A = 586; //compare the CTC A = 600ms =586TCCR1B |= ((1 << CS10) | (1 << CS12)); // Start timer at Fcpu/1024}ISR(TIMER1_COMPA_vect) //timer capture RPM counter{ uint16_t rpm;switch(kalibrasi) {case 1 :{rpm=number/100;break; }case 2 :{rpm=number/10;break; }case 3 :{rpm=number;break; }case 4 :{rpm=number*10;break; }case 5 :{rpm=number*100;break; }default: rpm=0;}angka1 = rpm%10;if(rpm>9) angka2 = ((rpm%100) - (rpm%10)) /10 ;else angka2=10;if(rpm>99) angka3 = ((rpm%1000) - (rpm%100)) /100 ;else angka3=10;if(rpm>999) angka4 = ((rpm%10000) - (rpm%1000)) /1000 ;else angka4=10;number=0;}ISR(TIMER0_COMPA_vect) // timer pindah kolom{segstep++;switch(segstep) {case 1 :{ conv_segmen(10);PORTD |= _BV(PD0);PORTD &= ~_BV(PD1) & ~_BV(PD4) & ~_BV(PD5) ;conv_segmen(angka1);break;}case 2 :{ conv_segmen(10);PORTD |= _BV(PD1);PORTD &= ~_BV(PD0) & ~_BV(PD4) & ~_BV(PD5) ;conv_segmen(angka2);break;}case 3 :{ conv_segmen(10);PORTD |= _BV(PD4);PORTD &= ~_BV(PD1) & ~_BV(PD0) & ~_BV(PD5) ;conv_segmen(angka3);break;}case 4 :{ conv_segmen(10);PORTD |= _BV(PD5);PORTD &= ~_BV(PD1) & ~_BV(PD4) & ~_BV(PD0) ;conv_segmen(angka4);segstep=0;break;}}}SIGNAL (SIG_INT0){number++;}void tombol(void){cli();conv_segmen(10);
sei();kalibrasi++;if (kalibrasi == 6) kalibrasi=1;eeprom_write_byte((uint8_t*)10, kalibrasi);_delay_ms(200);
DDRD &= ~_BV(PD3) ; // tombol}void baca_eeprom(void){kalibrasi = eeprom_read_byte((uint8_t*)10);if(kalibrasi == 0xFF) kalibrasi=3;}int main(void){GIMSK |= (1<<INT0);MCUCR |= (1<<ISC01)| (1<<ISC11); //fall edgeDDRD |= _BV(PD0) | _BV(PD1) | _BV(PD4) | _BV(PD5) ; // seg select
if(bit_is_clear(PIND, PD3) )DDRB |= _BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB3) | _BV(PB4) | _BV(PB5) | _BV(PB6) ; // seg a,b,c,d,e,f,ginit_ctr();init_ctr1();baca_eeprom();sei();while(1){
{tombol;
}
}}
SELAMAT MENCOBA