Forum: Mikrocontroller und Digitale Elektronik Attiny13 - 25 kHz Hardware PWM immer HIGH


von Athlon N. (athlon)


Lesenswert?

Hallo!
Ich bin gerade dabei eine kleine Lüftersteuerung für einen 4 Pin 12V PWM 
PC Lüfter zu bauen und verwende dafür den Attiny13.

Der Code sollte eigentlich eine Arbeit von 10 Minuten sein, will aber 
ums Verrecken nicht funktionieren.

Folgender Testaufbau: Attiny PWM Ausgang OC0A (PB0) -> Widerstand -> 
(Basis) Open Collector Schaltung mit NPN Transistor -> PullUp Widerstand 
an Collector (3.3V).

Das Problem:
Im WGMA Mode 5, d.h als TOP Wert wird OCR0A herangezogen, krieg ich am 
Collector immer HIGH raus, d.h. der Transistor sperrt. Es kommt kein PWM 
Signal raus.

Im WGMA Mode 1, d.h. als TOP Wert wird 0xFF herangezogen, krieg ich ein 
PWM Signal am Ausgang, aber leider mit der falschen Frequenz.

Hier mal der Code:
int main(void)
{
  DDRB |= (1<<DDB0);

  OCR0A = 0xC0; //dez: 192 -> 25 kHz at 9.6 MHz clk
  TCNT0 = 0x22; //duty cycle

  //Set OC0A on Compare Match when up-counting. Clear OC0A on
        //Compare Match when down-counting.
  //inverted PWM output at OC0A
  TCCR0A |= ((1<<COM0A1)|(1<<COM0A0)); //inverting PWM

  //WGMA Mode 5 (PWM Phase correct with TOP: OCRA)
  TCCR0A |= (1<<WGM00);
  TCCR0B |= (1<<WGM02);

  TCCR0B &= ~((1<<FOC0A)|(1<<FOC0B));

  //clk(IO) - no prescaling
  TCCR0B |= (1<<CS00);
  TCCR0B &= ~((1<<CS01)|(1<<CS02));

    while(1)
    {
    }
}

Hab ich irgendwas vergessen, dass für den WGMA 5 Mode benötigt wird?

Lg,

von Martin (Gast)


Lesenswert?

A special case occurs when OCR0A equals TOP and COM0A1 is set. In this 
case, the Compare
Match is ignored, but the set or clear is done at TOP. See “Fast PWM 
Mode” on page 64
for more details.


Siehe Note 1

von spess53 (Gast)


Lesenswert?

Hi

>//WGMA Mode 5 (PWM Phase correct with TOP: OCRA)

Dann ist aber OC0B Ausgang

> TCNT0 = 0x22; //duty cycle

Duty Cycle wird mit OCR0B eingestellt.

MfG spess

von Martin (Gast)


Lesenswert?

Du nutzt doch den Output B als PWM, also:

TCCR0A |= ((1<<COM0B1)|(1<<COM0B0)); //inverting PWM

Und du musst natürlich auch ein Dutycycle setzen:

OCR0B = xxx

von Athlon N. (athlon)


Lesenswert?

Klasse vielen Dank!
Jetzt funktionierts, aber ich lese das nicht aus der Doku raus :/

Wieso wird im WGMA Mode 5 OC0B als Ausgang verwendet? Wo steht das?
Und wo steht, dass mit OCR0B der duty cycle eingestellt wird?

Ich verwende diese Doku: http://www.atmel.com/images/doc2535.pdf

Lg

von spess53 (Gast)


Lesenswert?

Hi

>Wieso wird im WGMA Mode 5 OC0B als Ausgang verwendet? Wo steht das?
>Und wo steht, dass mit OCR0B der duty cycle eingestellt wird?

OCR0A kann nur eine Aufgabe erfüllen. Entweder als Top- oder als 
Compare-Register.

MfG Spess

von Athlon N. (athlon)


Lesenswert?

Ich verstehe danke.
Aber steht das auch irgendwo in der Doku, dass dann OC0B als Ausgang 
fungiert und mit OCR0B die Duty Cycle eingestellt wird?
Oder bin ich nur etwas von den TI Dokus verwöhnt?

von Paul B. (paul_baumann)


Lesenswert?

Athlon N. schrieb:
> Aber steht das auch irgendwo in der Doku, dass dann OC0B als Ausgang
> fungiert und mit OCR0B die Duty Cycle eingestellt wird?

Auf manche Sachen kommt man nur durch Probieren.

MfG Paul

von spess53 (Gast)


Lesenswert?

Hi

>Auf manche Sachen kommt man nur durch Probieren.

Oder durch etwas gesunden Menschenverstand.

MfG Spess

von Paul B. (paul_baumann)


Lesenswert?

spess53 schrieb:
> Oder durch etwas gesunden Menschenverstand.

Richtig. Den Menschenverstand braucht man beim Probieren, um sämtliche
sinnvollen Einstellmöglichkeiten zu finden.
;-)

MfG Paul

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.