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
voidt_int(void)interrupt1
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!
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
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!
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
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
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
@ 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