Forum: Mikrocontroller und Digitale Elektronik LED-Dimmer / PWM Timing-Problem


von Rush (Gast)


Lesenswert?

Moin Leute...
Ich habe ein Timingproblem was LEDs dimmen angeht.
momentaner Stand:

1. weisse und blaue LEDs sollen abwechselnd gedimmt werden
2. LEDs werden mittels PWM gedimmt (OC1A und OC1B)
3. Timer0 im Fast-PWM Mode (zählt bis 1023, Vergleichsregister OCR1A u. 
OCR1B)

Wenn ich die beiden LEDs mit gleichen Werten in den Vergleichsregistern 
hin und herdimmen lasse dann dimmen die LEDs wie gewünscht, sprich:

WS    BL
0%    100%
20%   80%
40%   60%
50%   50%
60%   40%
70%   30%
80%   20%
90%   10%
100%  0%


Da die LED von der Leuchtstärke alldings unterschiedlich sind, ich sie 
also in der Helligkeit angleichen möchte, Sieht der Dimmvorgang nicht 
mehr so schön aus da die beiden Vergleichsregister mit unterschiedlichen 
Werten geladen sind. Angenommen die blauen haben einen Soll-Wert von 20% 
und die weissen von 40%. Dann sollen die blauen von 0% bis 20% 
hochgedimmt werden, während die blauen von 40% nach 0% gedimmt werden. 
Hierbei müssten ja die blauen langsamer dimmen als die weissen damit ich 
einen flüssigen Übergang erhalte.

Mein Problem ist jetzt wie ich das realisieren soll...
Die Funktion muss auch flexibel sein weil wie schon gesagt, die maximale 
Helligkeit ist ja abhängig von den eingesetzten LEDs. Könnt ihr mir da 
ein wenig auf die Sprünge helfen ?

Hier noch meine derzeitige Funktion zum dimmen:
1
.
2
.
3
.
4
#define  PWM_WS    OCR1A      //Pin Ausgang
5
#define  PWM_BL    OCR1B 
6
volatile uint16_t intTOP_WS;
7
volatile uint16_t intTOP_BL;
8
9
.
10
.
11
.
12
void flush(void)
13
{
14
  for (i = 0; i < intTOP_WS; i++)
15
  { 
16
    PWM_WS++; 
17
    PWM_BL--;
18
  _delay_ms(6);
19
  }
20
21
  for (i = 0; i < intTOP_BL; i++)
22
  { 
23
    PWM_WS--; 
24
    PWM_BL++;
25
  _delay_ms(6);
26
  }
27
}
Vielen Dank schonmal für die Bemühungen.

von Matthias L. (Gast)


Lesenswert?

>Dann sollen die blauen von 0% bis 20% hochgedimmt werden, während die >blauen von 
40% nach 0% gedimmt werden.

Bevor du was programmierst, solltest du dich mit Bleistift und Papier 
hinsetzen und erstmal darüber nachdenken. Und einen Ablauf skizzieren.

Dann wirst du erkennen, dass es auf eine lineare Gleichung der Form

y = mx + n

herausläuft. Wobei das x die Zeit t ist.


Achja, die delays solltest du lieber durch Timer machen.

von Rush (Gast)


Lesenswert?

Der Ansatz mit Papier und Bleistift ist ja gut, nur bin ich doch schon 
ziemlich lange aus der Schule draußen und weiss nicht mal im Ansatz wie 
ich überhaupt anfangen sollte zu Zeichnen.

y = mx + n

x = Zeit

Und was stellt y, m und n dar?

Kannst du mir einmal eine Beispielrechnung geben, dann sollte ich denke 
ich klar kommen.

Das mit den delays ist mir klar, lieber einen Timer.
Allerdings habe ich bereits den Timer0 für die Tastenentprellung und 
Timer1 fürs PWM.

von Matthias L. (Gast)


Lesenswert?

>Der Ansatz mit Papier und Bleistift ist ja gut, nur bin ich doch schon

Woher weißt du, was du programmierst, wenn du dir über den zu 
programmierenden Ablauf keine Gedanken gemacht hast...?



Mal doch mal ein Diagramm auf.

die x-Achse ist die Zeit.
die y-Achse ist 0..100% Helligkeit.

Jetzt malst du die Kurven für beide LEDS darein.

Das musst jetzt nur mathematisch beschrieben werden. Dann kannst du das 
programmieren.

von Rush (Gast)


Lesenswert?

Ja ok, und wie komme ich von meinen Zwei linien auf die Gleichung welche 
mir die Differenz der beiden Dimmvorgänge liefet ?

von Matthias L. (Gast)


Lesenswert?

was für ne Differenz? Poste doch mal die Skizze

von Rush (Gast)


Angehängte Dateien:

Lesenswert?

Hier mal die Skizze
X = Zeit in ms
Y = Helligkeit in Prozent

von Matthias L. (Gast)


Lesenswert?

Naja,
jetzt nimmst du die Gleichung

y = m * x  +  n


Jetzt nimmst du den Anfangs, und den Endpunkt und setzt den in die 
Gleichung ein:

   y = m * x  +  n

BLAU:
   0 = m * 0  +  n
  40 = m * 40 +  n

WEISS:
   0 = m * 0  +  n
  18 = m * 40 +  n

Das sind zwei GLeichungssysteme mit zwei Unbekannten. Damit kannst du m 
und n ausrechnen. m gibt an, um wieviel & die LED pro Millisekunde 
heller wird.

von Rush (Gast)


Lesenswert?

Und was gibt n an ?

von Matthias L. (Gast)


Lesenswert?

Den Durchstoßpunkt der Kurve durch die y-Achse.

von Rush (Gast)


Lesenswert?

Ja der wäre doch dann immer 0/0 oder nicht?

von Matthias L. (Gast)


Lesenswert?

in deinem fall sind beide n=0.

von Rush (Gast)


Lesenswert?

habs jetzt mal durchgerechnet.

Also umgestellt müsste dir Formel ja nach m sein.

Habe ich das hier rausbekommen

y/x - n = m   also für blau dann:
40/40 - n = m  ergibt 1

n ist ja immer 0 hast du gesagt.
Dann bekomme ich aber für die weissen LEDs auch 0 raus. Kann ja aber 
nicht sein? Wo liegt jetzt mein Fehler?

von Rush .. (rush)


Lesenswert?

Kann es sein dass du hier was vertauscht hast :

BLAU:
   0 = m * 0  +  n
  40 = m * 40 +  n

WEISS:
   0 = m * 0  +  n
  18 = m * 40 +  n


bei Blau hast du drinstehen 40 = m * 40 +  n
und bei weiss 18 = m * 40 +  n. Sollte dass nicht 18 = m * 18 +  n sein 
?

von Rush .. (rush)


Lesenswert?

Ah, habs doch gerafft....

Bin ja auch blöd. X ist ja die Zeit und Y die Helligkeit bzw. das PWM

Vielen Dank Matthias :-)

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.