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
Tartózkodási hely: Százhalombatta

Re: Fordulatszámmérés

HozzászólásSzerző: llori » 2013. december 4. szerda, 15:05

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
Tartózkodási hely: Győr
Kapcsolat:

Re: Fordulatszámmérés

HozzászólásSzerző: irak » 2013. december 4. szerda, 18:17

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
Tartózkodási hely: Százhalombatta

Re: Fordulatszámmérés

HozzászólásSzerző: llori » 2013. december 4. szerda, 19:41

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
Tartózkodási hely: Százhalombatta

Re: Fordulatszámmérés

HozzászólásSzerző: llori » 2013. december 4. szerda, 21:37

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/tanfolyami-kezdocsomag-tanfolyam-normal-keszlet-328-ext1-lcd-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ásSzerző: petyko » 2013. december 9. hétfő, 13:19

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: 9964
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Fordulatszámmérés

HozzászólásSzerző: Robert » 2013. december 9. hétfő, 14:09

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ásSzerző: petyko » 2013. december 9. hétfő, 14:17

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
Tartózkodási hely: Százhalombatta

Re: Fordulatszámmérés

HozzászólásSzerző: llori » 2013. december 9. hétfő, 14:29

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ásSzerző: petyko » 2013. december 10. kedd, 11:44

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ásSzerző: petyko » 2013. december 13. péntek, 12:53

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?


Vissza: “Arduino / C-nyelvű programozás (AVR-Duino, EthDuino, Arduino, Diecimila)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég