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
https://www.mikrocontroller.net/articles/AVR-Tutorial:_PWM Ganz unten gibts noch weitere Links!
:
Bearbeitet durch User
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
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
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)
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.
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
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.
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); }
Okay Fehler gefunden. Es heißt TIMER2_COMP_vect und nicht TIMER2_COMPA_vect.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.