Sida 1 av 2
styra vanliga datorfläktar med en PWM signal från moderkorte
Postat: 12 september 2013, 18:03:40
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
Re: styra vanliga datorfläktar med en PWM signal från moderk
Postat: 12 september 2013, 18:18:04
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.
Re: styra vanliga datorfläktar med en PWM signal från moderk
Postat: 12 september 2013, 21:01:17
av Tekko
Man ska inte PWM'a fläktar med bara 2 eller 3 tåtar, de tar skada av det.
Re: styra vanliga datorfläktar med en PWM signal från moderk
Postat: 12 september 2013, 23:35:55
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.
Re: styra vanliga datorfläktar med en PWM signal från moderk
Postat: 12 september 2013, 23:54:32
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.
Re: styra vanliga datorfläktar med en PWM signal från moderk
Postat: 13 september 2013, 00:09:34
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

Re: styra vanliga datorfläktar med en PWM signal från moderk
Postat: 13 september 2013, 07:35:55
av Micke_s
De har antagligen gjort något liknande detta + en spole och kondensator på utgången.
Re: styra vanliga datorfläktar med en PWM signal från moderk
Postat: 13 september 2013, 08:23:01
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.
Re: styra vanliga datorfläktar med en PWM signal från moderk
Postat: 13 september 2013, 08:25:59
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.
Re: styra vanliga datorfläktar med en PWM signal från moderk
Postat: 13 september 2013, 13:48:02
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
Re: styra vanliga datorfläktar med en PWM signal från moderk
Postat: 13 september 2013, 14:47:33
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.
Re: styra vanliga datorfläktar med en PWM signal från moderk
Postat: 13 september 2013, 16:06:58
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...
Re: styra vanliga datorfläktar med en PWM signal från moderk
Postat: 13 september 2013, 17:14:59
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.
Re: styra vanliga datorfläktar med en PWM signal från moderk
Postat: 18 september 2013, 13:29:32
av swetrekki
JanErik, jag skickar dig ett PM...
Re: styra vanliga datorfläktar med en PWM signal från moderk
Postat: 18 september 2013, 20:56:16
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