RGB-Controller MOSFET-Problem

OP #2555875
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....
Gast
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
OP
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.
OP
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.
OP
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.
OP
> 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 ;)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.