Forum: Mikrocontroller und Digitale Elektronik ATMega8 Timer0 PWM (LED Dimmen) schaltet nicht komplett ab


von Rene H. (ballibou77)


Lesenswert?

Hallo,

habe eine PWM 10bit Phase Correct am laufen.

Wenn ich OCR1A oder OCR1B setze funktioniert die PWM ohne Probleme. Wenn 
ich jedoch OCR1A = 0; oder OCR1B = 0; setze sind die LEDs jedoch nicht 
ganz aus.

Die LED bleibt immer noch ganz leicht an. Wer kann mir da weiter helfen?

Danke euch.

von spess53 (Gast)


Lesenswert?

Hi

>Die LED bleibt immer noch ganz leicht an.

Ist normal:

If the OCRnx is set equal to BOTTOM (0x0000) the output
will be a narrow spike for each TOP+1 timer clock cycle.

> Wer kann mir da weiter helfen?

Entweder invertierter Betrieb oder phase/freqency correct benutzen.

MfG Spess

von Oliver S. (oliverso)


Lesenswert?

Sie sollten aber aus sein. Also Fehler in Zeile 42, oder Baustein 42 
defekt...

Oliver

von Norbert S. (norberts)


Lesenswert?

spess53 schrieb:
> If the OCRnx is set equal to BOTTOM (0x0000) the output
> will be a narrow spike for each TOP+1 timer clock cycle.

Hi,

Das ist nur bei Fast PWM so aber angeblich wird ja Phase Correct 
benutzt.
Also bitte mal mindestens die Initialisierung des Timers zeigen.

Gruß,
Norbert

von Rene H. (ballibou77)


Lesenswert?

Habe gerade festgestellt das es beim ATMega32 genau so ist -.-

ATMega8 Code
1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <avr/interrupt.h>
4
5
void timer_start(void)
6
{ 
7
  OCR1A = 125-1;
8
    TCCR1B |= (1 << WGM12);
9
    TIMSK |= (1 << OCIE1A);
10
    TCCR1B |= (1 << CS01);
11
    sei();
12
}

ATMega32 Code
1
// Timer 1 || PWM
2
TCCR1A = (1<<WGM10)|(1<<WGM11)|(1<<COM1A1)|(1<<COM1B1);
3
TCCR1B = (1<<WGM12)|(1<<CS10);
4
OCR1A = 0;
5
OCR1B = 0;
6
7
sei();

Dimmen geht von 0 - 254. Also OCR1X = 0 - 254 geht.

Aber bei 0 sind die LEDs eben nicht aus.

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Rene H. schrieb:
> habe eine PWM 10bit Phase Correct am laufen.

Sicher?

Rene H. schrieb:
> ATMega8 Code
> #include <avr/io.h>
> #include <stdint.h>
> #include <avr/interrupt.h>
>
> void timer_start(void)
> {
>   OCR1A = 125-1;
>     TCCR1B |= (1 << WGM12);
>     TIMSK |= (1 << OCIE1A);
>     TCCR1B |= (1 << CS01);
>     sei();
> }

Das ist der CTC Modus.


> ATMega32 Code
> // Timer 1 || PWM
> TCCR1A = (1<<WGM10)|(1<<WGM11)|(1<<COM1A1)|(1<<COM1B1);
> TCCR1B = (1<<WGM12)|(1<<CS10);
> OCR1A = 0;
> OCR1B = 0;
>
> sei();

Das ist Fast PWM (10 Bit).

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.