Forum: Mikrocontroller und Digitale Elektronik LED-Fading 8051 / Soft PWM


von Luis D. (luis_d)


Lesenswert?

Ich grüße euch,

Was ich vorhabe:

Ich möche eine LED (oder später mehrere) faden und das mit einem 8051, 
genauer mit dem Atmel 89C51AC3.

*Was ich mir dabei gedacht habe:*
Ich habe mir gedacht in einem Interrupt, der alle x ms (mit Schleife 
dann ca. 100 Hz) ausgelöst wird, eine Tabelle abzuarbeiten in der steht, 
wie oft der Interrupt ausgelöst wird, bevor die LED getoggelt wird.
Mir ist auch klar dass diese PWM sehr schnell geht.
Kann man wohl kaum was sehen. Wenn ich jetzt aber meine 100 Hz PWM 
beibehalten möchte, muss ich ein Feld mit 500 Elemente anlegen um eine 
*5 sec. lange Fading-Phase* hinzubekommen (siehe meine Berechnung am 
Schluss).

Die Beiträge zu http://www.mikrocontroller.net/articles/LED-Fading und 
http://www.mikrocontroller.net/articles/Soft-PWM habe ich gelesen und 
noch vieles anderes. Allerdings unterscheidet sich C bei AVRs von C bei 
8051 doch ziehmlich stark und von AVRs hab ich wenig Ahnung, naja 
eigentlich gar keine (will mich an denen auch irgendwann mal versuchen).
Resultat ist jedenfalls, dass ich mit den Beispielen nur sehr wenig 
Anfangen kann.

Jetzt gibt es hier sicher eine deutlich einfachere Methode, vorallem 
ohne große Tabellen. Hardware PWM habe ich noch nie versucht, würde 
jedoch gerne beides testen wollen, vorallem jedoch Soft-PWM, wenn es 
darum geht mehrere LEDs zu steuern, oder würdet ihr da einfach einen 
Multiplexer empfehlen?

*Was ich mir noch dabei gedacht habe:*
In meinem Code wird die LED-Auszeit verkürzt, während die An-Zeiten 
länger werden (Inhalt Tabelle, exponentiell) um ungefähr die 100 Hz zu 
halten.
Somit wäre dann ja auch gegeben, dass die LED wirklich ganz an und ganz 
ausgehen kann.

LED = 1 -> LED aus
Timer: 16 Bit
Ich weiß de Code passt nicht, auch nicht zu meinen Angaben (erster 
Versuch, danach nur noch auf Papier getüftelt), aber es geht mir nur mal 
um den Prinzipaufbau, dass ich das auch verstehe.
1
void t_int (void) interrupt  1
2
{
3
  TF0=0;
4
5
  if(led == 0)
6
  {      
7
    if(i == pwm_table[32-count])
8
    {
9
      i = 0;
10
      led = 1;
11
      //++count;
12
      if(count==32) count=0;
13
    }    
14
  }  
15
  else
16
  {
17
    if(i == pwm_table[count])
18
    {
19
      i = 0;
20
      led = 0;
21
      ++count;
22
    }
23
  }
24
  ++i;    
25
  TR0=1;
26
}


Wie ich darauf komme?
ich habe mir eine Formel zusammengebastelt:

hergeleitet aus:

f_osc in MHz
f_PWM in Hz
PWM_soll_zeit in ms
x = Größe der Tabelle, um die gewünschte Zeit zu erreichen.

dabei ist bei mir:

timervorladung = 246
PWM_soll_zeit = 5000 ms
teiler = 6, da X2 Mode
f_osc = 29,4912 MHz
f_PWM = 100 Hz

Vielen Dank für die Hilfe!

von R. W. (quakeman)


Lesenswert?

Wieviele LEDs willst du denn getrennt voneinander steuern per PWM?

Der 89C51AC3 kann schon alleine per PCA Timer fünf getrennte hardware 
PWM Ausgänge ansteuern. Falls das ausreicht, dann würde ich bei der 
hardware Lösung bleiben. Eine software PWM verschlingt ansonsten 
wertvolle Rechenzeit, die du später in deinem Hauptprogramm nicht mehr 
zur Verfügung hast.

Oder soll das Ganze sowieso nur ein Lernprojekt sein und keine 
spezifische Anwendung später haben?
Dann kannst du das natürlich auch per software PWM realisieren.

Ciao,
     Rainer

von Luis D. (luis_d)


Lesenswert?

Zuerst mal sollte es ein Lernprogramm werden, habe aber im Hinterkopf 
auch schon eine Anwendung, in der bis zu 30 LEDs hängen würden. Momentan 
habe ich sowieso keine größere Aufgaben für den MC sodass es eigentlich 
keine große Rolle spielt, wie viel Rechenleistung für die PWM gebraucht 
wird.

Aber das mit den 5 Kanälen für den PCA Timer hört sich Interessant an, 
würde ich gerne mal mehr darüber Erfahren. Die einzelnen Register sind 
mir bekannt, dafür gibts ja das Handbuch.
Aber der Mechanismus und Ablauf der dahinter steckt wäre auch ganz 
interessant, dass ich das auch verstehe was ich mache.
Ein Beispiel dazu wäre sehr schön.

Ich such auch noch selbst danach.

Vielen Dank!

von R. W. (quakeman)


Lesenswert?

Beispiele habe ich keine, aber im Datenblatt steht zum PCA ja alles 
drin, was man wissen muss. :)
Damit sollte es nicht schwer sein ein Beispielprogramm zu erstellen, 
womit man dann etwas herumexperimentieren kann.

Ciao,
     Rainer

von Jobst M. (jobstens-de)


Lesenswert?

Also in Assembler könnte man das mit 30 LEDs schaffen. Da benötige ich 
5 Befehlszyklen (im X2 Mode also 30 Quarztakte) pro LED.

Bei 100Hz und 8-Bit Auflösung also 25600 Aufrufe pro Sekunde.
Bei 30 Q-Takten pro Kanal bei 30 LEDs = 900 Q-Takte
25600 * 900 = 23,04MHz Mindestfrequenz um nur die LEDs zu bedienen.


Gruß

Jobst

von Ralf (Gast)


Lesenswert?

Ich hab's bei mir so gelöst:
- ein Timer generiert die PWM-Frequenz = Auflösung x Wiederholrate
- ein Timer generiert eine Zeitbasis (beispielsweise 10ms) -> Im 
Interrupt werden sog. Software-Timer-Variablen dekrementiert, wenn sie 
ungleich 0 sind
- Die Applikation kann die SW-Timer verwenden, um Timeouts etc. zu 
realisieren.
- Wenn die Applikation geschickt aufgebaut wird, hängt der Controller 
auch nicht bei der Abfrage der Timeouts.
- Ich habe eine Tabelle mit den nötigen PWM-Werten (beispielsweise 10 
oder 20 Stufen) -> nicht wirklich große Tabelle
- Die Applikation holt sich entsprechend der "Timeouts" den nächsten 
PWM-Wert aus der Tabelle

Also keine großen Tabellen, Controller wartet nicht "umsonst", etc. :)

Ralf

von Falk B. (falk)


Lesenswert?

@  Luis D. (luis_d)

>dann ca. 100 Hz) ausgelöst wird, eine Tabelle abzuarbeiten in der steht,
>wie oft der Interrupt ausgelöst wird, bevor die LED getoggelt wird.

???

>Mir ist auch klar dass diese PWM sehr schnell geht.
>Kann man wohl kaum was sehen.

Warum machst du das dann?

> Wenn ich jetzt aber meine 100 Hz PWM
>beibehalten möchte, muss ich ein Feld mit 500 Elemente anlegen um eine
>*5 sec. lange Fading-Phase* hinzubekommen (siehe meine Berechnung am
>Schluss).

Kann sein.

>Die Beiträge zu http://www.mikrocontroller.net/articles/LED-Fading und
>http://www.mikrocontroller.net/articles/Soft-PWM habe ich gelesen und
>noch vieles anderes.

Und auch verstanden?

> Allerdings unterscheidet sich C bei AVRs von C bei
>8051 doch ziehmlich stark

Nicht wirklich. Du musst lediglich die Timersteuerung und den IO-Zugiff 
anpassen, der Rest bleibt gleich.

>Resultat ist jedenfalls, dass ich mit den Beispielen nur sehr wenig
>Anfangen kann.

Dann lies sie noch einmal und denk drüber nach.

>Jetzt gibt es hier sicher eine deutlich einfachere Methode, vorallem
>ohne große Tabellen. Hardware PWM habe ich noch nie versucht, würde


Dann tu es. Die beißt nicht.

>jedoch gerne beides testen wollen, vorallem jedoch Soft-PWM, wenn es

Dann tu es ebenfalls.

>darum geht mehrere LEDs zu steuern, oder würdet ihr da einfach einen
>Multiplexer empfehlen?

Nein.

>*Was ich mir noch dabei gedacht habe:*
>In meinem Code wird die LED-Auszeit verkürzt, während die An-Zeiten
>länger werden (Inhalt Tabelle, exponentiell) um ungefähr die 100 Hz zu
>halten.

Hä?
du hast das Prinzip nicht wirklich verstanden. Lies die Artikel noch 
einmal.

>Ich weiß de Code passt nicht, auch nicht zu meinen Angaben (erster
>Versuch, danach nur noch auf Papier getüftelt), aber es geht mir nur mal
>um den Prinzipaufbau, dass ich das auch verstehe.

Dann hör auf so hektisch hier zu fabulieren und bring mal etwas Ruhe und 
Klarheit in deine Gedanken.

Kleiner Tipp. Die PWM hat mit dem Fading erstmal nichts zu tun. Mach 
erstmal NUR die PWM mit festen Werten, das Fading kommt später.

MFG
Falk

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.