A HALL szenzoros motor fordulatszám mérő program – egy kicsit jobban.

Nem voltam megelégedve a programommal, mert a 60-as szorzó miatt pontatlan és eléggé ugráló eredményeket adott. Böngésztem egy kicsit és találtam egy ötletet. Ne azt mérjük, hogy hányat fordul egy másodperc alatt a motor, hanem azt, hogy egy fordulatnak mennyi a periódus ideje és ezt fordítsuk aztán át rpm-re. Ennek a mérésnek a hátránya, hogy az álló motor soha nem ad jelzést, tehát a periódusidő végtelen. Azt hiszem sikerült megoldani a problémát, alant láthatjátok a programot. Az előző számolást is megtartottam, hogy össze tudjam hasonlítani módszereket.



/* 
 *  HALL szenzoros motor fordulatszám mérő program
 *  arduino.hu
 */
volatile int rpmdeltatime = 0;       //Ez lesz a peridousidő millisecundumban
volatile unsigned long rpmtime = 0;  //Segédváltozó
unsigned long heartbeattime = 0;     //Ennek segítségével másodpercenként egyszer mérek
int rpm = 0;                         //új rpm
volatile int oldrpm = 0;             //előző módszerrel kiszámolt rpm
 
void setup()
{   
  Serial.begin(115200);              // A soros port inicializálása
  Serial.println(F("rpm started"));  //Jelzés, hogy egyáltalán elindult a program
  pinMode(3,INPUT);                  //A HALL szenzor kimenete a 3-as lábra kötve, itt érzékeli az 1-es megszakítást az Arduino<br>
  attachInterrupt(1, blink, FALLING);//A megszakítás inicializálása: 1-es megszakítás, "blink" a megszakítási szubrutin neve, "FALLING" azaz lefutó élre legyen megszakítás
  heartbeattime = millis();          //Az időzitő változó szinkronizálása
}
 
void loop()
{   
  if(millis() > heartbeattime + 1000){   //amennyiben eltelt 1000 millisecundum azaz 1 másodperc
    rpm = 0;                        // Az új rpm kinullázása    
    if(rpmdeltatime != 0){          // Ha van mérési eredmény, akkor számolunk
     rpm = 60000/rpmdeltatime;      // 1 percben 60000 millisec van f=1/T
    }
    Serial.print("RPM: ");          
    Serial.println(rpm);            // Új rpm kiíratása
    rpmtime = 0;                    // Változók kinullázása, hogy ha megáll a motor ne kapjunk hibás eredményt
    rpmdeltatime = 0;
    Serial.print("OLDRPM: ");        
    Serial.println(oldrpm*60);      //Az előző rpm kiírása a soros portra, *60 mert egy percben 60 másodperc van
    oldrpm = 0;            
    
    heartbeattime=millis();         //Az óra újraindítása
  }
}
 
void blink()                         //A megszakítás kezelő szubrutin
{  
  if (rpmtime != 0){                 //Az első jel indítja a mérést, a másodiknál már belépünk az if-be
    rpmdeltatime = millis() - rpmtime;//Az előző jel és az új jel között eltelt idő lesz a periódusidő
  }
  rpmtime = millis();                //A megszakítási jel idejének eltárolása
  oldrpm++;                          //Rpm számolás az előző módszerrel
}


A program korlátja, hogy két fordulatnak kell lenni a mérési időn belül ami most 1 másodperc. Tehát a legnagyobb periodusidő amit mérni tud az 0,5 secundum azaz a legkisebb rpm az 120 fordulat/perc. Ha a mérési időn belül több fordulat van a program az 1 másodperc letelte előtti utolsó fordulat eredményét jelzi ki.

Hall szenzoros motor fordulatszám mérés Arduinoval 3
Cimke:

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.