Forum: Mikrocontroller und Digitale Elektronik ATTINY85 per pwm MOSFET/LED ansteuern


von Andreas V. (computerpap)


Angehängte Dateien:

Lesenswert?

Hallo Elektronikgemeinde
Ich möchte über einen ATTINY85 über 2 pwm-Ausgänge und jeweils über 
einen MOSFET IRLML2502, LED's ansteuern. Leider bin ich blutiger 
Anfänger, was Elektronik angeht. Die angehängte Schaltung hab ich mir 
nach verschiedenen Vorlagen aus dem Netz ausgedacht ist aber sicherlich 
nicht vollständig. Meine Fragen dazu wären,
1. Kann die Schaltung so grundsätzlich funktionieren?
2. Hab ich die richtigen MOSFET's ausgesucht?
Aber die wichtigste Frage wäre, was muss alles noch verbaut werden, 
damit die Schaltung bzw, die Bauteile geschützt sind, ich habe zB 
irgendwas gelesen von einen Gate-Widerstand, aber was verbaut man da. 
Die Schaltung wird über ein 12V-Netzteil gespeißt, reicht es die 
Spannungsregler so wie im Schaltplan anzusteuern, dass die LED's mit 9V 
und der ATTINY mit 5V versorgt werden.
Die Leistungsangaben der LED's sind gemessene Werte, auf den Stripes 
steht lediglich 10V. Diese Spannung von 10V hatte ich angelegt und den 
Strom dann so wie es im Schaltplan steht gemessen. Ich würde die Stripes 
aber gerne nur mit max. 9V betreiben.
Viele Fragen, aber ich hoffe ihr könnt mir den ein oder anderen Tipp 
geben, und lasst mich bitte am Leben, wie ich schon schrieb, bin ich 
Anfänger!
Danke schon mal im voraus.

von Stefan F. (Gast)


Lesenswert?

Wenn die LED Streifen Widerstände zur Strombegrenzung enthalten, dann 
kannst du das so machen. Aber nur dann.

Du solltest die Abblock-Kondensatoren am Mikrocontroller und um die 
Spannungsregler herum nicht weglassen. Die sind nicht zur Dekoration 
vorgesehen, sondern haben eine wichtige Funktion.

von Andreas V. (computerpap)


Lesenswert?

Danke für die schnelle Antwort.
Meinst du einen 0,33µ Keramikkond. zwischen IN und GND, und einen 0,1µ 
Kramikkondensator nochmal zwischen OUT und GND? Reicht das als 
Schutzbeschaltung für die Spannungsregler aus?

: Bearbeitet durch User
von chris (Gast)


Lesenswert?

Andreas V. schrieb:
> irgendwas gelesen von einen Gate-Widerstand

mach 33Ohm bis 100Ohm dazwischen und gut ist. Vom Prinzip her ist das 
Gate eine Kondensator und beim Umladen, abhängig vom Laststrom, können 
enorme Umladströme auftreten welche dann die Ausgänge in Mileidenschaft 
ziehen können.
FET-Treiber mal in die Suchmaschine eingeben.

> reicht es die
> Spannungsregler so wie im Schaltplan anzusteuern, dass die LED's mit 9V
> und der ATTINY mit 5V versorgt werden.

Ja das ist i.O. da der µC maximal 5V verträgt. LED's haben ihre 
Durchbruchsspannung und können nur indirekt, mit Widerstand einfachste 
Lösung, andere Spannungen als die Durchbruchsspannung vertragen.

> Die Leistungsangaben der LED's sind gemessene Werte, auf den Stripes
> steht lediglich 10V. Diese Spannung von 10V hatte ich angelegt und den
> Strom dann so wie es im Schaltplan steht gemessen. Ich würde die Stripes
> aber gerne nur mit max. 9V betreiben.

Mutig dies so zu tätigen, wenn du mal eine Namen der Stripes hättest 
könnte man effektiver deine Frage beantworten.
Stripes ohne intgrierte Vorwidertsände oder mit ?

Wenn "mit" reichen auch 9V aus sollte dann ganz leicht dunkler sein als 
an 10V

Wenn ohne hast du Glück gehabt das die LED's nicht abgraucht sind
siehe dazu https://www.mikrocontroller.net/articles/LED

von Andreas V. (computerpap)


Angehängte Dateien:

Lesenswert?

Die Stripes hängen im Moment noch an einem PIC. Ich hatte an den Stripes 
mal die Eingangsspannung gemessen und die war max. 9V. Ich hab mal ein 
Bild von den Stripes angehängt.

von Stefan F. (Gast)


Lesenswert?

Stefan F. schrieb:
> Du solltest die Abblock-Kondensatoren am Mikrocontroller und um die
> Spannungsregler herum nicht weglassen.

Andreas V. schrieb:
> Meinst du einen 0,33µ Keramikkond. zwischen IN und GND, und einen 0,1µ
> Kramikkondensator nochmal zwischen OUT und GND?

Halte dich an dabei an die Vorgaben aus den Datenblättern der jeweiligen 
Spannungsregler. Am Mikrocontroller sind 100nF üblich.

> Reicht das als Schutzbeschaltung für die Spannungsregler aus?

Mit "Schutz" hat das nichts zu tun. Es geht darum, eine stabile 
Arbeitsweise zu erreichen. Spannungsregler können ohne Kondensatoren so 
gründlich versagen, dass sie sogar Überspannung ausgeben!

Andreas V. schrieb:
> Ich hab mal ein
> Bild von den Stripes angehängt.

Sieht aus, als seien da Widerstände drauf.

von Andreas V. (computerpap)


Angehängte Dateien:

Lesenswert?

So hab jetzt mal den Schaltplan soweit ergänzt, wäre echt nett wenn ihr 
da nochmal drüber schauen könntet.
In einigen Schaltungen hab ich gesehen, dass an den Fet's noch ein 
Widerstand vom Gate nach GND hängt (bei mir R4, R5). Braucht man den und 
wie groß sollte dieser sein?

Hab ich die richtigen Fet's ausgewählt? Da kenn ich mich überhaupt nicht 
aus.
Das Datenblatt ist hier:
https://www.infineon.com/dgdl/irlml2502pbf.pdf?fileId=5546d462533600a401535668048e2606

Bei den Spannungsreglern bin ich mir eigentlich sicher das es passt. Der 
5V-Regler bringt 500mA
https://www.mouser.de/datasheet/2/389/l78m-974157.pdf
und der 9V-Regler soll 1,5A bringen,
https://www.mouser.de/datasheet/2/389/l78-974043.pdf

Ausserdem habe ich den Reset-Eingang des ATTINY über einen 10k 
Widerstand nach +12V gezogen, sollte doch auch so passen.

: Bearbeitet durch User
von Route_66 H. (route_66)


Lesenswert?

Andreas V. schrieb:
> Ausserdem habe ich den Reset-Eingang des ATTINY über einen 10k
> Widerstand nach +12V gezogen,

Du meinst sicher +5V...

von Andreas V. (computerpap)


Lesenswert?

ja klar, sorry

von AndyII (Gast)


Lesenswert?

Die stripes scheinen 2 LEDs in Reihe und dann an einer einfachen 
konstant Stromquelle zu beinhalten also kein Problem so wie du es machen 
willst.

Die pull down Widerstände von gate nach gnd sind dazu da, das hat auf 
einen definierten Pegel (hier gnd) zu ziehen falls der Controller pin im 
hochohmigen Zustand ist wie zb bei der Initialisierung des Controllers.
Hier wurde ich welche verbauen... Wert abhängig vom mosfest oder pi mal 
daumen etwas zwischen 10k und 100k

von Bulli (Gast)


Lesenswert?

Hallo,

hast du paar mehr Details zu der Schaltung und vorallem zu dem Code?

Ich suche was, um 24V LED-Streifen mit "softstart" und "softstop" 
anzusteuern.
Die Steifen sollen beim enschalten langsam hochdimmen und beim 
ausschalten langsam wieder runterdimmen. (so. ca. 1-2s).
Was noch interessant wäre, is eine einstellbare maximale 
(End)-Helligkeit.

Ich denke die Schaltung aus Andreas' post sollte das gut schaffen, oder?
Kann mir jemand mt dem Code behilflich sein?

Danke und Gruß
Bulli

von Brain 2.0 (Gast)


Lesenswert?

Wenn du mal ein wenig googelst, findest du genug Code dafür.

von M. K. (sylaina)


Lesenswert?

Bulli schrieb:
> Kann mir jemand mt dem Code behilflich sein?

Aber klar doch. Willst du auch einen Attiny85 benutzen? Wie genau sieht 
deine Schaltung aktuell aus? Hast du schon Code erstellt oder beginnen 
wir bei 0?

von Bulli (Gast)


Angehängte Dateien:

Lesenswert?

Der aktuelle Code sieht im Moment so aus (nicht getestet ob es 
tatsächlich geht), dazu brauche ich euch.
1
int pwmPin = 0;                        // PWM Pin5 Attiny85 ; A0
2
int buttonPin = 3;                     // Tastereingang an Pin 2
3
int PotiPin= 2;                        // Das Potientiometer für die maximale Helligkeit wird an Pin7  (A1) eingelesen
4
5
int myDirection = -1;                   // die Richtung, in die die LED gedimmt werden soll, <0 = ausdimmen, >0 andimmen
6
bool lastButtonState = false;           // der Zustand des Buttons beim letzten Schleifendurchlauf
7
int brightness = 0;                     // anfängliche Helligkeit
8
int delayTime = 10;                     // steuert die Geschwindigkeit des Dimmens, je höher, desto langsamer
9
int maxhell;                            // Maximale Helligkeit (über Potentiometer eingestellt)
10
11
void setup() {
12
  pinMode(buttonPin,INPUT);
13
  pinMode(pwmPin,OUTPUT);
14
  pinMode(PotiPin, INPUT);
15
}
16
17
void loop() {
18
   maxhell=analogRead(PotiPin)/ 4;
19
  
20
  bool myCurrentButtonState = digitalRead(buttonPin);                           // liest den aktuellen Zustand des Tasters aus
21
  if ((lastButtonState!=myCurrentButtonState)&&(myCurrentButtonState==LOW)){    // wenn dieser HIGH ist, aber beim letzten Durchlauf nicht
22
    myDirection = myDirection * (-1);                                           // ändere Dimm-Richtung                          
23
  }
24
  brightness = brightness + myDirection;                                        // zähle den Wert je nach dem hoch oder runter
25
  if (brightness> maxhell) brightness = maxhell;                                // obere Grenze des Dimmens ist der Wert "maxhell"
26
  else if (brightness<0) brightness = 0;                                        // untere Grenze des Dimmens = 0
27
  
28
  analogWrite(pwmPin, brightness);                                              // sende den Leuchtwert an die LED's
29
  
30
  lastButtonState=myCurrentButtonState;                                         // merke dir den aktuellen Tasterzustand für den nächsten Durchlauf
31
  delay(delayTime);
32
}

Im groben sieht die Ausgangsbeschaltung so aus, sorry dass ich mit Paint 
gezeichnet habe, aber mit eagle brauche ich noch länger ;-o

von M. K. (sylaina)


Lesenswert?

Bulli schrieb:
> Im groben sieht die Ausgangsbeschaltung so aus, sorry dass ich mit Paint
> gezeichnet habe, aber mit eagle brauche ich noch länger ;-o

Ganz ehrlich: Für mit Paint gezeichnet sieht das super aus! ;)

Zu deinem Programm:

Das sieht soweit schon nicht verkehrt aus aber der ein und andere 
Schnitzer ist noch drin versteckt.

Die Variable brightness soll, so nehme ich an, die Pulsbreite des 
PWM-Signals darstellen (IMO macht es nur so Sinn wenn ich mir die 
Kommentare in deinem Code anschaue).
Jetzt betrachte ich mir diese Zeile:
1
brightness = brightness + myDirection;

und stelle mir vor, dass brightness in einem Durchlauf schon den 
maximalen Wert (0xff) erreicht hatte. Kannst du dir vorstellen was dann 
im nächsten Durchlauf geschieht? Dann geht deine LED aus. Überlege dir 
mal warum und überlege dir, wie du das verhindern kannst dass brightness 
außerhalb des zulässigen Bereiches kommen kann.

Und dann noch etwas, das mir auffiel, was man aber entweder mit Software 
oder mit Hardware lösen kann:

Du hast einen Taster verbaut aber dieser hat keinerlei Maßnahmen bzgl. 
Prellen, weder in Hardware noch in Software. Eine einfache 
Hardware-Lösung, die einfachste Lösung, ist es, parallel zum Taster 
einen Kondensator zu verbauen, z.B. einen 100nf.
Alternativ kannst du den Taster auch in Software entprellen (heute 
üblich soweit ich das beurteilen kann). Wie das geht kannst du hier 
anschauen (Beispiel für Arduino-Umgebung):
https://www.youtube.com/watch?v=E6mAWhm8J-0

von HildeK (Gast)


Lesenswert?

M. K. schrieb:
> Eine einfache
> Hardware-Lösung, die einfachste Lösung, ist es, parallel zum Taster
> einen Kondensator zu verbauen, z.B. einen 100nf.

Recycle dafür den 100nF, der am Gate des MosFet hängt. Der hat dort 
nichts verloren... Dem kannst du dann auch gleich den 100Ω in Reihe 
schalten, um die Kontakte deines Tasters nicht über Gebühr zu belasten, 
auch als Recycling.

von Bully (Gast)


Lesenswert?

M. K. schrieb:
> und stelle mir vor, dass brightness in einem Durchlauf schon den
> maximalen Wert (0xff) erreicht hatte. Kannst du dir vorstellen was dann
> im nächsten Durchlauf geschieht? Dann geht deine LED aus. Überlege dir
> mal warum und überlege dir, wie du das verhindern kannst dass brightness
> außerhalb des zulässigen Bereiches kommen kann.

Eigentlich dachte ich, dass genau
1
  if (brightness> maxhell) brightness = maxhell;                                // obere Grenze des Dimmens ist der Wert "maxhell"
2
  else if (brightness<0) brightness = 0;                                        // untere Grenze des Dimmens = 0
das ganze abfängt. Wenn der Wert über 255 geht, dann schreibe ich die 
255 drauf.

Den Kondensator zur entprellung recycle ich,... danke hierfür.

von M. K. (sylaina)


Lesenswert?

Da hast du recht, Bully, ich hab das
1
.../4;

beim Poti Auslesen nicht gesehen gehabt.

;)

von Bulli (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich habe die Schaltung nochmal angepasst (und den Arduino-Code auch).

Könnt ihr bitte mal drüber schauen?

Zur gewünschten Funktion:
Der LED-Streifen soll langsam hochdimmen, sobald entweder Netzspannung 
erkannt wird, oder der PIR-Melder Bewegung erkennt.
Der Streifen soll runterdimmen, wenn die Netzspannung aus ist, und wenn 
der PIR-Melder keine Bewegung mehr erkennt.
Die Eingangssignal sind keine "Taster-Signale", sondern jeweils dauernd 
anstehende Spannung (Schalter).

Zur Erklärung was ich da zusammengefrickel habe:
-Den 230V-Teil habe ich hier aus dem Forum.
-Die Schmelzsicherung in der Masse-Seite des LED-Streifens habe ich 
aufgrund des einfacheren Platinenlayouts so eingesetzt, da war am 
meisten Platz. Nicht ganz perfekt, aber ich denke das geht trotzdem, 
oder?
-Die Schmelzsicherung im Netzspannungsteil würde ich als Printsicherung 
ausführen. OK?
- Den Ausgang des PIR-Sensors ziehe ich über den 10k auf Masse, da nicht 
sicher ist, ob der PIR-Sensor überhaupt angeschlossen wird (ich mache da 
eine Pfostenleiste zum optionalen Anschluss hin).

Der Code sieht mittlerweile so aus:
1
int LowPin = 3;                        // Low-Signal von 230V Schaltung an Hardware-Pin 2 (LOW_AKTIV)
2
int PirPin= 4;                         // High-Signal von PIR-Melder an Hardware-Pin 3  (HIGH_AKTIV)
3
int PotiPin= 2;                        // Das Potentiometer für die maximale Helligkeit wird an Hardware-Pin 7 eingelesen
4
int PwmPin = 0;                        // PWM-Ausgang zu Mosfet zur LED-Ansteuerung an Hardware-Pin5 
5
6
int brightness = 0;                    // anfängliche Helligkeit
7
int delayTime = 10;                    // steuert die Geschwindigkeit des Dimmens, je höher, desto langsamer
8
int maxhell;                           // Maximale Helligkeit (über Potentiometer eingestellt)
9
int laststate;                         // Beleuchtung schon ein?   1=eingeschaltet
10
11
12
void setup() {
13
  pinMode(LowPin,INPUT);
14
  pinMode(PirPin,INPUT);
15
  pinMode(PotiPin,INPUT);
16
  pinMode(PwmPin,OUTPUT);
17
}
18
19
void loop() {
20
//Auswertung "Maximale Helligkeit" 
21
maxhell=analogRead(PotiPin)/ 4;
22
if (maxhell >= 255) {
23
  maxhell = 255;
24
  }
25
26
//Eingangssignal beim ein- und ausschalten entprellen
27
if ((((digitalRead(PirPin)==HIGH)||(digitalRead(LowPin)==LOW))&&(laststate = 0))||(((digitalRead(PirPin)==LOW)&&(digitalRead(LowPin)==HIGH))&&(laststate = 1))){
28
  delay(50);
29
}
30
31
//LED hochdimmen
32
if (((digitalRead(PirPin)==HIGH)||(digitalRead(LowPin)==LOW))&&(brightness<maxhell)){
33
  brightness = brightness + 1;
34
  }
35
//LED runterdimmen
36
else if (((digitalRead(PirPin)==LOW)&&(digitalRead(LowPin)==HIGH))&&(brightness>0)){
37
  brightness = brightness - 1;
38
  }  
39
  
40
//Analogausgang beschreiben                                   
41
analogWrite(PwmPin, brightness);
42
43
//Speichern ob Beleuchtung bereits ein ist
44
if (brightness > 0) {
45
   laststate = 1;
46
}
47
     else {
48
    laststate = 0;
49
   }
50
delay(delayTime);}

Beitrag #6472286 wurde von einem Moderator gelöscht.
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.