Forum: Mikrocontroller und Digitale Elektronik ATTiny48 - Die Sache mit der PWM Frequenz


von Rubelus (Gast)


Lesenswert?

Hiho,


ich tüdel gerade mit einem ATTiny45 herrum, ich möchte eine PWM Frequenz 
von 150HZ erzeugen.

Jedoch ist das Datenblatt sehr wiedersprüchlich, mir scheint es so als 
kann ich die Frequenz garnicht "fein" ändern. Nur über die Prescaler. 
Laut Datenblatt wird der Compare mit OCR0A verglichen bevor er wieder 
nach Bottom geht.

Jedoch ändere ich mit OCR0A ja meine DutyCycle?

Kann ich eine genaue PWM Frequenz nur mit einem externen Quarz 
erhalten?!

von Rubelus (Gast)


Lesenswert?

Sorry, überschrift falsch! Ist natürlich ein Tiny45 nicht 48!

von Ansgar K. (paulderbademeister)


Lesenswert?

Laut Datenblatt existiert eine PWM-Einstellung, bei der OCR0A als TOP 
genutzt wird. Da der Timer nur bis TOP zählt und dann wieder auf 0x00 
gesetzt wird, kann man somit über OCR0A die Frequenz der PWM wählen.

OCR0B kann dann dazu genutzt werden, den Duty Cycle der PWM an seinem 
Pin zu variieren. Damit hättest du eine PWM mit (fast) beliebiger 
Frequenz.

von Pom (Gast)


Lesenswert?

Rubelus schrieb:
> Hiho,
>
>
> ich tüdel gerade mit einem ATTiny45 herrum, ich möchte eine PWM Frequenz
> von 150HZ erzeugen.
>
> Jedoch ist das Datenblatt sehr wiedersprüchlich, mir scheint es so als
> kann ich die Frequenz garnicht "fein" ändern. Nur über die Prescaler.
> Laut Datenblatt wird der Compare mit OCR0A verglichen bevor er wieder
> nach Bottom geht.
>
> Jedoch ändere ich mit OCR0A ja meine DutyCycle?
>
> Kann ich eine genaue PWM Frequenz nur mit einem externen Quarz
> erhalten?!
Also:
Die PWM-Frequenz wird durch den Wert bestimmt, bei dem der Zähler 
zurückgesetzt wird. Der Zähler muß nicht immer bis 65535 oder 255 
laufen, sondern kann je nach Modus bei frei definierbaren Werten 
zurückgesetzt werden. Mit dem Prescaler, der den Grundtakt des Zählers 
vorgibt und dem Rücksetzwert kann die Periodendauer meist hinreichend 
genau und fein aufgelöst eingestellt werden.

Innerhalb des durch den Rücksetzwert vorgegebenen Rahmens kann dann mit 
OCRx das Tastverhältnis eingestellt werden. Natürlich dann im Verhältnis 
zum Rücksetzwert. Wenn der Zähler also bis 200 läuft und Du 100 in OCRx 
einstellst, wird 50 % Tastverhältnis daraus. Wenn der Zähler bis 400 
läuft und in OCRx weiterhin 100 steht, dann werden es 25 % (oder 75 %) 
sein.

Ein Quarz ist dazu nicht nötig wenn die Genauigkeit des internen 
Oszillators ausreicht.


Gruß,
Pom

von Rubelus (Gast)


Lesenswert?

Ansgar K. schrieb:
> Laut Datenblatt existiert eine PWM-Einstellung, bei der OCR0A als TOP
> genutzt wird. Da der Timer nur bis TOP zählt und dann wieder auf 0x00
> gesetzt wird, kann man somit über OCR0A die Frequenz der PWM wählen.
>
> OCR0B kann dann dazu genutzt werden, den Duty Cycle der PWM an seinem
> Pin zu variieren. Damit hättest du eine PWM mit (fast) beliebiger
> Frequenz.

Eben nicht.

Mit OCR0A stelle ich nicht die Frequenz ein, sondern den DutyCycle - 
OCR0B wiederrum wird völlig ignoriert.

Laut Datenblatt wird OCR0A bei Setzen von WGMnX auf ein PWM Modus nicht 
als TOP genutzt sondern als Interruptflag für OCnX der Timer läuft 
dennoch bis 0xff durch (Siehe dazu Datenblatt Seite 77 / Figure 11-9) 
dies wiederspricht sich jedoch mit der Tabelle auf Seite 82 / Table 
11-5.

Laut den Formeln im Datenblatt können nur mit dem Prescaler feste 
Frequenzen genutzt werden (N steht für den Prescaler):

Fast PWM:

Phase Correct PWM:

von Rubelus (Gast)


Lesenswert?

Sooo....


also nochmal nachprobiert. Wenn ich als Ausgang den COM0B1 nehme, statt 
den COM0A1 - dann kann ich mit OCR0A den TOP wählen, so wie es im 
Datenblatt auch steht, und mit OCR0B die Periodendauer.

Hier mal mein Code, welcher eine Freq von 150Hz erzeugt.:

1
    TCCR0A = (1<<WGM00) | (1<<WGM01) | (1<<COM0B1);    //Fast PWM; Pin1
2
    TCCR0B = (1<<WGM02) | (1<<CS02);                   //Vorteiler 256
3
    OCR0A = 213;                                       //TOP auf 213
4
    OCR0B = 10;                                        //Duty auf 10

Sobald ich aber COM0B1 durch COM0A1 ersetze, streikt er - weder am Oszi 
noch am Freq Zähler kommt dann was an.

von Ansgar K. (paulderbademeister)


Lesenswert?

Natürlich, du hast dann nen duty cycle von null prozent für ocra. wenn 
du es mit einer genauen frequenz haben willst, geht nur noch b als 
output

von Rubelus (Gast)


Lesenswert?

Dann verstehe ich aber folgenden Satz nicht:

"2 High Frequency PWM Outputs with Separate Output Compare Registers"

wenn ich nun zwei PWM Kanäle unterschiedlich von einander ausgeben will, 
schon gar mit unterschiedlichen compare registern, beeinflusst doch das 
OCR0B automatisch das OCR0A Register und umgedreht bei dem zweiten PWM 
Kanal?!

Das der PWM "Kanal" des Timer 1 für die Hose ist brauchen wir ja nicht 
näher zu Erörtern, da ist ja quasi der DutyCycle fest vorgeben - solange 
man nicht mit dem deadtimer arbeitet.

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.