hm, wie ist die frage genau gemeint: willst du mit einem timer die frequenz sampfreq erzeugen?
Hallo,
Ein Programm zur Berechnung gibt es hier:
https://www.roboternetz.de/phpBB2/dl...le&file_id=169
FOSC: 7372800hz
SAMPFREQ:512hz
=P: 64
Ich möchte FOSC per Prescaler P in SAMPFREQ übersetzen
Mit welcher Formel berechnet man P?
Gruß
hm, wie ist die frage genau gemeint: willst du mit einem timer die frequenz sampfreq erzeugen?
Ja ,T/C0 soll als Counter arbeiten.
wie rechnet das Programm?
Da es oft mehrere Lösungen gibt, ist das keine richtige Formel
Ich häng' da ein Excel sheet rein, guck' mal, vielleicht hilft's
("TImer" Tabelle, das andere vergiß)
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Das ist so einfach gar nicht zu beantworten.
Wenn Du einen der 8Bit Timer benutzt läuft dieser alle 256 Timerzyklen über und es wird ein Timer Overflow Interupt ausgelöst.
ist der Prescaler auf 8 eingestellt Brauchst Du also 256*8 Taktzyklen für diesen Überlauf. Bei der Einstellung auf Prescaler 64 also 256*64 Taktzyklen. Soweit dürfte das noch klar sein.
Beim 16 Bit Timer dauert das Ganze natürlich 65536*64 Taktzyklen.
Hast Du aber nun ein Verhältnis von Taktfrequenz zu Timerfrequenz das nicht durch 256 teilbar ist musst Du während des Interrupts das Couterregister mit einem Preload z.B. 11 füttern. Dadurch wird der Timeroverflow nach (256-11)*64 Taktzyklen erreicht.
Weil die Ausführung der Interruptroutine natürlich auch Zeit benötigt, kann es passieren das es gerade bei kleinen Prescalereinstellungen (/0 und / zu Jitterfehlern und Berechnungsfehlern kommt.
Die Preloads sollten also möglichst früh in der Interruptroutine angesiedelt sein.
Ich teste solche Spielchen mit AVR Studio 4 aus, dann kann man schon mal eine Aussage machen ob das so funktionieren kann.
Wichtig ist dabei, das der benötigte Preload Wert bei einem 8Bit Timer immer unter 255 liegen muß.
Sinnvoll ist es auch den Prescaler auf möglichst hohe Werte einzustellen, weil dann der Controller weniger Zeit in den Timer Interrupt Routinen rumgurkt.
Eine weitere Möglichkeit für krumme Teilerwerte sind die Output Compare Matches, den aber nicht alle Timer der ATMEL AVR Controller haben.
Dabei wird in ein Output Comparematch Register ein Wert vorbelegt.
Erreicht der Interne Counter diesen Wert kann ein Interrupt ausgelöst werden in dem dann eine von Dir geschriebene Routine ausgeführt wird.
Der interne Timer kann auch Automatisch bei Erreichen des Comparematchwertes zurückgesetzt werden.
Die Timer der ATMEGA Reihe bieten sehr, sehr viele Möglichkeiten - zieh Dir halt mal das Datenblatt von einem z.B. ATMEGA 8 rein.
es wird doch wohl die formel geben!
den beitrag von wkrug kann man in zwei formeln fassen:
erstmal die frequenz, mit der der overflow interrupt ausgelöst wird:
f_samp=f_osc/(pre*2^n)
f_samp: interrupt-frequenz
f_osc: takt
pre: prescaler
n: bit-zahl des timers
wenn der prescaler jeden wert annehmen könnte, würde das schon genügen. aber im allgemeinen braucht man noch diese formel:
f_samp=f_osc/(pre*(2^n-preload))
d.h. der volle wertebereich des timer ,2^n, wird um den preload-wert reduziert, sodass man eine relativ gute auflösung für f_samp erhält.
das hat aber wkrug schon alles beschrieben, ich hab nur noch mal die formeln explizit aufgeschrieben.
man mus auf jeden fall ein bisschen dabei denken, nur einsetzen genügt nicht!
gruß
jonas
Lesezeichen