Zählen mit Arduino

Der chaotische Hauptfaden

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

Antworten
Kevin89
Beiträge: 45
Registriert: Di 10. Sep 2013, 18:40

Zählen mit Arduino

Beitrag von Kevin89 »

Nabend,

ich wurste mich grad ein wenig in die Arduino Geschichte rein hänge aber nun an dem Problem, dass ich per Hallsensor oder Lichtschranke eine Drehzahl abfragen möchte und zwar in Umdrehungen pro Sekunde aber ich komm irgendwie nicht drauf wie ich die Anzahel der "HIGH's" innerhalb einer Sekunde zählen und dann als Variable weiter verwenden kann.

Ich hoffe jemand kann mir da weiter helfen :idea:


gruß
Benutzeravatar
Sascha
Beiträge: 673
Registriert: Di 13. Aug 2013, 15:20
Wohnort: Irgendwo bei Heilbronn

Re: Zählen mit Arduino

Beitrag von Sascha »

Das löst man normalerweise umgekehrt, man misst wie viel Zeit zwischen zwei High-Impulsen vergeht. Dafür gibt es das Capture-Modul (o.ä.) welches dies mit einem Timer erledigt. Den Messwert musst du dann noch umrechnen, et voila.
Benutzeravatar
Fritzler
Beiträge: 12604
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Zählen mit Arduino

Beitrag von Fritzler »

Hallsensor an den INT0 oder INT1 des AVR hängen.
Paralel dazu läuft ein Timer (dessen Zählfrequenz ist ja bekant).
Wenn der Interrupt auslöst, dann den Zählerstand merken, wenn der wieder auslöst den Zählerstand merken.
Aus den 2 Zählerständen kannste die zeit für eine Umdrehung berechnen und daraus die Umdrehungen pro Sekunde.

Oder aber der Hallsensor kommt an den T0 oder T1 Eingang eines Timers, dann zählt der Timer für dich.
Allerdings brauchste dann 2 Timer, der eine zählt die Impulse und den anderen benutzt du um pro Sekunde einmal nachzusehen wie hoch denn der andere Timer gezählt hat.
Kevin89
Beiträge: 45
Registriert: Di 10. Sep 2013, 18:40

Re: Zählen mit Arduino

Beitrag von Kevin89 »

Huch das ging ja schnell...

dazu muss ich noch sagen, dass ich auf dem Gebiet zeiten im Controller überhaupt keine Ahnung habe...natürlich verwende ich die delay Funktion reichlich aber wie ich jetzt mit einem Signal an einem pin ein Timer starte -> keine Ahnung :cry:

wenn mir das jemand noch für ganz ganz unwissende erklären könnte, dann wäre ich sehr dankbar
SebiR
Beiträge: 472
Registriert: Di 13. Aug 2013, 18:34

Re: Zählen mit Arduino

Beitrag von SebiR »

http://playground.arduino.cc/code/timer1
und
http://www.arduino.cc/en/Reference/AttachInterrupt

Sollten genug sein ;)

Mit jedem Interrupt über deinen Interrupt-Pin inkrementierst du eine Zählervariable n. Mit dem Timerinterrupt, der alle t ausgelöst, teilst du die Anzahl der Inkrementierungen durch das Intervall des Timers und nullst deine Zählervariable wieder. n/t ist im Prinzip schon die Frequenz.
plottermeier
Beiträge: 1457
Registriert: Fr 16. Aug 2013, 14:32

Re: Zählen mit Arduino

Beitrag von plottermeier »

Hallo,
hier gibt es weiter unten ein Beispiel dafür (Impcount):
http://forum.fhem.de/index.php?t=rview&goto=83400
Das kannst Du etwas modifizieren und dann die Millisekunden zwischen 2 Impulsen oder auch die Anzahl der Impulse in einer Sekunde ermitteln
(Je nachdem, wie schnell die Impulse kommen)
Kevin89
Beiträge: 45
Registriert: Di 10. Sep 2013, 18:40

Re: Zählen mit Arduino

Beitrag von Kevin89 »

Danke euch!

das werde ich mir morgen mal reindrehen...

jetzt ist erstmal Bettgehzeit :|
Benutzeravatar
Sascha
Beiträge: 673
Registriert: Di 13. Aug 2013, 15:20
Wohnort: Irgendwo bei Heilbronn

Re: Zählen mit Arduino

Beitrag von Sascha »

Wie schnell kommen denn die Impulse? Eher so paar pro Sekunde oder schneller?
Ich konnte jetzt auf die Schnelle nix finden, hab auf der Arduinoseite nur PulseIn() gefunden, was aber nicht ganz das macht was du brauchst. Der 16bit Timer hat diese Capturefunktion, hier auf Seite 120f beschrieben. Würde mich wundern wenn Arduino da kein API dafür hätte.
Mit jedem Interrupt über deinen Interrupt-Pin inkrementierst du eine Zählervariable n. Mit dem Timerinterrupt, der alle t ausgelöst, teilst du die Anzahl der Inkrementierungen durch das Intervall des Timers und nullst deine Zählervariable wieder. n/t ist im Prinzip schon die Frequenz.
Noch unperformanter gehts nicht oder? :)

Arduino hat gefühlt den Funktionsumfang eines ZX81, kann man da auch mehr als LEDs blinken lassen? ;)
SebiR
Beiträge: 472
Registriert: Di 13. Aug 2013, 18:34

Re: Zählen mit Arduino

Beitrag von SebiR »

Ich werde jetzt einfach mal nicht auf den Versuch einer Grundsatzdiskussion eingehen, still halten kann ich dennoch nicht.
Nur so viel: Der Arduino verfügt über den kompletten Funktionsumfang und die gleichen Möglichkeiten wie der genutzte ATMega. Und ja, LEDs blinken geht wunderbar.

Um die Impulse pro Zeiteinheit zu bestimmen, sollte das funktionieren. Und du kannst mir nicht erzählen, dass der Controller durch das ja anscheinend äußerst primitive Arduino in irgend einer Weise durch Zählen ausgelastet ist. Viel Perfomance braucht es nicht. Ob nun 1000000x oder 100000000x pro Sekunde gezählt werden könnte, spielt wohl keine Rolle.
Benutzeravatar
Fritzler
Beiträge: 12604
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Zählen mit Arduino

Beitrag von Fritzler »

@sebir,
keine Grundsatzdiskussion haben wellen aber wie nen gebissener Hund bellen, also Füße still halten und vllt mal was zum Thema beitragen ! :evil:

@Kevin
Wo hakts denn mit der Zeitberechnung?
Der AVR wird von einem Takt versorgt von sagen wir 16MHz, der Timer hat einen Taktvorteiler um aus diesen 16MHz andere Taktraten gewinne zu können.
Sagen wir er Teilt durch 256, also der Timer bekommt 62,5kHz.

Die zu messende Achse dreht sich mit 3600 Umdrehungen/min (=60 pro Sekunde).
Also kommen 60 Impulse/Sekunde vom Hallsensor.
Das macht also ~1040 Timerticks die im Register TCNT stehen.

Jetzt kann man das auch von hinten aufziehen.
Bei 16MHz hat eine Taktperiode 62,5ns (ganz schön wenig ;)).
Bei dem Timer haben wir uns ja 62,5kHz ausgesucht, das sind 16µs pro Timertick.
Alsooo: 1 Timertick = 16µs und 100 Timerticks = 1,6ms.
Bisher ja recht einfach.

Also unsere 1040 Timerticks sind 0,01664s dür unsere 60 Umdrehungen/s.

Jetz kommt aber eine andere Zahl vom Timer rein, sagen wir 5000.
Das sind dann 5000Ticks zu 16µs, also 0,08s.
1s/0,08s = 12,5 Umdrehungen/sekunde.

--> Also wenn ein Interrupt ausgelöst wird vom Hallsensor, dann den alten Timertickstand vom neuen abziehen (TCNT Register).
das ist dann die Vergangene Zeit und die Formel oben anwenden.

Ansonsten noch Lektüre:
http://www.mikrocontroller.net/articles ... ial:_Timer
http://www.mikrocontroller.net/articles ... er_des_AVR
http://www.rn-wissen.de/index.php/Timer ... _%28Avr%29

http://www.avr-tutorials.com/interrupts ... rogramming
http://www.mikrocontroller.net/articles ... Interrupts
Benutzeravatar
fiete
Beiträge: 91
Registriert: Di 13. Aug 2013, 13:32
Wohnort: Bremen

Re: Zählen mit Arduino

Beitrag von fiete »

Ich hatte das Problem auch und mein Codeschnippsel noch auf der Platte gefunden.

Bevor nun alle in großes Gelächter verfallen: Programmierung und ich mögen uns nicht so doll. Es ist vll nicht schön programmiert, aber es funktioniert.

Code: Alles auswählen

const int sensorPin = A0;    //Sensorpin ist A0
int sensorwert = 0;
int alterwert = 0;
int rpmcount = 0;
int value = 0;
int messen=0;
unsigned long int startzeit=0;
float rpm=0;
int rpm_speicher=0;
int vergleich=0;
unsigned long int messzeit = 0;
int fertig = 0;
float rpm1=0;
float rpm2=0;
float rpm3=0;

void setup() {
Serial.begin(9600);
}

void loop() {


if(messen==0) //Messung reset
{
  rpmcount=0;
  rpm_speicher=0;
  startzeit=millis();
  alterwert=0;
  messen=1;
  fertig=0;
  messzeit=0;
}
else
{
sensorwert = analogRead(sensorPin);  //messwert lesen
 
  if(sensorwert > 300) //Auswertung anfang
    {
      value = 1;
    }
else
    {
      value = 0;
    }
    
if(value != alterwert)
    {
      alterwert = value;
      
      if(value==1)
      {
      rpmcount++;
      //Serial.print("rpmcount: ");
      //Serial.println(rpmcount);       //Auswertung ende
    }
    }

if (((millis()-startzeit) >=1000) && (fertig==0))  //Abbruchbedingung nach 1 sec.
    {
    rpm_speicher = rpmcount;
    vergleich = rpmcount+1;
    fertig=1;
    //Serial.print("Signale/s: nach einer Sekunde");
    //Serial.println(rpm_speicher);  
    }  //abruchbedingung zu
  
if ((rpmcount==vergleich) && (fertig==1))    //Messen Zusatzzeit
    {
    messzeit=millis()-startzeit;
    rpm1=rpmcount*1000;
    rpm2=rpm1/messzeit;
    rpm3=(rpm2*60);
    rpm3=int(rpm3);
    Serial.print("RPM:  ");
    Serial.println(rpm3);
    
     
    messen=0;
    } //Messen zu
  
}  //else zu
} //loop zu
Ich hoffe ich konnte helfen...

Schöne Nacht noch!
Fiete
Kevin89
Beiträge: 45
Registriert: Di 10. Sep 2013, 18:40

Re: Zählen mit Arduino

Beitrag von Kevin89 »

Hallo,

dankeschön ich werds mal versuchen aber das ist so kompliziert, dass ich keine großen Hoffnungen habe das zeitnah zu kapieren... :?

Ich hatte eigentlich eher gehofft, dass es eine rel einfache Lösung mit einer Schleife gibt die dann praktisch jede sekunde von vorne anläuft und zum Schluss immer die Anzahl der Signale, die in der Sekunde angekommen sind ausspuckt.

Drehzahl wäre max 2000u/min sollte bei 16khz max. also noch deutlich im Rahmen liegen :mrgreen:
Benutzeravatar
fiete
Beiträge: 91
Registriert: Di 13. Aug 2013, 13:32
Wohnort: Bremen

Re: Zählen mit Arduino

Beitrag von fiete »

Ich hatte eigentlich eher gehofft, dass es eine rel. einfache Lösung mit einer Schleife gibt, die dann praktisch jede sekunde von vorne anläuft und zum Schluss immer die Anzahl der Signale, die in der Sekunde angekommen sind ausspuckt.
Naja. Ich habe dir fertigen Code präsentiert. Den kannst du so eins zu eins in ein Sketch kopieren, evt. die "Auswertschwelle" des Hallsenosors angleichen (bei mir steht er auf 300) und sofort im Serial Monitor deine Umdrehungen ablesen. Er liefert jede Sekunde (plus Bruchteil) ein Ergebnis.

Um ihn zu verstehen sind in dem Sketch noch mehrere Ausgaben auskommentiert. Das sind noch Arkefakte, die beim Entwickeln übrig geblieben sind. Einfach mal anschalten und im Serial Monitor mitverfolgen, was dort genau passiert.

Gruß
Fiete
Kevin89
Beiträge: 45
Registriert: Di 10. Sep 2013, 18:40

Re: Zählen mit Arduino

Beitrag von Kevin89 »

Ich war da gestern nur so überrant von , dass ich es erstmal begutachten musste :mrgreen:

Funktioniert aber sehr schön !

Ich sollte mich nur mal mit der Serialprint Funktion auseinandersetzen


gruß
plottermeier
Beiträge: 1457
Registriert: Fr 16. Aug 2013, 14:32

Re: Zählen mit Arduino

Beitrag von plottermeier »

Ja,
die ist praktisch, um in die Kiste reinzusehen.
Antworten