Hallo,
ich habe nun schon viel mit (Hochleistungs)LEDs und PWM rumprobiert. Mir
schwebt eine stufenlose Steuerung einer LED von 0% - 100% Helligkeit
(nicht Strom!) vor.
Ich habe schnell gemerkt, dass ich eine Exponentialfunktion brauche, um
LEDs für den Menschen linear zu dimmen. Doch mit einer
Exponentialfunktion habe bei 8 oder 10 BIt richtig böse Stufen im
unteren Bereich wenn ich 256 Helligskeitsstufen haben möchte.
Was nun?
Ich möchte:
-8 RGB LEDs (also 24 PWM Kanäle) mit 256 Stufen steuern könnnen.
-Die Helligkeit soll sich für den Zuschauer linear verändern.
-Keine sichtbaren Stufen.
-PWM Freq. so dass ein Flackern sichtbar ist (~100Hz)
Ich denke dazu brauche ich eine 16 Bit PWM für die 24 Kanäle. Da kommt
bei den Atmegas nur Hardware PWM in Frage, oder?
Welche Atmelprozessoren (oder andere ebenso leicht beschaff- und
programmierbare Prozessoren kommen in Frage?)
MfG
Die PulsWelle
@Steffen,
das was du schreibst klingt sehr gut.
Hier steht aber nur was von 4 Timern:
http://cgi.ebay.de/ws/eBayISAPI.dll?ViewItem&item=110341273999
@Jimmy
Der XMega ist ganz neu. Verfügbarkeit ist auch nicht so prall, ansonsten
sicherlich eine gute Alternative...
@PulsWelle:
noch was vergessen. Die Timer TIM6 und TIM7 sind interne Timer. TIM1,
TIM2, TIM3, TIM4, TIM5 und TIM8 kann man für ext. PWM verwenden. Das
sollten dann genau 24 PWM's werden.
@ PulsWelle (Gast)
>schwebt eine stufenlose Steuerung einer LED von 0% - 100% Helligkeit>(nicht Strom!) vor.
Die beiden Parameter sind bei LEDs ziemlich linear gekoppelt.
>Ich habe schnell gemerkt, dass ich eine Exponentialfunktion brauche, um>LEDs für den Menschen linear zu dimmen.
DAS ist ja auch was anderes ;-)
>-8 RGB LEDs (also 24 PWM Kanäle) mit 256 Stufen steuern könnnen.>-Die Helligkeit soll sich für den Zuschauer linear verändern.>-Keine sichtbaren Stufen.
Alles eine Frage der Geschwindigkeit. In Zeilupe braucht man 16 PWM,
schon klar.
>-PWM Freq. so dass ein Flackern sichtbar ist (~100Hz)
Fehlt da ein k ? ;-)
>Ich denke dazu brauche ich eine 16 Bit PWM für die 24 Kanäle. Da kommt>bei den Atmegas nur Hardware PWM in Frage, oder?
Ja.
>Welche Atmelprozessoren (oder andere ebenso leicht beschaff- und>programmierbare Prozessoren kommen in Frage?)
Viele AVRs haben einen 16 Bit Timer mit zwei PWM Ausgängen (z.B.
tiny2313), einige haben zwei Timer und damit 4. Nimm so ein Teil und
häng eine RGB-LED dran. Die Daten fütterst du über einen Master-AVR per
RS232 rein. Fertig. Keine Probleme mit Spezialbauteilen.
Man kann das auch in einen grösseren CPLD packen, allerdings sind 24
Kanäle a 16 Bit schon heftig, da braucht man einen ZIEMLICH grossen
CPLD. Besser ein kleines FPGA, das ist billiger.
MFG
Falk
Hi,
sollen dass wirklich 24 Kanäle werden, oder sollen die 8LEDs synchron
laufen? Falls letzteres kannste Problemlos X LEDs in Reihe schalten.
Schau mal unter LED-Styles.de, da gibt's nen Bausatz mit RGB Fader
(Helligkeit gleich, die Stufen hängen davon davon ab wie schnell Du von
0%-100% steuern willst. Komplett mit LP & Tiny für 8,50, FETs sind auch
dabei.
Ist mit nem 2313 und ich habe das Teil selber, funktioniert gut,
allerdings wie Du schon schreibst ist im unteren Bereich ein flackern zu
sehen (aber nur a.d. Kontroll-LED). Da die Gesamthelligkeit immer 100%
ist, überlagen die anderen Farben das Flackern recht gut.
Die Exponentialfunktion sollte sich doch z.B. auch durch ein shift
Rechts erledigen lassen bei den Wartezeiten zwischen dem
runterschalten?!
Ciao hufnala
P.S. da liegt auch der code für Bascom....
@mawieit
Ich hab jetzt den von dir vorgeschlagenen TLC5947. Ich steuere den TLC
mit einem ATMEga32 an.
Leider werden die LEDs bei jedem Helligkeitswechsel kurz dunkel. Steht
auch so im Datenblatt:
"The data in the grayscale shift register are moved to the grayscale
data latch with a low-to-high transition on this pin. When the XLAT
rising edge is input, all constant current outputs are forced off until
the next grayscale display period. The grayscale counter is not reset to
zero wirth a rising edge of XLAT."
XLAT übernimmt die Seriell eingeschobenen Daten so dass sie angezeigt
werden. Ich müsste also immer genau zum Ende einer PWM Periode XLAT
setzen, damit kein Flackern entsteht. Nur wie soll ich das anstellen?
Wie merke ich dass die PWM Periode des TLCs gerade um ist?
Oder ist der Chip so ****** dass kein Fading möglich ist? Dann wäre ich
aber schwer enttäuscht....
Anbei der Quellcode der den Chip versorget:
1
ISR(SIG_OVERFLOW0)// Alle 16 Mikrosekunden
2
{
3
if(sendclk<288)// Wenn noch Bits zu senden sind
4
{
5
if((PORTA&(1<<CLOCK))||sendclk==0)// Beim ersten Bit oder wenn Bit neu gesetzt werden soll
6
{
7
PORTA&=~(1<<CLOCK);// Setze Clock Low um neues Bit zu setzen
8
if(color8[35-(sendclk/8)]&(1<<(7-(sendclk%8))))// Neues Bit gemäß Array setzen
9
PORTA|=(1<<DATA);
10
else
11
PORTA&=~(1<<DATA);
12
13
sendclk++;
14
}
15
else// Wenn Bit übernommen werden soll
16
{
17
PORTA|=(1<<CLOCK);// Setze Clock High um aktuelles Bit zu übernehmen
18
}
19
}
20
else// Wenn alle Bits gesendet wurden
21
{
22
sendclk++;
23
if(sendclk==289)
24
PORTA|=(1<<CLOCK);// Setze Clock High um letzes Bit zu übernehmen
25
if(sendclk==290)
26
PORTA&=~(1<<CLOCK);// Setze Clock Low da alle Daten übetragen wurden
PulsWelle wrote:
> -Keine sichtbaren Stufen.
Das hängt stark von der Änderungsgeschwindigkeit ab, das Auge darf keine
Zeit haben, sich auf jede Stufe neu zu adaptieren.
Bei sehr langsam und sehr dunkel brauchst Du wohl schon 16 Bit.
Bei einer normalen Umgebungshelligkeit braucht man auch nicht soviel
Stufen.
Für Experimente kannst Du dieses Projekt benutzen:
Beitrag "programmierbare 16 Kanal PWM Lightshow"
Es hat eine 10Bit Auflösung mit Stufung 3.Wurzel von 2.
Viel CPU-Zeit geht allerdings für das serielle Laden der
Leistungs-Schieberegister drauf. Ich habs deshalb gemacht, damit die
Schaltung möglichst einfach ist.
Mit nem 40 Pinner kannst Du 24 Ausgänge parallel laden und auch noch
feiner abstufen.
Durch die PMW-Tabelle im RAM gibt es keine Störungen beim Ändern des
Wertes.
Und alle anderen Interrupts müssen ISR_NOBLOCK sein (Vorsicht, geht
leider nicht mit der HW-UART!).
Peter
Hallo Peter,
Danke für deine Ideen. Ich habe die Platine mit dem TLC5947 aber jetzt
schon fertig und würde diesen gerne nutzen. Was mich dabei aber sehr
ärgert, ist dass bei jeder Helligkeitsänderung die LEDs bis zum nächsten
PWM Zyklus ausgeschaltet werden. Dadurch flackern die LEDs bei jeder
Helligkeitsänderung... :-(