Arduino Timer avbryter (3 / 6 steg)
Steg 3: Exempel 1: cykel hastighetsmätare
Jag ställa in timer 1 avbryta varje ms (frekvens 1 kHz) för att mäta magnetisk växeln. Om magneten är förbi växeln, signalen från växeln är hög och variabeln "tid" får sättas till noll. Om magneten inte är nära får switch "tiden" ökas med 1. Detta sätt "tid" är egentligen bara ett mått på hur lång tid i millisekunder som har gått sedan magneten senast förbi växeln magnetiska. Denna information används senare i koden för att beräkna rpm och mph på cykeln.
Här är lite kod som sätter upp timer1 för 1kHz avbryter
(CLI); //stop avbrott
Ställ in timer1 avbrott vid 1kHz
TCCR1A = 0; / / Ställ in hela TCCR1A register till 0
TCCR1B = 0; / / samma för TCCR1B
TCNT1 = 0; //initialize värde till 0
ställa in timer räknas 1khz steg
OCR1A = 1999. / / = (16 * 10 ^ 6) / (1000 * 8) - 1
var tvungen att använda 16-bitars timer1 för denna bc 1999 > 255, men skulle kunna byta till timers 0 eller 2 med större prescaler
Aktivera CTC läge
TCCR1B | = (1 << WGM12);
Ange CS11 bit för 8 prescaler
TCCR1B | = (1 << CS11);
Aktivera timern jämför avbrott
TIMSK1 | = (1 << OCIE1A);
SEI (); //allow avbrott
Här är hela koden om du vill ta en titt:
cykel hastighetsmätare
Amanda Ghassaei 2012
/*
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller ändra
* det enligt villkoren i GNU General Public License som offentliggjorts av
* den Free Software Foundation; antingen version 3 av licensen, eller
* (på ditt alternativ) någon senare version.
*
*/
prov beräkningar
däckets radie ~ 13.5 inches
omkrets = pi * 2 * r = ~ 85 inches
max hastighet av 35 km/h = ~ 616inches/sekund
Max rps = ~7.25
#define reed A0 /-pin ansluten till läsa switch
lagring variabler
float radie = 13,5; / / däck radius (i tum) - ändra detta för din egen cykel
int reedVal;
lång tid = 0; / / tid mellan en full rotation (i ms)
flyta mph = 0.00;
float omkrets;
booleska bakgrundsbelysning;
int maxReedCounter = 100; //min tid (i ms) av en rotation (för debouncing)
int reedCounter;
void setup() {
reedCounter = maxReedCounter;
omkrets = 2 * 3.14 * radie.
pinMode (1, OUTPUT); //tx
pinMode (2, utgång); //backlight växla
pinMode (reed, ingång); //redd switch
checkBacklight();
Serial.write (12), //clear
TIMER SETUP - timer avbrottet tillåter preceise tidsinställda mätningar av reed switch
mor finns information om konfiguration av arduino timers http://arduino.cc/playground/Code/Timer1
(CLI); //stop avbrott
Ställ in timer1 avbrott vid 1kHz
TCCR1A = 0; / / Ställ in hela TCCR1A register till 0
TCCR1B = 0; / / samma för TCCR1B
TCNT1 = 0, //initialize counter värde till 0.
ställa in timer räknas 1khz steg
OCR1A = 1999. / / = (16 * 10 ^ 6) / (1000 * 8) - 1
Aktivera CTC läge
TCCR1B | = (1 << WGM12);
Ange CS11 bit för 8 prescaler
TCCR1B | = (1 << CS11);
Aktivera timern jämför avbrott
TIMSK1 | = (1 << OCIE1A);
SEI (); //allow avbrott
AVSLUTA INSTALLATIONSPROGRAMMET FÖR TIMER
Serial.BEGIN(9600);
}
void checkBacklight() {
bakgrundsbelysning = digitalRead(2);
om (bakgrundsbelysning) {
Serial.write (17), //turn bakgrundsbelysningen på
}
annat {
Serial.write (18), //turn bakgrundsbelysning av
}
}
ISR(TIMER1_COMPA_vect) {//Interrupt på freq 1 kHz att mäta reed switch
reedVal = digitalRead (vass); //get val av A0
om (reedVal) {//if reed switch är stängd
om (reedCounter == 0) {//min tid mellan pulserna har gått
mph = (56.8*float(circumference)) / flyta (tid), //calculate miles per timme
tid = 0; //reset timer
reedCounter = maxReedCounter; //reset reedCounter
}
annat {
om (reedCounter > 0) {//don't låt reedCounter gå negativ
reedCounter-= 1; //decrement reedCounter
}
}
}
annat {//if reed switch är öppen
om (reedCounter > 0) {//don't låt reedCounter gå negativ
reedCounter-= 1; //decrement reedCounter
}
}
om (tid > 2000) {
mph = 0; //if inga nya pulser från reed switch-däck är fortfarande inställd 0 mph
}
annat {
tid + = 1; //increment timer
}
}
void displayMPH() {
Serial.write (12), //clear
Serial.write ("Speed =");
Serial.write (13); //start en ny rad
Serial.Print(mph);
Serial.write ("MPH");
Serial.write ("0.00 MPH");
}
void loop() {
skriva ut mph en gång per sekund
displayMPH();
Delay(1000);
checkBacklight();
}