Hallo, Ich möchte die Drehzahl einer Lochscheibe mit dem Arduino Nano überwachen, und auf ein LCD ausgeben. Schaltung mit Lischtschranken und Schmidt Trigger ist aufgebaut und gibt ein sauberes Rechteck aus. Die Scheibe hat 12 Löcher, und eine Drehzahl von knapp 1000 bis max 20.000 Umdrehungen. Ich bräuchte sogesehen nur den passenden Code. Kann mir dabei bitte jemand helfen?
Nick S. schrieb: > Hallo, > > Ich möchte die Drehzahl einer Lochscheibe mit dem Arduino Nano > überwachen, und auf ein LCD ausgeben. > > Schaltung mit Lischtschranken und Schmidt Trigger ist aufgebaut und gibt > ein sauberes Rechteck aus. > > Die Scheibe hat 12 Löcher, und eine Drehzahl von knapp 1000 bis max > 20.000 Umdrehungen. > > Ich bräuchte sogesehen nur den passenden Code. Dann würde ich an deiner Stelle anfangen zu programmieren. So gesehen.
Gast
#4051255
Nick S. schrieb: > Ich bräuchte sogesehen nur den passenden Code. Ja, genau .... das ist schnell erledigt. Das Forum entwickelt für dich. Nick S. schrieb: > Schaltung mit Lischtschranken und Schmidt Trigger ist aufgebaut und gibt > ein sauberes Rechteck aus. Bis über 200 KHz ...... sicher ?
Arduinoquäler schrieb: > Bis über 200 KHz ...... sicher ? 4 kHz sollten reichen!
Gast
#4051280
Arduinoquäler schrieb: > Ja, genau .... das ist schnell erledigt. Das Forum entwickelt für dich. Schon fertig, http://www.mikrocontroller.net/articles/Drehzahlmesser muss er nur noch aber nicht von dir, denn du... > Bis über 200 KHz ...... sicher ? ...kannst nicht mal Sekunden und Minuten auseinanderhalten.
Gast
#4051289
MaWin schrieb: > ...kannst nicht mal Sekunden und Minuten auseinanderhalten. Was kann ich denn noch alles nicht .....
Gast
#4051293
MaWin schrieb: > ...kannst nicht mal Sekunden und Minuten auseinanderhalten. Von Minuten war nicht die Rede. Default-Zeiteinheit ist Sekunde.
Gast
#4051311
Arduinoquäler schrieb: > Was kann ich denn noch alles nicht Offensichtlich eine Menge, denn du merkst noch nicht mal, wenn man dich vorsichtig auf deinen Fehler aufmerksam macht und hast es immer noch nicht begriffen. Merkbefreit.
Die Schaltung von http://www.mikrocontroller.net/articles/Drehzahlmesser ist ganz was anderes. Ich habe einen Arduino Nano, und brauche den entsprechenden Code dazu. Umdrehungen beziehen sich auf eine Minute, wenns Anfangs keine 20.000 upm schafft ist egal, sonst kann ich eine Lochscheibe mit nur einem Loch montieren. Wär nur schön wenn ich bis knapp unter 1000U/min eine Anzeige auf einem LCD hätte. Es handelt sich um ein 2x16 Zeilen LCD, das ist in den Arduinobeispielen dabei, aber kennen mich damit zuwenig aus, bzw funktioniert kaum ein Programm von mir :( lg
Gast
#4051364
Um wenigstens etwas konstruktives beizutragen: http://www.pyroelectro.com/tutorials/tachometer_rpm_arduino/ Wenn Du etwas Englisch verstehst ... Deine Anpassung wäre also (time*7) durch (time*12) zu ersetzen - und die richtigen PINs auszuwählen.
Hallo Dieter, danke für den Link, habs nach langer Fehlersuche tatsächlich hinbekommen, Bild im Anhang :) Aber die Verzögerung ist jenseits von gut und böse, gibts irgenwo ein Tut mit dem Capture Register und Compare Match, etc? In diesem Thread Beitrag "Re: Zündkurve verstellen beim 2Takter" hat mir Max.D schon einiges an Anregungen gegeben, aber selber schaff ich das leider nicht :( Lg, Kolbi
Gast
#4052262
Arduinoquäler schrieb: > Default-Zeiteinheit ist Sekunde. Seit wann gibt es Default-Einheiten?
Gast
#4052338
Nick S. schrieb: > Aber die Verzögerung ist jenseits von gut und böse Ja, da wird mit Absicht verzögert - nicht unbedingt optimal ... wie eigentlich der komplette Code, wenn man genauer hinschaut. Ich habe keine Ahnung, ob micros() in float kommen - aber das einfach mal übernommen (bin kein Arduino-Nutzer). Probier mal ...
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
Glücklich bin ich mit der Lösung nicht - wenn ca. 7000 Umdrehungen pro Minute überschritten werden geht es "in die Hose". Aus Performance-Gründen würde ich die "Alternative" ausprobieren ... Wie geschrieben bin ich kein Arduino-Spezialist und würde es wohl auf "normaler" AVR-Ebene anders lösen. Hoffentlich schaut Karl-Heinz hier nicht hin, sonst bekomme ich Hiebe :-)
Gast
#4052416
Übrigens: Interessant, was Du da gebaut hast. Habe mir den 2-Takter-Thread auch mal angeschaut. Da bin ich aber mechanisch deutlich zu weit entfernt ... bin zwar vor Ur-Zeiten mal Quickly gefahren (immer eine Vergaser-Füllung weit), aber das ist lange her :-)
Gast
#4052476
Thomas W. schrieb: > Seit wann gibt es Default-Einheiten? Seit Sternzeit 153498.45798,54 oder so ...
Leider funktioniert da was nicht, ich bekomme die Fehlermeldung: error: cannot convert 'long unsigned int()' to 'float' in assignment Wenns am Arduino liegt dass das so aufwändig ist, dann kauf ich mir gern andere Hardware... Lg
Gast
#4052505
Nick S. schrieb: > ich bekomme die Fehlermeldung: error: > cannot convert 'long unsigned int()' to 'float' in assignment Kannst Du bitte mal das KOMPLETTE aktuelle Coding plus ALLE (Fehler)-Meldungen hier einstellen? Danke ... Nur zur Information: Mit der Meldung selbst (ohne Zeilen-Referenz) kann niemand etwas anfangen. Die Zeilen-Referenz bringt auch nur etwas, wenn man das komplette, zugrunde liegende Coding kennt ...
Gast
#4052515
Nick S. schrieb: > ich bekomme die Fehlermeldung: error: > cannot convert 'long unsigned int()' to 'float' in assignment Und was steht in der betreffenden Code-Zeile Dieter Frohnapfel schrieb: > Ich habe keine Ahnung, ob micros() in float kommen - aber das einfach > mal übernommen (bin kein Arduino-Nutzer). Google kennst du? "arduino micros" hilft in diesem Fall weiter ;-) http://arduino.cc/en/reference/micros
Gast
#4052520
Wolfgang A. schrieb: > Google kennst du? Nö, was ist das? Du kannst ja gerne weiterhelfen, da Du ja optimal informiert bist :-) Ich klinke mich damit aus ...
Gast
#4052522
Wolfgang A. schrieb: > Und was steht in der betreffenden Code-Zeile Aber Lesen kannst Du schon Dieter Frohnapfel schrieb: > Kannst Du bitte mal das KOMPLETTE aktuelle Coding plus ALLE > (Fehler)-Meldungen hier einstellen? Danke ... gut, das freut mich, mach mal weiter ... und gute Nacht etc. an alle
Leute, Leute, bitte lockerbleiben, Gefühle haben hier nix verloren, nur Technik bitte! ^^ Ich wollte mit meinem letzen Post wirklich nicht undankbar klingen oder so, danke an alle, die sich bisher die Mühe gemacht haben da was weiterzubringen! Hier die komplette Fehlermeldung: Drehzahlmesser.ino: In function 'void fan_interrupt()': Drehzahlmesser.ino:63:14: error: cannot convert 'long unsigned int()' to 'float' in assignment Error compiling. Ganz schlau werde ich daraus nicht, ist der Fehler in Zeile 63, oder wie ist das zu verstehen? Keine Ahnung ob der Schmitt-Trigger nötig ist, werds demnächst ohne probieren und berichten. Lg!
Gast
#4052909
O.K. - ein paar minus-Bewertungen kann ich noch gebrauchen :-) Lt. Gurgel soll es also unsigned long sein - daher:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
Wieso bei Dir die volatile float-Deklarationen zu Beginn keine Fehlermeldung auslösen ist mir allerdings ein Rätsel (es sei denn, Du hast die gar nicht übernommen ... aber Deinen Code kann ich ja nicht sehen ...) Habe noch ein "time = 0" eingebaut, damit nicht unsinnig bei jedem Durchlauf gerechnet wird.
Gast
#4053285
Dieter Frohnapfel schrieb: > Habe noch ein "time = 0" eingebaut, damit nicht unsinnig bei jedem > Durchlauf gerechnet wird. Dafür kriegst Du ein dickes Minus für das time = 0!
Es geht auch ohne Schmitt Trigger, wieder ein Bauteil gespart ;) Da ich die Wertemittelung eigentlich gar nicht brauche, hab ich den Code dementsprechend geändert:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
Zum messen hoher Drehzahlen würd ich die Drehzahl einfach auf 10er oder 100er Stellen runden. Herzlichen Dank für die Hilfe, Projekt fertig! :) Lg
Sorry, hab das alte Programm erwischt, so müssts gehn:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
2 Dinge In loop() willst du die Endlosschleife
1 | |
nicht haben. Das Arduino Framework ist so aufgebaut, dass es dir ein main() vorgibt, welches vom Prinzip her so aussieht
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
Die obligate Endlosschleife steckt bereits in diesem vorgegebenem main() drinnen, welches du nicht selbst schreibst. D.h. die Funktion loop() wird laufend ohne dein Zutun aufgerufen und das willst du auch so haben, damit das Framework die Chance kriegt ihre eigene Buchhaltung zu erledigen. Dein
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
ist daher kontraproduktiv. Denn genau letzters, dem Framework die Möglichkeit zu geben ihre eigenen Dinge zu erledigen, unterbindest du damit. Das andere ist der delay, den du da drinnen hast. Du willst keinen delay haben (ausser ganz kurze)! Denn in dieser Zeit kann der µC nichts anderes machen als Däumchen drehen und noch ISR abarbeiten. Das ist dir aber zu wenig. Zeitsteuerungen im Arduino Framework funktionieren so (am Beispiel mit Millisekunden
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
Auf die Art vermeidest du das unproduktive Däumchen drehen. Das Prinzip ist simpel: Wenn du alle 5 Sekunden eine Aktion machen willst und deine Uhr hat bei der letzten Aktion den Sekundenzeiger auf 20 gehabt, dann ist die nächste Aktion fällig, wenn der Sekundenzeiger auf 25 steht. Was anderes hast du im Prinzip hier
1 | |
2 | |
3 | |
4 | |
5 | |
auch nicht gemacht. Nur dass natürlich die Verwendung von float an dieser Stelle den programmtechnischen Supergau darstellt und du nicht 2 mal micros() aufrufen willst, weil du ja keine Gewähr hast, dass sich der Wert in der Zwischenzeit nicht geändert hat (mal abgesehen vom unnötigen Zeitbedarf für den Aufruf)
Leider blicke ich nicht ganz durch.. Kannst du bitte den kompletten Sketch posten? Dann könnt ich das vergleichen und probieren. Lg!
Nein. Sorry. Es ist dein Projekt und du lernst gefälligst programmieren. Ausserdem denke ich, dass ich mehr als ausführlich die Motivation und die Hintergünde geschildert habe. Einfach Copy&Paste und gut ist spielt es bei mir nicht mehr. Nicht auf diesem simplen Schwierigkeitsgrad.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
