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?
:
Bearbeitet durch User
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²
:
Bearbeitet durch User
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ß)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.