Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: We-Mod-It | Das Forum von Moddern für Modder. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 924

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 74

  • Nachricht senden

1

Mittwoch, 27. August 2014, 12:39

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"


Zitat


/*
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"


Zitat


/*
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"


Zitat


/*
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

Dieser Beitrag wurde bereits 42 mal editiert, zuletzt von »Scynd« (8. Januar 2015, 10:38)


Es haben sich bereits 3 registrierte Benutzer bedankt.

Benutzer, die sich für diesen Beitrag bedankt haben:

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

Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 924

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 74

  • Nachricht senden

2

Samstag, 8. November 2014, 22:33

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


der_george

"Mein Name ist George - Der George"

Beiträge: 4 832

Registrierungsdatum: 17. März 2010

Wohnort: Da wo der Berch wohnt

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

Danksagungen: 356

  • Nachricht senden

3

Donnerstag, 13. November 2014, 14:11

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!

Beiträge: 1

Registrierungsdatum: 19. Mai 2016

  • Nachricht senden

4

Donnerstag, 19. Mai 2016, 20:10

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« ist der Autor dieses Themas

Beiträge: 924

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 74

  • Nachricht senden

5

Donnerstag, 19. Mai 2016, 23:10

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!

Beiträge: 1

Registrierungsdatum: 29. März 2017

  • Nachricht senden

6

Mittwoch, 29. März 2017, 11:09

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

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »tschidda« (29. März 2017, 12:04)


Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 924

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 74

  • Nachricht senden

7

Mittwoch, 29. März 2017, 22:38

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!

Beiträge: 9

Registrierungsdatum: 19. April 2017

  • Nachricht senden

8

Mittwoch, 19. April 2017, 22:45

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« ist der Autor dieses Themas

Beiträge: 924

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 74

  • Nachricht senden

9

Donnerstag, 20. April 2017, 07:34

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:


Es hat sich bereits 1 registrierter Benutzer bedankt.

Benutzer, die sich für diesen Beitrag bedankt haben:

ahlermi (20.04.2017)

ahlermi

Neu Hier!

Beiträge: 9

Registrierungsdatum: 19. April 2017

  • Nachricht senden

10

Donnerstag, 20. April 2017, 09:09

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« ist der Autor dieses Themas

Beiträge: 924

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 74

  • Nachricht senden

11

Donnerstag, 20. April 2017, 10:25

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!

Beiträge: 9

Registrierungsdatum: 19. April 2017

  • Nachricht senden

12

Donnerstag, 20. April 2017, 10:33

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

danke!

ahlermi

Neu Hier!

Beiträge: 9

Registrierungsdatum: 19. April 2017

  • Nachricht senden

13

Mittwoch, 23. Mai 2018, 00:07

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« hat folgende Bilder angehängt:
  • IMG_0580.JPG
  • IMG_0581.JPG

Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 924

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 74

  • Nachricht senden

14

Mittwoch, 23. Mai 2018, 16:08

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


ahlermi

Neu Hier!

Beiträge: 9

Registrierungsdatum: 19. April 2017

  • Nachricht senden

15

Mittwoch, 23. Mai 2018, 16:14

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

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ahlermi« (23. Mai 2018, 16:24)


Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 924

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 74

  • Nachricht senden

16

Mittwoch, 23. Mai 2018, 20:29

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


ahlermi

Neu Hier!

Beiträge: 9

Registrierungsdatum: 19. April 2017

  • Nachricht senden

17

Mittwoch, 23. Mai 2018, 21:35

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

ahlermi

Neu Hier!

Beiträge: 9

Registrierungsdatum: 19. April 2017

  • Nachricht senden

18

Donnerstag, 24. Mai 2018, 22:24

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« ist der Autor dieses Themas

Beiträge: 924

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 74

  • Nachricht senden

19

Freitag, 25. Mai 2018, 13:46

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!

Beiträge: 9

Registrierungsdatum: 19. April 2017

  • Nachricht senden

20

Freitag, 25. Mai 2018, 14:23

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.