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!!
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!
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.