PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zwei 8-Bit Timer kombinieren



floe-de
19.02.2009, 19:44
Hi,

ich verwende den ATtiny25 für die Ansteuerung der Schrittmotoren. Leider besitzt dieser kein 16Bit Counter für die Erzeugung der Frequenz. Dieser besitzt allerdings zwei 8-Bit Timer. Jetzt wollte ich die beiden Counter kombinieren, so dass ich eine feinere Auflösung für die Schrittmotoren bekommen.
Inmoment kann ich nur die folgenden Auflösung erreichen bei 8Mhz.


Prescaller Zählerwert Frequenz Out Frquenz Schritt
64 0 62500
64 5 10416,67 52083,33
64 10 5681,82 4734,85
64 15 3906,25 1775,57
64 20 2976,19 930,06
64 25 2403,85 572,34
64 30 2016,13 387,72
64 35 1736,11 280,02
64 40 1524,39 211,72
64 45 1358,7 165,69
64 50 1225,49 133,21
64 55 1116,07 109,42
64 60 1024,59 91,48
64 65 946,97 77,62
64 70 880,28 66,69
64 75 822,37 57,91
64 80 771,6 50,76
64 85 726,74 44,86
64 90 686,81 39,93
64 95 651,04 35,77
64 100 618,81 32,23
64 105 589,62 29,19
64 110 563,06 26,56
64 115 538,79 24,27
64 120 516,53 22,26
64 125 496,03 20,5
64 130 477,1 18,93
64 135 459,56 17,54
64 140 443,26 16,3
64 145 428,08 15,18
64 150 413,91 14,17
64 155 400,64 13,27
64 160 388,2 12,44
64 165 376,51 11,69
64 170 365,5 11,01
64 175 355,11 10,38
64 180 345,3 9,81
64 185 336,02 9,28
64 190 327,23 8,8
64 195 318,88 8,35
64 200 310,95 7,93
64 205 303,4 7,55
64 210 296,21 7,19
64 215 289,35 6,86
64 220 282,81 6,55
64 225 276,55 6,26
64 230 270,56 5,99
64 235 264,83 5,73
64 240 259,34 5,49
64 245 254,07 5,27
64 250 249 5,06
64 255 244,14 4,86

Würde aber gerne die deltas (letzte Spalte) zwischen den erreichbaren Frequenzen verringern. Hat jemand schon Erfahrung damit, wie man die beiden 8Bit Timer zu einem 16Bit Timer kombiniert?
Welches vorgehen ist das schlauste.

Gruss,
flo

Besserwessi
19.02.2009, 20:54
Ich weiss zwar nicht wozu man beim Schrittmotor einen 16 Bit Zähler gebrauchen kann, aber für die Freqwunzerzeugung könnte ich weiterhelfen.
Zum einen kann man wohl irgendwie USI und einen Timer zu einem 12 Bit timer kombinieren.

Die Standradmethode für die Freqwunzerzeugung mit hoher auflösung ist ein NCO oder nummerisch gesteuerter Oszillator. Mit einem AD wandler als Ausgange hat man dann einen DDS Generator. Allerdings braucht man da ziehmlich viel Rechen zeit.

Wenn es einem nur um ein Rechtecksignal mit Variabler frequenz geht, kann man den Zähler um eine Bruchanteil erweitern. Den Zähler in CTC Mode laufen lassen und im Interrupt jeweils den Bruchanteil zu einer 8 oder 16 Bit zahl addieren. Wenn man bei der Addition einen Überlauf kriegt wird der Wert im output compare register um einen höher gesetzt als sonst. Im mittel kriegt man so Frequenzen als hätte der Teilerfaktor des Zählers noch ein Paar Bits nach dem Komma. Es wären als Teilerfaktoren wie z.B. 200.125 möglich.

Für die Vermutlich niedrigen Frequenzen, wie man sie Mit dem 16 Bit timer erhalten würde, müßte man die Überläufe in Software zählen und dann erst kurz vor ende der Zeit, z.B. im vorletzen compare match den output mode auf toogle stellen.

floe-de
21.02.2009, 22:02
Ich weiss zwar nicht wozu man beim Schrittmotor einen 16 Bit Zähler gebrauchen kann, aber für die Freqwunzerzeugung könnte ich weiterhelfen.
Zum einen kann man wohl irgendwie USI und einen Timer zu einem 12 Bit timer kombinieren.

Die Standradmethode für die Freqwunzerzeugung mit hoher auflösung ist ein NCO oder nummerisch gesteuerter Oszillator. Mit einem AD wandler als Ausgange hat man dann einen DDS Generator. Allerdings braucht man da ziehmlich viel Rechen zeit.

Wenn es einem nur um ein Rechtecksignal mit Variabler frequenz geht, kann man den Zähler um eine Bruchanteil erweitern. Den Zähler in CTC Mode laufen lassen und im Interrupt jeweils den Bruchanteil zu einer 8 oder 16 Bit zahl addieren. Wenn man bei der Addition einen Überlauf kriegt wird der Wert im output compare register um einen höher gesetzt als sonst. Im mittel kriegt man so Frequenzen als hätte der Teilerfaktor des Zählers noch ein Paar Bits nach dem Komma. Es wären als Teilerfaktoren wie z.B. 200.125 möglich.

Für die Vermutlich niedrigen Frequenzen, wie man sie Mit dem 16 Bit timer erhalten würde, müßte man die Überläufe in Software zählen und dann erst kurz vor ende der Zeit, z.B. im vorletzen compare match den output mode auf toogle stellen.

Der USI wird schon gebraucht. Irgendwas externes will ich nicht basteln. Was meinst du genau mit dem Bruchteil? Das verstehe ich noch nicht so ganz. Soll ich im Interrupt immer z.B. eine int Variable +16 hochzählen lassen und jeweils überprüfen ob der Integer Wert überlaufen wurde und dann triggern?

Gruss,
flo

Besserwessi
21.02.2009, 23:19
Das System mit dem Bruchteilen ist vor allem für hohe frequenzen interessant. Mit einem einfachen Teiler kriegt man nur ganzzahlige Teiler der Taktfrequenz hin. Man kann die zwischen werte erreichen,w enn man in kauf nimmt, das nicht alle "perioden" gleich lang sind. Die zwischenwerte sind vor allem bei eher kleinen Teilerfaktoren, also ohne Prescaler interessant. Um diese krummen Teiler zu kreigen wird eine Integer oder Byte Variable bei jedem Interrupt um einen bestimmten betrag erhöht. Bei einem Überlauf wird die Zeit bis zum nächsten Interrupt um einen zyklus länger gewählt also sonst. Die Signal Ausgabe erfolgt aber weiter bei jedem Timerinterrupt.


Hier geht es wohl mehr um niedrige Frequenzen. Also eher um so etwas wie f / 123456. Da wird man auf Bruchteile schon mal verzichten können.
Was man da braucht ist eine definierte Verzögreung. Dazu müßte man erst mal eine ganze Menge an Timer interrupts abwarten, und dann beim letzten noch genau die richtige Verzögerung einstellen. Ganz einafch wird das nicht, weil man mit ganz kleinen VErzögerungen probleme kriegt.