Fordulatszámmérés

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
llori
DrótVégénSzéndarab
Hozzászólások: 18
Csatlakozott: 2011. március 12. szombat, 7:00

Re: Fordulatszámmérés

Hozzászólás Szerző: llori »

Sziasztok!

Fordulat számmérésen agyalgattam, kiolvastam a rpm és Arduino google sok találatát.

Ez vezetett a megoldásra: http://playground.arduino.cc/Main/ReadingRPM
Illetve természetesen ez a FÓRUM :D

Próba panelon még nem raktam össze, csak a kódót szerkeztettem meg.

Kód:

Kód: Egész kijelölése

volatile byte rpmcount;
unsigned int rpm;
unsigned int lastmillis;

int deltat;


void setup()
{
                pinMode(13, OUTPUT);               //LED a D13 kivezetesen
                pinMode(3,INPUT);       //D3 GND fele nyomogomb (opcio!)
                digitalWrite(3, HIGH);    //D3 belso felhuzoellenallas (opcio!)

                

                Serial.begin(9600); 
                attachInterrupt(3, rpm_fun, RISING);
                rpmcount = 0;
                rpm = 0;
                deltat = 1000;

}

void loop()
{

                if (millis() - lastmillis == deltat)  //1000ms egy másodperc, így addig csak a megszakitással a fordulatszám jeleket számolgatjuk. Érdekes lehet a tesztelésnél a nagyobb-vegy-egyenlőt => vizsgálni.
                {
                               detachInterrupt(3);       //Interupt kipakcsolása a számolás folyamatára
                               rpm = rpmcount * 60 * 1000 / deltat;
                               Serial.print("RPM =\t");
                               Serial.print(rpm);
                               Serial.print("1/min;\t");
                               Serial.print("freq=");
                               Serial.print(rpmcount);
                               Serial.println("Hz");
                               rpmcount = 0;


                               attachInterrupt(3, rpm_fun, RISING);
                }
                
                

}
void rpm_fun()
{
                rpmcount++;
}
Félelmem az, hogy a megszakítás kikapcsolásánál a fordszám változűásokat nem látjuk.
Ha közben komolyabb feladatokat is akarunk adni a AVR-nek, akkor az interupt mindig megszagatja.

Lehet az egy megoldás, hogy az Arduino egy másik Arduinotól kapja meg az online fordulatszám jelet.
Ezen még elmélkednem kell...

Lóri
Avatar
irak
Biztosítékgyilkos
Hozzászólások: 73
Csatlakozott: 2005. november 2. szerda, 7:00

Re: Fordulatszámmérés

Hozzászólás Szerző: irak »

Hello!

Nem tiltsd le az irq-t és kész.
Másold le a számlálót, nullázd ki ,és engedd futni tovább mielőtt kalkulálsz.
Mellesleg elég a 8 bit a számláláshoz?
A lastmillis nincs beállítva, így csak 1x fut majd le az egész (meg ha túlcsordul a belső számláló).
Gondolom a kijelzés után bele akarod tenni az aktuális időt.
Amúgy egyszerűbb a delay() függvénnyel megoldani:
http://arduino.cc/en/Reference/Delay

Fogadjunk hogy a következő projektedhez prellmentesítés kell majd:D
Avatar
llori
DrótVégénSzéndarab
Hozzászólások: 18
Csatlakozott: 2011. március 12. szombat, 7:00

Re: Fordulatszámmérés

Hozzászólás Szerző: llori »

Valóban :-) delay()-jel egyszerübb.
mingyá, átírom a kódot.
Avatar
llori
DrótVégénSzéndarab
Hozzászólások: 18
Csatlakozott: 2011. március 12. szombat, 7:00

Re: Fordulatszámmérés

Hozzászólás Szerző: llori »

irak!

Igazad volt! :roll:

majdnem meggebedtem mire rájöttem, hogy a 3 digitális pin az egyes interup láb :mrgreen:


A nyomógombos fordulatszám szimulálásnál megvolt az első találkozásom Mr. Prell-lel :wink:

A prellmentesítés nélküli kód:

Kód: Egész kijelölése

    volatile int rpmcount; //megszakításban használatos változó definiállása
    unsigned int rpm; //fordulatszám változó definiálása


    void setup()
    {
      pinMode(13, OUTPUT);               //LED a D13 kivezetesen
      pinMode(3,INPUT);       //D3 GND fele nyomogomb
      digitalWrite(13, HIGH); // 13 pin-en lévő LED kigyujtás
      digitalWrite(3, HIGH); //D3 belso felhuzoellenallas
      Serial.begin(9600); //serial port indítás
      attachInterrupt(1, rpm_fun, FALLING); // megszakítás indítás
      rpmcount = 0; // megszakítás változó nullázás
      rpm = 0; // megszakítás változó nullázás
    }

    void loop()
    {
     delay(1000); // 1másodper szünet
     rpm = rpmcount * 60; //forulatszám 1/perc-é számmítás
     Serial.print("RPM =\t"); // kiirások
     Serial.print(rpm); // kiirások
     Serial.print(" 1/min; \t"); // kiirások
     Serial.print("freq="); // kiirások
     Serial.print(rpmcount); // kiirások
     Serial.println("Hz "); // kiirások
     rpmcount = 0; //megszakítás változó nullásáz
    }
    
    void rpm_fun() //megszakítés függvény
    {             
      rpmcount++; // ha megszakítás van, akkor a megszakaítás változó növekedjen eggyel
    }
A teljességhez hozzá tartozik, hogy Arduino 60 nap alatt tanfolyami normál készletem van itthon.
http://shop.tavir.hu/product_info.php/t ... d-dvd-p-38
petyko
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2013. december 9. hétfő, 13:15

Re: Fordulatszámmérés

Hozzászólás Szerző: petyko »

Sziasztok! Bascom-ba atmega8-ra szeretnék egy váltásjelző programot, de valahogy nem áll nekem össze a képlet. A fordulatszámmérőre érkező impulzusok számától függően villanjon egy led, mondjuk 4ezres fordulaton. Tud valaki segíteni hogy induljak el?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Fordulatszámmérés

Hozzászólás Szerző: Robert »

Eddig mire jutottál?

A fordulatszámmérésre lsd a korábbi mintákat.
A LED ki/bekapcsolás:

Kód: Egész kijelölése

If fordulatszam > hatarertek, then set LED else reset LED
petyko
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2013. december 9. hétfő, 13:15

Re: Fordulatszámmérés

Hozzászólás Szerző: petyko »

Ez a része oké. A timer és a counter beállítása nem világos.
Avatar
llori
DrótVégénSzéndarab
Hozzászólások: 18
Csatlakozott: 2011. március 12. szombat, 7:00

Re: Fordulatszámmérés

Hozzászólás Szerző: llori »

Ez a TIMER dolog engem is érdekel!
petyko
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2013. december 9. hétfő, 13:15

Re: Fordulatszámmérés

Hozzászólás Szerző: petyko »

Eddig jutottam:

Kód: Egész kijelölése

Config Portd.6 = Output
Config Timer1 = Counter , Edge = Rising , Prescale = 1


Do
  Start Counter1
  Waitms 25
  Stop Counter1
  If Counter1 > 16 Then Set Portd.6 Else Reset Portd.6
  Counter1 = 0
Loop
Ezzel csak az a bajom hogy nem eléggé pontos
petyko
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2013. december 9. hétfő, 13:15

Re: Fordulatszámmérés

Hozzászólás Szerző: petyko »

Sziasztok! Kipróbáltam adc-vel:

Kód: Egész kijelölése

Config Portc.0 = Input
Config Portb.0 = Output
Config Adc = Free , Prescaler = 2 , Reference = Avcc


Dim A As Word



Do
A = 0
Start Adc
A = Getadc(0)
Waitms 25
Stop Adc
If A = 1023 Then A = A + 1
If A > 66 Then Set Portb.0 Else Reset Portb.0
Loop
Így most 4000-es fordulatnál kapcsolja a ledet viszont 4440-nél nem kapcsol. Miért lehet ez?
Válasz küldése