Hallo Leute, Ich habe vor mittels einer Refelxlichtschranke die Drehzahl/Geschwindigkeit eines Computerlüfters zu messen. Das ganze soll so funktionieren,dass ich mit 1 Lichtschranke eben durch die den lüfter ( die Lüfterblätter ) strahle und die Unterbrechungen zähle die durch die Lüfterblätter beim drehen verursacht werden. Das ganze soll mit Hilfe eines Arduino Uno R3 realisiert werden. Leider habe ich vom Programmieren in dieser Richtung keine Ahnung und hoffe hier jemanden zu finden der mir da einfach helfen kann....... Je einfacher das Programm desto besser ;) Der Lüfter hat 9 Lüfterblätter ! Ich denke diese Info braucht man um die Negativen / Positiven Flankenauswertung vorzunehmen. Besten Dank schonmal an die die mir helfen können ;)
Kauf dir das Lichtschranken-Shield und lade die zugehörige Lib runter, dann kannst du in deinem Sketch in der Aruino-Lichtschranken-Language programmieren.
Warum benutz du nicht den Tacho Ausgang des Lüfters um die Drehzahl zu bestimmen?
Ich muss das ganze in einem Projekt ausarbeiten..... dies sollte doch etwas mehr arbeit machen wie nur die Drehzahlleitung auszuwerten ;) Zudem muss ich verschiedene Arten der Geschwindigkeitsmessung/Drehzahlmessung aufzeigen. Und das mit der Refelxlichtschranke was so das günstigste Anschauungsmaterial :)
Paul schrieb: > Ich muss das ganze in einem Projekt ausarbeiten..... Ohne Dir Alles fertig zu zeigen, aber wenn Du die reziproke Messung verstanden hast, kannst Du noch viel ausarbeiten. http://www.mino-elektronik.de/fmeter/fm_software.htm#bsp7
Um dir eine erste Roadmap zu geben: - richte ein Pin so ein, dass bei Pegelwechsel ein Zähler inkrementiert wird - richte einen 1s-Timer so ein, dass bei dessen Auslösung Folgendes passiert: a) Einlesen des Zählerstandes in eine Variable b) Rücksetzen des Zählerstandes auf Null c) teilen des Variableninhaltes durch die Anzahl der Lüfterflügel d) Ausgabe des Zählerstandes auf Display oder UART - zurück zum Anfang So solltest du erste Schritte hinbekommen ...
Paul schrieb: > Ich muss das ganze in einem Projekt ausarbeiten..... dies sollte doch > etwas mehr arbeit machen wie nur die Drehzahlleitung auszuwerten ;) Genau genommen unterscheidet sich die Auswertung der Drehzahlleitung in nichts von der Auswertung der UNterbrechungen einer Lichtschranke. Oder dachtest du, auf der Drahzahlleitung schreibt der Lüfter im Klartext die Drehzahl raus? Die Drahzahlleitung ist nicht mehr als 1 Puls pro Umdrehung. Wie bestimmt man daraus die Drehzahl? Was ist überhaupt Drehzahl? Das ist die Anzahl der Umdrehungen pro Sekunde. Hat man also ein System, welches 1 (oder mehrere) Pulse in jeder Umdrehung erzeugt, wie bestimmt man dann naheligenderweise die Drehzahl? Man könnte zb 1 Sekunde lang mitzählen, wieviele Pulse kommen. Zählt man beispielsweise 20 Pulse in dieser 1 Sekunde und weiß man, dass pro Umdrehung lediglich 1 Puls kommt, dann hat man also eine Drehzahl von 20 Umdrehungen pro Sekunde. Das dann in U/min auszudrücken ist nur noch eine Umrechnung. Diese Art der Drehzahlmessung ist eine einfache Möglichkeit. Sie hat ihre Begrenzungen und Limitierungen, ist aber leicht verstehbar. > Leider habe ich vom Programmieren in dieser Richtung keine Ahnung Dann musst du das ändern. Ein Programm welches Pulse an einem Eingang zählt, ist jetzt nicht gerade Hexenwerk oder Raketentecchnik. > und hoffe hier jemanden zu finden der mir da einfach helfen > kann....... Je einfacher das Programm desto besser ;) Nö. Es ist dein Projekt. Du kannst gerne nachfragen, wenn du an irgendeinem Detail nicht mehr weiter kommst, aber Pulse zählen ist so trivial, dass musst du schon alleine können. Jeder der erfolgreich einen Eingang abfragen kann, schafft das. Lass erst mal die Sache mit der 1 Sekunde beiseite und programmier einfach nur einen Zähler, der bei jeder Unterbrechung der Lichtschranke um 1 weiterzählt. Und dann drehst du den Lüfter mit der Hand langsam durch und siehst nach, ob dein Programm funktioniert - der Zähler muss hochzählen. Damit gehts los: einfach nur die Unterbrechungen zählen. Die Sache, das dies nur 1 Sekunde lang passieren soll, kommt später.
:
Bearbeitet durch User
also ich hab jetzt schon mal hinbekommen das ich den Ausgang zählen kann, bzw die Pulse Zählen kann..... jedoch benötige ich eine Postive / Negative Flanke um auch genau 1 hochzuzählen bei einem Impulse/Lüfterblatt. Kann mir jemand Programmtechnisch mit einer Negativen Flanke weiterhelfen ? von der theorie des ganzen Problems hab ichs ja verstanden. Alles kein Thema. Der Grund warum ich hier schreibe ist ja die gedanken in eine Programmiersprache zu schreiben die ich leider nicht behersche !!! Und ich habe leider keine Zeit mir die jetzt noch groß beizubringen :(
Paul schrieb: > Und ich habe leider keine Zeit mir die jetzt noch groß beizubringen :( Dass ich Dich oben auf ein fertiges Programm für Arduino verwiesen habe, ist Dir wohl entgangen :-( Dort noch eine Division /9 (Lüfterblätter) einzufügen, dürfte kein Problem sein, wenn Du tatsächlich etwas verstanden hättest.
Paul schrieb: > also ich hab jetzt schon mal hinbekommen das ich den Ausgang zählen > kann, bzw die Pulse Zählen kann..... jedoch benötige ich eine Postive / > Negative Flanke um auch genau 1 hochzuzählen bei einem > Impulse/Lüfterblatt. Dann hast du es eben nicht hinbekommen. So einfach ist das. > Kann mir jemand Programmtechnisch mit einer Negativen Flanke > weiterhelfen ? Was ist denn eine Flanke? Eine Flanke liegt vor, wenn beim wiederholten Abfragen eines Eingangs sich der Pgel geändert hat. Um das feststellen zu können, wirst du dir also den Pegel in einer Variable merken müssen, damit du beim nächsten Durchlauf durch loop() den Vergleich anstellen kannst. > von der theorie des ganzen Problems hab ichs ja verstanden. Das wage ich mal zu bezweifeln. Du magst eine vage Ahnung haben, aber ob man das 'begreifen' nennen kann .... > Alles kein > Thema. Der Grund warum ich hier schreibe ist ja die gedanken in eine > Programmiersprache zu schreiben die ich leider nicht behersche !!! Du kennst keine Variablen? Du weißt nicht, wie du einen Eingang abfrägst? Du kennst kein if? Dann ändere das. > Und ich habe leider keine Zeit mir die jetzt noch groß beizubringen :( Dann hast du Pech. Wer Bildhauerarbeiten machen möchte/muss muss zuerst den Umgang mit Hammer un Meissel und alle anderen Techniken beherrschen, die man als Amateur-Bildhauer so braucht
1 | unsigned char ZustandVorher; |
2 | |
3 | void setup() |
4 | {
|
5 | ....
|
6 | |
7 | ZustandVorher = digitalRead( .... ); |
8 | }
|
9 | |
10 | void loop() |
11 | {
|
12 | unsigned char ZustandJetzt; |
13 | |
14 | ZustandJetzt = digitalRead( ... ); |
15 | |
16 | if( ZustandVorher != ZustandJetzt ) // gab es eine Veränderung? |
17 | {
|
18 | // Ja gab es
|
19 | |
20 | if( ZustandJetzt == LOW ) // was war die Veränderung? |
21 | // war es ein Wechsel
|
22 | // a) von Low auf High
|
23 | // b) oder von High auf Low
|
24 | {
|
25 | |
26 | // Es war ein Wechsel von High auf Low
|
27 | // im Volksmund auch eine 'fallende Flanke' genannt
|
28 | ....
|
29 | }
|
30 | |
31 | ZustandVorher = ZustandJetzt; // den jetzigen Zustand merken, damit |
32 | // im nächstem Durchlauf durch loop
|
33 | // mit dem dann vorliegenden Zustand
|
34 | // verglichen werden kann
|
35 | }
|
36 | }
|
:
Bearbeitet durch User
1 | const int inputPin = 2; |
2 | const int outputPin = 13; |
3 | |
4 | volatile int Impulse=0; // Variablen, die von Interruptroutinen angefasst werden, sollten "volatile" deklariert werden |
5 | volatile unsigned long lastTime=0; // Zeitpunkt der letzten steigenden Flanke, nötig zum Entprellen |
6 | volatile int Umdrehungen=0; |
7 | volatile long Zeit_start; |
8 | volatile long Zeit_stopp; |
9 | volatile long Zeit_Umdrehung; |
10 | volatile long Zeit_sek; |
11 | volatile long Zeit_min; |
12 | volatile long Drehzahl; |
13 | |
14 | |
15 | void setup() |
16 | {
|
17 | pinMode(outputPin, OUTPUT); |
18 | pinMode(inputPin, INPUT); |
19 | Serial.begin(9600); |
20 | |
21 | attachInterrupt(0, keyPressed, RISING); // 0 ist der Interrupt für Pin 2, bei jeder steigenden Flanke wird keyPressed() aufgerufen |
22 | }
|
23 | |
24 | void keyPressed() // state hochzählen, falls mindestens 50ms seit der letzten Flanke vergangen sind |
25 | {
|
26 | unsigned long now = millis(); |
27 | if (now - lastTime > 50) // entprellen |
28 | {
|
29 | Impulse++; |
30 | Umdrehungen = Impulse / 3; //Anzahl Lüfterblätter 3 |
31 | |
32 | if (Impulse = 1) |
33 | Zeit_start = millis(); //Zeit starten beim ersten Impuls (positive Flanke) |
34 | |
35 | if (Umdrehungen = 1) //Wenn 1 Umdrehung |
36 | Zeit_stopp = millis(); //Zeit stoppen |
37 | |
38 | Zeit_Umdrehung = Zeit_start - Zeit_stopp; //benötigte Zeit für eine Umdrehung in ms |
39 | |
40 | |
41 | Zeit_sek = Zeit_Umdrehung / 1000; //Umrechnen von ms in s |
42 | Zeit_min = Zeit_sek * 60; //Umrechnen von s in min |
43 | |
44 | Drehzahl = 1 / Zeit_min; //Drehzahl errechnen |
45 | |
46 | Serial.println(Drehzahl); |
47 | }
|
48 | lastTime=now; |
49 | }
|
50 | |
51 | |
52 | void loop() |
53 | {
|
54 | |
55 | }
|
Das ist das Programm bisher. Die Impulse und Umdrehungen kann ich messen. Nun geht es darum das ich das ganze in U/min umrechne. Leider gibt er mir bei der Ausgabe am Ende nur " ( -1 ) aus. Wieso ist das so ? Stimmt was mit meiner Rechnung nicht ?
:
Bearbeitet durch User
Das hier
1 | if (Impulse = 1) |
2 | ...
|
3 | |
4 | if (Umdrehungen = 1) //Wenn 1 Umdrehung |
sind Zuweisungen und keine Vergleiche. Ein Vergleich auf Gleichheit schreibt sich in C++ als == und nicht als =
1 | if (Impulse == 1) |
2 | ...
|
3 | |
4 | if (Umdrehungen == 1) //Wenn 1 Umdrehung |
ok stimmt !! Danke das war mal ein Fehler :) Nur leider Funktioniert das trotzdem nicht so....... Irgendwie speichert sich die Zeit beim ersten Impuls ab, jedoch bei der ersten Umdrehung (sprich 3 Impulse) nicht mehr. Gibt es einen anderen Weg um die Zeit zwischen dem ersten und dem dritten Impuls zu messen ?
Paul schrieb: > ok stimmt !! > Danke das war mal ein Fehler :) > > > Nur leider Funktioniert das trotzdem nicht so....... > Irgendwie speichert sich die Zeit beim ersten Impuls ab, jedoch bei der > ersten Umdrehung (sprich 3 Impulse) nicht mehr. Logisch. 'Impulse' wird ja auch nie wieder 1 :-) Aber: Hinweis Die Endzeit eines Messvorgangs ist automatisch Startzeit des jeweils nächsten Messvorgangs. Hinweis2 Du willst nicht die Drehzahl bei jedem Puls erneut ausrechnen. Denn die kann sich sowieso da nicht ändern. Ein Ausrechnen der Drehzahl macht nur dann Sinn, wenn du eine neue Endzeit hast. > > Gibt es einen anderen Weg um die Zeit zwischen dem ersten und dem > dritten Impuls zu messen ? Wie wäre es mit einem korrekten Programm? So wie du programmierst, kannst du davon ausgehen dass (wenn die grundsätzliche Idee stimmt) du Fehler im Programm hast. Die grundsätzliche Idee ist schon ok, aber sie ist falsch umgesetzt. Du musst dir erst mal klar machen, wie die grundsätzliche Idee eigentlich funktioniert - das scheint mir nicht wirklich der Fall zu sein. Dann klappt es auch mit der Umsetzung. Einfach was hinzuschreiben, das hat gerade bei Neulingen noch nie funktioniert. Tip Oft hilft es, wenn man sich erst mal klar macht, wie man selber (als Person) die Aufgabenstellung lösen würde. Also: du hast eine Signal, dass in regelmässigen Abständen kommt und du hast eine Armbanduhr. Du weisst ferner, dass immer 3 Signalpulse zusammengehören und eine Umdrehung darstellen. Wie gehst DU vor um daraus die Drehzahl (laufend) zu errechnen?
1 | Ereignis Ablesung von der Uhr (Sekunden) |
2 | Puls 3 |
3 | Puls 5 |
4 | Puls 7 |
5 | Puls 10 |
6 | Puls 12 |
7 | Puls 15 |
8 | Puls 19 |
9 | ... |
welche Drehzahlen hast du gemessen. Wenn DU selbst die Aufgabe lösen kannst, hast du offensichtlich das Prinzip verstanden und kannst das auch programmieren, nachdem du dir klar gemacht hast, wie du vorgegangen bist. Dein Hilfsmittel sind Bleistift und Papier, auf dem du dir Werte notieren darfst. Du darfst alle Werte von deinem Papier benutzen wann immer du sie brauchst, du darfst aber nicht dein Gedächtnis für irgendwas benutzen. Das Papier ist dein Gedächtnis. Wenn du dir irgendwas für 'später' merken willst, dann musst du es aufschreiben. Du musst dir alles in geeigneter Form aufschreiben. Du hast zb. nicht das Wissen (weil du ja kein Gedächtnis hast) das jetzt gerade der dritte Puls reinkommt. Wenn du diese Information zur Verarbeitung brauchst, dann muss es auf deinem Papier irgendwo eine Stelle geben an der die jeweilige Pulsnummer steht und die du bei jedem Puls um 1 erhöhst. So ist das gemeint mit "du hast kein Gedächtnis". Also, du bearbeitest jetzt ein Ereignis
1 | Puls 3 |
was machst du damit? Was notierst du dir? Dann kommt das nächste Ereignis
1 | Puls 5 |
was machst du damit? Warum machst du genau das damit? Als nächstes kommt
1 | Puls 7 |
wie ist das jetzt? Was machst du damit? Warum?
1 | Puls 10 |
etc. etc. Wenn bei deinem Vogehen dann auch die 2.te Drehzahlberechnung das korrekte Ergebnis liefert, dann kann man auch davon ausgehen, dass das Verfahren insgesammt stimmt. Nur mit dem Erhalt des ersten Ergebnisses ist das noch nicht gesichert.
:
Bearbeitet durch User
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.