Hallo zusammen. Ich möchte die Anzahl der PWM-Signale eines MEGA128 erweitern. Es soll softwaremässig mit einem 16Bit-Timer/Counter ein PWM-Signal erzeugt werden. Die PWM-Frequenz soll 1kHz betragen. Meine Berechnung sieht wie folgt aus: Sei f die Taktfrequenz (16MHz), p der Prescaler (1), k der Teiler des 16Bit-Timer/Counter TC und n (in diesem Fall 8) die Breite des Zählers. Dieser Zähler zählt von 0 an bis zu seinem Maximum und ändert die Zählrichtung, sobald dieses Maximum (TOP) erreicht wird. Es handelt sich also um eine phasenrichtige PWM. Bei Erreichen eines Compare-Wertes wird ein Ausgangspin getoggelt. Dann gilt für das softwaremässig erzeugte PWM Signal: f f(PWM) = ------------------------------- (2^n+1 - 2) Prescaler k Geht man von der PWM-Frequenz von 1kHz aus, dann berechnet sich k zu: k = 16000000/(1000*(2^9 -2)) = 31,37 (gewählt k=31) Nachladewert des Counters ist dann: 2^16 - 31 = 65505 = 0xFFE1 TCNT1H = 0xFF TCNT1L = 0xE1 TCCR1B = 0x01 Prescaler: 1 Sind meine Überlegungen richtig? Ich bekomme aus irgendwelchen Gründen die falsche PWM-Frequenz. Diese Frequenz ist zwar nicht wichtig, ich möchte dennoch verstehen, wo der Denkfehler liegt. Hier ist ein Ausschnitt vom C-Quellcode // TIMER1 initialisation - prescale:1 void timer1_init(void) { TCCR1B = 0x00; //stop TCNT1H = 0xFF; //setup TCNT1L = 0xE1; } #pragma interrupt_handler timer1_ovf_isr:15 void timer1_ovf_isr(void) { TCNT1H = 0xFF; // reload counter high value TCNT1L = 0xE1; // reload counter low value if(!direction) // count++; else count--; if(count==0x01) direction=0; if(count==0xFE) direction=1; if(count == temp1) TOGGLEBIT(PORTD,5); } void main() { init_devices(); direction=0; // der 8Bit-Zähler soll zunächst vorwärts zählen count = 0x00; TCCR1B = 0x01; //start Timer, no prescaling while(1); }
Hi hilel, ich würde an deiner Stelle den Timer im Compare-Modus laufen lassen, damit sparst du dir schon mal dir Reinitialisierung nach dem Overflow (inkl. Zeitverzug). Mir hat bei diesem Thema mit dem Software PWM eine Applicatione Note von Atmel weitergeholfen (AVR136: Low-jitter Multi-channel Software PWM). Ist zwar am Anfang ein bisschen unübersichtlich, aber wenn man das Prinzip kappiert hat ist die Lösung wesentlich einfacher als das Rad neu zu erfinden. Mfg Flo
Hallo Flo.K Danke für die rasche Antwort. Ich werde mir diese AN anschauen. Gruß Hilel
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.