12V - 3 Pin Lüftersteuerung mit Nano?

...heute sind die ersten Bauteile angekommen, leider waren die P-Kanal noch nicht dabei.
Hoffe die kommen dann auch bald, so dass ich mit dem Aufbau beginnen kann.

Hast du mir vielleicht einen Beispiel-Sketch, so dass ich dann gleich mal in die Testphase gehen könnte?

Gruß Max

Nimm den Blink Beispiel-Sketch und steuere die Transistoren mit pin 13.
Der Lüfter müßte dann 1 Sekunde laufen und 1 Sekunde nicht. Eventuell solltest Du die Zeiten etwas verlängern.

Grüße Uwe

moin moin,
das werde ich machen...gute Idee!

Gruß Max

Guten Morgen Uwe,

nun sind die Transistoren alle vorhanden und ich kann mit dem Aufbau der Schaltung beginnen.
Als Grundschaltung habe ich diese hier herangezogen (1)

P-Channel

und etwas abgeändert!

Da ich eine 4Pin Lüfter nun habe müsste nach meinem Verständnis die Schaltung dann in etwa so abgeändert werden? (2)

...und wenn das ggf. richtig wäre, dann müsste doch für einen 3Pin-Lüfter die Schaltung in etwa so aussehen??? (3)

Was meinst du dazu?
Gruß Max

Nein, dann brauchst Du nur direkt mit dem Arduino-Ausgang aud PWM in des Lüfters gehen und die Masse der 12V mit der Masse des Arduino verbinden.

Grüße Uwe

Hallo,

und das PWM Signal benötigt ca. 25kHz für den 4 Pin Lüfter.

Hallo Uwe,

das hab ich jetzt nicht ganz verstanden... das heißt ich kann mir den MosFET und den Q1 mit Widerständen sparen.
Den Lüfter mit + und - direkt an die 12V Versorgung hängen.
Vom Nano PWM Out direkt auf den PWM IN vom Lüfter drauf.
Die zwei Massen Nano und 12V Versorgung zusammen?

Ok, wohin mit dem Tacho vom Lüfter? -> vermutlich ein Input vom Nano (analog oder digital)?

Gruß Max

Hallo Doc_Arduino,
woher bekomme ich die 25kHz für den Lüfter?

Ich möchte die Lüftersteuerung in einen vorhandenen Timer Sketch einarbeiten und in einen Sketch vereinen...
Geht das dann überhaupt?

Sonst würde ich dann doch eher auf einen 3Pin-Lüfter umsteigen (habe ich auch hier in gleicher Größe) und müsste dann vermutlich Schaltung 1 oder Schaltung 3 heranziehen (also mit Transistoren).

Oder liege ich da total falsch?

Gruß Max

Hallo,

ja du musst sogar deinen Transistor weglassen. Direkt 12V und Masse anklemmen. Das ist dessen Spannungsversorgung. Von den anderen beiden Pins ist einer der Eingang für das PWM Signal und der andere der Tachoausgang. Der Tachoausgang ist Open Kollektor, braucht also noch einen Pullup an 5V damit du ihn direkt am Arduino einlesen kannst. Falls du das benötigst!
Im Datenblatt deines Lüfters sollte die Pinbelegung stehen.
Falls nicht ...
Intel_4_Wire_PWM_Spec.pdf (114,9 KB)
Noctua_PWM_specifications_white_paper.pdf (1001,5 KB)

Für die Farben garantiere ich nicht, aber die generelle Pinbelegung sollte daraus hervorgehen.
Einfacher wäre dein Lüfter hat ein Datenblatt.

Deinen Timersketch kenne ich nicht. Programme kann man immer vereinen. Das geht umso einfacher je besser sie aufgebaut sein. Der 4 Pin Lüfter ist auf jeden Fall die bessere Lösung. Glaub es.

Edit:
Wenn du nichts verwendest was an den Timer-Registern schon rumfummelt, dann kann man unbürokratrisch den Prescaler von Timer 1 ändern. Dann hat man 31,3kHz. Das ist zwar offiziell knapp außerhalb vom Spec, sollte aber dennoch funktionieren.

Also. Wenn du am Nano Pin 9 oder 10 für das PWM Signal zum Lüfter verwendest, dann kannst du im setup mit folgender Zeile

TCCR1B = _BV(CS10);  // Prescaler von default 64 auf 1 ändern

den Takt des Timers 1 ändern. Damit kannst du weiterhin analogWrite() ganz normal verwenden.

Für alle die tiefer reinschauen wollen, dass ist die Arduino Defaulteinstellung.
WGM10 (PWM Phase Correct 8 Bit) mit CS11, CS10 (Prescaler 64).

TCCR1A: 0b0000'0001
TCCR1B: 0b0000'0011

Ok, das hört sich jetzt für mich sehr kompliziert an... bin Anfänger und versuche das natürlich zu verstehen.

Den Sketch von dem Timer kann ich einstellen, damit kannst du auch gleich sehen was hier belegt bzw. verwendet wird.

hier sollen dann aber bei der Änderung auf die Lüftersteuerung auch noch ein paar neue Dinge wie ein I2C LCD und einige Einstellmöglichkeiten für den Lüfter mit einfließen.
Die Temperaturwerte sollen von einem DS18B20 erfasst werden, die dann den Lüfter in der Drehzahl steuern.
AnlaufTemp und MaxTemp sollen über Taster in 5°C Schritten einstellbar sein und auch nach einem Wechsel vom SET-Modus in den Normal-Modus im EEprom gespeichert werden.
So dass die Einstellungen bei einem Stromausfall nicht verloren gehen.

Ist sowas realisierbar?

Gruß Max

Hallo,

machbar ist alles. Nur eine Frage der Ausdauer und Zeit. Beschäftige dich erstmal allein mit dem Lüfter ansteuern. Nimm wie gesagt dazu Pin 9 oder 10 und verwende die eine Zeile von mir zum ändern der PWM Frequenz für diese Pins.
Dann kannst du mit analogWrite() in 255 Stufen den Lüfter ausprobieren.
analogWrite gibt nicht wie der Name sagt eine analoge Spannung raus sondern ein PWM Signal. Genau das brauchst und nimmst du.
Dann nimmste zum testen ein Poti, liest das ein, teilst den Wert durch 4 und verwendest das Ergebnis für analogWrite. Schon kannste mit dem Lüfter spielen.
Danach überlegst du dir wie diese Erkenntnis in dein bestehendes Programm einbaust.

Hallo,

das werde ich mal versuchen zu realisieren.
Das Poti soll dann vorerst den TempWert simulieren?

Genau. Einfach mal machen ... :face_with_monocle:

Hallo Doc_Arduino,

ist etwas her, als du mir die genannte Zeile empfohlen hast!
Musste zuerst ein anderes Projekt beenden und bin nun an der Lüftersteuerung angekommen.

Grundsätzlich habe ich nun die Schaltung mit dem Poti mal aufgebaut und den Sketch dazu erstellt.
Wenn ich nun am Poti drehe kann ich die Drehzahl einstellen.
Die kleinste Drehzahl des Lüfters (Startdrehzahl) liegt ca. bei einen Wert von 200 am analogRead Pin 3 (Poti-Eingang).

kannst du mir die Zeile, besonders den Teil = _BV(CS10) erklären.
Ich finde im Netz einige Beiträge zum Thema Register, aber hier wird immer einen Zeile

TCCR1B = TCCR1B & 0b11111000 | 0x01;

beschrieben.
Zusätzlich wollte ich auch noch gerne wissen, wie ich dann das Register auch wieder auf Standardeinstellung zurückstellen kann?

Danke dir schon mal...

Gruß Max

ist das gleiche wie:
(1<<CS10)
Was CS10 ist, findest du im Datenblatt

TCCR1B = 0; // Reset Zustand wieder herstellen
Auch die Reset Values stehen im Datenblatt.

Hallo,

_BV(n) ist nur ein, für mich, besser lesbares Makro zum Bit setzen in einem Register.
Man sieht häufig diese (1<<n) Variante.

CS10 ist ein define in der Controller Headerdatei ohne die gar nichts geht.
Wenn du einen Nano hast, dann steckt da ein ATmega328P drauf und dann kannst du im Arduino Installationsordner einmal nach einer Datei namens iom328p.h suchen.
Die Datei ist immer verfügbar. Alle defines von da drin können verwendet werden.

Letztlich bedeutet _BV(CS10) das das Bit wofür CS10 steht im Register gesetzt wird. Man muss nicht unbedingt wissen an welcher Position das eigentliche Bit steht, dafür verwendet man ja den Bitnamen CS10. Dafür ist die Lesbarkeit Manual kompatibel. Man liest aha Bit CS10 wird hier gesetzt.

TCCR1B = TCCR1B & 0b11111000 | 0x01;

Diese Zeile setzt und löscht bestimmte Bits, nur ist in der Form ohne nachschlagen im Manual nicht lesbar welche Bits gesetzt gesetzt wurden. Dafür muss man im Manual des ATmega328P lesen welche Bedeutung die einzelnen Bits haben. Dazu schlägst du das Manual Kapitel 16 Timer 1 auf und Unterkapitel 16.11.2 Register TCCR1B.

TCCR1B = TCCR1B & 0b11111000;

Jetzt zerlegen wir das in 2 Schritte. Hier werden die Bits mittels Bitmaske ver-undet. Der eigentliche Zweck ist die Prescalereinstellung zu löschen mit den letzten 3 Bits auf 0. Das heißt die oberen 5 Bits bleiben wie sie sind und der Prescaler wird gelöscht und damit auch einhergehend der Timer gestoppt.

TCCR1B = TCCR1B | 0x01;

Damit wird in anderer Schreibweise Prescaler 1 gesetzt.

Wie setzt man wieder den Default Prescaler 64?
Gute Frage. :slight_smile:
Dafür schaut man in die Prescalertabelle 16.5 und sieht welche Prescaler Bits dafür zuständig sind. Nämlich CS11 und CS10. Alle 3 Prescalerbits befinden sich im gleichen Register TCCR1B. Um sich das Leben einfacher zugestalten kann man sich 2 Funktionen schreiben.

void runTimer1 (const unsigned int prescaler)
{
  stopTimer1();

  // set new Prescaler Clock Select Bits
  switch (prescaler) {  
    case    1 : TCCR1B |= _BV(CS10);              break;
    case    8 : TCCR1B |= _BV(CS11);              break;
    case   64 : TCCR1B |= _BV(CS11) | _BV(CS10);  break;
    case  256 : TCCR1B |= _BV(CS12);              break;
    case 1024 : TCCR1B |= _BV(CS12) | _BV(CS10);  break;
    default :   break;  // otherwise timer remains stopped  
  }
}


void stopTimer1 (void)
{
  TCCR1B &= ~( _BV(CS12) | _BV(CS11) | _BV(CS10) );
}

Nochwas zum Thema zu lesen gibts hier. Nur die Seitenzahlen haben sich geändert und die pighixxx Links sind tot.

das heißt ich muss nur die Zeile

TCCR1B  = _BV(CS11) | _BV(CS10);

einfügen um wieder die Standarteinstellung des Timer 1 zu erhalten?

Gruß Max

ok, danke dir...hatte ich heut Mittag völlig überlesen!
:face_with_hand_over_mouth:

Korrekt. Oder eben runTimer1(64);

COOL danke für die Unterstützung!

:sunglasses: