Forum: Mikrocontroller und Digitale Elektronik Optimierung Drehzahl-Messer


von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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...

von Daniel (Gast)


Lesenswert?

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.

von Matthias L. (Gast)


Lesenswert?

>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!

von Falk B. (falk)


Lesenswert?


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
Noch kein Account? Hier anmelden.