Moin, heul, heul, heul. Nachdem ich die Datenblätter nun fast auswendig kenne und trotz nach ewigen rumprobieren zu keiner Lösung gekommen bin, hier meine Frage an die Experten: Ich habe hier einen RGB LED Controller der via EVN28J60 (Ethernet) angesprochen wird und seine Daten zu einem Mega32 weitergibt. Internetansteuerung klappt perfekt. An den 3 PWM Ausgängen hängen via 100 Ohm widerständen je ein N-Mosfet IRLU2905 die LED Stripes mit 12 Volt ansteuern. Folgender Effekt: OK: Ich steuere einen Kanal an - Wert 0 im DDRD Register => LED Stripes gehen aus Nicht OK: Ich steuere IRGENDEINEN anderen Wert als 0 im Register an => LED Stipes sind erstmal aus, nach einiger Zeit blinken die langsam ganz schwach, dimmen dann blinkend hoch und sind irgendwann (30 sek später) bei 100% Dauerleuchten. Ich dachte bisher, dass man über eine PWM Ansteuerung es hinbekommen müsste dass ich die LED Stripes stufenlos 'dimmen' könnte. Klappt aber nicht. Kurze Randnotiz: Derzeit steuere ich die IRLU2905 noch mit VCC des Mega32 an und der liegt derzeit bei nur 3,3 Volt wegen dem ENC28j60. Logic-Level-Shifting und damit Betriebsspannung 5 Volt baue ich noch ein - aber ich glaube nicht dass es daran liegt - denn sonst würden die Mosfets ja gar nicht richtig schalten. Lasut Datenblatt sollte ein IRLU2905 mit 3 Volt dank LogicLevelGate das können. P.s. Der Mega3 wird mit 8 MHZ bei 3,3 Volt betrieben und die PWM-Kanäle initialisiere ich wie folgt: TCCR1B |= (1<<CS12); //Prescaler 256 TCCR2 |= (1<<CS22) | (1<<CS21) | (0<<CS20); //Prescaler 256 TCCR1A |= (1<<WGM10); TCCR1B |= (1<<WGM12); TCCR2 |= (1<<WGM21) | (1<<WGM20); TCCR1A |= (1<<COM1A1) | (1<<COM1B1) ; TCCR2 |= (1<<COM21) | (1<<COM20) ; // init OCR1A = 0; OCR1B = 0; OCR2 = 0; // Alle ausgänge ausschalten DDRD = 0; und so verwende ich die PWMs späer.... // BEISPIEL .... später via Ethernet-steuerung für z.b. einen kanal .... // Wert setzen OCR1A = 100; DDRD |= (1<< PD5); // BEISPIEL ... später via Ethernetsteuerung zum ausschalten z.b. für alle Ports ... DDRD = 0 OCR1A = 0 Preisfrage: Wo liegt mein Denkfehler .... heul....
du brauchst definierte pegel an den pins, das gleiche hatte ich auch, als ichs das erste mal probiert hab. entweder du lässt die DDR eben auf 1, oder du nimmst 10k widerstände an den PWM-outs gegen masse. mfg
> oder du nimmst 10k widerstände an > den PWM-outs gegen masse. Gerade eben ausprobiert: Dann sind die Stripes IMMER ganz 'aus'.
dunno.. schrieb: > du brauchst definierte pegel an den pins, das gleiche hatte ich auch, > als ichs das erste mal probiert hab. Du hattest doch recht. (1) Man(n) sollte die 10 k auch an Masse anlöten. (2) Man(n) sollte auch 10k nehmen und nicht 100 Ohm. und (3) scheinen die 3 Volt Vcc nicht genug für den IRLU2905 zu sein ... mit 5 Volt gehts ganz sauber....
Martin Bauer schrieb: > // Alle ausgänge ausschalten > DDRD = 0; > > > und so verwende ich die PWMs späer.... > > > > // BEISPIEL .... später via Ethernet-steuerung für z.b. einen kanal .... > > // Wert setzen > OCR1A = 100; > DDRD |= (1<< PD5); > > > > // BEISPIEL ... später via Ethernetsteuerung zum ausschalten z.b. für > alle Ports ... > > DDRD = 0 > OCR1A = 0 Du veränderst beim Ausschalten die Datenrichtung des Ausgangsports. Das heißt du wechselst zwischen Tristate (mit internem Pullup) und irgendeinem Ausgangszustand (LO, wenn PWM noch aktiv aber mit OCRA=0 betrieben wird) hin und her. Dadurch hast du dann eben eine in der Luft hängende Leitung, die der 10k Widerstand dann in definierten Zustand (Low) zieht. Schalte doch einfach den Timer ein/aus und lasse die Pins auf Ausgang (DDRD |= (1<< PD5);) Sonst hast du eben die undefinierten Pegel und anders kannst du einen definierten GND bzw. definiert VCC ausgeben.
Hallo Thomas, Du hast Recht. Nur OCR1A=0 zu setzten reicht aber nicht aus - die LEDs 'glimmen' dann noch etwas. Also bleibt nur die Lösung entweder die Pins auf Tristate mit externen Pull-Down oder eben den ganzen PWM-Kram abschalten und den internen Pin auf LOW zu setzten zu verwenden. So habe ich es jetzt auch gemacht: Ausschalten mit: DDRD |= (1<< PD5); TCCR1A &= ~(1<<COM1A1); PORTD &= ~(1 << PD5); Einschalten mit TCCR1A |= (1<<COM1A1); OCR1A = ....irgendeinwert.... DDRD |= (1<< PD5); Gracias an alle hier....
Kann sein dass ich mich jetzt in den Datenblättern verlese, aber du verwendest doch Mega 32 oder? Timer 1 hat dann als WGM die bits WGM12 und WGM10 gesetzt gemäß deinem Code... DAs ist lt. Datenblatt http://www.atmel.com/Images/doc2503.pdf ein Reservierter Betriebsmodus? Probier mal Modus 5, das ist der invertierte PWM-Modus, da sollte es ohne Glühen auch hinhauen... beim Mega88 und Konsorten passt das zumindest ;) Es ist halt zu beachten, dass dann der Wert 0xff nicht 100% ein bedeutet, sondern 0% (aus), da eben invertierter Modus. Beispiel: 0x10 zuweisen (relativ dunkel) OCR1A = ~0x10; // immer Einserkomplement bilden P.s Timer werden üblicherweise ausgeschaltet, indem man ihnen die Taktquelle nimmt (CS0, CS1 und CS2 auf 0), z.b. TCCR1B &= ~(7<<CS00); Reaktivieren dann, indem man den Takt wieder auf den entsprechenden Prescaler setzt.
Thomas Bergmüller schrieb: > Kann sein dass ich mich jetzt in den Datenblättern verlese, aber du > verwendest doch Mega 32 oder? Timer 1 hat dann als WGM die bits WGM12 > und WGM10 gesetzt gemäß deinem Code... > > DAs ist lt. Datenblatt http://www.atmel.com/Images/doc2503.pdf ein > Reservierter Betriebsmodus? > > Probier mal Modus 5, das ist der invertierte PWM-Modus, da sollte es > ohne Glühen auch hinhauen... beim Mega88 und Konsorten passt das > zumindest ;) Ne ne.... WGM13 ist nicht gesetzt -> D.h. ich habe den Modus 5. Modus 5 ist ein "Fast PWM, 8-bit" mit TOP=0xff. Das Ding 'glimmt' aber trotzdem....
Ups mein Fehler... Hast du ein Oszi? Wäre interessant ob das Glimmen von der PWM kommt (sprich irgendwo softwaretechnisch der Hund begraben) oder ob der FET nicht ganz aufmacht... Alternativ: Wenn du PORTD &= ~(1<<PD5); Einfach mal fix ausschaltest und das ganze PWM Zeug weglässt, glimmts dann noch immer oder ist dann ganz aus? Wenns ganz aus ist, liegt's an der PWM-Erzeugung.
> Hast du ein Oszi? Leider nein. Bin von Haus aus 'Informatiker' ..... > Alternativ: Wenn du PORTD &= ~(1<<PD5); Einfach mal fix ausschaltest und > das ganze PWM Zeug weglässt, glimmts dann noch immer oder ist dann ganz > aus? Wenns ganz aus ist, liegt's an der PWM-Erzeugung. Ist dann ganz aus. Ich denke da wird noch ein kleiner 'ripple' bei dem Wert 0 erzeugt werden.... habe ich zumindest mal irgendwo gelesen...
Jop, vermutlich 1 Zählschritt, das Problem gibts öfters und hängt mit dem Betriebsmodus des Timers zusammen. Schick mal den gesamten Quelltext, hab Mega 32 und Oszi da, ich brenn den mal kurz und mess dir bzw. model ihn so um dass er geht wenn du willst ;)
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.