Forum: Mikrocontroller und Digitale Elektronik PWM für Lagerfeuer erklärt


von Peter Marten (Gast)


Lesenswert?

Guten Tag,

ich bin nicht ganz neu im µC Gebiet, habe aber noch nie etwas mit PWM 
gebaut. Nun habe ich eine Projektidee wo ich mir das gleich mal aneignen 
kann.

Gebaut werden soll eine Lagerfeuer-Imitation mit LEDs. Ich denke ich 
benötige so 20 rote und 20 gelbe helle LEDs am Ende. Die müssen aber 
nicht alle unabhängig von einander flackern also 2 Kanäle (gelb und rot) 
sollten wohl reichen. Da der Atmega (habe bisher nur Atmega8 und 16 
programmiert) keine 20 LEDs je Ausgang schafft brauche ich denke noch 
einen Treiber.

Nun habe ich bevor ich loslege aber noch ein paar Verständnisfragen und 
es wäre nett, wenn mir die jemand von euch beantworten könnte.:
1. Was genau ist denn das Prinzip des PWM einfach erklärt? Kann ich 
nicht einfach die LED einschalten und eine Schleife programmieren die im 
ms-Takt hoch zählt und dann an ausgewählten Stellen (z.B. bei 100ms, 
250ms, 400ms und dann von vorn beginnen) einfach aus und gleich wieder 
an geht?

2. Muss ich bei der Verwendung eines Treibers und PWM etwas beachten? 
Also funktioniert das in Kombination?

Peter

von Teo D. (teoderix)


Lesenswert?

https://www.mikrocontroller.net/articles/AVR-Tutorial:_PWM
Ganz unten gibts noch weitere Links!

: Bearbeitet durch User
von FÄHNLEINFISELSCHWEIF (Gast)


Lesenswert?

Nachdem Du den PWM Artikel durchgelesen und verstanden hast, nimm den 
Timer mit zwei PWM Ausgängen und programmiere entsprechend die OCR 
Register.
Als Treiber einen passenden MOSFET für jede PWM und die Vorwiderstände 
bei den LEDs nicht vergessen.
Mach's erstmal mit je einer einzelnen LED direkt am PWM Pin um Dein 
"Feuer" passend flackern zu lassen.
Wegen Treiber lies das durch:
http://www.mikrocontroller.net/articles/Transistor#Basisschaltung

von Peter Marten (Gast)


Lesenswert?

Hallo,

okay also PWM habe ich nun verstanden. Zumindest wie ich eine LED zum 
Blinken bekomme bzw. die Helligkeit variieren kann.

Aber wie genau funkrtioniert jetzt ein Flackern, welches 
unregelmäßig//zufällig passiert (oder ein Faden)? Ändere ich dann immer 
wieder den Vergleichswert also. den Puls des PWM-Signals, sodass das 
Ein- und Ausschalten unregelmäßig passiert?

VG

von Peter Marten (Gast)


Lesenswert?

Ich habe hier einen denke ich simplen Code 
http://www.dieelektronikerseite.de/uC%20Ecke/Circuits/Elektronische%20Adventkerzen.htm

Verstehe aber nicht was genau in den beiden Funktionen Firelights und 
Timer_counter passiert. (Kann nur C)

von FÄHNLEINFISELSCHWEIF (Gast)


Lesenswert?

Mit BASIC kenne ich mich nicht aus aber ich denke mal das RND(256) für 
RANDOM also zufällig steht.
Du kannst das auch direkt in den Timer packen, wäre in C sowas:
1
...
2
OCRA = rand(256);
3
OCRB = rand(256);
4
...
Das bedeutet das jedesmal eine neue zufällige Zahl in das Register 
geschrieben wird.
Du kannst auch ein Array enrichten um eine Pseudozufallliste zu 
erzeugen.
Probier einfach beides aus und entscheide was Dir am besten gefällt.

von spess53 (Gast)


Lesenswert?

Hi

>okay also PWM habe ich nun verstanden. Zumindest wie ich eine LED zum
>Blinken bekomme bzw. die Helligkeit variieren kann.

Schon mal die Suche nach 'Lagerfeuer' hier im Forum probierte?

MfG Spess

von Romantiker (Gast)


Lesenswert?

FÄHNLEINFISELSCHWEIF schrieb:
> Das bedeutet das jedesmal eine neue zufällige Zahl in das Register
> geschrieben wird.

So eine reine Zufallsfunktion, bei der (idealerweise) keine Korrelation 
zwischen zwei aufeinanderfolgenden Werten besteht, wird wohl nicht so 
richtig als flackerndes Lagerfeuer durchgehen. Zumindest ein 
Tiefpassfilter sollte noch dahinter sitzen, damit sich die Helligkeit 
nicht völlig abrupt ändern kann.

von Peter Marten (Gast)


Lesenswert?

Hallo,

kann es sein, dass ich während ich die Vergleichsregister nicht so 
einfach ändern kann während alles läuft?

Egal ob ich in der Interrupt-Routine die Änderung der Register einbaue 
oder nicht, das Verhalten der LEDs scheint sich nicht zu verändern. Ich 
weiß, dass sie sich ja eigentlich durchaus sehr stark ändern könnten, da 
ich keinen Tiefpassfilter habe, aber es passiert ja gar nichts.


int main(void)
{
  //lcd_init();

  // PWM Einstellungen
  DDRB = (1 << PB1 ) | (1 << PB2 );  // OC1A auf Ausgang

  TCCR1A = (0<<WGM11) | (1<<WGM10) | (1<<COM1A1) | (0<<COM1A0) | 
(1<<COM1B1);  // Modus Vergleich 8 Bit
  TCCR1B = (0<<WGM13) | (1<<WGM12) | (1<<CS12) | (0<<CS11) | (0<<CS10); 
// 101 = 1024 100 = 256  011 = 64  010 = 8 000 = 1
  TIMSK |= (1 << OCIE2);
  TCCR2 = (1<<WGM21) | (1<<CS22) | (1<<CS21) | (1<<CS20); // Timer 2 zum 
Verstellen des PWM als Compare Mode
                              // 101 128  111 1024
  OCR1A = 130; // OCR1A initial setzen
  OCR1B = 230;
  OCR2 = 256; // Timer 2
  sei();

  while(1)
    {
        //TODO:: Please write your application code

    }
}

// Timer 2 Output COMPARE A Interrupt
ISR(TIMER2_COMPA_vect) {

  OCR1A = rand(256);
  OCR1B = rand(256);

}

von Peter Marten (Gast)


Lesenswert?

Okay Fehler gefunden.
Es heißt TIMER2_COMP_vect und nicht TIMER2_COMPA_vect.

von Peter Marten (Gast)


Lesenswert?

Hat jemand einen Tipp für mich, welchen LED Treiber bzw. Mosfet ich 
benötige? Die Angebotsvielfalt ist ja riesig.

Ich hätte gern einen Treiber, der etwas flexibel ist. An den ich also 5 
oder 10 oder 15 LEDs (normale LEDs nichts ausgefallenes) anschließen 
kann.

von Stefan F. (Gast)


Lesenswert?

Kommt auf die LED's und die Versorgungsspannung an. Ein simpler 
Vorschlag:
1
                         +------LED's----- VCC
2
         2,2k Ohm      |/
3
  PWM  o---[===]---+---|
4
                   |   |\>
5
                   |     |    100 Ohm
6
                   |     +---[===]---+
7
                   |                 |
8
                   +---|>|---|>|-----+---- GND      
9
                        1N4148
Diese PWM fähige Konstantstromquelle liefert 7 Milliampere. VCC muss 
hoch genug sein, um die LED's (in Reihenschaltung) zuzüglich 2 Volt.

Als Transistor musst du einen wählen, der die Verlustleistung verträgt.

Beispiel: VCC=50V und 5 LED's zu je 2V.

Amm 100 Ohm Widerstand fallen 0,7 Volt ab. Dann muss der Transistor 
50-0,7-(5*2)=39,7 Volt verheizen. 39,7V * 7mA = 0,277 Watt.

Wenn du deine "Flexibilität" etwas mehr einschränkst, kommst du mit 
einem ganz normalen BC548 aus.

von Teo D. (teoderix)


Lesenswert?

Gtx Freak schrieb:
> 12.  50 St  2,00 €  N-Fet Logiklevel  IRLML2502  SOT23  20V 4.2A  45mOhm
> International Rectifier
> http://www.irf.com/product-info/datasheets/data/irlml2502pbf.pdf

Beitrag "[V] Div SMD - Spannungsregler, Pic's, Transistoren, Tantal's, Dioden/LED"

Super Angebot und sollte Deine Bedürfnisse abdecken.

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.