Habe da einige Probleme und Fagen zu der Optimierung meines Atmega16 Drehzahlmessers. Zur Erläuterung: Mit meinem Drehzahlmesser kann ich 2 von einander unterschiedliche Drehzahlen (Motordrehzahl, Geschwindigkeit) messen und diese auf ein LCD anzeigen lassen. Die Werte auf dem LCD stimmen mit der Drehzahl des Motors und der reellen Geschwindigkeit überein. Jetzt zu meinen Problemen: 1. Da ich mittels Pollig die einzelnen Drehzahlen nacheinander messe bleibt mein Programm z. B. in der Erfassung der Geschwindigkeit hängen, wenn der Wagen steht, da er auf einen Impuls wartet. Habe es schon mit dem Befehl „goto“ und if-Anweisung versucht. Goto wird aber irgendwie nicht akzeptiert. Wie komme ich aus der Zählschleife raus um dennoch die Motordrehzahl zu messen, auch wenn der Wagen steht? 2. Derzeit deklariere ich die Variablen noch in „INT“ um aber eine genauere Berechnung durchführen zu können würde ich gerne „FLOAT“ verwenden. Mit Float-Variablen gibt mir das LCD aber nur noch „0“ aus. 3. Bei der Geschwindigkeitsberechnung muss ich die Teilergebnisse in mehrere Variablen schreiben, damit ich überhaupt die Geschwindigkeit errechne kann. Warum ist das so? Bei der Drehzahl klappt das alles in einer Formel. Gruß Daniel
Daniel wrote: > 1. Da ich mittels Pollig die einzelnen Drehzahlen nacheinander messe > bleibt mein Programm z. B. in der Erfassung der Geschwindigkeit hängen, Um das richtig zu lösen, würde man z.N. mit einem Timer arbeiten und mit dem eine Torzeit festlegen in der die eigentliche Messung stattfinden darf. Man kann sogar die Hardware des µC z#hlen lassen und nur das Ergebnis abholen (TIMER/COUNTER Interrupts). Die Drehzahl ergibt sich dann durch die Anzahl der Impulse (Signalflanken) innerhalb der Torzeit. Du kannst z.B. hingehen und in der while-Schleife zusätzlich die count Werte überprüfen. Wenn du unrealistisch hohe Werte bekommst, heisst das, das Fahrzeug steht bzw. bewegst sich langsamer als deine unterste, selbst festgelegte Messgrenze. Denk auch an die beiden vorangehenden while--Schleifen, die zum Synchronisieren auf die eigentlich LOW-Phase bei der Messung vorbereiten! > 2. Derzeit deklariere ich die Variablen noch in „INT“ um aber eine > genauere Berechnung durchführen zu können würde ich gerne „FLOAT“ > verwenden. Mit Float-Variablen gibt mir das LCD aber nur noch „0“ aus. Warum das mit float genauer gehen soll, leuchtet mir im Moment nicht ein. Float-Rechnung benötigt aber mehr Programmplatz und ist langsamer. die fehlerhafte Anzeige kann an mehreren Dingen liegen - ungeeignete Umwandlungsfunktion von float zu String oder fehlerhafte Definition der variablen oder ungeschickte Anweisungen (Formeln). > 3. Bei der Geschwindigkeitsberechnung muss ich die Teilergebnisse in > mehrere Variablen schreiben, damit ich überhaupt die Geschwindigkeit > errechne kann. Warum ist das so? Bei der Drehzahl klappt das alles in > einer Formel. Insbesondere bei der Rechnung mit Ganzzahlen kann es zu Rundungsproblemen und Überlauf des Zahlenbereichs kommen. Die mehrstufigen Formeln bei der Geschwindigkeit sind eventuell so angelegt, dass diese Probleme minimal sind. Vielleicht hilft es solche Rechnungen mal mit Papier und Bleistift durchzunudeln...
Erstmal vielen Dank für deine Antwort. Mein Erstes Problem, in dem ich nicht wusste wie ich aus der Schleife rauskomme hat sich erledigt. Habe es doch mit dem „goto“ hinbekommen. An einen Timer, der bei einem Interrupt die Schleife verlässt habe ich auch schon gedacht. Im Grunde ist es ja das gleiche. Mein Zähler zählt bis zu einem bestimmten Wert. Wenn er überschritten wird springt er direkt in die nächste Zählschleife. Und setzt die Geschwindigkeit ohne Rechnung auf „0“. Zu meinem Problemen 2 und 3. Das mit INT (Ganzzahlen) Rundungsfehler auftreten war mir klar. Deswegen sollten ja bei float (Fließkomma) der Rundungsfehler geringer werden. Durch die Rundungsfehler steigt meine Drehzahl in 80-150er Schritten und die Geschwindigkeit in 5-7er Schritten. Meiner Meinung nach, etwas zu große Schritte.
>Habe es doch mit dem „goto“ hinbekommen. Es lebe der Spaghetti-code! >Wenn er überschritten wird springt er direkt in die nächste Zählschleife. Das geht evtl sogar, ist aber Murks! >Das mit INT (Ganzzahlen) Rundungsfehler auftreten war mir klar. Dafür gibt es "Pseudofloat". Du arbeitest mit Integerwerten, diese sind aber auf ein Hunderstel normiert. Also die Angabe int=32124 bedeutet eigentlich 321,24 [Einheit]. Bei der Ausgabe auf das Display wird einfach an geeigneter Stelle ein Komma eingefügt... >Meiner Meinung nach, etwas zu große Schritte. Deshalb sollte man vorher mal Rechnen! Du brauchst die Kalibrierfunktion und deren Ableitung sagt etwas über die Genauigkeit aus! Dann weißt du wie genau du messen musst, um eine bestimmte Genauigkeit bei der Drehzahl/Geschw. hinzubekommen. (Du kannst natürlich unendlich viele Stellen anzeigen, diese Genauigkeit wird aber nur vorgegaukelt! Digital sei Dank..) GIb mir paar Werte und ich rechne dir das aus!
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.