LED-Dimmer / PWM Timing-Problem

Gast #1218729
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.
Gast #1218735
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.
Gast #1218750
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.
Gast #1218759
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.
Gast #1218803
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.
Gast #1220932
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren