PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM Zählerstand? (gelöst)



Palmer
01.10.2009, 17:11
Hallo,

ich benutze dieses PWM-Signal:


void init_timer1(void) //Initialisierung des Timers für Erzeugung des PWM-Signals
{
/* normale 8-bit PWM aktivieren (nicht invertiert),
Das Bit WGM10 wird im Datenblatt auch als PWM10 bezeichnet */
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);

/* Einstellen der PWM-Frequenz auf 14 kHz ( Prescaler = 1 ) */
TCCR1B = (1<<CS10);

/* Interrupts für Timer1 deaktivieren
Achtung : Auch die Interrupts für die anderen Timer stehen in diesem Register */
TIMSK &= ~0x3c;
}
(stammt aus dem Beispiel Programm für das RN-Control)


Ich würde gerne den Zählerstand auslesen (in welchem Register?), da ich eine halbwegs exakte Zeit brauche (Zeitspanne von 3 Sekunden).

Wie errechnet sich die PWM-Frequenz
Fpwm = Fclock(16MHz) : Prescaler(1) : (?)

Ist die PWM eigentlich auch konstant, wenn ich andere Intrrupts und Timer verwende?

MfG
Palmer

Babbage
02.10.2009, 08:13
Der Zählerstand des Timers ist im Register TCNT1

So wie ich das aus dem Datenblatt lese zählt der Timer von 0 bis 256 und dann zurück.
Also wird nach 256 Taktzyklen das PWM Signal einmal gewechselt. Ein vollständiges Signal ist also nach 2x 256 Taktzyklen komplett.

Frequenz = FClock / (Prescaler) / 256 / 2 = 31250Hz

Die PWM wird Hardwaremäßig generiert und ist unabhängig von sonstigen aktivitäten des Prozessors.
Mann kann sogar die Interrupts des Timer1 nutzen ohne die PWM zu stören.

Falls Du eine exakte Zeit von 3s brauchst kannst Du dir die auch mit einem anderen Timer bauen oder nimmst den TOV1 Interrupt und zählst 3*31250 Hz ab.

Palmer
02.10.2009, 15:22
Hi,

danke hat alles geklappt und so wie ich es wollte. Hab dann doch den Interrupt vom Timer1 genommen, da ich den Zähler nicht genau abfragen konnte (mein Programm ist etwas umfangreich und eine Abfrage des Zählers würde nicht immer jeden Zählerwechsel mit bekommen)!

MfG
Palmer