mikrocontroller.net

Forum: Compiler & IDEs Tiny13 C Software PWM, wie ?


Autor: NochnAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich möchte mit einem Tiny13 sechs LEDs via PWM dimmen.
Soweit ich das Datenblatt verstanden habe, hat er zwei Hardware PWMs, 
die über die Compare Register gesteuert werden ?
Wie bekomme ich nun auf die anderen Pins eine steuerbare PWM ?
Assembler kann ich leider nicht und WinAVR unterstützt ja den Tiny13, 
daher möchte ich in C programmieren ;)
Wie mache ich sowas ?
Meine Idee, ich nehme einen Timer und setze in dessen Überlaufinterrupt 
je nach Zählerstand der einzelnen Pins selbige auf Low oder High.
Ist das der richtige Ansatz ?
Mit der Suche habe ich hier leider nix passendes gefunden :-(
Danke für jede Hilfe ;)

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

Bewertung
0 lesenswert
nicht lesenswert
NochnAnfänger wrote:
>
> Meine Idee, ich nehme einen Timer und setze in dessen Überlaufinterrupt
> je nach Zählerstand der einzelnen Pins selbige auf Low oder High.
> Ist das der richtige Ansatz ?
>

Ja, das ist der richtige Ansatz.

Für jeden Pin gibt es einen Grenzwert.

Im Überlaufinterrupt zählst du einen globalen Zähler hoch.
Ist der globale Zählerstand kleiner diesem
Grenzwert, dann wird der Pin eingeschaltet. Ist er größer
wird der Pin ausgeschaltet. Das prüfst du für jeden Pin
einzeln durch.

In Pseudocode

Überlaufinterrupt:

   globaler_Z = globaler_Z + 1

   if( globaler_Z < PWM_1 )
     schalte Pin 1 ein
   else
     schalte Pin 1 aus

   if( globaler_Z < PWM_2 )
     schalte Pin 2 ein
   else
     schalte Pin 2 aus

   if( globaler_Z < PWM_3 )
     schalte Pin 3 ein
   else
     schalte Pin 3 aus

   if( globaler_Z < PWM_4 )
     schalte Pin 4 ein
   else
     schalte Pin 4 aus

   ...

Das ergibt dann eine PWM mit 256 Stufen. Dies deshalb, da
der globaler_Z sinnvollerweise in einem uint8_t abgelegt wird.
Der hat 8 Bit und daher zählt dieser Zähler immer von 0 bis 255,
0 bis 255, etc. Für die PWM_x Variablen reichen dann ebenfalls
uint8_t.
Bei 6 PWM Stufen kann man die einzelnen Stufen wie oben noch
ausprogrammieren. Bei mehr Stufen, würde man das ganze natürlich
in eine Schleife packen und die PWM Werte sinnvollerweise in
ein Array legen.

256 braucht man aber oft nicht, und ausserdem kann es dann noch
ein Problem mit dem Timing geben, da ja die PWM Frequenz damit
effektiv nur noch ein 256-tel der Timer-Zählfrequenz ist.
Dann kann man zb. die PWM auf nur 64 Stufen begrenzen:

Überlaufinterrupt:

   globaler_Z = globaler_Z + 1
   if( globaler_Z > 63 )
     globaler_Z = 0

   if( globaler_Z < PWM_1 )
   ...

Eine andere Möglichkeit die PWM Frequenz zu erhöhen ist es,
sich nicht an den Overflow Interrupt zu klemmen, sonden zb.
an den CTC Interrupt (keine Ahnung ob der Tiny 13 sowas hat).


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.