Lüfter Tachosignal simulieren

Guten Tag,

ich bin hier neu und hoffe auf etwas Hilfe :slight_smile:

Die Ausgangssituation:

Ich habe mir einen gebrauchten HP Proliant DL380 g5, dieser ist während des Betriebs extrem laut. Ein Lüfter alleine braucht 30 Watt!
Eine Möglichkeit wäre vielleicht, die 12 V Leitung des Lüfter mit einem Widerstand zu versehen, aber es würde die 30 Watt nicht reduzieren, zudem hätte ich ein bisschen Angst, dass der Widerstand die Dauerbelastung nicht schafft.

Der Plan:

Der Lüfter sollte durch einen von BeQuiet getauscht werden. So nun kontrolliert, aber das Mainboard die Umdrehungen pro Minute und gibt eine Fehlermeldung aus wegen dem BeQuiet Lüfter, da dieser natürlich nicht so schnell dreht wie der 30 Watt Lüfter. Das Problem hierbei ist, ab 2 "fehlerhaften" Lüftern startet der HP Proliant DL380 G5 nicht.
Meine Idee wäre jetzt gewesen mit dem Arduino ein vorgetäuschtes Tachosignal auszugeben.
Das Problem, ich weiß leider nicht wie und ich finde leider dazu auch nichts im Internet.

Jetzt kommt ihr ins Spiel, vielleicht kann mir jemand sagen ob ein vorgetäuschtes Tachosignal per Arduino überhaupt möglich ist und wie dies zu bewerkstelligen ist.

Vielen Dank!

Hallo,

du weißt aber schon das solche Teile nicht für das Wohnzimmer gedacht sind?
Den Lüftertausch kannste jedenfalls vergessen. Der macht Lärm weil der Luft unter erschwerten Bedingungen durchziehen muss. Drosseln macht auch keinen Sinn, dann bekommt er die Wärme nicht weg. Auch kannst du nicht einfach irgendein PC Lüfter einbauen. Für den PC gibts schon Unterschiede im Druckverhalten von Lüftern für CPU-Kühler vs. Gehäuselüfter. Alle dafür ungeeignet.
Mein Tipp, verkauf das Teil wieder. Wenn nicht, nächster Tipp, https://netz-treff.de

Hi danke für die Antwort,

ich weiß nicht wie du darauf kommst, dass es im Wohnzimmer stehen soll, davon habe ich doch gar nichts geschrieben.

Auch auf dein anraten hin werde ich ihn nicht verkaufen, da er sehr gut meine Anforderungen erfüllt, bis wie gesagt auf die Lautstärke, deswegen lass doch einfach mal die Wärmentwicklung mal meine Sorge sein und es mich zumindest mal ausprobieren. Darum geht es doch hier oder?

Das mit den CPU Lüftern müsste vor ca. 20 Jahren noch einen Unterschied gemacht haben, aber mittlerweile existiert da kein Unterschied mehr, was man unter anderem daran erkennt, dass es z. b. bei Alternate oder Caseking keine eigene Rubrik dafür gibt, aber darum will ich mich gar nicht streiten, wenn du das so siehst, dann mag es wohl so sein.

Aber vielleicht kannst du mir meine obigen Fragen beantworten, zumindest zum Teil, denn dazu hast du leider nichts geschrieben.

Ich weiß wir sind im Internet und da kennt man sich nicht und nur weil ich eine Frage habe bin ich nicht komplett auf den Kopf gefallen, deswegen sprich mir bitte nicht die gesamte Kompetenz ab

Danke!

Hi

Gleiches darf ich dann aber auch von Dir erwarten können, oder?
Wenn Dir vorher schon bewusst war, daß mit Reduzierung der Drehzahl eine Reduzierung der Lautstärke und ebenfalls eine Reduzierung der 'weggeschafften Wärme' daher kommt - was hattest Du gleich gefragt?

Aja - das Tacho-Signal ... wie viele Ticks möchtest Du pro Sekunde haben?
digitalWrite(_pin,millis()%10<5); macht 100 Hz (alle 5ms wechselt der Pegel)

Befürchte aber, daß das Ding dann wirklich nur 'warme Luft' produziert.

MfG

Naja die Schaltung würde ich so probieren:
(Arduino links, Mainboard rechts)

Vielleicht reicht SoftwarePWM. Code sieht dann so aus:

void setup()
{
  pinMode(3, OUTPUT);
}

void loop()
{
  digitalWrite(3, HIGH);
  delayMicroseconds(100);
  digitalWrite(3, LOW);
  delayMicroseconds(900);
}

Wenn Du keine Frequenz unter 31 Hz ( 1860 RPM) brauchst dann kannst Du es auch mit der Funktion Tone() versuchen.
Grüße Uwe

Super! Dankeschön, ich werde es versuchen die nächsten Tage es umzusetzen.
Naja die Rpm müssten sich auf ca. 4000 einpendeln.
Aber wenn ich mich nicht komplett irre bzw. meine Informationen nicht veraltet sind, muss die Frequenz durch 2 geteilt werden, da 2mal ein Signal pro Umdrehung ausgegeben wird.

Vielen Dank nochmal, ich werde versuchen die Ergebnisse hier zu posten

Btw: @postmaster-ino Deine Befürchtungen werde ich ernst nehmen. Ich wollte sowieso die Temperatur miteinander vergleichen.

Hallo,

für mich passen weiterhin paar (alle) Dinge nicht zusammen.
Aber wenn du unbedingt willst, nimmste einen Frequenzverdoppler.

/*
 * Doc_Arduino - german Arduino Forum
 * IDE 1.6.12
 * Arduino Mega2560
 * 13.10.2016
 *
 * Impulsformer mit automatischer Anpassung
 * Erzeugt aus jedem Tastverhältnis ein symmetrisches Rechtecksignal mit doppelter Frequenz
 */

#include <util/atomic.h>    // für cli() und sei() mit SREG Sicherung

volatile unsigned long t_QUADER;   //  [µs]
unsigned long Tastdauer;           // global wegen seriellen Monitor

const byte PIN_IN = 2;      // Eingang, Interrupt Pin, auch beim UNO
const byte PIN_OUT = 13;    // Ausgang

enum States {ONE, TWO};
States Phase = ONE;

void setup()
{
  Serial.begin(250000);
  
  pinMode (PIN_IN, INPUT_PULLUP);
  pinMode (PIN_OUT, OUTPUT);

  attachInterrupt(digitalPinToInterrupt(PIN_IN), FLANKE, FALLING);
}

void loop()
{
   Frequenzverdoppler();
   //serieller_Monitor();
}  


/* *** Funktionen *** */

void FLANKE() {       // Interrupt Routine
  static bool Signal = false;
  static unsigned long t_ONE = 0;
  static unsigned long t_TWO = 0;
  
  Signal = !Signal;

  if (Signal == false) {   // 1. LOW Flanke erkannt
    t_ONE = micros();      // Zeit merken
  }
  
  if ( Signal == true) {  // 2. LOW Flanke erkannt
    t_TWO = micros();     // Zeit merken
    t_QUADER = (t_TWO - t_ONE) / 4;  // viertel Periodendauer berechnen
  } 
}


void Frequenzverdoppler()
{    

  static unsigned long last_micros = 0;
    
  ATOMIC_BLOCK (ATOMIC_RESTORESTATE)    // gesichert vor Verfälschung
  {
    Tastdauer = t_QUADER;
  }
  
  if ( (Phase == ONE) && (micros() - last_micros > Tastdauer) ) {     // 1. Phase
    last_micros = micros();          // Zeit merken
    digitalWrite(PIN_OUT, LOW);      // Ausgang LOW
    Phase = TWO;
  }  

  if ( (Phase == TWO) && (micros() - last_micros > Tastdauer) ) {     // 2. Phase
    last_micros = micros();          // Zeit merken
    digitalWrite(PIN_OUT, HIGH);     // Ausgang HIGH
    Phase = ONE;
  }
}



void serieller_Monitor ()
{
  static unsigned int intervall = 1000;  // [ms]
  static unsigned long last_millis = 0;

  if ( millis() - last_millis < intervall ) return; // Zeit noch nicht erreicht, Funktion abbrechen
    last_millis += intervall; 
    Ueberschriftszeile();
    Serial.print(Tastdauer); Serial.print('\t');
    Serial.println();
}


void Ueberschriftszeile ()
{
  static int counter = 44;

  counter++;
  
  if (counter < 30) return;  // Zeit noch nicht erreicht, Funktion abbrechen
                             // aller 30 Zeilen eine Überschriftszeile einfügen
    counter = 0; 
    Serial.print(F("T 1/4")); //Serial.print('\t');
    Serial.println();
}

Hi

if (micros() - last_micros > Tastdauer) {
   last_micros+=Tastdauer;
   digitalWrite(PIN_OUT,Phase==ONE?1:0); //sollte ggf. auch ohne '?1:0' schon klappen
   Phase=(Phase==ONE)?TWO:ONE;
}

Nahezu identischer Code und durch das += der Zeit-Variable kein Verschieben - wohl heulen auf hohem Niveau, aber wenn man kann (außerdem muß micros() nicht erneut 'angefordert' werden).

MfG

Hallo,

als Entschuldigung, dass ist vom 13.10.2016 und seitdem unverändert lagernd. Habe ich damals mit damaligen Kenntnissen laut Problemstellung geschrieben. :wink:

Hi

Entschuldigung angenommen, wenn auch unnötig - hatte das Datum gar nicht aktiv gesehen :slight_smile:
:slight_smile:

MfG