Forum: Mikrocontroller und Digitale Elektronik Fast PWM mit Atmega8


von Robin (Gast)


Lesenswert?

Hallo zusammen,

ich habe vorhin versucht mich etwas in Fast PWM einzulesen.
Dabei habe ich unter anderem bei Youtube folgendes Video gefunden:
https://www.youtube.com/watch?v=kAnp2n2o60Y

Da ich einen Atmega8 nutze, habe ich mir das Datenblatt vom Controller 
genommen und geguckt ob es Unterschiede bei der Konfiguration gibt, was 
ich aber nicht feststellen konnte.

Hier der Code:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#define F_CPU 1000000UL
4
#include <util/delay.h>
5
6
int main(void)
7
{
8
  // Ein- / Ausgänge konfigurieren
9
  DDRB |= (1<<PB1);          //an PB1 ist die LED angeschlossen
10
  PORTB|= (1<<PB0) | (1<<PB2);    //Pull Ups für Taster S1 und S2
11
12
  // PWM konfigurieren
13
  TCCR1A |= (1<<WGM10);        // Fast-PWM (8-Bit)
14
  TCCR1A |= (1<<COM1A1);        // nicht invertieredner PWM-Modus
15
  TCCR1B |= (1<<WGM12);        //
16
  TCCR1B |= (1<<CS12);        // Prescaler 256
17
  OCR1A = 0;              // Startwert (LED-AUS)
18
  
19
  sei();
20
  
21
  while (1)
22
  {
23
    //***** Taster S1 (LED heller) *****
24
    if (!(PINB & (1<<PB2)))      // wenn Taster S1 gedrückt ist, dann...
25
    {
26
      if (OCR1A < 255)      // wenn Maximalwert noch nicht erricht ist, dann LED heller...
27
      OCR1A++;          // verarbeite die Impulsbreite des PWM-Signals um "1"
28
      
29
      _delay_ms(15);        // warte 15ms
30
    }
31
    
32
    //***** Taster S2 (LED dunkler) *****
33
    if (!(PINB & (1<<PB0)))      // wenn Taster S2 gedrückt ist, dann...
34
    {
35
      if (OCR1A > 0)        // wenn Minimalwert noch nicht erricht ist, dann LED dunkler...
36
        OCR1A--;        // verarbeite die Impulsbreite des PWM-Signals um "1"
37
      
38
      _delay_ms(15);        // warte 15ms
39
    }
40
  }
41
  return 0;
42
}

Das Problem ist nun das die LED nicht komplett aus geht und flackert.
Wenn ich den F_CPU anstatt 8MHz auf 1MHz einstelle, bekomme ich es 
wenigstens schon einmal hin das die LED bei voller Helligkeit normal 
leuchtet.

Was mach ich falsch? Bzw. übersehe ich irgendetwas im Datenblatt?

Danke und liebe Grüße.

von Robin (Gast)


Lesenswert?

Wo ist die Antwort, die einer eben noch geschrieben hatte?
Jetzt kann ich gar nicht mehr fragen was er meinte? ^^

Kann mir vielleicht noch wer weiter helfen?

von kunz (Gast)


Lesenswert?

Möglicherweise meinst du das Glimmen durch den "narrow spike".

Aus Datenblatt:

"The extreme values for the OCR1x Register represents special cases when 
generating a PWM
waveform output in the fast PWM mode. If the OCR1x is set equal to 
BOTTOM (0x0000) the output will be a narrow spike for each TOP+1 timer 
clock cycle. Setting the OCR1x equal to TOP
will result in a constant high or low output (depending on the polarity 
of the output set by the
COM1x1:0 bits.)"

von Axelr. (Gast)


Lesenswert?

Robin schrieb:
> bei Youtube folgendes Video gefunden:
> Youtube-Video "Mikrocontroller - Grundlagen (Timer; Teil 2) PWM"

Das ist von "Horst Schlemmer", oder? =:o))

Dein Prescaler ist zu hoch (256). Stell ihn auf (64) oder gar auf (8).

Wenn OCR1A == 0, dann merke dir, was in TCCR1A drinn stand und setze es 
auf Null. Wird OCR1A wieder größer, schreibst Du den alten Inhalt wieder 
in TCCR1A hinein. Aber nur, dann, wenn noch null drinn steht.

von Robin (Gast)


Lesenswert?

xD Ja der hört sich schon komisch an aber erklärt das ganze recht gut.

Mit dem Vorteiler hat schonmal geklappt. Also ich hab den jetzt auf 8 
gestellt.
Jetzt muss ich noch gucken wie ich die LED komplett ausschalten kann.

von Axelr. (Gast)


Lesenswert?

Auf Invertierend könnte gehen. Musst Du zwar jedesmal 255- OCR1A 
rechnen, aber bei gaanz hell fällt es nicht witer auf, wenn die LED alle 
255 Takte einmal mit einem kurzen Spike aussetzt.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wenn du bei (OCR1A == 0) den LED Ausgang auf Eingang schaltest, geht die 
LED ganz aus.

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.