Fordulatszámmérés

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
holex
Biztosítékgyilkos
Hozzászólások: 70
Csatlakozott: 2013. október 29. kedd, 1:35

Fordulatszámmérés

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

Van egy ventillátor aminek a fordulatszámát szeretném mérni Hall jeladóval és kiíratni 7szegmenses kijelzőre. A neten talált mintakódok és saját ötletek alapján csináltam valamit:

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

int felfutoElekSzama; 
int rpm;
int hallsensor = 2;
byte i;
                        


void bejovojel ()
{ 
felfutoElekSzama++; 
}

void setup() 
{ 
pinMode(hallsensor, INPUT);  
attachInterrupt(0, bejovojel, FALLING); 
for(i=22;i<54;i++)
pinMode(i, OUTPUT);
} 


void loop () 
{
   felfutoElekSzama = 0;	
   sei();	 
   delay (2000);	
   cli();	
   rpm = ((felfutoElekSzama * 30)/2);
   kiir1(rpm/1000);
   kiir2((rpm/100)%10);
   kiir3((rpm/10)%10);
   kiir4(rpm%10);
}

A kiir eljárásokat nem másoltam be, mert nagyon hosszúak, 4 db 7 szegmenses kijelzőre írják ki az RPM-et, de azzal nincs is gond. Ezzel ez a gondom, hogy ha a 2000-es delay étéket növelem a felfutoElekSzama szorzóját pedig csökkentem, akkor pontosabban mér, viszont nagyon ritkán. Arra lenne szükségem, hogy legalább fél másodpercenként frissüljön az érték. Ha viszont fordított irányban változtatom a számokat, akkor meg folyamatosan ugrál az érték felváltva pl 1080 és 1140 között (tehát csökken a felbontás). Tehát a kettő közül egyik megoldás sem jó. Valami olyasmire gondoltam, hogy mondjuk 10 fordulatonként frissülhetne a kiiírt érték oly módon, hogy azt mérnénk, hogy mennyi idő telt el amíg beérkezett 10 impulzus, ez szerintem pontos is lenne és még gyors is. A problémát itt abban látom, hogy ha megáll a forgás, akkor az örökkévalóságig fogja várni, hogy beérkezzen a 10 impulzus és sosem írja ki a 0-t, tehát erre is meg kell határozni valami kritikus időt. Vagy esetleg ne mindig 10 impulzust várjunk, hanem nagyobb fordulatnál többet, kisebbnél kevesebbet. Sajnos még nem tudok annyira programozni, hogy ezt a problémát meg tudjam oldani. Nem tudná valaki a felvázolt ötletek alapján megcsinálni? Már ha egyáltalán működőképes így a dolog.
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 »

Mindkét értéket csökkented?
delay2000-t és a számsorzót?

Bár szerintem a rendszer határait feszegeted....

Tipp: rövid időintervallumot mérsz, 20x. És átlagolod....
holex
Biztosítékgyilkos
Hozzászólások: 70
Csatlakozott: 2013. október 29. kedd, 1:35

Re: Fordulatszámmérés

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

Nem, ha az egyik nő, akkor a másik csökken. Mert ugye a 2000 az 2 mp és azt 30-cal kell szorozni az 1 perchez.
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 »

Rovid időt mérsz - sokszor , és átlagolsz?
holex
Biztosítékgyilkos
Hozzászólások: 70
Csatlakozott: 2013. október 29. kedd, 1:35

Re: Fordulatszámmérés

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

Na ezt megpróbálom, kíváncsi vagyok mire jutok :D Köszönöm a segítséget.
holex
Biztosítékgyilkos
Hozzászólások: 70
Csatlakozott: 2013. október 29. kedd, 1:35

Re: Fordulatszámmérés

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

Alkottam valamit de még mindig nem jó: fix 5V-ról hajtva a ventit másodpercenként ugrál 1020-1050-1080 között 30-asával. Megnéznéd mit rontottam el?

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

int felfutoElekSzama; 
int rpm;
int hallsensor = 2;
volatile byte i;
byte j;
byte tomb[20];
float atlag50millisecre;


void bejovojel ()
{ 

tomb[i]++;

}

void setup() 
{ 
pinMode(hallsensor, INPUT);  
attachInterrupt(0, bejovojel, FALLING); 
for(i=22;i<54;i++)
pinMode(i, OUTPUT);
} 


void loop () 
{
  for(i=0;i<20;i++){
    sei();
    delay(50); 
    cli();
}
    felfutoElekSzama=0;
    for(i=0;i<20;i++){
     felfutoElekSzama+=tomb[i];
     tomb[i]=0;
    }
    atlag50millisecre=(float)felfutoElekSzama/20;
    rpm = ((atlag50millisecre * 1200)/2);
    kiir1(rpm/1000);
    kiir2((rpm/100)%10);
    kiir3((rpm/10)%10);
    kiir4(rpm%10);
 
}


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 »

A float típust nagyon gyorsan el kell felejteni. Baromi erőforrás-igényes.
Az INT enable/disable-t is - Arduino alatt. A rendszer belső függvényeit és eljárásait borítod meg.
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 »

Minél pontosabban akarsz mérni, annál nagyobb időt kell átfognod, nincs mese.
Vegyél mintát mondjuk negyed másodpercenként, tedd őket egy ringbufferbe.
De közben ne nullázd a számlálót, (elveszik a lényeg!) hanem vond le az előző adatot.
Átlagolsz-kiírsz.
Így lesz egy felfutása a mért értéknek, de folyamatosan fog változni.
A motor se nulla idő alatt pörög fel tuti.

Ez nálam jól megy (lcd-n):

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

#include <LiquidCrystal.h>

#define  MINTAK_SZAMA       8
#define  MINTA_PER_MPERC    4

LiquidCrystal lcd(4, 5, 0, 1, 6, 3);

unsigned int ertek,erteklista[MINTAK_SZAMA],kezdoertek,szamlalo,frekvencia;
unsigned char i,index;

void Szamlalo(){
  szamlalo++;
}

void setup() {
  attachInterrupt(0,Szamlalo,FALLING);
  lcd.begin(16, 2);
}

void loop() {
  delay(1000/MINTA_PER_MPERC);

  ertek=szamlalo;
  kezdoertek=erteklista[index];
  szamlalo-=kezdoertek;

  index++;
  if(index==MINTAK_SZAMA)index=0;

  erteklista[index]=ertek-kezdoertek;

  frekvencia=0;
  for(i=0;i<MINTAK_SZAMA;i++){
    frekvencia+=erteklista[i];
  }

  lcd.clear();
  lcd.print("rpm:");
  lcd.print(frekvencia*60/MINTAK_SZAMA*MINTA_PER_MPERC);
}
holex
Biztosítékgyilkos
Hozzászólások: 70
Csatlakozott: 2013. október 29. kedd, 1:35

Re: Fordulatszámmérés

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

Ez nálam 0 rpm-et ír. Amikor kihúzom a jelvezeték csatalkozóját, akkor egy másodpercre kiír 120-at, aztán megint nulla. Menet közben is nulla. Több ventivel is kipróbáltam.
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 »

Érdekes.

Nálam egy darab "dróttal" méri a számítógép tápjának brummját.
Némi pontatlansággal mert nincs itthon 16Mhz kvarc, 14745600-al van hajtva.
Arányosan elosztva kb pontos.
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
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 »

Be tudod másolni azt a forrást amit feltöltöttél az eszközbe?
s3seawa
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2013. november 4. hétfő, 11:43

Re: Fordulatszámmérés

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

Sziasztok.
Suzuki swift 1.3 (95)be cben kirt valami használható mintát?
Köszönöm
Avatar
volkov
DrótVégénSzéndarab
Hozzászólások: 45
Csatlakozott: 2012. november 10. szombat, 7:00

Re: Fordulatszámmérés

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

Sziasztok!

Ugyan ezzel a gonddal küzdöttem én is, bár én kocsi fordulatszámát mértem.
Ha a jelek számát számoltam, soha nem lett pontos, ugrált az érték, bármilyen timeframet próbáltam.
A megoldást Robert adta meg :)
Nem a jelek számát kell mérni, hanem a két jel között eltelt időt! Ezzel azonnal megvan a kívánt eredmény. :)

Egy excel fájlban könnyen ki lehet számolni, hogy mennyire kell pontosnak lenned, s mi a képlet amivel vissza tudod számolni 2 jel közti időből a fordulatszámot

Nem tudom hol s hogy mérsz, de ha pl. fordulásonként 1 jeled van:
1 jel/mp : 60 rmp (1 sec)
10 jel / mp: 600 rpm (0.1 sec)
stb.

Ha 3 jel van mp-ként (lapátok egy infra érzékelő előtt pl)
3 jel / mp : 60 rmp (0.333 sec)
30 jel / mp: 600 rpm (0.03333sec)

(persze ha nem számoltam el semmit :D)
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!

Én úgy gondolom hogy mind1 hogy adott idő alatt mérsz impulzusszámot, vagy annak a reciprokával operálsz.
Max. annyi a különbség hogy két impulzus közötti időt nehezebb mérni, mint adott idő alatti impulzusokat.

Érdekelne is a megoldásod.
Azt tudom elképzelni, hogy két ext int között a mag csak számlál, és az órafreki/érték/utasítások órajeléből lehetne visszaszámolni az eltelt időt. ( Ja... nincs idő kijelezni így :) )
Vagy az timer1 számlálóval manipulálsz, osztás nélkül. Ami 1/65536-od órafrekinél hosszabb impulzus felett bonyolódik kissé (bár timer1 irq lekezelheti a túlcsordulást).
Hétvégén ha lesz időm kipróbálom.

A legnagyobb probléma az az, hogy perc alapú adat kell, és az a fránya 60-as szorzó elrondítja keményen az eredményt.... amit átlagolással elmaszatolhatunk...
Arról nem is beszélve hogy a jelforrás frekvenciája is változó.
Ebben az esetben, 1 perc alatti fordulatszámot pontosan csak 1 perc alatt lehet megmérni.
Mellesleg az a megoldás, amit megosztottam, az is áll mint a gerely, stabil frekvencián.
Avatar
ampervadasz
Bitmanipulátor
Hozzászólások: 119
Csatlakozott: 2008. január 19. szombat, 7:00

Re: Fordulatszámmérés

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

Szervusztok!

Lenne két kérdésem, amit a program írásakor jó lenne tisztán látni.
1. Milyen időközönként frissüljön a kijelzés?
2. Milyen pontos legyen a kijelzett érték?

Lehet nagyon pontos és gyors kijelzést is használni, de akkor értékelhetetlen a kijelzett érték, mivel SOHASEM azonos a motor fordulatszáma. (zavaró)
Ésszerű határadatok nélkül csak találgat az ember, legalább ezt a 2 értéket adjátok már meg kiindulásnak.
Válasz küldése