ATTiny48 - Die Sache mit der PWM Frequenz

Gast #2003856
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?!
#2003885
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.
Gast #2003886
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
Gast #2004070
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:
Gast #2004153
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.
Gast #2004364
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren