Pages: [1] 2 3   Go Down
Author Topic: standalone arduino - MOSFET PWM für Lüfterregelung  (Read 3114 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

so langsam bin ich am verzweifeln, komme hier nicht mehr wirklich weiter und würde daher gerne um etwas Hilfe bitten.

Ich habe hier eine Playstation3, bei der die Lüfterregelung defekt ist. Daher wollte ich mir gerne mit einem Arduino selbst eine Regelung zusammen basteln. Dazu lese ich über zwei LM35 die Temperatur naher der Heatpipe aus. Die Temperatur gebe ich dann über eine 7-Segment Anzeige aus.
Die Lüfterregelung habe ich über einen MOSFET umgesetzt, den ich per Bipolartransistor treibe, hauptsächlich um das Schaltverhalten zu invertieren, um im Fehlerfall hardwaremäßig die volle Lüfterdrehzahl zu erreichen.
Der Lüfter hat auch eine PWM Steuerleitung, diese setzte ich mit den 3,3V auf "HIGH".

Einige Sachen sind vielleicht etwas ungewöhnlich, allerdings war mein Ziel möglichst wenig in die Hardware der Konsole einzugreifen.

Die Schaltung habe ich auf einen Lochrasterplatine zusammengelötet, sie scheint soweit zu funktionieren. Beispielsweise kann ich die Temperatur auslesen und auf dem Display ausgeben. Prinzipiell kann es also nicht völlig daneben sein.

Mein Problem ist allerdings, dass sobald ich den Port 9 per PWM ansteuere der Atmega ständig neustartet, oder sich sonst unerwartet verhält. Das Neustarten habe ich durch das Ansteuern des Summers in der Setup Funktion überprüft. Den Ausgang digital zu schalten klappt hingegen problemlos.
Was mir vor allem nicht erklären kann, ist, dass der Aufbau auf dem Steckbrett mit dem Arduino (vollständiges Board) problemlos funktioniert. Dort kann ich die Lüfterdrehzahl schön per PWM regeln.
Ich habe auch schon den MOSFET und den NPN-Transistor getauscht, um einen Defekt der Bauteile auszuschließen.

Deshalb habe ich die Frage, ob ich zusätzlich an den Atmega noch etwas anschließen muss, dass auf dem Arduino Board verbaut ist?
Was könnte den Arduino veranlassen neu zu startet?

Würde mich über Hilfe sehr freuen, bin jetzt schon seit Tagen an der Fehlersuche... smiley-confuse


* Schaltplan.png (83.79 KB, 2089x1429 - viewed 97 times.)
« Last Edit: March 23, 2013, 11:34:43 am by dominikdh » Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 96
Posts: 4763
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mach mal noch einen etwas grösseren Kondensator zwischen 5V und GND. Ich vermute, dass Dir die Stromversorgung kurz etwas taucht, wenn Du den MOSFET schaltest. Auf dem Arduino-Board sind entsprechende Kondensatoren integriert, welche die Versorgungsspannung für den ATmega stabilisieren.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Super, danke für den Tipp! Werde ich direkt mal testen.

EDIT:
So, habe vorhin mal ein wenig probiert.
Es scheint wohl wirklich an der Versorgungsspannung zu liegen. Nochmals danke für den Hinweis!

Zuerst habe ich verschiedene Elkos (10µF-220µF) hinter den Spannungsregler gesetzt. Die haben jedoch alle nicht wirklich etwas gebracht.
Jetzt habe ich noch zusätzlich direkt hinter den Pin 7 und 8 des Atmegas einen 220nF gelötet.
Mit dem Kondensator läuft läuft das Programm zum Faden des Lüfters tatsächlich durch. Ich kann also die Pulsweite beliebig modulieren.

Da Lüfter allerdings bei der relativ niedrigen PWM-Frequenz des Arduinos hörbare Pips-Geräusche von sich geben, will ich die Frequenz mit der PWM frequency library auf 25kHz hochsetzten. Damit klappt das feaden jedoch noch nicht, ab einem bestimmten PWM Wert bricht die Spannung wohl wieder zu weit ein, sodass der Atmega irgendwie hängen bleibt (jedoch nicht neu startet)...

An das Problem werde ich mich morgen noch einmal dran setzten, immerhin weiß ich jetzt, in welche Richtung ich schauen muss.
Wenn ich in den Schaltplan des Arduinos schaue, bin ich mit meinen Kapazitäten (220µF am Spannungsregler und 220nF am Atmega) jedoch schon über denen auf dem Arduino?  smiley-confuse
Für Hinweise bzgl. benötigter Kapazität bin ich natürlich offen smiley-wink
Ich glaube so langsam muss ich mal über die Anschaffung eines Oszilloskops nachdenken...
« Last Edit: March 20, 2013, 04:53:14 pm by dominikdh » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20298
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ein anderes Problem:
Der ULN2004 funktionier nicht mit CMOS Ausgängen. Du mußt ULN2003 verwenden.
Statt der ganzen 595 und ULN könntest Du einen MAX7219 verwenden.

Ich weiß jetzt nicht die Farbe der 7-Segementanzeige. Aber bei rot hast Du 50mA pro LED und 1,4A gesamt, bei blau sind deas immernoch 20mA und somit 560mA. Das übersteugt die Möglichkeit des Spannungsstabilisators.

Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen Dank für deine Antwort!

Ein anderes Problem:
Der ULN2004 funktionier nicht mit CMOS Ausgängen. Du mußt ULN2003 verwenden.
Statt der ganzen 595 und ULN könntest Du einen MAX7219 verwenden.
Stimmt. Weiß auch nicht, warum ich da die ULN2004 und nicht die 2003 gekauft habe smiley-surprise
Naja, habe gerade bei ebay noch ULN2003 nachgekauft, mal hoffen, dass sie noch vor dem Wochenende kommen.
Interessanterweise funktioniert wie gesagt die Displayschaltung auch mit den ULN2004. Vielleicht weil die 5V schon recht nahe an den 6V für die ULN2004 liegen? Könnte das evtl. der Grund für die Ungleichförmigkeit meiner Versorgungsspannung sein? Allerdings funktionierte es auch nicht, wenn ich die LEDs nicht angeschlossen hatte...
Mir wäre es auch lieber den Grund des Problems zu beheben und nicht nur die Symptome durch Kondensatoren zu bekämpfen.
Der MAX7219 wäre natürlich eleganter gewesen, allerdings kannte ich ihn bisher noch nicht.
Außerdem verbaue ich gerne "simple" Bauteile. Wie man wahrscheinlich merkt, bin ich noch in der Lernphase smiley-wink. Daher finde ich es immer schön, wenn ich die Funktion der ICs noch nachvollziehen kann und nicht nur vorne was reinschicke und hinten das richtige rauskommt smiley-lol
 
Ich weiß jetzt nicht die Farbe der 7-Segementanzeige. Aber bei rot hast Du 50mA pro LED und 1,4A gesamt, bei blau sind deas immernoch 20mA und somit 560mA. Das übersteugt die Möglichkeit des Spannungsstabilisators.

Ich habe rote LEDs verbaut, pro Segment 3 in Reihe. Als Strom sind 30mA angegeben, sodass ich insgesamt auf 840mA komme. In dem Schaltplan war noch ein Fehler, die LEDs hängen nicht an 12V sondern an den 8V des 7808. Im Datenblatt wird für den 7808 ein maximaler Ausgangsstrom von 1,5A angegeben. Allerdings betreibe ich die LEDs nicht dauerhaft, sondern stelle sie per PWM auf etwa 30%. Zusätzlich habe ich noch einen kleinen Alu-Kühlkörper an den Spannungsregler geschraubt.
Sollte ich trotzdem noch etwas an der Spannungsversorgung machen? Evtl. einen zweiten 7808 verbauten und die Leistung aufteilen, oder besser einen Leistungswiderstand vor den Spannungsregler?

Schöne Grüße
Dominik
Logged

Online Online
Edison Member
*
Karma: 31
Posts: 1051
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mir wäre es auch lieber den Grund des Problems zu beheben und nicht nur die Symptome durch Kondensatoren zu bekämpfen.
Das siehst du falsch.
Kondensatoren sind eine elementares Element einer sauberen Spannungsversorgung.
Üblicherweise wird, zusätzlich zu den Kondensatoren am Spannungsregler, an jedem IC direkt am Versorgungspin nochmal ein Kerkos (ca. 100nF) verbaut, um die Versorgung am IC vor Einbrüchen zu schützen.
Das ist kein bekämpfen der Symptome, sonder die Basis einer sauberen Spannungsversorgung, welche wiederum Voraussetzung für die ordungsgemäße Funktion der Schaltung ist.

Gunther
Logged

Grüße
Gunther

Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, ja, stimmt...

Allerdings habe ich jetzt einen 220nF direkt an den Versorgungspins, was scheinbar noch nicht ganz ausreicht.
Bei der normalen PWM-Frequenz von ~500Hz läuft das Programm jetzt durch. Wenn ich die Frequenz allerdings auf 25kHz hochsetzte, dann gibt es wieder Probleme.

Daher scheint es ja noch einen Effekt bei der Ansteuerung des Transistors zu geben?! Das war mein Hintergedanke zur Ursache smiley-wink
Liegt das an der schnellen Umladung der Gate-Kapazität?

Edit:
Das Programm bleibt jetzt immer bei niedrigen Lüfterdrehzhalen hängen - sprich bei hohen PWM Anteilen.
Die Kapazität an Vcc zu erhöhen scheint nichts mehr zu bringen, habe testweise mal einen weiteren 100nF Kerko an Pin 7 und 8 gehalten, das hat jedoch nicht geholfen.
« Last Edit: March 21, 2013, 04:49:44 am by dominikdh » Logged

Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich würde auch eher von Nanofarrad auf Mikrofarrad umschwenken...
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok.
Aufgrund des Schaltplans des Arduino Uno Boards habe ich mich bisher im nF Bereich bewegt, dort sind ja 100nF verbaut. Ich werde gleich mal noch einen Elko dranhängen.

Gerade habe ich mal noch ein bisschen mit den PWM Frequenzen gespielt. Bis etwa 5000Hz läuft er, danach gibt es Probleme.
Logged

Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Der Spannungswandler ist im Schaltplan oben rechts, da findet man am Ein- und Ausgang jeweils einen Elko mit 47µF. Etwas mehr schadet in der Regel auch nicht... smiley-wink
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja, da habe ich mittlerweile schon einen 220µF dran smiley-wink

In unmittelbarer Nähe des Vcc Pins meinte ich die 100nF.
Ich versuche gerade dort mal noch einen zusätzlichen Elko unterzubringen, also recht nah an dem Vcc Eingang.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

So, hänge noch einmal den aktuellen Schaltplan an. Neu sind im Wesentlichen die Kondensatoren C9, C10, C11.
Jedoch komme ich leider nicht über eine Frequenz von etwa 5kHz. Sobald ich dann einen PWM Wert über ca. 200 schreibe, bleibt das Programm hängen. Ein automatischer Neustart findet meistens allerdings nicht mehr statt.
Dabei ist alles sehr unzuverlässig, manchmal läuft es noch einigermaßen durch, manchmal bleibt er schon früher hängen, usw.

Das ist das Programm, das ich laufen lasse:
Code:
/*

 Mimics the fade example but with an extra parameter for frequency. It should dim but with a flicker
 because the frequency has been set low enough for the human eye to detect. This flicker is easiest to see when
 the LED is moving with respect to the eye and when it is between about 20% - 60% brighness. The library
 allows for a frequency range from 1Hz - 2MHz on 16 bit timers and 31Hz - 2 MHz on 8 bit timers. When
 SetPinFrequency()/SetPinFrequencySafe() is called, a bool is returned which can be tested to verify the
 frequency was actually changed.
 
 This example runs on mega and uno.
 */

#include <PWM.h>

//use pin 11 on the Mega instead, otherwise there is a frequency cap at 31 Hz
int FAN = 9;                // the pin that the LED is attached to
int brightness = 0;         // how bright the LED is
int fadeAmount = 2;         // how many points to fade the LED by
int32_t frequency = 7000; //frequency (in Hz)

void setup()
{
  //initialize all timers except for 0, to save time keeping functions
  InitTimersSafe();

  //sets the frequency for the specified pin
  bool success = SetPinFrequencySafe(FAN, frequency);
 
  //if the pin frequency was set successfully, turn pin 13 on
  if(success) {
    pinMode(11, OUTPUT);
    digitalWrite(11, HIGH);
    delay(1000);
    digitalWrite(11, LOW);   
  }
  Serial.begin(9600);
}

void loop()
{
  //use this functions instead of analogWrite on 'initialized' pins
  pwmWrite(FAN, brightness);

  brightness = brightness + fadeAmount;

  if (brightness < 1 || brightness > 250) {
    fadeAmount = -fadeAmount ;
  }     
 
  Serial.println(brightness);
  delay(50);     
}

Leider verstehe ich bisher noch nicht, warum es bei höheren Frequenzen Probleme gibt. Scheinbar gibt es da ja an den Transistoren einen Effekt?


* Schaltplan2.png (85.25 KB, 2089x1429 - viewed 40 times.)
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 96
Posts: 4763
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wieso steuerst Du den MOSFET nicht direkt an? Die IRF540 schalten spätestens bei 4V voll durch. Wenn Du den Transistor davor drin lassen willst, solltest Du versuchen, den Basis-Widerstand etwas zu verkleinern, damit er schneller durchschaltet. Obwohl 5kHz etwas gar wenig ist, ich hatte erst bei einigen MHz Problem in dieser Hinsicht.

Was heisst "bleibt das Programm hängen" genau? Wie weit kommt es? Wird überhaupt noch etwas ausgegeben? Falls nein, mache mal etwas mehr Debug-Output rein.
Logged

Online Online
Edison Member
*
Karma: 31
Posts: 1051
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mir sind noch zwei Sachen aufgefallen:

a) die 12V scheint garnicht gepuffert?  hier könnte ein Elko nicht schade.
Ein Elko an der Prozessorversorgung hingegen ist überflüssig, da würde ich wenn dann eher auf 1n parallel zum 220nF gehen, aber das sollte bei den Frequenzen nicht nötig sein.

b) Du solltest  unbedingt einen Gate-Vorwiderstand verbauen (ca. 220R bis 470R) das reduziert die Stromspitzen beim Abschalten des FETS. Zum Verständnis: du entlädst die Gate-Kapazität des Fet direkt über Transistor. Das verursacht im Abschaltfall extrem schnelle (ns) Spikes (kann auch 1A sein), die auf der Induktivität der Zuleitungen (in dem Frequnezbereich ist ein Draht kein Draht mehr, sondern Spule, Kondensator, Widerstand, Antenne....) Spannungsspitzen von mehreren Volt erzeugen können.

Ausserdem: ich kenne deinen Aufbau nicht, aber es könnte auch ein Problem der Masseführung sein. Versuche mal deine Masseleitungen dick, kurz, und am besten sternförmig zu halten. (eine Massefläche wäre noch besser).

Ansonsten das Problem langsam einkreisen:
- ohne Lüfter betreiben. Wenns noch geht, eine andere Last (weniger Strom) probieren, wenns nicht geht, dann ohne FET betreiben etc.
so lange weiter machen, bis man weiss welche Komponente die Störungen verursacht.

Und, so wie Pylon schon anmerkte: mit "Debug-Serial.print" die Stelle finden, an der die SW aussteigt. auch das kann ein Hinweis sein. Aber ich tippe am ehesten auf die Masseführung.

Gunther


« Last Edit: March 21, 2013, 10:54:08 am by guntherb » Logged

Grüße
Gunther

Online Online
Edison Member
*
Karma: 31
Posts: 1051
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wieso steuerst Du den MOSFET nicht direkt an? Die IRF540 schalten spätestens bei 4V voll durch.
Das stimmt so nicht.
Bei 4V ist der IRF540 noch voll im linearen Modus! Deshalb empfehle ich immer einen Logic Level FET, z.B. den IRLZ44N, der ist bei 4V schon fast, bei 5V ganz gesättigt.
Logged

Grüße
Gunther

Pages: [1] 2 3   Go Up
Jump to: