mikrocontroller.net

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


Autor: Rush (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
.
.
.
#define  PWM_WS    OCR1A      //Pin Ausgang
#define  PWM_BL    OCR1B 
volatile uint16_t intTOP_WS;
volatile uint16_t intTOP_BL;

.
.
.
void flush(void)
{
  for (i = 0; i < intTOP_WS; i++)
  { 
    PWM_WS++; 
    PWM_BL--;
  _delay_ms(6);
  }

  for (i = 0; i < intTOP_BL; i++)
  { 
    PWM_WS--; 
    PWM_BL++;
  _delay_ms(6);
  }
}

Vielen Dank schonmal für die Bemühungen.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rush (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rush (Gast)
Datum:

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

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was für ne Differenz? Poste doch mal die Skizze

Autor: Rush (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal die Skizze
X = Zeit in ms
Y = Helligkeit in Prozent

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rush (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was gibt n an ?

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Durchstoßpunkt der Kurve durch die y-Achse.

Autor: Rush (Gast)
Datum:

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

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in deinem fall sind beide n=0.

Autor: Rush (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rush ... (rush)
Datum:

Bewertung
0 lesenswert
nicht 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 
?

Autor: Rush ... (rush)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.