Forum: Mikrocontroller und Digitale Elektronik und nochmal tacho (rechenaufgabe) Atmega32, C


von He G. (dare)


Lesenswert?

Sodale. Das Thema hab ich zwar schon einmal innerhalb eines meiner 
anderen Topics angesprochen und gedacht eine Lösung gefunden zu haben 
aber Pustekuchen.
Ich benutze Timer0 um Tachosignale als externen Takt zu zählen. Timer1 
um das gleiche mit Drehzahlsignalen zu tun. Das Ganze mache ich zB ne 
halbe Sekunde lang.
Danach verarbeite ich jedenfalls die Daten und gebe sie aus. Dann lese 
ich noch nen Max6675 aus. Vielleicht gibts auch noch mehr zu tun 
(Anzeigemodi etc.). Delays gibts auch ein paar.
Nun also vergeht ja zwischen zwei Tachomessungen ne gewisse Zeitspanne. 
Die müsste ich ja eigentlich auch messen um einigermaßen zuverlässig die 
zurückgelegte Distanz errechnen zu können (Tacho braucht halt auch nen 
Kilometerzähler). Es gibt doch nen dritten Timer oder? Der hat aber nur 
8bit. Mit höchstem Prescaler hat der bei 4Mhz Takt ja immer noch 4khz. 
Das bedeutet, es dauert lediglich 1/16 Sekunden bis ein 8bit Timer 
überläuft, oder? Zu dem dritten Timer hab ich auch noch nicht viel 
gefunden. Wie muss ich welche Register setzen, damit er mit takt/1024 
läuft und nen Interrupt auslöst, wenn er überläuft?
Ist das überhaupt ein sinnvoller Ansatz? Ich dachte mir, ich lasse ihn 
einfach immer ne Variable hochzählen, wenn er überläuft. Dann hab ich 
nachher nen Wert/16=Sekunden. Ist das genau oder dauert der 
Interruptkram und das Umrechnen und in die Kilometer-Variable-schreiben 
zu viele Takte um genau zu sein?
Wie würdet ihr das Problem lösen?
Danke!!

von He G. (dare)


Lesenswert?

So, ich habe im Datenblatt den Timer zwei mit den relevanten Registern 
gefunden.
Kann mir denn mal jemand sagen, ob folgender Programmablauf zu einem 
vernünftigem (einigermaßen genauem) Ergebnis führt?

Timer2(8 Bit) wird gestartet, bei Überlauf wird per Interrupt der Wert 
einer Variablen - nennen wir sie SystemTime - erhöht.

in der Schleife:
Systemtime wird ausgelesen, Timer 0 und 1 werden mit externem Takt 
gestartet und zählen Signale. Derweil lasse ich den Atmega andere 
Messschaltungen auswerten. Nun werden Timer 0 und 1 angehalten, ich lese 
Systemtime erneut aus, setze Systemtime 0 und lasse weiter zählen. Aus 
der Differenz der zwei Werte von Systemtime und den Timern 0 und 1 kann 
ich mir Geschwindigkeit und Drehzahl errechnen da ich ja die vergangene 
Zeit der Messdauer kenne. Aus dem zweiten Systemtime-Wert kann ich mir 
die vergangene Zeit seit der letzten Messung errechnen und mit Hilfe der 
Geschwindigkeit die daraus folgende Distanz.
Während ich jetzt also Dinge auf dem Display ausgebe und andere 
Schaltungen auswerte läuft Systemtime weiter. Ich nehme die 
Geschwindigkeit der nächsten Messung an.

Ist diese Art der Zeitmessung genau oder quatsch? Das ist eigentlich die 
einzige Frage auf die ich mir eine Antwort erhoffe, bevor ich mich da 
ran setze.

Grüße!

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Also ich kann ja mal sagen wie ich das zur Zeit mache:

Ich hab nen Timer und am ICP (Input Capture Pin) hängt das Tachosignal.
Im ICP Interupt zähle ich eine Variable hoch, und sichere den Wert des 
Timers, da resete ich den.
Ich weiß welcher Weg/Tachoimpuls zurückgelegt wurde.
--> Anzahl Impulse * Weg/Impuls = Zurückgelegte Strecke
--> Zeit zwischen zwei Pulsen (ICP Wert) = Geschwindigkeit

Ein zweiter Timer ist auf 10ms eingestellt, und die Drehzahlmessung 
hängt an ExtINT Pin. In der ExtINT Interupt Routine zähle ich eine 
Variable hoch im 10ms Interupt wird diese gespeichert und auf 0 gesezt.
--> Impulse/10ms = Drehzahl.


Die Umrechnungen geschehen alle in der Mainschleife, auf diese Weise 
erreicht man die beste genauigkeit, da fürs Zählen/messen nur eine 
minimalzahl takte (Stickwort kurze Interruptzeiten) benötigt werden.

So hast du schonmal Weg& Geschwindigkeit mit einem Timer erledigt, und 
der 10ms Timer kann noch für andere Aufgaben mitverwendet werden, 
außerdem ist es dan mehr oder weniger "egal" wie viel bit der Timer hat.

Gruß
Läubi

von He G. (dare)


Lesenswert?

Ich möchte jetzt nicht nachsehen aber ICP braucht keinen der 3 Timer? 
Hat quasi nen vierten? Was für ne Auflösung denn?
Die Geschichte mit Signalen per Interrupt hochzählen macht mir Mut. 
Denn: bei einer max. Drehzahl von 12.000 liegen bei mir 24.000 
Zündsignale an. Das sind 400hz. Also 400 Interrupts/Sekunde. Bei meiner 
Idee zur Zeitmessung gibts 16 Interrupts/Sekunde, welche die Zeitmessung 
verfälschen könnten. Verschwindend wenig also. Oder hab ich nen 
Denkfehler?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Doch der ICP nuzt den 16bit Timer.
Die interupt verfälschen nix... Der ICP Timer holt automatisch beim 
Interput den Zählstand in ein Register, das kann man dann bequem ein 
paar Takte später auslesen, das ist ja der Vorteil. Und für die 
Wegmessung verpasst du auch nix, weil ob du genau zu dem Impuls zählst 
oder ein paar Takte später änder nix:

Impuls ------ vieeeeeeeeeeeeeeel Zeit ---------- Impuls

So siehts aus AVR sicht aus ;)

Den bedenke bei 4Mhz macht der 4.000.000 Takte/Sekunde, es treten bei 
400hz also 400 Interupts/Sekunde auf --> Du hast 10000 Takte Zeit 
zwischen den Impulsen was anderes zu tun ;)
Oder anders ausgedrückt 0,01% Der Zeit tritt ein Interupt auf 99,99% der 
Zeit wartet der AVR auf ein Ereignis. Ich glaub da wär dir auch 
langweilig :)

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.