Timer2 ist, wenn ich mich recht erinnere, ein 8-Bit-Timer. Deshalb kann OCR2 nicht den Wert 1000 annehmen.
Guten Tag
Ich habe auf einem Atmega8, mit 16mhz getacktet, 3 Hardware PWM's am laufen.
Die des Timer 1 laufen auch richtig:
Jetzt brauche ich aber noch den 3 PWM kanal.Code:TCCR1A= (1<<Com1A1) | (1<<COM1B1); TCCR1B = (1<<WGM13) | (1<<CS11); ICR = 20000; //Dauer 20ms OCR1A = 1000; //Dauer 1ms OCR1B = 1000; //"
Das ist der Teil von dem ich ausging das er stimmt,Code:TCCR2 = (1<<WGM20) | (1<<COM21) | (1<<CS21) OCR2 = 250;
Durch herumspielen habe ich aber gemerkt das hier die Frequenz nicht stimmt.
Mir fehlt hier irgendwie auch die möglichkeit ICR1 aus dem Timer 1.
Nun meine Frage, hat sich jemand mit dem Timer 2 schonmal beschäftigt und weis vieleicht eine lösung?
Danke
Timer2 ist, wenn ich mich recht erinnere, ein 8-Bit-Timer. Deshalb kann OCR2 nicht den Wert 1000 annehmen.
Richtig, der Wert war zum rumspielen.
Was mich Wundert ist, dass das Signal von Timer2 gegenüber Timer1 invertiert ist. Obwohl ich nach Einstellungen den selben Modus benutzen müsste.
Auch ist bei 250 die low flanke gerade mal 5microSekunden. Was eigentlich auch nicht stimmen dürfte?
Ich krieg mit obigem code einen 1ms High Impuls(Sehr gut)Code:TCCR2 = (1<<WGM20) | (1<<COM21) | (1<<CS20) | (1<<CS21) | (1<<CS22); OCR2 = 30;
Aber mir fehlt einfach ein ICR1 damit ich die 20ms Periodendauer bestimmen kann. Das sollte doch möglich sein, ich habe jetzt das Datenblatt mehrmals gelesen aber ich find nichts. (Leider spreche/lese ich nicht gerade fliessend Englisch)
hat keiner eine Idee?
du kannst versuchen, mit dem Prescaler (und Fast PWM oder Phase Correct PWM) einen Wert für TOP (0xFF) zu generieren, der den 20ms, die du brauchst ähnelt.
Gruß, Yaro
Ich habe das mal kurz durchgerechnet.....
Mit einem Takt von 16Mhz geht das leider nicht auf...
was du aber machen könntest ist: Du hast doch einen 16bit Timer, der im 20ms-Rhythmus wieder von vorne anfängt. Dies kannst du dir zunutze machen, und diesen Takt für deinen 8bit Timer verwenden, indem du jedes mal, wenn der 16bit Timer bei TOP angekommen ist, einen Interrupt generierst, der deinen 8bit Timer wieder auf 0 setzt.
Du musst nur darauf aufpassen, dass der 8bit Timer etwas länger als 20ms für seinen durchlauf braucht.
Ich hoffe, ich konnte dir helfen.
Gruß, Yaro
Besten dank für deine Antwort,
Nur das Problem ist, wen ich den Timer so laufen lasse das ich über 20ms komme(mit dem 8bit Timer). Dann ist die Auflösung um zwischen 1 und 2 ms zu variieren extrem tief.
Oder verrechne ich mich da?
Vieleicht hast du dazu eine Idee
Du hast Recht.....die Auflösung ist wirklich extrem schlecht!
Hier ist dann eine andere Idee, sie kommt zwar einem software-PWM näher, als einem Hardware-PWM, aber so sollte es trotzdem funktionieren:
du stellst ein, dass dein TOP(0xFF) etwas über 2ms liegt.
Du stellst OCR so ein, wie du es brauchst. Nun hast du einen Timer, der deine 2ms am Anfang bedienen kann. Als overflow-interrupt machst du dann folgendes: du stellst deinen 8bit Timer aus!
Und in dem input-capture-interrupt bei deinem 16bit timer(der jede 20ms auftritt) machst du deinen 8bit-timer wieder an.
Es sieht dann folgendermaßen aus: der 16bit timer mach den 8bit-timer an, dieser durchläuft seine 2ms und geht aus.
Vergiss nicht darauf zu achten, dass OC2 nachdem der Timer aus ist auf GMD liegt, und nicht HIGH ist.
So erzielst du eine 10mal höhere Auflösung. Wenn dir das immernoch nicht genug ist, dann ist auch noch mehr möglich, allerdings geht das dann schon deutlicher auf die Leistung des Controllers.
Gruß, Yaro
Ist bestimmt ein Versuch wert, danke dir
Damit ist mein Timer knapp über 2ms.Code:TCCR1A= (1<<Com1A1) | (1<<COM1B1); TCCR1B = (1<<WGM13) | (1<<CS11); ICR = 20000; //Dauer 20ms OCR1A = 1000; //Dauer 1ms OCR1B = 1000; // TCCR2 = (1<<WGM20) | (1<<COM21) | (1<<CS22); OCR = .....
Wie schalte ich den Timer den nun aus?Code:ISR(TIMER2_OVF_vect) { ?? };
TCCR2 = 0? Resp. wie schalte ich ihn wieder ein. Es wäre toll wen du mir da mit etwas Code aushelfen könntest.
Lesezeichen