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
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 ?
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
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?
Niang schrieb:> Schaltung mit Hall-sensor ...> Der Zahnrad ...
Hast Du auch bedacht, dass neben Hall-Sensor und Zahnrad noch ein Magnet
erforderlich ist?
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.
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 ?
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++;
}
}
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²
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. :)
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ß)