styra vanliga datorfläktar med en PWM signal från moderkorte

Planering och tankar kring eventuella framtida projekt.
swetrekki
Inlägg: 81
Blev medlem: 15 december 2008, 19:40:02
Ort: Göteborg

styra vanliga datorfläktar med en PWM signal från moderkorte

Inlägg av swetrekki »

hej, jag behöver lite hjälp här...
jag vill styra alla mina fläktar i datorn för vattenkylningen, (4 st) från CPU fläktens uttag på moderkortet.
Mao, när temperaturen går upp på cpun så ökar fläktarna över radiatorn. jag vill dessutom mata strömmen från en separat kontakt för att slippa lasta moderkortet med det.

har ni några förslag?

// Claes
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: styra vanliga datorfläktar med en PWM signal från moderk

Inlägg av Micke_s »

Enligt http://www.silentpcreview.com/forums/vi ... hp?t=36548 så har du en pwm signal från moderkortet.

Taco måste du nog koppla till en fläkt i alla fall.

Beroende på om du har 3 pinnars eller 4 pinnars fläktar så är det olika strategi.
3 pinnar : du behöver någon extern förstärkare för PWM signalen.
4 pinnar: alla borde kunna dela på en pwm signal, annars får du kasta på en logikgrind som buffer.
Tekko
Inlägg: 9009
Blev medlem: 28 november 2004, 20:19:15

Re: styra vanliga datorfläktar med en PWM signal från moderk

Inlägg av Tekko »

Man ska inte PWM'a fläktar med bara 2 eller 3 tåtar, de tar skada av det.
Användarvisningsbild
Electricguy
Inlägg: 12488
Blev medlem: 15 augusti 2007, 16:52:14
Ort: Kälmä' typ..

Re: styra vanliga datorfläktar med en PWM signal från moderk

Inlägg av Electricguy »

Moderna fläktar av lite kvalitet klarar av det, då de är gjorda för att även användas med manuella PWM kontroller.
JanErik
Inlägg: 3191
Blev medlem: 11 februari 2008, 17:15:58
Ort: Vasa, Finland

Re: styra vanliga datorfläktar med en PWM signal från moderk

Inlägg av JanErik »

Jag styr radiatorfläktarna enligt vattentemperaturen istället. Atmega328 (Arduino-bootloader) med DS18B20 och PWM-styrda fläktar genom en effekt-MOSFET. Reglerar till 35C med en PI-loop. Under en viss temperatur/hysteres stängs fläktarna av helt. Samma chip styr också chassie- och grafikkortsfläkt med separata sensorer.
swetrekki
Inlägg: 81
Blev medlem: 15 december 2008, 19:40:02
Ort: Göteborg

Re: styra vanliga datorfläktar med en PWM signal från moderk

Inlägg av swetrekki »

Micke_s skrev:Enligt http://www.silentpcreview.com/forums/vi ... hp?t=36548 så har du en pwm signal från moderkortet.

Taco måste du nog koppla till en fläkt i alla fall.

Beroende på om du har 3 pinnars eller 4 pinnars fläktar så är det olika strategi.
3 pinnar : du behöver någon extern förstärkare för PWM signalen.
4 pinnar: alla borde kunna dela på en pwm signal, annars får du kasta på en logikgrind som buffer.
Hej Micke
Japps precis som jag skrev i ämnes raden så vill jag använda PWM signalen från moderkortet.
Taco, signalen på moderkortet kommer jag att mata med signalen från en av fläktarna.
"vanliga datorfläktar" = 3pins, har du 4 pinnars så har de en PWM så använder man normat en pwm splitter kabel bara.

det är just förstärkaren som jag funderar på , vet att det finns en massa enkla pwm styrningar med lm317 (antar att det finns mer lämpliga iom att 37 volt inte e aktuellt)och en 555'a, men jag har ingen susning om hur pwm signalen ser ut och/elle hur man skulle kunna använda den istället för vippan... det är det som är själva frågan, ber om ursäkt att jag inte var tydlig nog med det i frågan.

för att förtydliga, så vill jag alltså använda PWM signalen från moderkortet för att styra en strömreglering för 4 likadana fläktar som dock bara har en rpm/taco signal [-,+,RPM] och allsammans skall matas från en separat 12v kontakt...

Phantek har precis kommit med ett nytt chassi och i det har dom vad dom kallar en PWM hub som jag misstänker skulle funka klockrent men den säljs så vitt jag vet inte löst
Bild
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: styra vanliga datorfläktar med en PWM signal från moderk

Inlägg av Micke_s »

De har antagligen gjort något liknande detta + en spole och kondensator på utgången.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
psynoise
EF Sponsor
Inlägg: 7226
Blev medlem: 26 juni 2003, 19:23:36
Ort: Landvetter

Re: styra vanliga datorfläktar med en PWM signal från moderk

Inlägg av psynoise »

Äldre moderkort med 3-stiftskontakt hade mer eller mindre spänningsstyrning kring 5 V till 12 V. Men på mina nyaste datorer med 4-stift har spänningsstyrningen tagits bort helt mot extra stiftet med pulsbredsstyrning.

Jag har själv gott i tankarna att sätta ihop en förstärkare som styr spänningsmatningen till en fläkt med 3-stift från pulsbredssignalen från ett nyare moderkort. Egentligen inga svårigheter förutom störningar bör dämpas för att inte ska problem någon annanstans.
Användarvisningsbild
psynoise
EF Sponsor
Inlägg: 7226
Blev medlem: 26 juni 2003, 19:23:36
Ort: Landvetter

Re: styra vanliga datorfläktar med en PWM signal från moderk

Inlägg av psynoise »

Tekko skrev:Man ska inte PWM'a fläktar med bara 2 eller 3 tåtar, de tar skada av det.
Vad är det specifikt som går i sönder eller inte fungerar bra?

Problemet går säkerligen att lösa genom att ha stora stigtider eller helt enkelt omvandla pulsbredssignalen till motsvarande konstantspänning om medelvärde.
swetrekki
Inlägg: 81
Blev medlem: 15 december 2008, 19:40:02
Ort: Göteborg

Re: styra vanliga datorfläktar med en PWM signal från moderk

Inlägg av swetrekki »

JanErik skrev:Jag styr radiatorfläktarna enligt vattentemperaturen istället. Atmega328 (Arduino-bootloader) med DS18B20 och PWM-styrda fläktar genom en effekt-MOSFET. Reglerar till 35C med en PI-loop. Under en viss temperatur/hysteres stängs fläktarna av helt. Samma chip styr också chassie- och grafikkortsfläkt med separata sensorer.
Låter trevligt och tanken har väl slagit mig med att det är mycket bättre att styra på vatten temperaturen, med tanke på att det är fler saker som kommer att ligga i slingan än bara CPUn. moderkort och framförallt GPU skall kylas lite längre fram.
va kostade din lösning att bygga? jag var ute efter en enkel billig lösning bara för att få fläktarna att jobba så lite som möjligt.

Mvh// Claes
Användarvisningsbild
psynoise
EF Sponsor
Inlägg: 7226
Blev medlem: 26 juni 2003, 19:23:36
Ort: Landvetter

Re: styra vanliga datorfläktar med en PWM signal från moderk

Inlägg av psynoise »

psynoise skrev:
Tekko skrev:Man ska inte PWM'a fläktar med bara 2 eller 3 tåtar, de tar skada av det.
Vad är det specifikt som går i sönder eller inte fungerar bra?

Problemet går säkerligen att lösa genom att ha stora stigtider eller helt enkelt omvandla pulsbredssignalen till motsvarande konstantspänning om medelvärde.
Läste själv på lite snabbt om datorfläktar nu och det visade sig att de flesta använder borstlös likspänningsmotor. Dessa har en hallsensor som sätts ur spel om matningsspänningen bryts. Dock kunde äldre moderkort styra fläktar med 3-stiftskontakt genom att ändra spänningsmatningen mellan 5 V till 12 V som skrivits innan.
swetrekki
Inlägg: 81
Blev medlem: 15 december 2008, 19:40:02
Ort: Göteborg

Re: styra vanliga datorfläktar med en PWM signal från moderk

Inlägg av swetrekki »

Psynoise: hmm men hall sensorn används väl bara för att synca var motorn är i varvet, man borde tappa lågfarts starter (eller att den ev rycker innan den startar) eller tappar man fler saker?
har kört en del borstlösa motorer till RC flyg och det har uteslutande varit sensorlösa (för att jag är så snål kanske ;) ) och dom rycker ju lite i början, men alla funkar fortfarande...
Och det rör sig om moderna moderkort denna gången...

Jag fick just svar att Phantek hubben kommer att säljas löst inom någon månad fast det hade ju inte varit lika kul...
JanErik
Inlägg: 3191
Blev medlem: 11 februari 2008, 17:15:58
Ort: Vasa, Finland

Re: styra vanliga datorfläktar med en PWM signal från moderk

Inlägg av JanErik »

swetrekki skrev:
JanErik skrev:Jag styr radiatorfläktarna enligt vattentemperaturen istället. Atmega328 (Arduino-bootloader) med DS18B20 och PWM-styrda fläktar genom en effekt-MOSFET. Reglerar till 35C med en PI-loop. Under en viss temperatur/hysteres stängs fläktarna av helt. Samma chip styr också chassie- och grafikkortsfläkt med separata sensorer.
Låter trevligt och tanken har väl slagit mig med att det är mycket bättre att styra på vatten temperaturen, med tanke på att det är fler saker som kommer att ligga i slingan än bara CPUn. moderkort och framförallt GPU skall kylas lite längre fram.
va kostade din lösning att bygga? jag var ute efter en enkel billig lösning bara för att få fläktarna att jobba så lite som möjligt.

Mvh// Claes
Jag kyler både CPU och GPU, seriekopplade block. Vattenflödet är ändå så högt att det inte blir nån temperaturskillnad över blocken.
Speciellt dyrt blev det inte, en Atmega328 för kanske 4e (8 MHz intern oscillator), 3 st DS18B20 (vatten, grafikkortsminnen, moderkortets switchtransistorer) kostar väl 3e styck, några MOSFETar med logiknivå 0,5e styck, breadboard, skruvkontaktssplintar, 3-pin fläktkontakter. Och en Arduino som programmerare.
swetrekki
Inlägg: 81
Blev medlem: 15 december 2008, 19:40:02
Ort: Göteborg

Re: styra vanliga datorfläktar med en PWM signal från moderk

Inlägg av swetrekki »

JanErik, jag skickar dig ett PM...
JanErik
Inlägg: 3191
Blev medlem: 11 februari 2008, 17:15:58
Ort: Vasa, Finland

Re: styra vanliga datorfläktar med en PWM signal från moderk

Inlägg av JanErik »

Pastar koden här så alla får se; har alltså vattenkylningsanläggningen i en extern låda och styr insugs- och radiatorfläktar skilt (cooler/air intake fan).

Kod: Markera allt

#include <OneWire.h>
#include <DallasTemperature.h>
#include <PID_v1.h>

int gpustate = 0, pwmstate = 0, waterstate = 0;
int PWMpin1 = 9; //GPU fan
int PWMpin2 = 10; //PWM fan
int PWMpin3 = 3; //cooler fans
int PWMpin4 = 11; //air intake fan

OneWire ds(2);  // on pin 2
DallasTemperature sensors(&ds); // Pass our oneWire reference to Dallas Temperature. 
// arrays to hold device address
DeviceAddress gpusensor = {0x22, 0x16, 0xC3, 0x1A, 0x00, 0x00, 0x00, 0x33};
DeviceAddress pwmsensor = {0x22, 0x60, 0xBA, 0x1A, 0x00, 0x00, 0x00, 0x87};
DeviceAddress watersensor = {0x22, 0xA0, 0xBC, 0x1A, 0x00, 0x00, 0x00, 0x84};
int sensorsOK = 0;

int gpustarttemp = 39;
int gpustoptemp = 32;
double gpusetpoint = 41;
int pwmstarttemp = 36;
int pwmstoptemp = 32;
double pwmsetpoint = 40;
int waterstarttemp = 34;
int waterstoptemp = 32;
double watersetpoint = 35;

int minspeed = 50;
int intakeoffset = 40;
double gputemp, pwmtemp, watertemp;
double output1, output2, output3, output4;

PID gpuPID(&gputemp, &output1, &gpusetpoint, 75, 10, 0, REVERSE);
PID pwmPID(&pwmtemp, &output2, &pwmsetpoint, 75, 10, 0, REVERSE);
PID waterPID(&watertemp, &output3, &watersetpoint, 180, 50, 0, REVERSE);

int initsensors() {
  int ok = 0;
  
  // locate devices on the bus
  sensors.begin();
  
  if (sensors.getDeviceCount() == 3) {
    sensors.setResolution(gpusensor, 12);
    sensors.setResolution(pwmsensor, 12);
    sensors.setResolution(watersensor, 12);
    ok = 1;
  }
  
  return ok;
}

void setup()  { 
  //OSCCAL = 0x80;
  Serial.begin(9600);
  //Pins 9 and 10: controlled by timer 1
  //Setting 	Divisor 	Frequency
  //0x01 	 	1 	 	31250
  //0x02 	 	8 	 	3906.25
  //0x03  		64 	 	488.28125
  //0x04  		256 	 	122.0703125
  //0x05 	 	1024 	 	30.517578125

  TCCR1B = TCCR1B & 0b11111000 | 0x05;
  
  //Pins 11 and 3: controlled by timer 2
  //Setting 	Divisor 	Frequency
  //0x01 	 	1  		31250
  //0x02 	 	8 	 	3906.25
  //0x03  		32  		976.5625
  //0x04 	 	64 	 	488.28125
  //0x05 	 	128  		244.140625
  //0x06  		256  		122.0703125
  //0x07 	 	1024  		30.517578125

  TCCR2B = TCCR2B & 0b11111000 | 0x07;
  
  // declare pin 9 to be an output:
  pinMode(PWMpin1, OUTPUT);
  pinMode(PWMpin2, OUTPUT);
  pinMode(PWMpin3, OUTPUT);
  pinMode(PWMpin4, OUTPUT);
  
  // locate devices on the bus
  sensorsOK = initsensors();

  gpuPID.SetMode(AUTOMATIC);
  pwmPID.SetMode(AUTOMATIC);
  waterPID.SetMode(AUTOMATIC);
} 

void loop()  { 
  if (sensorsOK == 1) {
    sensors.requestTemperatures();
    gputemp = sensors.getTempC(gpusensor);
    pwmtemp = sensors.getTempC(pwmsensor);
    watertemp = sensors.getTempC(watersensor);
  }
  else sensorsOK -= 1; //countdown to reinit sensor
  if (sensorsOK < -10) {
    sensorsOK = initsensors();
  }
  
  Serial.print("GPU temperature = ");
  Serial.println(gputemp);
  Serial.print("PWM temperature = ");
  Serial.println(pwmtemp);
  Serial.print("Water temperature = ");
  Serial.println(watertemp);

  switch (gpustate) {
    case 0: //stopped
      if ((gputemp > gpustarttemp)||((int) gputemp == 0)) {
        analogWrite(PWMpin1, 200); //startup boost until next cycle
        gpustate = 1;
      }
      break;
      
    case 1: //running
      gpuPID.Compute();
      
      if (output1 < minspeed) output1 = minspeed;
      if ((int) gputemp == 0) { //could not read sensors, set full speed
        //Serial.println("Full speed");
        output1 = 255;
      }
      if (output1 > 255) output1 = 255;

      Serial.print("GPU fan output: ");
      Serial.println(output1);   
      analogWrite(PWMpin1, output1);
      
      if ((gputemp < gpustoptemp)&&((int) gputemp != 0)) {
        analogWrite(PWMpin1, 0);
        gpustate = 0;
      }
      break;
  }

  switch (pwmstate) {
    case 0: //stopped
      if ((pwmtemp > pwmstarttemp)||((int) pwmtemp == 0)) {
        analogWrite(PWMpin2, 200); //startup boost until next cycle
        pwmstate = 1;
      }
      break;
      
    case 1: //running
      pwmPID.Compute();
      
      if (output2 < minspeed) output2 = minspeed;
      if ((int) pwmtemp == 0) { //could not read sensors, set full speed
        //Serial.println("Full speed");
        output2 = 255;
      }
      if (output2 > 255) output2 = 255;

      Serial.print("PWM fan output: ");
      Serial.println(output2);   
      analogWrite(PWMpin2, output2);
      
      if ((pwmtemp < pwmstoptemp)&&((int) pwmtemp != 0)) {
        analogWrite(PWMpin2, 0);
        pwmstate = 0;
      }
      break;
  }
  
    switch (waterstate) {
    case 0: //stopped
      if ((watertemp > waterstarttemp)||((int) watertemp == 0)) {
        analogWrite(PWMpin3, 200); //startup boost until next cycle
        analogWrite(PWMpin4, 200); //startup boost until next cycle
        waterstate = 1;
      }
      break;
      
    case 1: //running
      waterPID.Compute();

      output4 = output3 + intakeoffset;
      
      if (output3 < minspeed) output3 = minspeed;
      if (output4 < minspeed) output4 = minspeed;
      if ((int) watertemp == 0) { //could not read sensors, set full speed
        //Serial.println("Full speed");
        output3 = 255;
        output4 = 255;
      }
      if (output3 > 255) output3 = 255;
      if (output4 > 255) output4 = 255;

      Serial.print("Water cooler fan intake output: ");
      Serial.print(output4);
      Serial.print(", radiator output: ");
      Serial.println(output3);
      analogWrite(PWMpin3, output3);
      analogWrite(PWMpin4, output4);      

      if ((watertemp < waterstoptemp)&&((int) watertemp != 0)) {
        analogWrite(PWMpin3, 0);
        analogWrite(PWMpin4, 0);
        waterstate = 0;
      }
      break;
  }
  
  // wait for 1000 milliseconds 
  delay(1000);
}
Här finns bra dokumentation hur man kopplar in 1-wire-sensorer:
http://www.strangeparty.com/2010/12/13/ ... e-sensors/
och spänningsmatad: http://bildr.org/2011/07/ds18b20-arduino/

Nåt sånt för drivningen av vardera fläkt: http://www.gammon.com.au/images/MOSFET_ ... driver.png
Skriv svar