Arduino-baserad optiska varvräknare (4 / 6 steg)
Steg 4: programmering
Du kan hämta den "skissen" för programmet nedan.
Funktionen rpm_fun är funktionen avbrott som kommer att anropas när data på pin 2 ändras från hög till låg (en fallande puls). Det uppdaterar den globala rpmcount, sedan växlar status-LED.
void rpm_fun() {//Each rotation, detta avbrott //function körs två gånger, så beakta //that för //calculating RPM //Update greve rpmcount ++; //Toggle status ledde om (status == låg) {status = hög;} annat {status = låg;} digitalWrite (statusPin, status);}
Setup initierar variabler, konfigurerar seriella parametrar, anger pin lägen och ställer in funktionen avbrott.
void setup() {Serial.begin(9600); //Interrupt 0 är digital stift 2, så det är där //the IR detektor är anslutna //Triggers på fallande (ändra från hög till låg) attachInterrupt (0, rpm_fun, faller); //Turn på IR-LED pinMode (ledPin, produktionen), digitalWrite (ledPin, hög), //Use statusPin att blinka tillsammans med avbryter pinMode (statusPin, produktionen); rpmcount = 0; rpm = 0; timeold = 0; status = låg;}
Loop funktion, är som namnet antyder, den huvudsakliga behandlingen loop som "går för alltid" medan styrelsen drivs upp. De första uttalande förseningarna under en sekund (1000 millisekunder), men observera att avbryta funktionen kommer att bryta i varje gång värdet av stift 2 ändras och köra funktionen rpm_fun. Efter 1 sekund försening, avbrottet är tillfälligt inaktiverad (detta inte kanske är nödvändigt, men verkar säkrare) då RPM beräknas baserat på antalet avbrott och förfluten tid mellan nu och förra gången beräkningen uppstått. Resultatet skickas tillbaka till datorn via den seriella porten, då avbrottet är återställd.
void loop() {//Update RPM varje andra delay(1000); //Don't process avbryter under beräkningar detachInterrupt(0); rpm = 30*1000/(millis() - timeold) * rpmcount; timeold = millis(); rpmcount = 0; //Write det ut till seriell port Serial.println(rpm,DEC); //Restart avbryta bearbetning attachInterrupt (0, rpm_fun, faller);}
Observera att sättet motorn och IR-detektorn har konfigurerats, varje enskild tur av spolen kommer att resultera i två övergångar, så beräkningen tar det i kraft. Samma sak skulle inträffa för två bladig fläkt eller propeller. Om bara ett ljust avbrott per varv inträffade, såsom en svängande arm, skulle beräkningen vara:
RPM = 60*1000/(millis() - timeold) * rpmcount;
För en tre bladig fläkt, skulle beräkningen vara:
RPM = 20*1000/(millis() - timeold) * rpmcount;