Forum: Mikrocontroller und Digitale Elektronik Drehzahlmesser Arduino


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Niang (Gast)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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ß)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.