arduino tachometr
Napsal: 29 srp 2018, 08:42
Dobrý den, snažím se vyrobit si pomocí arduina a jazýčkového kontaktu (reed switch) tachometr na kolo. Myslel jsem si, že to bude jednoduché, ale začíná se ukazovat, že to nejde úplně samo.
Problém je ten, že to hází naprosto nesmyslně veliký rychlosti. Vypisovaná rychlost se sice mění podle toho jak rychle je spínán magnetický senzor, ale je naprosto nereálná. Ten časovač mám z internetu z návodu na tachometr. Když jsem zkoušel vypisovat proměnnou cas ke které by se měla přičíst 1 každou milisekundu zjistil jsem, že je mnohem pomalejší.
proto prosím o radu jak to napravit popřípadě kde mám chyby.
tady je program který zatím mám:
#define magnet 2
bool sepnuti;
long cas;
float mmin;
float pi = 3.141592;
float r = 0.30;
float o;
void setup(){
pinMode(magnet, INPUT_PULLUP);
o = pi*2.0*r;
Serial.begin(9600);
cli();//stop interrupts
//set timer1 interrupt at 1kHz
TCCR1A = 0;// set entire TCCR1A register to 0
TCCR1B = 0;// same for TCCR1B
TCNT1 = 0;
// set timer count for 1khz increments
OCR1A = 1999;// = (1/1000) / ((1/(16*10^6))*8) - 1
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS11 bit for 8 prescaler
TCCR1B |= (1 << CS11);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
sei();//allow interrupts
//END TIMER SETUP
}
ISR(TIMER1_COMPA_vect) {
cas++;
// Serial.println(cas);
}
void loop(){
sepnuti = digitalRead(magnet);
if(!sepnuti){
if(cas>100){
cli();
mmin = o/(float(cas)/60000);
cas = 0;
sei();
}
}
Serial.println(mmin);
// Serial.println(millis());
if(cas > 3500){
mmin = 0;
}
}
Problém je ten, že to hází naprosto nesmyslně veliký rychlosti. Vypisovaná rychlost se sice mění podle toho jak rychle je spínán magnetický senzor, ale je naprosto nereálná. Ten časovač mám z internetu z návodu na tachometr. Když jsem zkoušel vypisovat proměnnou cas ke které by se měla přičíst 1 každou milisekundu zjistil jsem, že je mnohem pomalejší.
proto prosím o radu jak to napravit popřípadě kde mám chyby.
tady je program který zatím mám:
#define magnet 2
bool sepnuti;
long cas;
float mmin;
float pi = 3.141592;
float r = 0.30;
float o;
void setup(){
pinMode(magnet, INPUT_PULLUP);
o = pi*2.0*r;
Serial.begin(9600);
cli();//stop interrupts
//set timer1 interrupt at 1kHz
TCCR1A = 0;// set entire TCCR1A register to 0
TCCR1B = 0;// same for TCCR1B
TCNT1 = 0;
// set timer count for 1khz increments
OCR1A = 1999;// = (1/1000) / ((1/(16*10^6))*8) - 1
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS11 bit for 8 prescaler
TCCR1B |= (1 << CS11);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
sei();//allow interrupts
//END TIMER SETUP
}
ISR(TIMER1_COMPA_vect) {
cas++;
// Serial.println(cas);
}
void loop(){
sepnuti = digitalRead(magnet);
if(!sepnuti){
if(cas>100){
cli();
mmin = o/(float(cas)/60000);
cas = 0;
sei();
}
}
Serial.println(mmin);
// Serial.println(millis());
if(cas > 3500){
mmin = 0;
}
}