standalone arduino - MOSFET PWM für Lüfterregelung

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

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.

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 :wink:
Ich glaube so langsam muss ich mal über die Anschaffung eines Oszilloskops nachdenken...

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

Vielen Dank für deine Antwort!

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.

Stimmt. Weiß auch nicht, warum ich da die ULN2004 und nicht die 2003 gekauft habe :open_mouth:
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

uwefed:
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

dominikdh:
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

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

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

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.

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

Ja, da habe ich mittlerweile schon einen 220µF dran :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.

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:

/*

 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?

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.

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

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

Danke für eure Antworten!

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.

Ich wollte damit ein "selbstleitendes" Verhalten erzeugen, damit im Fehlerfall der Lüfter auf maximaler Drehzahl läuft.
Ob das so sinnvoll ist, lässt sich vielleicht drüber streiten. Aber es sollte doch so generell möglich sein, oder?

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

Ja, das ist was schwammig, allerdings weiß ich nicht wirklich, wo ich mehr Debug-Output unterbringen soll.
In der Setup-Funktion lasse ich ja den Summer piepsen. Damit bekomme ich mit, wenn der Prozessor neustartet.
In jedem Programmdurchlauf gebe ich den PWM-Wert aus. Ich sehe dann, dass der Wert stetig zunimmt, bis etwa 200 (sprich 100 Programmdurchläufen), mal ist es etwas mehr, mal etwas weniger. Dann kommt per Serial-Output nichts mehr und der Lüfter dreht mit konstanter Drehzahl.
Wenn ich das Programm mit höheren PWM-Frequenzen laufen lasse, ist die Tendenz größer, dass der Prozessor neustartet. Außerdem findet das dann schon früher statt (<200).
Ich hoffe, dass das einigermaßen verständlich ist.

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

Die 12V kommen von einem Steckernetzteil. Ich dachte mir, dass dieses entsprechende Pufferkondensatoren verbaut hat.
Gerade habe ich mal noch mit einem 100µF Kondensator die 12V gepuffert, das hat das Problem nicht behoben.

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

Das war ein guten Tipp. Danke vor allem auch für die Erklärung!
Ich habe nun einen 390R zwischen Gate und den Collector gelötet. Damit komme ich nun auf etwa 15kHz. Das sind zwar noch nicht die 25kHz, die ich eigentlich angepeilt hatte, aber damit könnte ich leben, die Ansteuerung ist nicht mehr zu hören.

guntherb:
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).

Hmm, das klingt für mich plausibel, warum der Aufbau auf dem Steckbrett funktioniert und in meiner zusammengelöteten Schaltung auf der Lochrasterplatine nicht.
Ehrlich gesagt, habe ich mir bei dem Zusammenbau keine Gedanken über die Massenführung gemacht. Das ist meine erste Schaltung die mit "höheren Frequenzen" (>500Hz) arbeitet. Deswegen habe ich da leider keinerlei Erfahrung.
So wie ich das sehe, könnten meine Masseleitungen durchaus ungünstig gelegt sein. Ich kann morgen mal noch ein Bild machen, ich vermute allerdings, dass es schwierig wird da einen Überblick zu gewinnen.
Bevor ich allerdings die Schaltung komplett neu aufbaue, lebe ich dann doch lieber mit den 15kHz, das Löten war einiges an Arbeit...

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

Ohne Lüfter läuft es auf jeden Fall. Ich werde morgen mal eine LED anstelle des Lüfters hängen. Mal schauen, ob ich dann über 15kHz komme.

Nochmals vielen Dank für die klasse Hilfe,
Dominik

So, nun habe ich noch ein paar Sachen probiert.

Zum einen habe ich mal anstatt des Lüfters nur eine LED als Last betrieben. Damit läuft es einwandfrei, auch bei 25kHz.

Als Gate Widerstand habe ich mal noch anstelle der 390 Ohm 470 Ohm eingelötet.

Mittlerweile kann ich jetzt die Schaltung auch mit 20-25 kHz und angeschlossenem Lüfter betreiben, allerdings noch nicht wirklich zuverlässig. Aber immerhin gibt es nicht mehr jedes mal Probleme, wenn ein hoher PWM Wert erreicht wird. Das zeigt ja, dass es in die Richtige Richtung geht :slight_smile:

Ich habe mal noch ein Bild von der Unterseite meiner Platine gemacht. Schön ist sicherlich was anderes :blush:
Die rot markierten Leiter sind die Masse Bahnen. Auf der Oberseite habe ich auch noch eine Masse-Käbelchen verlegt, allerdings bekommt man da von einem Foto wohl keinen Überblick, da dort auch noch einige andere Kabel laufen...
Die gelbe Bahn ist eine 5V Leitung (Versorgungsspannung der Schieberegister). Ich hoffe, dass die beiden Leitungen nebeneinander keine Probleme machen. Allerdings liegt da ja keine dynamische Spannung drauf.
Außerdem habe ich mal noch die Pins des MOSFETs und des Bipolartransistors mit Grün markiert.
Hoffentlich ist das Bild kein Musterbeispiel wie man es nicht machen sollte... :roll_eyes:

Wenn es also mit kleineren Maßnahmen noch möglich ist die Masseführung zu verbessern, dann würde ich das mal noch probieren.

Wie gesagt, eigentlich könnte ich jetzt auch mit ~15kHz leben, damit scheint der Aufbau nun einigermaßen stabil zu funktionieren. Da ich aber gerne aus meinen Fehlern lerne und 25kHz eigentlich auch nicht gerade Hochfrequenztechnik sein sollte, würde ich auch noch Verbesserungsmaßnahmen durchführen (wenn ich nicht die Platine komplett neu aufbauen muss).

EDIT: Sorry, das Bild zu verkleinern habe ich im Eifer des Gefechts vergessen :blush:. Ich bin sonst auch kein Fan von solchen "Postern".
Habe einen neuen Anhang beigefügt.

Kann mir mal einer erklären warum hier immer Bilder mit 3000x2000 Pixeln Auflösung hochgeladen werden? Das viele Scrollen macht es schwieriger den Überblick über eine Schaltung zu bekommen, als wenn man ein Bild mit 1280x1024 oder so ähnlich hat. Mehr Details bekommt man mit der hohen Auflösung eh nicht, die meisten Bilder wirken dann eh schon verschwommen.

Ist eigentlich ein Problem der Forum-Webseite, die sollte die Bilder nicht nur als Daumennagel und volle Pixelgröße, sondern auch/besser mit "width=100%" oder so bereitstellen können. Das würde normalen Browsern viel helfen.

Meine Freunde gucken immer blöd, wenn ich mich über gemailte Bilder von xMB Größe mit dem Hinweis beschwere, ich wolle sie mir nur auf dem Bildschirm anschauen. (Schaff dir doch schnelleres Internet an)

michael_x:
Ist eigentlich ein Problem der Forum-Webseite, die sollte die Bilder nicht nur als Daumennagel und volle Pixelgröße, sondern auch/besser mit "width=100%" oder so bereitstellen können. Das würde normalen Browsern viel helfen.

Nicht ganz. Denn die width=100% ändern leider nix an der Größe der Bildatei. Wer z.B. mobil, weil unterwegs oder auf Arbeit im Forum mitliest, der hat dann ein Problem.
Ich betreue ehrenamtlich die IT eines größeren Tierschutzvereins. Dort kommen teilweise mehrere Mails pro Tag zu vermissten Tieren an. Viele der Leute scheinen da auch zu glauben das die Größe des Bildes direkt proportional zur Chance ist, das Tier wieder zu finden. Daher kenne ich die Mailproblematik auch recht gut :slight_smile: