You are not logged in.

Dear visitor, welcome to We-Mod-It | Das Forum von Moddern für Modder. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 924

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 74

  • Send private message

1

Wednesday, August 27th 2014, 12:39pm

Arduino Tutorial 4 - Lüfterdrehzal auslesen


Arduino Tutorial 4 - Lüfterdrehzahl auslesen



Vorwort

3-Pin Lüfter lassen sich sehr einfach mit einem Arduino und einem N-Kanal Mosfet (Transistor) per PWM steuern, leider lässt sich so die Drehzahl der Lüfter nicht so einfach erfassen.
Das liegt daran, dass die Elektronik, die das Tachosignal erzeugt, vom Lüfter mit Strom versorgt wird.
Wenn wir jetzt ein PWM Signal an den Lüfter anlegen, wird er sehr schnell an und aus geschalten und somit eine gedrosselte Geschwindigkeit erzielt. Dadurch wird aber auch die Elektronik des Tachosignals gestört und der Lüfter gibt kein saubers Signal mehr aus.

Ich habe lange nach einer Lösung für dieses Problems gesucht, da das Internet hier nicht viel hergibt, außer Leuten mit dem selben Problem :(
Dann bin ich aber bei meinen Recherchen auf ein PDF eines Herstellers für Fan Controller Chips gestoßen, dass mich auf den richtigen Weg gebracht hat.
Mir war es deshalb sehr wichtig diese Tutorial zu schreiben um für andere "Suchende" etwas Licht ins Dunkel zu bringen.

Das Zauberwort mit dem ich des Problem gelöst habe ist das sogenannte "Pulse Stretching".



Teileliste

Arduino IDE (Tutorial wurde mit 1.5.7 Beta erstellt)
Arduino UNO (Es gibt die Arduinos aber auch deutlich günstiger bei Ebay)
Breadboard
10kOhm Widerstand
Steckbrücke (oder Kabel je nach Vorliebe)
10kO Drehpoti
10kO NTC-Wiederstand (Temperatursensor)
alternativ Wakü Thermosensor (das sind auch nur 10kO NTC-Wiederstände in einem Metallgehäuse)
N-Chanel Transistor/Mosfet
12V Netzteil (das ist nur ein Beispiel! Bitte wählt ein ausreichend starkes Netzteil je nach Leistung des Lüfters)
alternativ 12V Computer Netzteil
12V PC Lüfter




Erklärung

In diesem Diagramm sieht man das Problem mit dem RPM Signal. Durch das anpulsen per PWM wird ein zerstückeltes Tachosignal ausgegeben, dass zu einer falschen Drehzahl führt.
Normalerweise zählt der Arduino die steigenden oder fallenden Flanken des Tachosignals. Über diesen Wert kann man dann die RPM berechnen.
Im untersten Bild sieht man, dass bei per PWM gesteuerten Lüftern, das Tachosignal sehr viele Flanken aufweist. Dadurch zählt der Arduino einen falschen Wert und die RPM Berechnung stimmt nicht.
Nur wenn ein PWM Wert von 255, also 100% anliegt, stimmen die gemessenen RPM.




Man kann sich hier einem Trick bedienen um das Problem zu umgehen. Es ist keine perfekte Lösung, aber die mit dem geringsten Aufwand und einem akzeptablen Ergebnis.
Man legt einfach für ein paar Millisekunden einen PWM Wert von 255 am Lüfter an und misst in dieser Zeit, die Dauer zwischen einer steigenden und einer fallenden Flanke, aslo die Zeit in der das Signal HIGH oder LOW ist. Da der Lüfter träge ist, ändert sich seine Geschwindigkeit und damit auch die Zeit zwischen den Flanke nicht merklich und man kann mit diesem Wert dann die RPM berechnen.




Das kurzzeitige anlegen von 100% PWM Wert hat natürlich kleine Auswirkungen auf die Drehzahl. Der Unterschied ist aber zu vernachlässigen. Wenn man die Drehzahl jede Sekunde abfragt oder nur alle drei Sekunden gab es bei mir nur einen Unterschied von ca. 15 RPM, also 15 Umdrehungen in der Minute.


Berechnung der Umdrehungen pro Minute

Gehen wir mal davon aus, dass wir eine Zeit zwischen der steigenden und der fallenden Flanke von Fz = 18567 Mikrosekunden gemessen haben, das sind 18,567 Millisekunden.
Ein Lüfter macht pro Umdrehung zwei Pulse im Tachosignal, das ist 4 x die Zeit zwischen den Flanken.




Hier ist jetzt die genaue Berechnung die dann im Arduino Sketch abläuft. Ich habe sie so genau wie möglich aufgeschrieben, damit ihr hoffentlich versteht, was da passiert.






________________________________________________________________________

4.1 - Reiner Code


Um die Drehzahl auslesen zu können brauchen wir natürlich erstmal den Code, der den Lüfter steuert. Fangen wir erst einmal mit dem reinsten Code an, damit ihr besser seht was für das Auslesen nötig ist und geben einen festen PWM Wert an den Lüfter aus.


Anschlussplan




CODE

"AT_4_1.ino"


Quoted


/*
Arduino Tutorial 4.1 - Lüfterdrehzahl auslesen - Reiner Code

by Scynd 2014

In diesem Tutorial geht es darum, die Drehzahl auszulesen wären der Lüfter mit einem festen PWM Wert gesteuert wird.
*/


//Konstante Variablen
const int FanPin = 9; // Lüfter an Pin 9 angeschlossen
const int TachoPin = 2; // Pin des Tachosignals des Lüfters

// Variablen
int FanSpeed = 160; // Variable für die Lüftergeschwindigkeit
int AbfrZeit = 2000; // Zeitabstand für die Abfragen des Tachosignals
long TachoMillis = AbfrZeit; // Zeitabstand für Pulse Stretching Funktion
float RPS = 0; // Variable mit Kommastelle für die Berechnung der Umdrehungen pro Sekunde
int RPM = 0; // Variable für die gemittelte Drehzahl
float UmdrZeit = 0; // Variable mit Kommastelle für die Zeit pro Umdrehung des Lüfters
float FlankenZeit =0; // Variable mit Kommastelle für die Zeit pro Puls des Lüfters



void setup() {

TCCR1B = TCCR1B & 0b11111000 | 0x01; // Setzt Timer1 (Pin 9 und 10) auf 31000Hz
Serial.begin(9600);
pinMode(FanPin, OUTPUT); //Setzt den Lüfter Pin als Ausgang
pinMode(TachoPin, INPUT); //Setzt den Tacho Pin als Eingang
}


void loop() {

analogWrite(FanPin, FanSpeed); // Gibt die Variable mit PWM aus

// Alle 2000ms pulse_stretch starten um die Drehzal auszulesen
if((millis() - TachoMillis) >= AbfrZeit) {
pulse_stretch();
}

}


void pulse_stretch() {

analogWrite(FanPin, 255); // Den Lüfter konstant mit Strom versorgen damit das Tachosignal funktioniert
FlankenZeit = pulseIn(TachoPin, HIGH); // Abfrage der Zeit pro Puls in Mikrosekunden
analogWrite(FanPin, FanSpeed); // Setzt die Lüftergeschwindigkeit zurück
UmdrZeit = ((FlankenZeit * 4)/1000); // Berechnung der Zeit pro Umdrehung in Millisekunden
RPS = (1000/UmdrZeit); // Umrechnung auf Umdrehungen pro Sekunde
RPM = (RPS*60); // Umrechnung auf Umdrehungen pro Minute

Serial.println(RPM); // Ausgabe der Drehzahl im Seriellen Monitor

TachoMillis = millis(); // Die TachoMillis werden aktualisiert um die nächsten 2000ms zählen zu können
}





In den Variablen habe ich Beispielhaft als festen PWM Wert FanSpeed = 160 eingestellt. Die restlichen Variablen sind für die Erfassung und Berechnung der RPM und sind selbsterklärend.
Im Loop wird der FanSpeed per analogWrite an den Lüfter ausgegeben und so eine feste Lüftergeschwindigkeit vorgegeben, die wir hier nur als Demonstrationswert brauchen.
Als nächstes wird per if Befehl abgefragt, ob 2000ms vergangen sind. Wenn das zutrifft wird die Funktion pulse_stretch ausgeführt.

Jetzt kommt der spannendere Teil. In der puls_stretch Funktion wird als erstes der Lüfter mit einem PWM Wert von 255 (100%) angesteuert, damit er ein sauberes Tachosignal ausgibt.
Dann wird die Zeit zwischen zwei Flanken des Tachosignals per pulsIn Befehl (Erklärung ) erfasst und in der Variable FlankenZeit gespeichert. Dieser Vorgang dauert nur wenige Millisekunden und beeinflusst so die Drehzahl nicht viel.
Anschließend senken wir die Geschwindigkeit des Lüfters wieder auf seinen Ausgangswert.
Jetzt kommt die Berechnung der Drehzahl mittels der erfassten FlankenZeit. Der berechnete Wert wird dann am Seriellen Monitor dargestellt.
Zum Schluss muss die Variable TachoMillis auf den aktuellen Wert der millis gesetzt werden, damit die nächste Abfrage im Loop funktioniert und pulse_stretch wieder ausgeführt werden kann.





________________________________________________________________________

4.2 - Drehzahl mit Potisteuerung


Da es ja nicht so viel Sinn macht, die Drehzahl bei einem festen PWM Wert auszulesen, ist hier ein Beispiel bei dem wir den Lüfter mit einem Potentiometer steuern und dabei die Drehzahl auslesen.


Anschlussplan




CODE

"AT_4_2.ino"


Quoted


/*
Arduino Tutorial 4.2 - Drehzahl mit Potisteuerung

by Scynd 2014

In diesem Tutorial geht es darum, die Lüftergeschwindigkeit mit Hilfe eines Drehpotenzometers einzustellen.
*/


//Konstanten
const int FanPin = 9; // Lüfter an Pin 9 angeschlossen
const int PotiPin = A0 ; // Potenzometer am analogen Eingang Pin 0 angeschlossen
const int TachoPin = 2; // Pin des Tachosignals des Lüfters


// Variablen
int FanSpeed = 0; // Variable für die Lüftergeschwindigkeit
int FanMin = 50; // Minimaler PWM Wert für den Lüfter. Kommt auf den Lüfter an
int PotiVar = 0 ; // Variable zum speichern des Potentiometereingangs
int AbfrZeit = 2000; // Zeitabstand für die Abfragen des Tachosignals
long TachoMillis = AbfrZeit; // Zeitabstand für Pulse Stretching Funktion
float RPS = 0; // Variable mit Kommastelle für die Berechnung der Umdrehungen pro Sekunde
int RPM = 0; // Variable für die gemittelte Drehzahl
float UmdrZeit = 0; // Variable mit Kommastelle für die Zeit pro Umdrehung des Lüfters
float FlankenZeit =0; // Variable mit Kommastelle für die Zeit pro Puls des Lüfters


void setup() {

TCCR1B = TCCR1B & 0b11111000 | 0x01; // Setzt Timer1 (Pin 9 und 10) auf 31300Hz
Serial.begin(9600);
pinMode(FanPin, OUTPUT) ; //Setzt den Lüfter Pin als Ausgang
pinMode(PotiPin, INPUT) ; //Setzt den LEDPin als Ausgang
pinMode(TachoPin, INPUT); //Setzt den Tacho Pin als Eingang
}


void loop() {

PotiVar = analogRead(PotiPin) ; // Liest das Potentiometer aus
FanSpeed = map(PotiVar, 50, 1023, FanMin, 255); // Verteilt den PWM Wert über den Messbereich des Potis

// Unterer Potenziometerbereichs (0-50) = Lüfter aus
if(PotiVar < 50) {
FanSpeed = 0;
}

analogWrite(FanPin, FanSpeed); // Gibt die Variable mit PWM aus

// Alle 2000ms pulse_stretch starten um die Drehzal auszulesen
if((millis() - TachoMillis) >= AbfrZeit) {
pulse_stretch();
}
}


void pulse_stretch() {
// Nur wenn PotiVar größer als 50 ist, wird die RPM ausgelesen
if(PotiVar > 50) {
analogWrite(FanPin, 255); // Den Lüfter konstant mit Strom versorgen damit das Tachosignal funktioniert
FlankenZeit = pulseIn(TachoPin, HIGH); // Abfrage der Zeit pro Puls in Mikrosekunden
analogWrite(FanPin, FanSpeed); // Setzt die Lüftergeschwindigkeit zurück
UmdrZeit = ((FlankenZeit * 4)/1000); // Berechnung der Zeit pro Umdrehung in Millisekunden
RPS = (1000/UmdrZeit); // Umrechnung auf Umdrehungen pro Sekunde
RPM = (RPS*60); // Umrechnung auf Umdrehungen pro Minute
Serial.println(RPM); // Ausgabe der Drehzahl im Seriellen Monitor
}
// Wenn der Lüfter nicht angesteuert wird, schreibe Drehzahl 0
else{
Serial.println("0");
}
TachoMillis = millis(); // Die TachoMillis werden aktualisiert um die nächsten 2000ms zählen zu können
}




Der Code hier ist nur eine Kombination aus 4.1 - Reiner Code und 3.3 - Lüftergeschwindigkeit per Drehpoti einstellen , deshalb erkläre ich dazu auch nicht viel.
Der einzige Unterschied ist in Bereich von pulse_stretch() zu finden. Hier wird die Abfrage der Drehzahl mit Pulse Stretching nur ausgeführt, wenn der Wert von PotiVar über 50 ist. Anderenfalls wird einfach im Seriellen Monitor als Drehzahl 0 ausgegeben.




________________________________________________________________________

4.3 - Drehzahl mit Temperatursteuerung



Als letztes Beispiel zeige ich euch noch, wie man die Lüfterdrehzahl bei einem Temperaturgesteuerten Lüfter ausließt.


Anschlussplan




CODE

"AT_4_3.ino"


Quoted


/*
Arduino Tutorial 3.2 - Temperaturgesteuerter Lüfter mit 10kO NTC

by Scynd 2014

In diesem Szenario geht es darum, die Lüftergeschwindigkeit über die Temperatur zu steuern.
Bei steigender Temperatur, soll auch die Lüftergeschwindigkeit steigen, bei sinkender Temperatur fallen.

*/


// Konstanten
const int FanPin = 9; // Pin für den Lüfter
const int TachoPin = 2; // Pin des Tachosignals des Lüfters
const int NTC = A0; // Pin für den 10kO NTC Wiederstand
const int NTCNominal = 10000; // Wiederstand des NTC bei Nominaltemperatur
const int TempNominal = 25; // Temperatur bei der der NTC den angegebenen Wiederstand hat
const int BCoefficient = 3977; // Beta Coefficient(B25 aus Datenblatt des NTC)
const int SerienWiederstand = 10000; // Wert des Wiederstands der mit dem NTC in Serie geschalten ist

// Variablen
int FanSpeed = 0; // Variable für die Lüftergeschwindigkeit
int FanMin = 60; // Kleinster PWM Wert für den Lüfter befor er abschält
int FanOut = 1; // Variable zum pürfen ob der Lüfter aus war
int TMin = 20; // Untere Grenze des Temperaturbereichs
int TMax = 60; // Obere Grenze des Temperaturbereichs
int AbfrageZahl = 5; // Je mehr abfragen, desto stabiler isr das Ergebnis, dauert aber länger
int Abfrage[5]; // Array Variable für das Mitteln der Temperatur http://arduino.cc/de/pmwiki.php?n=Reference/Array
float Durchschnitt = 0; // Variable für das Mitteln der Temperatur
float Temp; // Variable für die Berechnung der temperatur nach Steinhart
int AbfrZeit = 2000; // Zeitabstand für die Abfragen des Tachosignals
long TachoMillis = AbfrZeit; // Zeitabstand für Pulse Stretching Funktion
float RPS = 0; // Variable mit Kommastelle für die Berechnung der Umdrehungen pro Sekunde
int RPM = 0; // Variable für die gemittelte Drehzahl
float UmdrZeit = 0; // Variable mit Kommastelle für die Zeit pro Umdrehung des Lüfters
float FlankenZeit =0; // Variable mit Kommastelle für die Zeit pro Puls des Lüfters



void setup() {

TCCR1B = TCCR1B & 0b11111000 | 0x01; // Setzt Timer1 (Pin 9 und 10) auf 31300Hz
Serial.begin(9600); // Setzt die Baudrate für die Ausgabe am Serial Monitor auf 9600
pinMode(FanPin, OUTPUT); // Setzt den Pin des Lüfters als Ausgang
pinMode(NTC, INPUT); // Setzt den Pin des NTC Wiederstands als Eingang
pinMode(TachoPin, INPUT); //Setzt den Tacho Pin als Eingang
}


void loop() {

Temperaturberechnung(); // Startet die Temperaturerfassungsroutine

// Lüftergeschwindigkeit über den Temperaturbereich einstellen
// TMin->0% PWM | TMax->100% PWM
FanSpeed = map(Temp, TMin, TMax, 0, 255);

// Wenn der PWM Wert unter den van FanMin fällt, schält der Lüfter ab
if (FanSpeed < FanMin) {
FanSpeed = 0;
FanOut = 1;
}

// Hysterese
if (FanOut == 1) {
FanSpeed = 0;
}

if(Temp >= 32) {
if(FanOut == 1) {
FanOut = 0;
analogWrite(FanPin, 255);
}
}

// PWM Wert auf 255 begerenzen
if (FanSpeed > 255) {
FanSpeed = 255;
}

analogWrite(FanPin, FanSpeed); // Den Lüfter mit dem PWM Wert ansteuern

// Alle 2000ms pulse_stretch starten um die Drehzal auszulesen
if((millis() - TachoMillis) >= AbfrZeit) {
pulse_stretch();
}
}



void Temperaturberechnung() {

// Nimmt N Abfragen in einer Reihe, mit einem kurzen delay
for (int i=0; i < AbfrageZahl; i++) {
Abfrage = analogRead(NTC);
delay(10);
}

// Mittelt alle Abfragen
Durchschnitt = 0;
for (int i=0; i < AbfrageZahl; i++) {
Durchschnitt += Abfrage;
}
Durchschnitt /= AbfrageZahl;

// Umwandlung des Wertes in Wiederstand
Durchschnitt = 1023 / Durchschnitt - 1;
Durchschnitt = SerienWiederstand / Durchschnitt;

// Umrechnung aller Ergebnisse in die Temperatur mittels einer Steinhard Berechnung
Temp = Durchschnitt / NTCNominal; // (R/Ro)
Temp = log(Temp); // ln(R/Ro)
Temp /= BCoefficient; // 1/B * ln(R/Ro)
Temp += 1.0 / (TempNominal + 273.15); // + (1/To)
Temp = 1.0 / Temp; // Invertieren
Temp -= 273.15; // Umwandeln in °C

// Ausgabe an den Seriellen Monitor
Serial.print("Temperatur ");
Serial.print(Temp);
Serial.println(" *C");

delay(500);
}



void pulse_stretch() {

if (FanOut == 0) {
analogWrite(FanPin, 255); // Den Lüfter konstant mit Strom versorgen damit das Tachosignal funktioniert
FlankenZeit = pulseIn(TachoPin, HIGH); // Abfrage der Zeit pro Puls in Mikrosekunden
analogWrite(FanPin, FanSpeed); // Setzt die Lüftergeschwindigkeit zurück
UmdrZeit = ((FlankenZeit * 4)/1000); // Berechnung der Zeit pro Umdrehung in Millisekunden
RPS = (1000/UmdrZeit); // Umrechnung auf Umdrehungen pro Sekunde
RPM = (RPS*60); // Umrechnung auf Umdrehungen pro Minute

Serial.println(RPM); // Ausgabe der Drehzahl im Seriellen Monitor
}
else {
Serial.println("0"); // Ausgabe von 0 RPM
}

TachoMillis = millis(); // Die TachoMillis werden aktualisiert um die nächsten 2000ms zählen zu können
}



Der Code hier ist nur eine Kombination aus 4.1 - Reiner Code und 3.2 - Temperaturgesteuerter Lüfter mit 10kO NTC deshalb erkläre ich dazu auch nicht viel.
Der einzige Unterschied ist in Bereich von pulse_stretch() zu finden. Hier wird die Abfrage der Drehzahl mit Pulse Stretching nur ausgeführt, wenn der Wert von FanOut 0 ist, sprich wenn der Lüfter läuft. Wenn der Lüfter steht, wird einfach 0 als Drehzahl im Seriellen Monotor ausgegeben.




Hier noch der Download der Arduino Sketche. Viel Spaß beim Nachbauen :thumbsup:
Arduino Tutorial 4 - Lüfterdrehzal auslesen.zip

This post has been edited 42 times, last edit by "Scynd" (Jan 8th 2015, 10:38am)


3 registered users thanked already.

Users who thanked for this post:

thechoozen (15.11.2014), H4wk (19.05.2016), ahlermi (19.04.2017)

Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 924

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 74

  • Send private message

2

Saturday, November 8th 2014, 10:33pm

So, das nächste Tutorial ist online. Viel Spaß damit! :thumbup:


der_george

"Mein Name ist George - Der George"

Posts: 4,832

Date of registration: Mar 17th 2010

Location: Da wo der Berch wohnt

Occupation: Inginöööör und Freundinbeschäftiger

Thanks: 356

  • Send private message

3

Thursday, November 13th 2014, 2:11pm

Wie immer sehr schön!

Top geschrieben und super anschaulich!

Vielen tausend Dank dafür!

So long :09
Meine Mods bei we-mod-it:
24h Stealth - 1.Platz 24h Livemodding DCMM 2010 | | taabar sin - 2. Platz Casemod DCMM 2012 | | 24h Semmetastic - 2. Platz 24h Livemodding DCMM 2013

Mein Modding-Verkaufsthread

H4wk

Neu Hier!

Posts: 1

Date of registration: May 19th 2016

  • Send private message

4

Thursday, May 19th 2016, 8:10pm

Hallo Scynd,

erst einmal vielen Dank für deine tollen Arduino How2s, diese haben mir wirklich schon sehr geholfen.

Ich habe nur eine Frage bzw. eine Anregung:
auf einer anderen Seite bin ich darüber gestolpert, dass man 3-Pin Lüftern nicht die Masse kappen sollte (N-CH, habe ich aktuell auch so) sondern man soll die Drehzahl über die 12V Steuern (P-CH).

hätte ich einen P-CH MOSFET da, hätte ich schon einen Versuch gestartet.
Was hältst du davon?

Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 924

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 74

  • Send private message

5

Thursday, May 19th 2016, 11:10pm

Hi H4wk,
freut mich das die Tutorial weitergeholfen haben ^^
Hm, ich habe das glaube ich vor ein paar jahren schon mal versucht, aber das hat nicht geklappt. Das mag aber auchdaran gelegen haben, dass ich deutlich weniger Ahnung von der Thematik hatte und auch kein Oszilloskop zur verfügung war.
Ich muss mal mein Kleinteil-Sammelsurium durforsten, ob ich nen P-Kanal Mosfet da habe. Wenn ja werde ich das mal testen :thumbup:

Danke für die Anregung!


tschidda

Neu Hier!

Posts: 1

Date of registration: Mar 29th 2017

  • Send private message

6

Wednesday, March 29th 2017, 11:09am

Hi,
erstmal vielen Dank für das (bzw. die schicken Tutorials)! Du hast mir auf dem Weg zur Eigenbau-Lüftersteuerung sehr weitergeholfen!
Jedoch habe ich noch ein paar Fragen zur Beschaltung. Laut dem PDF , dass dir als Grundlage dient, sollen noch ein paar weitere Bauteile (Zener-Diode, Gleichichterdiode und Kondensator) mit in die Schaltung integriert werden (siehe Bild ). Da mein Entwurf eine Mischung aus der Temperaturgesteuerten und der Poti-gesteuerten Variante von dir ist, bin ich mir nicht 100%-ig sicher wie und wo ich die Teile einbauen soll. Außerdem habe ich vor das ganze mit insg. 6 Kanälen nachzubauen (einfach 6-mal die Schaltung in Reihe gepackt) und an jedem Kanal sollen bis zu 4 Lüfter hängen (die logischerweise dann pro Kanal alle gleich laufen sollen). Als Lüfter verwende ich jeweils 4x Noiseblocker NB-BlackSilentFan-80mm.
Hier mein aktuelles Platinenlayout ohne die weiteren Bauteile (nur auf deinen Tutorials basierend): Platine (Leitungen: rot=5V, schwarz=Masse/0V, gelb=12V, blau=Arduino). Die LEDs sind nur zur Visualisierung ob etwas am Lüfter/Temp-Sensor angeschlossen ist (einfach in Reihe zum jeweiligen Bauteil). Die Stomversorgung soll über einen normalen 4-Pin-Molex-Anschluss vom PC-netzteil erfolgen und der Arduino wird da einfach angeklemmt (12V+GND). Die restlichen Bauteile sind wie Beschrieben bzw. verlinkt Dimensioniert.

Dazu folgende Fragen:
1. Wie muss ich die Bauteile dimensonieren? (Sind die Teile ausreichend: Z-Diode , Gl-Diode , Kondensator)
2. Wo muss ich die Bauteile in meine Schaltung reinbasteln?
3. Kann ich die Schaltung einfach vervielfältigen um mehr Kanäle zu bekommen (oder mach ich da grade nen Denkfehler)?

Danke schon mal im vorraus!
Gruß

+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+#+
EDIT:
Hab meine Platine nochmal überarbeitet um eine mögliche Lösung für 2. zu bekommen. Ist das so (Bild) möglich? Die grünen Kästen sind die neuen Bauteile (vgl. Schaltung im PDF), die blauen sind die LEDs, die einfach nur ausgeblendet sind um die Übersicht zu behalten

This post has been edited 2 times, last edit by "tschidda" (Mar 29th 2017, 12:04pm)


Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 924

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 74

  • Send private message

7

Wednesday, March 29th 2017, 10:38pm

Hi, schön das dir die Tutorials weitergeholfen haben ^^

Zu deiner Frage, dur brauchst eigentlich nur eine Freilafdiode parallel zum Lüfter. Hier ist ein Tutorial , dass das super erklärt. Ich muss das in meinen Tutorials mal ergänzen :whistling: .

1) Ich würde die 1N5817 nehmen, die du schon genannt hast.
2) wie im oberen Tutorial, parallel zum Lüfter.
3) Ja, die schaltung kannst du vervierfältigen, so oft du willst, solange genug PWM Kanäle da sind ;)

Ich hoffe das Hilft dir weiter.

Gruß Scynd


ahlermi

Neu Hier!

Posts: 9

Date of registration: Apr 19th 2017

  • Send private message

8

Wednesday, April 19th 2017, 10:45pm

Tutorial für einen 4-Pin Lüfter

Hallo Scynd,

hättest du Lust ein Tutorial für einen 4 Pin Lüfter zu schreiben?

Gruß ahlermi

Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 924

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 74

  • Send private message

9

Thursday, April 20th 2017, 7:34am

Hi, ich habe schon Tutorials dazu geschrieben. Sie sind aber evtl. noch nicht ganz Fehlerfrei, deshalb habe ich sie hier noch nicht eingefügt. Allerdings habe ich sie eben auf meiner Webseite freigeschalten, damit du darauf zugreifen kannst ;)

Hier die allgemeine ansteuerung von 3 und 4 Pin Lüftern
http://www.scynd.de/tutorials/arduino-tu…er-steuern.html

Und hier mit Drehzahlerfassung
http://www.scynd.de/tutorials/arduino-tu…l-auslesen.html


Ich hoffe das hilft dir weiter, aber wie gesagt, es könnte noch der ein oder andere kleine Fehler drin sein :rolleyes:


1 registered user thanked already.

Users who thanked for this post:

ahlermi (20.04.2017)

ahlermi

Neu Hier!

Posts: 9

Date of registration: Apr 19th 2017

  • Send private message

10

Thursday, April 20th 2017, 9:09am

Lüfter anhalten

Ich bin begeister! danke für die schnelle Antwort. :hail:

gibt es eine Möglichkeit den lüfter per PWM anzuhalten? Oder ist davon abzuraten? dann würde ich ein relay zwischen schalten.

Bei fanSpeed = 4 dreht er noch langsam, unter 4 dreht er schneller ?(

Gruß ahlermi

Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 924

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 74

  • Send private message

11

Thursday, April 20th 2017, 10:25am

Gern geschehen ^^
Das ist ein Punkt weswegen ich die Tutorials noch nicht freigegeben hatte.
Wenn die PWM Lüfter quasi kein Signal bekommen drehen sie aus Sicherheitsgründen auf voller Drehzahl, falls mal die Lüftersteuerung abschmiert. Man müsste hier quasi zusätzlich einen Transistor in die Stromversorgung des Lüfters hängen, wie bei den 3 Pin Lüftern und diesen wenn der Lüfter an sein soll ein HIGH Signal geben und wenn er aus gehen soll ein LOW Signal. Ich hoffe du verstehst was ich meine.

Gruß Scynd


ahlermi

Neu Hier!

Posts: 9

Date of registration: Apr 19th 2017

  • Send private message

12

Thursday, April 20th 2017, 10:33am

jupp, deshalb ja das erwähnte Relay, damit kappe ich dann
einfach die Stromzufuhr.
Hab noch Platinen rumfliegen.

danke!

ahlermi

Neu Hier!

Posts: 9

Date of registration: Apr 19th 2017

  • Send private message

13

Wednesday, May 23rd 2018, 12:07am

Problem, ESP8266 startet immer neu wenn Lüfter läuft

Hallo Scynd,

Ich benutze einen ESP8266 der ein Servosignal an einen Arduino schickt, der dann das Signal auf 2 Lüfter gibt.


Das ganze funktioniert auch, leider aber meist nur kurz, 3-5 Sekunden, dann startet der ESP8266 neu.


Ich habe ein 12V Netzteil angeschlossen und versorge ESP8266 mit einem 5V / 1,5A Netzteil, der Arduino hängt an den 3,3 V vom ESP8266.


Zusätzlich sind noch vorgesehen 2 DHT22 und ein CO2 Sensor alles 5V, diese sind aber noch nicht angeschlossen.


Kann es sein das die 1,5A nicht ausreichen, ich weiß nicht wie viel Strom an den Widerständen verbraten wird.


Gruß Michael
ahlermi has attached the following images:
  • IMG_0580.JPG
  • IMG_0581.JPG

Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 924

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 74

  • Send private message

14

Wednesday, May 23rd 2018, 4:08pm

Hm, klingt schon irgendwie nach Netzteil. Wobei 1,5A eigentlich reichen sollten. Ist das eine 3,3V Version des Pro Mini?


ahlermi

Neu Hier!

Posts: 9

Date of registration: Apr 19th 2017

  • Send private message

15

Wednesday, May 23rd 2018, 4:14pm

Ja, 3,3V, der Arduino läuft auch weiter, der ESP8266 hängt sich weg, LED geht aus, etc.

Der Widerstand hängt auch am ESP8266

Das LED Unterputz Netzteil liefert rund 12W 12V 1A

This post has been edited 1 times, last edit by "ahlermi" (May 23rd 2018, 4:24pm)


Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 924

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 74

  • Send private message

16

Wednesday, May 23rd 2018, 8:29pm

Sorry, dann fällt mir spontan leider auch nichts ein :|


ahlermi

Neu Hier!

Posts: 9

Date of registration: Apr 19th 2017

  • Send private message

17

Wednesday, May 23rd 2018, 9:35pm

Ich habe noch die Vermutung das der Arduino zu viel Strom verbraucht, den der ESP nicht bringt.

ahlermi

Neu Hier!

Posts: 9

Date of registration: Apr 19th 2017

  • Send private message

18

Thursday, May 24th 2018, 10:24pm

So, ich weiß jetzt mehr, auch wenn ich nicht behaupten kann das ich schlauer bin.

Wenn ich den Input Impuls einfach nur vom ESP ablöte, also keine Drehzahl auslese, dann läuft alles stabil...

Widerstand, 5v alles unberührt. :pillepalle:

Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 924

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 74

  • Send private message

19

Friday, May 25th 2018, 1:46pm

Ich kenne mich mit dem ESP nicht aus, aber mit wieviel Volt laufen denn die Ein und Ausgänge? 5v oder 3,3v?
Ich könnte mir höchstens vorstellen, dass sie mit 3,3v laufen, du aber an die Impulsleitung einen Widerstand als Pull up auf 5v gehängt hast. Kann das von deinen Bildern her nicht sagen.


ahlermi

Neu Hier!

Posts: 9

Date of registration: Apr 19th 2017

  • Send private message

20

Friday, May 25th 2018, 2:23pm

Das ist ein guter Tipp, da gehen die Meinungen auseinander, versorgt wird der NodeMCU Lua Amica Module V2 ESP8266 mit 5V, aber möglicherweise können die Inputs nur 3,3V vertragen.

Danke, werde es testen und berichten.