Forum: Mikrocontroller und Digitale Elektronik Fast-PWM Frequenz mit 100Hz


von Jörg S. (mitchell)


Angehängte Dateien:

Lesenswert?

Hallo,
ich brauche mal wieder Hilfe.
Komme mit dem Einstellen der PWM-Frequenz nicht klar.

Mein erster Versuch, Fast PWM Mode3, prescale factor = 8, CPU 1Mhz 
intern,
ergibt eine PWM Frequenz von rund 488Hz.
Die PWM funktioniert auch so weit.
 Im Anhang ist der C-Code zum Testen.
Kontroller ist ein Tiny25, verwendet wird Timer0, Ausgang ist PB0 
(OC0A).
Die Pulsweite stelle ich mit OCR0A ein.

Wenn ich nach dem Datenblatt gehe, um die Frequenz auf 100Hz zu ändern, 
muss ich den Fast PWM Mode7 verwenden (WGM02 auf 1 setzen) und den 
TOP-Wert mit OCR0A festlegen.

Wie bzw. wo stelle ich dann aber die Pulsweite ein?
Ist dann OC0A noch der Ausgang?
Muss ich noch was anderes umstellen?

Habe schon ein paar Versuche durch, aber ohne Erfolg, PWM geht dann 
nicht mehr.
2.Datei zeig einen Versuch mit OCR0B für die Pulsweite, funktioniert 
aber nicht.


Gruß Jörg

von schorsch (Gast)


Lesenswert?

Jörg S. schrieb:
> 2.Datei zeig einen Versuch mit OCR0B für die Pulsweite, funktioniert
> aber nicht.

Eigentlich soll man keine unvollständigen Programme kommentieren aber
Ansatz über OC0B ist richtig
OC0B (PB1) als Ausgang konfiguriert?
PWM_50 Wert höher als OCR0A Wert?

von Thomas E. (thomase)


Lesenswert?

>  TCCR0A = (1 << COM0A1) | (1 << WGM01) | (1 << WGM00);
Das ist jetzt falsch. Da OCR0B jetzt das Compare-Register ist:


  TCCR0A = (1 << COM0B1) | (1 << WGM01) | (1 << WGM00);

Und den OC0B(PB1) auf Ausgang schalten nicht vergessen.

mfg.

von mitchell (Gast)


Lesenswert?

Hallo,
schon mal Danke für die schnellen Antworten.
Wie ich schon erwähnte, habe ich einige Kombinationen versucht.
Ich habe PB1 (OC0B) verwendet und den Ausgang auch entsprechend 
geändert.
Ich hatte auch mal COM0B1 verwendet, aber ich weis jetzt nicht mehr ob 
auch alles zusammen, werde ich dann noch mal testen.

schorsch schrieb:
> PWM_50 Wert höher als OCR0A Wert?

was meinst du genau damit?

Ich habe in OCR0A den TOP Wert mit 52 geladen, damit nicht mehr bis 256 
sondern nur bis 52 gezählt wird um die 100Hz zu erreichen.
Mit OCR0B stelle ich die Pulsweise (DutyCycle) von 0x00 bis 0xFF ein.
Ist das jetzt falsch?
Kann ich nur noch Werte kleiner OCR0A verwenden?

Gruß Jörg

von Thomas E. (thomase)


Lesenswert?

mitchell schrieb:
> Mit OCR0B stelle ich die Pulsweise (DutyCycle) von 0x00 bis 0xFF ein.
> Ist das jetzt falsch?

Ja, das ist falsch. Du stelltst mit OCR0B von 0 bis OCR0A ein. Also bis 
52.

mitchell schrieb:
> Kann ich nur noch Werte kleiner OCR0A verwenden?

Ja. Kleiner oder gleich 52. Das ist eine ziemlich mickrige Auflösung. 
Ist aber egal, da deine Rechnung sowieso falsch ist.

1Mhz/Prescaler64/157 = 99,52 also ~100

Du stellst den Prescaler auf 64 und OCR0B auf 156.

mfg.

von Jörg S. (mitchell)


Angehängte Dateien:

Lesenswert?

Hallo,
da war ich schon fast auf den richtigen Weg und klar habe ich mich da 
verrechnet.
Danke für die Hilfe es funktioniert jetzt.
Nun kann ich weiter Testen, ob das mit den 100hz auch so funktioniert 
wie ich es gerne möchte.
Anbei der Code mit dem ich die PWM jetzt getestet habe.
Mit 3 Schaltern zum testen der verschiedenen PWM-Pulsbreiten.

Gruß Jörg

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.