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


von NochnAnfänger (Gast)


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 ;)

von Karl H. (kbuchegg)


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).


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.