Lüftertacho trotz Transistor auslesen

Moinsen,

ich bastel mir gerade eine typische temperaturgesteuerte Lüftung mit PWM Lüftern. Soweit funktioniert auch alles super. Temperatur wird auf Display ausgegeben und die Lüfter faden beim Steigen langsam bis zu einer maxTemp hoch. Nun habe ich nach folgendem Tutorial den Tachoausgang des PWM Lüfters angeschlossen und den darunter stehenden Code in meinen integriert: Reading PC Fan RPM with an Arduino | The Makers Workbench

Schließe ich alles nach dem Schaltbild an, funktioniert dies auch problemlos. Schalte ich aber nun die ganze Apperatur an mein Arduino mit einem zwischengeschalteten Transistor, wird nur noch Blödsinn angezeigt. Es kann also nur daran liegen, dass ich den Ground vom Netzteil des Lüfters durch den Transistor schicke und dies dann zu einem unkontrollierten Anzeigen von Zahlen kommt. Kennt jemand das Problem und kennt eine Lösung?

Anbei noch mein Code:

#define Tmax          45.0                           // max. Temperatur
#define Tmin          20.0                           // min. Temperatur
#define waittime      1000                            // Aktualisierungszeit in ms
#include <LiquidCrystal.h>
#include <PWM.h>

int32_t frequency = 25000;


LiquidCrystal lcd(12, 11, 6, 5, 4, 3);


int i, temp;
int fan = 9;
int a, value;
float Temperatur = 0.0;  

//***********************************************************
int NbTopsFan; 
int Calc;

                                  //The pin location of the sensor
int hallsensor = 2;

                        
typedef struct{                  //Defines the structure for multiple fans and their dividers
  char fantype;
  unsigned int fandiv;
}fanspec;

//Definitions of the fans
fanspec fanspace[]={{0,1},{1,2},{2,8}};

char fan1 = 1;   //This is the varible used to select the fan and it's divider, set 1 for unipole hall effect sensor 
               //and 2 for bipole hall effect sensor

void rpm ()      //This is the function that the interupt calls 
{ 
NbTopsFan++; 
}

              //This is the setup function where the serial port is initialised,
             //and the interrupt is attached
//*****************************************************



void setup() 
{
  //***********************************************************
    pinMode(hallsensor, INPUT);
    //***********************************************************
  Serial.begin(9600);
  
      //***********************************************************
  attachInterrupt(0, rpm, RISING);
      //***********************************************************
  
  lcd.begin(16,2);
  pinMode(fan, OUTPUT);
  pinMode(7, INPUT);
}

void loop() {
  
  
  InitTimersSafe();
  bool succes = SetPinFrequencySafe(9, frequency);
  
  temp = ((5.0*analogRead(A0)*100.0)/1024);
  Serial.println (temp);
 
  fan = map(temp, Tmin, Tmax, 0, 255);    // Tmin->0% // Tmax->100%
  if (fan<25)   fan = 0;
  if (fan>255) fan = 255;
  
   for (int i=0;i<4;i++)
  {
    analogWrite(9, fan);               // PWM Geschwindigkeit setzen
  }

        //***********************************************************
        
  NbTopsFan = 0;	//Set NbTops to 0 ready for calculations
   sei();	 //Enables interrupts
   delay (1000);	//Wait 1 second
   cli();	 //Disable interrupts
   Calc = ((NbTopsFan * 60)/fanspace[fan1].fandiv); //Times NbTopsFan (which is apprioxiamately the fequency the fan is spinning at) by 60 seconds before dividing by the fan's divider
   Serial.print (Calc, DEC); //Prints the number calculated above
   Serial.print (" rpm\r\n"); //Prints " rpm" and a new line
        //***********************************************************


  value = digitalRead(7);
  
  //if(value == 1)
  //{
 //   a =a+1;
 //   delay (1);
 // }
 // if(a>2)
 // {
 //   a=0;
//  }
 // 
//  if (a==0)
 // {
    lcd.setCursor (0,0);
    lcd.print("Temp.: ");
    lcd.print(temp);
    lcd.print('\xDF');
    lcd.print("C");
    lcd.setCursor(0,1);
    lcd.print("RPM: ");
    lcd.print(Calc/20);

//  }  
// if (a==1)
//  {
//  lcd.setCursor (0, 0);
 // lcd.print("Neuer Bildschirm!");
 // }

        
  
}

Grüße,

Jan

Das ist ein ganz normales Verhalten. Du betreibst den Lüfter mit einem (bipolaren) npn-Transor oder einem n-Channel-Mosfet. Dabei knipst du mit der PWM dem Lüfter regelmäßig den Saft ab, indem du ihm die Verbindung zur Masse sperrst.
Nun ist der Tacho-Ausgang aber ein Open-Collector-Ausgang, der zweimal pro Umdrehung auf Masse gezogen wird bzw. gezogen werden soll. In deinem Fall ist keine Masse da, was dein falsches Messergebnis dann auch zeigt.

Mit einem PNP oder P-Kanal geht es dann vielleicht:


Den NPN brauchst du aber noch als Vorstufe