mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Macht diese PWM-Variante Sinn?


Autor: M.B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe damals mal folgenden PWM-Code programmiert:
(auf einem ATmega-Prozessor in AVR GCC)

Es war eine LED angehangen die gedimmt werden sollte von 0 - 100%
Der Aufruf erfolgte in der main mit:
PWM(128);
// Werte zwischen 0 für aus und 1023 für 100%
void PWM(uint16_t PWM_rate)
{
// OC1A is used
  if (PWM_rate == 0)
    {
    TCCR1B = 0;      // PWM-Timer anhalten
    TCCR1A = 0;      // normaler Ausgang -> kein PWM
    
    PORTB |= (1<<PB1); // für OC1A
    }
  else //{PWM_Init und Einstellen der PWM-Rate}
    {
    TCCR1A = (1<<WGM11) | (1<<WGM10) | (1<<COM1A1) | (1<<COM1A0);
    // Mode 7 - Fast PWM 10-Bit
    // PWM-Mode Timer 1 Ausg. A enabled (OC1A)
    // COM - Compare Output Mode: Clear on Compare match
    TCCR1B = (1<<WGM12) | (1<<CS10);
    // CS - Prescaler auf 8 = Clk / 8 (CS11=1)
    // CS - Prescaler auf 1 = Clk (CS10=1)
    
    OCR1A = PWM_rate;
    // set output OC1A, when Counter = OCR1A
    }
}

Ich unterscheide hier zwischen 0 für aus und die Dimmwerte.

Aber bei den Dimmwerten wird jedesmal der Timer initialisiert.

Das ist doch Quatsch! Aber bei 0% bzw aus reicht da nicht ein PWM-Wert 
von 0, also OCR1A = 0? Oder z.B. anhalten des Timers (CS alle 0)? Wieso 
habe ich das damals so gemacht? Scheinbar hab ich mir da was bei 
gedacht.
Die Schaltung habe ich leider nicht mehr.

Ich möchte jetzt wieder eine PWM programmieren und für PWM = 0 soll der 
Ausgang auf 0 bleiben. Wie ist es am sinnigsten?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
M.B. schrieb:
> Aber bei 0% bzw aus reicht da nicht ein PWM-Wert
> von 0, also OCR1A = 0?

<Gedächtnis kram>
Die PWM erzeugt dann immer noch kurze Spikes.
OCR1A gleich 0 funktioniert hardwaremässig nicht.

> Oder z.B. anhalten des Timers (CS alle 0)? Wieso
> habe ich das damals so gemacht? Scheinbar hab ich mir da was bei
> gedacht.

Davon geh ich mal aus :-)

> Ich möchte jetzt wieder eine PWM programmieren und für PWM = 0 soll der
> Ausgang auf 0 bleiben. Wie ist es am sinnigsten?

Lass es doch so.
Mach noch rein
  ...

  else //{PWM_Init und Einstellen der PWM-Rate}
    {
    if( TCCR1A == 0 )   // war die PWM auf 0? -> Timer neu starten
      {  
      TCCR1A = (1<<WGM11) | (1<<WGM10) | (1<<COM1A1) | (1<<COM1A0);
      // Mode 7 - Fast PWM 10-Bit
      // PWM-Mode Timer 1 Ausg. A enabled (OC1A)
      // COM - Compare Output Mode: Clear on Compare match
      TCCR1B = (1<<WGM12) | (1<<CS10);
      // CS - Prescaler auf 8 = Clk / 8 (CS11=1)
      // CS - Prescaler auf 1 = Clk (CS10=1)
      }

    OCR1A = PWM_rate;
    // set output OC1A, when Counter = OCR1A
    }
}

Autor: M.B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wow - guter Hinweis

Ich sag nur Bäume! (vor lauter Wald...)

Ja, so einfach und doch so weit weg.

Danke für den Tipp

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.