PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Leuchtturm-Simulation mit LEDs



ACDC
19.11.2006, 18:58
Hallo zusammen !

Ich möchte das Leuchtfeuer eines Leuchtturms simulieren. Ein simples Lauflicht reicht mir da nicht, ich denke eher an ein langsames Einschalten der LEDs bis zum Maximum, dann wieder langsam Ausschalten bis zum "Aus". 18 LEDs für rundum reichen mir, davon sollten drei oder fünf oder gar sieben jeweils in den verschiedenen Zuständen "an" sein, die mittlerste jeweils um die volle Helligkeit, die beiden daneben dann jeweils im halbhellen Bereich und die beiden daneben dann jeweils im schwachhellen Bereich.

OOOOOOOOO
1OOOOOOOO
21OOOOOOO
321OOOOOO
2321OOOOO
12321OOOO
O12321OOO
OO12321OO
OOO12321O
OOOO12321
OOOOO1232
OOOOOO123
OOOOOOO12
OOOOOOOO1
OOOOOOOO0

Je weicher die Übergänge werden, desto besser. Ein Leuchturm ist schliesslich kein Flashlight :-)

Am liebsten würde ich das mit einem ATmega-Controller realisieren, einfache C-Kenntnisse und Hardwarekenntnisse sind vorhanden.

Danke für Eure Hilfe !

Gruß, Andreas

izaseba
19.11.2006, 19:19
Hallo,
schönes Projekt :-)
Nur wo ist eigentlich die Frage ?

Da kommst Du um PWM nicht herum, wenn Du noch keinen µC im Sinn hast würde ich Dir irgendwas mit viel Hardware PWM empfehlen, ich glaube der Mega88 hat z.B. 6 PWM Kanäle :-k

Gruß Sebastian

ACDC
19.11.2006, 19:31
Hallo,
schönes Projekt :-)
Nur wo ist eigentlich die Frage ?Danke. Stimmt. Okay, ich reiche die Frage mal nach : wie kann man sowas mit vernünftigem Aufwand realisieren ?


Da kommst Du um PWM nicht herum, wenn Du noch keinen µC im Sinn hast würde ich Dir irgendwas mit viel Hardware PWM empfehlen, ich glaube der Mega88 hat z.B. 6 PWM Kanäle :-k Das dachte ich auch schon, aber braucht man da Hardware-PWM für, geht das nicht vielleicht auch mit Soft-PWM ? Denn bei 18 LEDs bräuchte ich ja entsprechend viele Hardware-PWMs ... und das bietet mir kein Controller !

Die erste Idee war, 18 Soft-PWM-Kanäle zu realisieren ... aber irgendwie fehlt mir eine vernünftiger Einstieg ... eine zündende Idee für den Start, wenn Du verstehst, was ich meine ?!

Gruß, Andreas

izaseba
19.11.2006, 19:56
Ja ich weiß, was Du meinst :-)

Ganz wichtig ist es eine Frequenz zu treffen, wo es nicht flackert 50 Hz z.B. ?
die dann mit der Auflösung multiplizieren z.B. 256
es kommt irgendwas mit 12 KHz, so mußt Du Deinen Timer laufen lassen.

Für jede LED mußt Du eine PWM Variable nehmen, die dann die Helligkeit darstellt 0-Aus 255 ganz hell.

So, wenn Der Timer überläuft inkrementierst Du eine Hilfsvariable und vergleichst sie mit allen LEDs Vabiablen nacheinander , wenn sie Gleich ist setzt Du den entsprechenden Pin auf LOW.

Ich hoffe, daß es verständlich ist, es erzeugt aber ziemlich viel Last, man muß gucken, Daß die Interrupt Routine nicht länger braucht als der Timer.

Gruß Sebastian

ACDC
19.11.2006, 20:08
Ja ich weiß, was Du meinst :-)Gut :-)


Ganz wichtig ist es eine Frequenz zu treffen, wo es nicht flackert 50 Hz z.B. ? die dann mit der Auflösung multiplizieren z.B. 256
es kommt irgendwas mit 12 KHz, so musst Du Deinen Timer laufen lassen.Die Freuqenz sollte so hoch wie nötig und so niedrig wie möglich sein ...


Für jede LED musst Du eine PWM Variable nehmen, die dann die Helligkeit darstellt 0-Aus 255 ganz hell.Klar, so sehe ich das auch ...


So, wenn Der Timer überläuft inkrementierst Du eine Hilfsvariable und vergleichst sie mit allen LEDs Vabiablen nacheinander , wenn sie Gleich ist setzt Du den entsprechenden Pin auf LOW.
Und wenn die Hilfsvariable "0" ist, dann werden im Prinzip alle LEDs eingeschaltet ...


Ich hoffe, daß es verständlich ist, es erzeugt aber ziemlich viel Last, man muß gucken, Daß die Interrupt Routine nicht länger braucht als der Timer.Deswegen muss die Frequenz ja so niedrig wie möglich sein.

Wo ich bisher noch keine Idee zu habe, ist, wie ich das Ganze nun auch noch ans Laufen bekomme ... also die Drehbewegung des Leuchtfeuers ;-)

Gruß, Andreas

izaseba
19.11.2006, 20:52
Deswegen muss die Frequenz ja so niedrig wie möglich sein.

Ja, 50 Hz hab ich eben so gesagt, da muß man halt etwas probieren, damit das Auge kein flackern mehr wahrnimmt.



Wo ich bisher noch keine Idee zu habe, ist, wie ich das Ganze nun auch noch ans Laufen bekomme ... also die Drehbewegung des Leuchtfeuers

Hmm,
ein Array mit Abbbild einer Drehung z.B.


uint8_t abbild[] = {32,64,128,255,128,64,32,0,0,0,0,0,0,0,0,0,0,0};

naja, die Werte müssen natürlich noch ermittelt werden.

das ganze mit einer Schleife in die PWM Werte laden und bei jedem Durchgang eine Stelle weiter rechts anfangen ?

Gruß Sebastian

ACDC
19.11.2006, 21:15
Hmm, ein Array mit Abbbild einer Drehung z.B.


uint8_t abbild[] = {32,64,128,255,128,64,32,0,0,0,0,0,0,0,0,0,0,0};

naja, die Werte müssen natürlich noch ermittelt werden.
das ganze mit einer Schleife in die PWM Werte laden und bei jedem Durchgang eine Stelle weiter rechts anfangen ?
Wenn ich das jetzt richtig verstehe, dann willst Du diese 7 LEDs jeweils bis zu einem konstanten PWM-Wert laufen lassen, richtig ? Meinst Du, dass das einen fließenden Übergang genügend simulieren kann ?
Ich dachte an eine fließende Anpassung der PWM-Werte. Aber der Aufwand beim Programmieren ist so erheblich, dass ich denke, dass selbst ein ATmega-16 mit 16 MHz das nicht schaffen kann ... oder ?

Gruß, Andreas

izaseba
19.11.2006, 21:31
Ich dachte an eine fließende Anpassung der PWM-Werte

Ja ich verstehe, einfach sanft ausblenden bzw. einblenden.
Ich persönlich würde es erstmal mit solch einem Array probieren :-k
verfeinern kann man es immer noch.

Hast Du die Hardware schon fertig, oder bist Du erstmal nur am planen ?

Gruß Sebastian

P.S. wie ich gerade sehe sind wir fast Nachbarn :-)

ACDC
19.11.2006, 21:44
Ich dachte an eine fließende Anpassung der PWM-WerteJa ich verstehe, einfach sanft ausblenden bzw. einblenden.Ja, genau ... das war jedenfalls mein erster Gedanke !


Ich persönlich würde es erstmal mit solch einem Array probieren :-k verfeinern kann man es immer noch.Die Hardware bleibt ja zumindest dieselbe, aber bei 18 LEDs auf 360 Grad ist es unrealistisch, wenn davon 7 LEDs gleichzeitig mehr oder weniger "an" sind, oder ? Ich denke, das sollten 4 oder max. 5 LEDs sein, aber vielleicht muss man das auch erstmal sehen ...


Hast Du die Hardware schon fertig, oder bist Du erstmal nur am planen ?Nein, ich bin bisher nur am planen, weder Hardware noch Software "stehen" zurzeit !


P.S. wie ich gerade sehe sind wir fast Nachbarn :-)Jepp, habe ich vorhin auch schon gesehen ... :-) ... Vielleicht trifft man sich ja mal ...

Gruß, Andreas

izaseba
19.11.2006, 22:07
Ich denke, das sollten 4 oder max. 5 LEDs sein


Ja, Du hast recht, ich hab es einfach so niedergeschrieben, ohne viel nachzudenken...

Schön ausblenden wäre natürlich viel schöner, dafür müßte aber die PWM Frequenz höher sein, womit wir wieder mit HW PWM besser dran wären.


Vielleicht trifft man sich ja mal

Spätestens wenn Deine Laterne fertig ist :wink:

Gruß Sebastian

phaidros
20.11.2006, 03:36
Wenn du nur die LEDs ansteuern willst, geht es mit Sicherheit:
Der Zustand der LEDs zu einem bestimmten Zeitpunkt lässt sich durch ein Bit-Array mit 24 Bit darstellen (dann hast du sogar 24 LEDs). Diese 3 Bytes werden einfach auf 3 Ports in einem festen Rhythmus (Timer oder NOPs) ausgegeben. Als Beispiel: Wenn du die LEDs in 100 Schritten langsam an- und wieder abschwellen lassen willst, brauchst du nur 300 Byte irgendwo abspeichern und nacheinander auf die richtigen Ports hauen. Und wie sehen jetzt die Bits aus? Das berechnest du einfach offline vorher auf deinem PC und generierst dir ein entsprechendes Programm.
Die brutalste Lösung geht also ungefähr so:
10 Gebe drei Bytes auf drei Ports aus
20 Warte ein Weilchen
30 Gebe drei Bytes auf drei Ports aus
40 Warte ein Weilchen
.....
.....
2000 Goto 10
Gruß
Phaidros

izaseba
20.11.2006, 20:12
Wie schnell soll das ganze denn drehen ?

Vielleicht könnte man 3 M48 oder M88 verwenden ?
die haben alle 6 HW PWM Kanäle.

Einer beschafft die Daten und die zwei anderen warten nur darauf die OCR Register damit zu füllen.

Komunikation dann per I2c,SPI,UART, weiß was ich...

Nur so ein Gedanke...

Gruß Sebastian