Temperatuur gestuurde fans

algemene C code
Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Temperatuur gestuurde fans

Berichtdoor benvo » 26 Aug 2020, 16:28

PWM Fan Control.

Graag zou ik mijn aquarium willen koelen met een PWM gestuurde ventilators. Daarvoor gebruik ik een programma, niet van mijzelf maar van ene Adrian Black. Wel heb ik het programma hier en daar aan mijn wensen aangepast. Op zich werkt het geheel, geeft ook geen fouten aan maar;

Met knop 2 moet ik de fans stop kunnen zetten, dat werkt niet. Ook blijven de fans, ongeacht de gemeten temperatuur, op volle kracht draaien. Er is geen reactie op het PWM signaal. Ik gebruik drie ventilators (Vieraderig waarvan ik er drie gebruik: Geel voor 12 Volt, Zwart voor aarde, Blauw voor PWM. Rood gebruik ik niet.) De temperatuur meet ik met een waterdichte Ds18b20. E.e.a. heb ik op mijn Arduino Uno gezet waar mogelijk ook een probleem zit. Oorspronkelijk stond het op een Arduino pro mini. Is er misschien iets mis in het onderstaande programma? Ik heb het tot nu toe niet kunnen vinden. Misschien jullie wel?

Code: Alles selecteren
[code]
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <EEPROM.h>

LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);  //0x3Fis het I2C bus adres voor een ongemodificeerd backpack.



//Data temperatuur aanluiting is op pin 9 van de Arduino
#define ONE_WIRE_BUS 11
//Legt een OneWire aan om te comminuceren met elk OneWire apparaat.
OneWire oneWire(ONE_WIRE_BUS);

//Verbind onze ONeWire referentie aan Dallas Temperature.
DallasTemperature sensors(&oneWire);

unsigned long temperatuurMillis;


const int PWMPin = 3;   // FAN PWM output 25khz signal
const int RightSW = 5;      // Rechterknop
const int MidSW = 7;      // Middelste knop
const int LeftSW = 9;      // Linkerknop

boolean dotprint = LOW; // Gebruikt voor aan/uit beeld op de LCD gedurende een normale werkingstijd

boolean RightSWState = LOW;
boolean MidSWState = LOW;
boolean LeftSWState = LOW;

boolean waitHere = HIGH; // Gebruikt voor een input wachttijd

int debouncecounter = 0;       // Hoe vaak hebben we een nieuwe waarde gezien
int debouncereading;           // De huidige waarde gelezen op de input pin
long debouncetime = 0;         // de laatste keer dat de output pin was gesampled
int debounce_count = 10; // Aantal milliseconden/samples om te bepalen wat de debounced input moet zijn.

const int LoopSpeed = 1000;  //Controls the speed of the mainloop
                       
int RampSpeed = 1;          //Controls the changing fan speed
                       
int TempCal = 0;
int TempMin = 25;
int TempMax = 35;

int FanMin = 10;         // Minimum fan speed 0-79
int FanMax = 79;        // Maximum fan speed 0-79
int CurrentSpeed = 79;   // The Current fan speed duty cycle (0-79)
int DesiredSpeed = 1;   // The desired fan speed
boolean FanStop = HIGH; // HIGH = fan stops when set to 0, LOW = fan doesn't stop
boolean BacklightLED = HIGH;
                        // LCD Display Backlight HIGH = on, LOW = off
boolean RunState = HIGH; // not used
float DisplayDutyCycle; // Duty cycle displayed on LCD
int buttonInput = 0;    // Used to read the button input

unsigned long time;     // used for button repeat
const unsigned long repeatdelay = 500;
                        // 500ms for repeat

// end varibles //


void setup() {
   time = millis(); // Time variabele voor de drukknop druktijd.


   if (BacklightLED)
   {
     lcd.backlight(); // Je kan de LCD verlichting uitzetten door de setting LOW i.p.v. High.
   }
   else
   {
     lcd.noBacklight();
   }
   
   

    // generate 25kHz PWM pulse rate on Pin 3
    pinMode(PWMPin, OUTPUT);   // OCR2B sets duty cycle
    // Set up Fast PWM on Pin 3
    TCCR2A = 0x23;     // COM2B1, WGM21, WGM20
    // Set prescaler 
    TCCR2B = 0x0A;   // WGM21, Prescaler = /8
    // Set TOP and initialize duty cycle to zero(0)
    OCR2A = 79;    // TOP DO NOT CHANGE, SETS PWM PULSE RATE
    OCR2B = CurrentSpeed;    // duty cycle for Pin 3 (0-79) generates 1 500nS pulse even when 0
   
    lcd.begin(20, 4); //Voor een 20x4 lcd.
   
    lcd.clear();

    // Load values from EEPROM
    eepromRead(); // Restore values from EEPROM

  lcd.clear();
 
  Wire.begin();

sensors.begin(); //Start de temperatuur libray/sensor
 
 
}

void loop() {
lcd.home();   //Zet de cursor op eerste kolom, op de eerste rij

lcd.print("Aquariumkoeling");


//---------------temperatuurmeting--------------
float f;

  sensors.requestTemperatures();
  f = sensors.getTempCByIndex(0);  //Zet de verkregen waarde in f.
 f = f + TempCal; // Apply sensor calibration

 if (f < TempMin) {
  if (FanStop) {
    DesiredSpeed = 0;
  } else {
    DesiredSpeed = FanMin;
  }
 }
 if (f > TempMax) {
  DesiredSpeed = FanMax;
 }

 if (f <= TempMax && f >= TempMin) {
  DesiredSpeed = map(f, TempMin, TempMax, FanMin, FanMax); // Map the Fan Speed to the Duty Cycle
 }


 if ((DesiredSpeed < CurrentSpeed) && ((CurrentSpeed - RampSpeed) > RampSpeed) ) {
  CurrentSpeed = CurrentSpeed - (1 * RampSpeed);
 } else if (DesiredSpeed < CurrentSpeed) {
  CurrentSpeed = CurrentSpeed - 1;
 }

 if ((DesiredSpeed > CurrentSpeed) && ((CurrentSpeed + RampSpeed) > RampSpeed) ) {
  CurrentSpeed = CurrentSpeed + (1 * RampSpeed);
 } else if (DesiredSpeed > CurrentSpeed) {
  CurrentSpeed = CurrentSpeed + 1;
 }

 lcd.setCursor(0,2);
 lcd.print("Fan Speed: ");

 if (FanStop) {
  OCR2B = 0;    // Stop the fan entirely
  lcd.print("STOP FAN   ");
 
 } else {
  OCR2B = CurrentSpeed;    // set duty cycle
 }
 
if (!FanStop) {
 if (CurrentSpeed <= 0) {
   lcd.print("STOP       ");
 } else {
   DisplayDutyCycle = CurrentSpeed * 1.2658227;
   lcd.print(DisplayDutyCycle, 1);
   lcd.print("%     ");
 }
}

 
  {
   lcd.setCursor(0,3);
   lcd.print("Temp:");
   lcd.print(f,1);
   lcd.setCursor(11,3);
   lcd.print((char)223);  //Print º teken.
   lcd.setCursor(12,3);
   lcd.print("C");
  }
 

 buttonInput = readButtons();
 if (buttonInput == 1) {   // toggle the backlight
    BacklightLED = !BacklightLED;
    EEPROM.write(8,BacklightLED);
   if (BacklightLED) {
      lcd.backlight(); // NOTE: You can turn the backlight off by setting it to LOW instead of HIGH
    } else {
      lcd.noBacklight();
    }
   }
 else if (buttonInput == 2) {FanStop = !FanStop; EEPROM.write(7,FanStop);} // stop the fan
 else if (buttonInput == 3) {fanMenu(); waitHere = 1;} // enter the setup menu
 else {
  if (dotprint) {
    lcd.setCursor(15,3);
    lcd.print((char)126);
    dotprint = !dotprint;
  } else {
    lcd.setCursor(15,3);
    lcd.print(" ");
    dotprint = !dotprint;
  }
  delay(LoopSpeed); }
}

void fanMenu() {

    // Menu starts here!
    lcd.clear();
    lcd.setCursor(0,2);
    lcd.print("Fan Control");
    lcd.setCursor(0,3);
    lcd.print("RUN        SETUP");
    delay(1000);
    while (waitHere) {
      buttonInput = readButtons();
      switch (buttonInput) {
      case 0: break;
      case 1: waitHere = 0; return 0;
      case 2: break;
      case 3: waitHere = 0;
      }
      delay(10);
    }
   
      lcd.clear();
      lcd.setCursor(0,2);
      lcd.print("Fan L Spd: ");
      lcd.setCursor(0,3);
      lcd.print("-     +     Next");
      buttonInput = 0;  // Reset button input routing
      while (buttonInput != 3) {
        lcd.setCursor(12,2); lcd.print(FanMin);lcd.print("  ");
        buttonInput = readButtons();
        switch (buttonInput) {
          case 1:
            FanMin--;
            break;
          case 2:
            FanMin++;
            break;
        }
      }

      lcd.clear();
      lcd.setCursor(0,2);
      lcd.print("Fan L Temp: ");
      lcd.setCursor(0,3);
      lcd.print("-     +     Next");
      buttonInput = 0;  // Reset button input routing
      while (buttonInput != 3) {
        lcd.setCursor(12,2); lcd.print(TempMin);lcd.print("  ");
        buttonInput = readButtons();
        switch (buttonInput) {
          case 1:
            TempMin--;
            break;
          case 2:
            TempMin++;
            break;
        }
      }


      lcd.clear();
      lcd.setCursor(0,2);
      lcd.print("Fan H Spd: ");
      lcd.setCursor(0,3);
      lcd.print("-     +     Next");
      buttonInput = 0;  // Reset button input routing
      while (buttonInput != 3) {
        lcd.setCursor(12,2); lcd.print(FanMax);lcd.print("  ");
        buttonInput = readButtons();
        switch (buttonInput) {
          case 1:
            FanMax--;
            break;
          case 2:
            FanMax++;
            break;
        }
      }
     
      lcd.clear();
      lcd.setCursor(0,2);
  //  lcd.print("                ");
      lcd.print("Fan H Temp: ");
      lcd.setCursor(0,3);
      lcd.print("-     +     Next");
      buttonInput = 0;  // Reset button input routing
      while (buttonInput != 3) {
        lcd.setCursor(12,2); lcd.print(TempMax);lcd.print("  ");
        buttonInput = readButtons();
        switch (buttonInput) {
          case 1:
            TempMax--;
            break;
          case 2:
            TempMax++;
            break;
        }
      }
     
      lcd.clear();
      lcd.setCursor(0,2);
  //  lcd.print("                ");
      lcd.print("Temp.offset: ");
      lcd.setCursor(0,3);
      lcd.print("-     +     Next");
      buttonInput = 0;  // Reset button input routing
      while (buttonInput != 3) {
        lcd.setCursor(12,2); lcd.print(TempCal);lcd.print("  ");
        buttonInput = readButtons();
        switch (buttonInput) {
          case 1:
            TempCal--;
            break;
          case 2:
            TempCal++;
            break;
        }
      }


      lcd.clear();
      lcd.setCursor(0,2);
  //  lcd.print("                ");
      lcd.print("Spd Change X: ");
      lcd.setCursor(0,3);
      lcd.print("-     +     Next");
      buttonInput = 0;  // Reset button input routing
      while (buttonInput != 3) {
        lcd.setCursor(13,2); lcd.print(RampSpeed);lcd.print("  ");
        buttonInput = readButtons();
        switch (buttonInput) {
          case 1:
            if (RampSpeed > 1) {RampSpeed--;}
            break;
          case 2:
            RampSpeed++;
            break;
        }
      }
 
      lcd.clear();
      lcd.setCursor(0,2);
      lcd.print("Bewaar settings? ");
      lcd.setCursor(0,3);
      lcd.print("OPSLAAN     ANULEER");
      buttonInput = 0;  // Reset button input routing
      delay(1000); // testing
      while (buttonInput != 1 && buttonInput != 3) {
        lcd.setCursor(12,2);
        buttonInput = readButtons();
        switch (buttonInput) {
          case 1:
            eepromSave(); // Save new values to EEPROM
            delay (2000);
            return(0);
          case 3:
            eepromRead(); // Reread stored values
            delay (2000);
            return(0);
            break;
        }
      }
    }
 

void eepromErase() {
  // routing not used in this program. Just here in case you want to clear the rom.
  lcd.clear();
  lcd.setCursor(0,2);
  lcd.print("Wis de EEPROM");
  lcd.setCursor(0,3);
  lcd.print("Size= "); lcd.print(EEPROM.length());
  delay(1000);

  for (int i = 0 ; i < EEPROM.length() ; i++) {
    EEPROM.write(i, 0);
  }
}

void eepromSave() {
 lcd.clear();
 lcd.setCursor(0,2);
 lcd.print("Bewaar naar EEPROM");
 EEPROM.write(0, 254); // this is the value I'll be looking for to know this data is correct
 EEPROM.write(1, RampSpeed);
 EEPROM.write(2, TempCal);
 EEPROM.write(3, TempMin);
 EEPROM.write(4, TempMax);
 EEPROM.write(5, FanMin);
 EEPROM.write(6, FanMax);
 if (FanStop) {
   EEPROM.write(7, 1);
 } else {
   EEPROM.write(7, 0);
 }
 
 if (BacklightLED) {
   EEPROM.write(8, 1);
 } else {
   EEPROM.write(8, 0);
 }

 if (RunState) {
   EEPROM.write(9, 1);
 } else {
   EEPROM.write(9, 0);
 }

 lcd.setCursor(0,3);
 lcd.print("Klaar!");
 delay(1000);
}

void eepromRead() {
 lcd.clear();
 lcd.setCursor(0,2);
 lcd.print("Lees EEPROM");

  if (EEPROM.read(0) == 254) {
    RampSpeed = EEPROM.read(1);
    TempCal = EEPROM.read(2);
    TempMin = EEPROM.read(3);
    TempMax = EEPROM.read(4);
    FanMin = EEPROM.read(5);
    FanMax = EEPROM.read(6);
    FanStop = EEPROM.read(7);
    BacklightLED = EEPROM.read(8);
    RunState = EEPROM.read(9);
    delay(500);
   /* if (BacklightLED) {
        lcd.backlight(); // NOTE: You can turn the backlight off by setting it to LOW instead of HIGH
      } else {
        lcd.noBacklight();
      }*/
    lcd.setCursor(0,3);
    lcd.print("Klaar!");
    delay(1000);
  } else {
    lcd.setCursor(0,3);
    lcd.print("Standaard settings gebruikt.");
    delay(1000);
  }
}

int readButtons() {
  // If we have gone on to the next millisecond
  // const int RightSW = 5;      // Right switch or Switch 1
  // const int MidSW = 6;      // Middle switch or Switch 2
  // const int LeftSW = 7;      // Left switch or Switch 3
  // boolean RightSWState = LOW;
  // boolean MidSWState = LOW;
  // boolean LeftSWState = LOW;
//  int debouncecounter = 0;       // how many times we have seen new value
// int debouncereading;           // the current value read from the input pin
// long debouncetime = 0;         // the last time the output pin was sampled
// int debounce_count = 10; // number of millis/samples to consider before declaring a debounced input

//unsigned long time;     // used for button repeat
//const unsigned long repeatdelay = 2000;

 

  // Right Button
 if (digitalRead(RightSW) && (millis() - time >= repeatdelay)) {
  for(int i = 0; i < 10; i++)
    {
      debouncereading = digitalRead(RightSW);

      if(!debouncereading && debouncecounter > 0)
      {
        debouncecounter--;
      }
      if(debouncereading)
      {
        debouncecounter++;
      }
      // If the Input has shown the same value for long enough let's switch it
      if(debouncecounter >= debounce_count)
      {
        time = millis();
        debouncecounter = 0;
        RightSWState = 1;
      }
    delay (10); // wait 10ms
    }
   } else {
    RightSWState = 0;
   }
   
 
 if (digitalRead(MidSW) && (millis() - time >= repeatdelay)) {
  for(int i = 0; i < 10; i++)
    {
      debouncereading = digitalRead(MidSW);

      if(!debouncereading && debouncecounter > 0)
      {
        debouncecounter--;
      }
      if(debouncereading)
      {
        debouncecounter++;
      }
      // If the Input has shown the same value for long enough let's switch it
      if(debouncecounter >= debounce_count)
      {
        time = millis();
        debouncecounter = 0;
        MidSWState = 1;
      }
    delay (10); // wait 10ms
    }
   } else {
    MidSWState = 0;
   }

 if (digitalRead(LeftSW) && (millis() - time >= repeatdelay)) {
  for(int i = 0; i < 10; i++)
    {
      debouncereading = digitalRead(LeftSW);

      if(!debouncereading && debouncecounter > 0)
      {
        debouncecounter--;
      }
      if(debouncereading)
      {
        debouncecounter++;
      }
      // If the Input has shown the same value for long enough let's switch it
      if(debouncecounter >= debounce_count)
      {
        time = millis();
        debouncecounter = 0;
        LeftSWState = 1;
      }
    delay (10); // wait 10ms
    }
   } else {
    LeftSWState = 0;
   }

  if (RightSWState) { return 1; }
  else if (MidSWState) { return 2; }
  else if (LeftSWState) { return 3; }
  else { return 0; }
}
[/code]

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Temperatuur gestuurde fans

Berichtdoor shooter » 26 Aug 2020, 19:35

ik weet niet hoe je de fans aangesloten hebt, en in je programma staat geen analogWrite om de PWM aan te sturen, verder zal er een driver tussenmoeten want de arduino kan maar heel weinig stroom leveren
paul deelen
shooter@home.nl

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Temperatuur gestuurde fans

Berichtdoor benvo » 26 Aug 2020, 20:40

Hallo Shooter,

Fijn dat je al een reactie wilde geven!

De fans worden rechtstreeks aangesloten op 12 volt voeding van 4,58 A. De drie fans vragen elk 0,40 mA. Hoe ik die aansloot schreef al in de beginpost. Mijn Arduino hoeft dus geen spanning/stroom aan de fans te leveren. Ik gebruikte dus ook geen mosfets o.i.d. De Arduino Uno heeft een eigen 9 Volt voeding. Hopelijk is dit juist.

Inderdaad vind je in het programma geen analogWrite om de eventuele 255 PWM waardes aan te geven. Van het grote geheel van het programma begrijp ik de bedoeling in grote lijnen maar er is een deel wat mij geheel en al onduidelijk is. Dat is het deel, in de setup, waar hij, de oorspronkelijke schrijver, een 25 kHz PWM puls rate "creëert" op pin 3. Waar dan ook de berekening dat aangaande staan. Dat zag ik als een vervanging voor die analogWrite die je al aangaf.

Misschien wordt het verhaal je nog wat duidelijker wanneer je het filmpje van de oorspronkelijke schrijver van dit programma ziet welke ik dus aangepast heb naar mijn uiteindelijke doel:

https://www.youtube.com/watch?v=AEJ8MQyEOBg

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Temperatuur gestuurde fans

Berichtdoor Koepel » 27 Aug 2020, 12:20

Wat is het merk en type van de fan ?
Hoe is de volgorde van de kleuren bij de stekker. Je begint bij zwart en dan ?
Hier staan plaatjes voor de Noctua fans: https://noctua.at/en/productfaqs/productfaq/view/id/215/.

Als dat duidelijk is dan kun je misschien een kleine test-sketch maken met analogWrite() om te kijken of je de fans kunt regelen. Waarschijnlijk werkt dat niet, Noctua zegt: 25kHz, acceptable range 21kHz to 28kHz.
Dan kun je die 25 kHz aan je kleine test-sketch toevoegen om te kijken of je de fan snelheid kunt regelen.
Als dat werkt, dan ga ik eens naar de sketch kijken :o

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Temperatuur gestuurde fans

Berichtdoor benvo » 27 Aug 2020, 15:30

Dank voor je reactie, Koepel!

Inmiddels heb ik de zaak draaiende. Ik bleek, heel dom in aanmerking nemende dat ik er zo lang naar keek, de aarde draad naar de arduino vergeten! De ventilators zijn van het merk Foxconn. De draadkleuren zwart, geel, rood en blauw. Zwart aarde, geel 12 volt, rood tach (raar!) en blauw tenslotte pwm.

De fans gaan steeds zachter draaien bij het dalen van de temperatuur. Wanneer ze het punt bijna bereiken wanneer koeling volgens de voorinstelling niet meer nodig is draaien de fans eigenlijk weer iets harder wat ik raar vind. Ze gaan niet stilstaan wat ook weer niet klopt. Lees ik namelijk het programma dan zie ik een boolean op de FanStop die op HIGH staat hetgeen inhoudt dat de fans stoppen wanneer ze op 0 gezet worden. Met knop 2, de middelste knop, zo verteld het programma ook kan de FanStop boolean op LOW gezet worden waardoor de fans nooit stoppen. Om de een of andere redenen werkt dit niet hoewel er dan wel op het LCD scherm stop aangegeven wordt. Dat moet ik dus ook nog uitvogelen.

Onder het kopje generate 25kHz pulse rate on Pin 3. Zie ik een aantal dingen staan die ik graag zou willen begrijpen. Dit omdat ik graag het totale programma wil begrijpen. 25kHz is, denk ik de pwm aan/uit frequentie in een bepaalde periode?
Wat betekend TCCR2A = 0x23 // COM2B1, WGM21, WGM20. En wat TCCR2B = 0x0A // WGM21, (gedeeld door8 ?

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Temperatuur gestuurde fans

Berichtdoor Koepel » 27 Aug 2020, 16:17

Die kleuren is inderdaad raar.

Volgens mij zet FanStop de 12V uit.
Als alleen het PWM signaal wordt weggehaald, dan moet de fan ook zo gemaakt zijn dat hij dan uit gaat. Ik kan me voorstellen dat hij anders op een laag toerental blijft draaien.

De 25 kHz is de frequentie van het PWM signaal. Om de pulsen een verschillende breedte te geven is echter een hogere frequentie nodig.

De WGM21, TCCR2B enzovoorts zijn de registers van de ATmega328P microcontroller.
Kijk in de datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf.
Ga naar pagina 150 voor de uitleg van Timer2.

Bij het ontwerp van de ATmega328P hebben ze geprobeerd om iets te maken dat bijna overal voor gebruikt kan worden. Er zitten drie timers in. Ze zijn voor veel verschillende dingen te gebruiken. Een PWM signaal maken wordt vanzelfsprekend veel gedaan. Maar er zijn verschillende PWM-modes, en de uitgang kan een pin zijn maar ook een interrupt. Volgens mij is dat het moeilijkste deel van de ATmega328P.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Temperatuur gestuurde fans

Berichtdoor shooter » 27 Aug 2020, 18:57

het snelste vind je met google door tccr2a en arduino te googlen, dan krijg je snel een uitleg hoe dat werkt.
want eigenliojk is analogWrite een commando dat een timer goed zet
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Temperatuur gestuurde fans

Berichtdoor Gij Kieken » 27 Aug 2020, 19:17

Hier zal je ook wel je gading in vinden denk ik,
https://sites.google.com/site/qeewiki/b ... -atmega328

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Temperatuur gestuurde fans

Berichtdoor benvo » 28 Aug 2020, 14:52

Dank alvast allemaal. Ik ga e.e.a. nalezen.

@Koepel:
Als de FanStop de 12 volt uit zou schakelen dan zouden de fan's stop moeten gaan staan. Dat gebeurd dus niet, kennelijk loopt dit dan toch via de PWM maar maak ik de PWM draad los, want dan is er geen PWM signaal dan gaat alles op volle kracht draaien. Hetgeen elkaar dan toch weer tegenspreekt. Dus wellicht is je gedachte juist dat mijn fan's geen stop kennen bij het ontbreken van een PWM signaal. Toch merk je wel dat er iets gebeurd want zodra er volgens het LCD schermpje een 5% toerental bereikt wordt, en dus vlakbij een stop zijn, heb ik het idee dat er iets schakelt want onder dit percentage gaan de fans weer ietwat harder lopen aan het geluid te horen. Bij de oorspronkelijke schrijver van dit programma werken de stops wel zoals ik zie op YouTube. Hij gebruikt een Noctua fan, meende ik. Vermoedelijk liggen de problemen ook niet in het programma maar mogelijk in mijn fan's en heeft het misschien een beter passende frequentie nodig?

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Temperatuur gestuurde fans

Berichtdoor shooter » 29 Aug 2020, 16:22

nee als er geen signaal op de draad staat dan gaan ze vol aan, omdat er dan geen regeling voor het toerental aanwezig of kapot is.
en er zit een minimum toerental in dus helemaal uit krijg je ze niet, maar dat komt door de elektronica in de fan.
paul deelen
shooter@home.nl

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten