Go Down

Topic: standalone arduino - MOSFET PWM für Lüfterregelung (Read 4781 times) previous topic - next topic

dominikdh

Mar 20, 2013, 06:20 pm Last Edit: Mar 23, 2013, 05:34 pm by dominikdh Reason: 1
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... :~

pylon

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.

dominikdh

#2
Mar 20, 2013, 07:05 pm Last Edit: Mar 20, 2013, 10:53 pm by dominikdh Reason: 1
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?  :~
Für Hinweise bzgl. benötigter Kapazität bin ich natürlich offen ;)
Ich glaube so langsam muss ich mal über die Anschaffung eines Oszilloskops nachdenken...

uwefed

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

dominikdh

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 ;). 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 XD


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

guntherb

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
Grüße
Gunther

dominikdh

#6
Mar 21, 2013, 10:23 am Last Edit: Mar 21, 2013, 10:49 am by dominikdh Reason: 1
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 ;)
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.

sth77

Ich würde auch eher von Nanofarrad auf Mikrofarrad umschwenken...
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

dominikdh

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.

sth77

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... ;)
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

dominikdh

Ja, da habe ich mittlerweile schon einen 220µF dran ;)

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.

dominikdh

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: [Select]
/*

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?

pylon

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.

guntherb

#13
Mar 21, 2013, 04:52 pm Last Edit: Mar 21, 2013, 04:54 pm by guntherb Reason: 1
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


Grüße
Gunther

guntherb

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.
Grüße
Gunther

Go Up