Forum: Mikrocontroller und Digitale Elektronik Software PWM


von S.T (Gast)


Lesenswert?

Hallo,
ich habe mir das Tutorial über PWM angeschaut und wollte mich jetzt mal 
erkundigen, wie nun die Berechnung für die PWM-Frequenz zustande kommt. 
Diese ist mir irgendwie noch nicht ganz klar.
Also wenn ich das richtig verstanden habe, haben wir einen Timer mit 8 
Bit Auflösung und nem Prescaler von 256. Daraus ergibt sich mir dann bei 
4 Mhz Systemtakt ein Timer, der mit einer Frequenz von ca. 15 kHz 
(4.000.000 / 256) raufzählt. Der müsste dann mit einer Frequenz von 61 
Hz (15.000 Hz / 256 Schritte) einen ISR auslöst. In dem ISR wiederum 
gibt es einen Counter der auch 255 Schritte hat. Also kann ich für die 
Frequenz, die dieser Counter hat, der gelöscht wird wenn er bei 255 
ankommt. Also wieder 61 Hz / 256 = 0,23 Hz. Bei der Rechnung, wo ist da 
mein Fehler? Ich komm nie auf eine PWM-Frequenz von 127 Hz.

Gruß S.T

von Klugscheißer (Gast)


Lesenswert?

Um welches Tutorial handelt es sich denn?

von S.T (Gast)


Lesenswert?


von Matthias K. (mkeller)


Lesenswert?

Nein der Teiler ist bei 1
1
        ldi     temp, 1<<CS00         ; CS00 setzen: Teiler 1
2
        out     TCCR0, temp

Damit gilt die Rechnung aus dem Tut:
( 4000000 / 256 ) / 127 = 123Hz

Auflösung ist hier aber eben nur 7bit, nicht 8bit
1
timer0_overflow:                      ; Timer 0 Overflow Handler
2
        inc     PWMCount              ; den PWM Zähler von 0 bis
3
        cpi     PWMCount, 128         ; 127 zählen lassen
4
        brne    WorkPWM
5
        clr     PWMCount

von S.T (Gast)


Lesenswert?

Hey, also gar kein Prescader?
Weil ich verwirrt bin. Im Tutorial stand der ISR soll beim 256 fachem 
der PWM-Frequenz ausgelöst werden, ich bin verwirrt.

von S.T (Gast)


Lesenswert?

Matthias Keller schrieb:
> Damit gilt die Rechnung aus dem Tut:
> ( 4000000 / 256 )

Und diese 4 Mhz durch 256 irritieren mich dann auch, wenn der Teiler den 
1 ist.

von S.T (Gast)


Lesenswert?

Matthias Keller schrieb:
> Nein der Teiler ist bei 1
>         ldi     temp, 1<<CS00         ; CS00 setzen: Teiler 1
>         out     TCCR0, temp
>
> Damit gilt die Rechnung aus dem Tut:
> ( 4000000 / 256 ) / 127 = 123Hz
>
> Auflösung ist hier aber eben nur 7bit, nicht 8bit
> timer0_overflow:                      ; Timer 0 Overflow Handler
>         inc     PWMCount              ; den PWM Zähler von 0 bis
>         cpi     PWMCount, 128         ; 127 zählen lassen
>         brne    WorkPWM
>         clr     PWMCount

Und im Tutorial heißt es, ich zitiere:
In der ISR wird ein weiterer Zähler betrieben (PWMCounter), der ständig 
von 0 bis 255 zählt.
IN diesem Stück Code zählt er aber nur bis 128. Das widerspricht sich 
doch oO

von S.T (Gast)


Lesenswert?

> Und im Tutorial heißt es, ich zitiere:
> In der ISR wird ein weiterer Zähler betrieben (PWMCounter), der ständig
> von 0 bis 255 zählt.
> In diesem Stück Code zählt er aber nur bis 128. Das widerspricht sich
> doch oO

Also auch wenn jetzt keiner was dazu sagt. Dann bitte den Text im Wiki 
korrigieren, der Zähler zählt bis 128 und nicht bis 255 (in der ISR).

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
Noch kein Account? Hier anmelden.