Forum: Mikrocontroller und Digitale Elektronik Drehzahlmesser Arduino


von Niang (Gast)


Lesenswert?

Hallo,

Ich möchte die Drehzahl eines Zahnrades mit dem Arduino Uno.

Schaltung mit Hall-sensor und Pull-Up widerstand ist aufgebaut
Der Zahnrad hat 18 Zähne, und eine Drehzahl von0 bis max
800 Umdrehungen.

Ich bräuchte sogesehen nur den passenden Code.


Kann mir dabei bitte jemand helfen?
MFG

von Brain 2.0 (Gast)


Lesenswert?

Niang schrieb:
> Kann mir dabei bitte jemand helfen?

Wie sollen wir dir helfen ?
Wie du die IDE startest ?
Oder wie du den Sketch eintipst ?
Oder wie du in Google den passenden Sketch findest ?

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Was funktioniert denn schon?

Bekommst Du eine LED zum Blinken, wenn ein Zahn 'vorbei flitzt'?

Wie würdest Du die Sache logisch versuchen zu lösen?

Wenn Dein Lösungsvorschlag Sinn ergibt, gibt es bestimmt hier Einen, Der 
Dir Das in 'Arduino' um münzt.
Aber ein 'Hier mein Problem, wo ist mein Code' kommt echt nicht gut - so 
gar keine Vorleistung ist echt Wenig.

MfG

von Sim J. (unimetal)


Lesenswert?

Rein prinzipiell:

Frequenz max. 18*800/60=240Hz
Also eine Periodendauer von ca 4ms.
Würde da nicht mehr auf Polling setzen, sondenr auf interrupts.

Entsprechend erstellst du einen Interrupt (Rising), der immer, sobald er 
ausgelöst wird, den Zähler um eins erhöht.

Nach einer gewissen Zeit (zum beispiel X=1s, jenachdem, wie oft Drehzahl 
benötigt), teilst du die Gezählten Inpulse aus dem Zähler durch 18 und 
multiplizierst mit (60/X), um auf die RPM zu kommen. natürlich setzt du 
den Zähler jetzt wieder auf null.

Beste Grüße

PS: Fang doch einfach mal an und wir sagen dir, was daran nicht 
funktionieren kann. Du willst doch auch was lernen oder nicht?

: Bearbeitet durch User
von Dietrich L. (dietrichl)


Lesenswert?

Niang schrieb:
> Schaltung mit Hall-sensor ...
> Der Zahnrad ...

Hast Du auch bedacht, dass neben Hall-Sensor und Zahnrad noch ein Magnet 
erforderlich ist?

von Wolfgang (Gast)


Lesenswert?

Sim J. schrieb:
> Frequenz max. 18*800/60=240Hz
> Also eine Periodendauer von ca 4ms.
> Würde da nicht mehr auf Polling setzen, sondenr auf interrupts.

Primär würde man die Zeit erstmal mit der Capture Funktion eines Timers 
messen. Den Interrupt kann man immer noch bemühen. Für die eigentliche 
Messung eignet der sich wegen Jitter nur unbedingt - jedenfalls wenn es 
etwas genauer sein soll.

von Niang (Gast)


Lesenswert?

Dietrich L. schrieb:
> Niang schrieb:
>> Schaltung mit Hall-sensor ...
>> Der Zahnrad ...
>
> Hast Du auch bedacht, dass neben Hall-Sensor und Zahnrad noch ein Magnet
> erforderlich ist?

 Nö da mein Hall-sensor aus Permanent-Magnet besteht.



Ich wollte nur paar tipps um zu wissen  wie ich mit programmierung 
anfangen soll.

Sim J. schrieb:
> Rein prinzipiell:
>
> Frequenz max. 18*800/60=240Hz
> Also eine Periodendauer von ca 4ms.
> Würde da nicht mehr auf Polling setzen, sondenr auf interrupts.
>
> Entsprechend erstellst du einen Interrupt (Rising), der immer, sobald er
> ausgelöst wird, den Zähler um eins erhöht.
>
> Nach einer gewissen Zeit (zum beispiel X=1s, jenachdem, wie oft Drehzahl
> benötigt), teilst du die Gezählten Inpulse aus dem Zähler durch 18 und
> multiplizierst mit (60/X), um auf die RPM zu kommen. natürlich setzt du
> den Zähler jetzt wieder auf null.
>
> Beste Grüße
>
> PS: Fang doch einfach mal an und wir sagen dir, was daran nicht
> funktionieren kann. Du willst doch auch was lernen oder nicht?

Das mache ich danke :) aber Die Periodendauer wurde mit attachInterrupt 
gezählt oder ?

von Niang (Gast)


Lesenswert?

ich habe Fehlermeldung bei countimpulse in loop :S
Da ich nicht viel mit prgrammierung zu tun hatte , bitte euch  um mich 
zu helfen meine Sketch  sauber zu programmieren :S
danke


#include  <Wire.h>


volatile unsigned long periode=0;
volatile unsigned long precedtmp =0;
float nbtourMaximum =0;
float nbtour;

void setup() {
Serial.begin(9600);
pinMode(2,INPUT);
pinMode(2,INPUT_PULLUP);
attachInterrupt(0,compteur,RISING); //reagiere auf steigende Flanken auf 
PIN 2
}



void loop() {
  interrupts();
  if (countimpulse <=18){
    nbtour= 600000*countimpulse/18*periode
    coutimpulse=0;
     }else if (countimpulse=0){
      nbtour=0;
     }

 if (nbtour > nbtourMaximum) nbtourMaximum = nbtour;
 Serial.print(Drehzahl);
 Serial.println(DrehzahlMaximum);

}
void compteur(){
  int countimpulse=0;
  unsigned long starttmp = millis();
  if (starttmp > precend-tmp){
    periode = starttmp - precedtmp;
    precedtmp =starttmp;
      countimpulse++;
  }


}

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Niang schrieb:
> ich habe Fehlermeldung bei countimpulse in loop :S

Und Die wäre?

Weiter ist Dein Post schwer zu Lesen - von Verstehen ganz zu schweigen.

Kleiner Tip: (bin alt genug, Tip mit einem P zu schreiben)
If countimpuls<=18 (ALLES, was kleiner oder gleich 18 ist)

ELSE (wird kaum ausgeführt, wenn countimpulse nur mit Mühe die 18 
erreicht)

Dann fragst Du im ELSE-Zweig au, ob (countimpulse=0) ist - Das ist IMMER 
wahr, da Du hier der Variable 'countimpulse' den Wert Null zuweist 
(einfaches Gleichheitszeichen) und wenn Das gaklappt hat (und Das 
klappt), bekommst Du ein 'true' zurück für den Erfolg dieser Zuweisung.

Du möchtest (countimpulse==0) - also eine PRÜFUNG, ob countimpulse Null 
ist.

Wie schon geschrieben ist ==0 auch schon in <=18 enthalten und ntbtour 
wird bei der Berechnung auch auf Null gesetzt - Du kannst Dir den 
Else-Zweig also komplett sparen.

MfG

Edit
Im Interrupt definierst Du countimpulse mit
int countimpulse=0
Dann zählst Du countimpulse +1 --> =1
Beim nächsten Interrupt initialisierst Du countimpulse mit
int countimpulse=0
Dann zählst Du +1 --> jupp, wieder EINS

Denke, die Definition sollte wesentlich früher im Programm stehen und 
wird wohl auch 'volatile' (oder so) deklariert werden müssen, da der 
Interrupt JEDERZEIT zuschlagen kann und im Programm so deshalb der Wert 
bei jedem Zugriff aus dem Speicher ausgelesen werden muß.

MfG²

: Bearbeitet durch User
von Ach Du grüne Neune (Gast)


Lesenswert?

Patrick J. schrieb:
> MfG²

MfG² ist zwar im Prinzip pfiffig formuliert, aber wenn die freundlichen 
Grüße nicht 100%ig sitzen, sondern zum Beispiel nur zu 90%, dann sind es 
0,9 x 0,9 = 0,81 = 81%. Und schon sind die freundlichen Grüße 
versehentlich nicht mehr ganz so freundlich wie man sie eigentlich 
formulieren wollte.  :)

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Ach Du grüne Neune schrieb:
> Und schon sind die freundlichen Grüße
> versehentlich nicht mehr ganz so freundlich wie man sie eigentlich
> formulieren wollte.  :)

MfG³ ;) (nur Spaß)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.