Forum: Mikrocontroller und Digitale Elektronik RGB-Controller MOSFET-Problem


von Martin B. (metatronik)


Lesenswert?

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....

von dunno.. (Gast)


Lesenswert?

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

von Uli (Gast)


Lesenswert?


von Martin B. (metatronik)


Lesenswert?

>  oder du nimmst 10k widerstände an
> den PWM-outs gegen masse.

Gerade eben ausprobiert:
Dann sind die Stripes IMMER ganz 'aus'.

von Martin B. (metatronik)


Lesenswert?

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....

von Thomas B. (nichtessbar)


Lesenswert?

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.

von Martin B. (metatronik)


Lesenswert?

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....

von Thomas B. (nichtessbar)


Lesenswert?

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.

von Martin B. (metatronik)


Lesenswert?

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....

von Thomas B. (nichtessbar)


Lesenswert?

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.

von Martin B. (metatronik)


Lesenswert?

> 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...

von Thomas B. (nichtessbar)


Lesenswert?

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
Noch kein Account? Hier anmelden.