-
        

Ergebnis 1 bis 4 von 4

Thema: Zwei 8-Bit Timer kombinieren

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    01.05.2007
    Beiträge
    9

    Zwei 8-Bit Timer kombinieren

    Anzeige

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

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    01.05.2007
    Beiträge
    9
    Zitat Zitat von Besserwessi
    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

  4. #4
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •