Refrigeração semi-passiva da fonte de alimentação do computador

Oi Este dispositivo é aplicável não apenas no PSU de um computador, mas falaremos sobre um computador como urgente :)



A tecnologia de processo para a produção de processadores está diminuindo constantemente, juntamente com o consumo de energia também está diminuindo. Os processadores das últimas gerações contêm um sistema de vídeo gráfico adequado para as tarefas diárias. Se você não é muito exigente quanto ao desempenho em videogames, então, por um orçamento relativamente modesto, pode pensar em um computador silencioso que emite sons apenas sob carga pesada, o que não acontece com frequência.

Em seguida, vem a minha visão de uma configuração de computador para refrigeração semi-passiva.

A CPU média no pico de sua carga gera 65 watts de calor, pode ser resfriada por um resfriador de fábrica com uma potência maior (que o normal) de 120-150 watts, definindo as configurações do BIOS para que comece a girar apenas quando 30-40% da CPU for carregada ou acima de 40 ° .

Outra fonte de ruído é o HDD, mas é simples, substituí-o por um SSD.

Havia um ventilador da fonte de alimentação que gira constantemente. Você pode comprar um totalmente passivo ou semi-passivo inicialmente, mas eis o preço da pergunta: (de US $ 150) talvez faça sentido direcionar esses fundos para uma maior produtividade?

Uma fonte de alimentação comum de 500 W (US $ 50) tem uma enorme reserva de energia no meu caso, então decidi desligar completamente o ventilador. Porém, durante uma operação prolongada sob carga pesada, os radiadores começaram a aquecer acima de 60 ° C, por isso foi decidido devolver o ventilador, mas manter a velocidade controlada.

Fontes de alimentação diferentes têm vários recursos de design, talvez em alguns casos seja necessário um fluxo de ar constante. Portanto, antes de fazer alterações no design do seu PSU, lembre-se de que você entende o processo, que possui mãos razoavelmente "uniformes" e que as alterações feitas não afetarão adversamente a operação do PSU e do equipamento relacionado. Muitas vezes acontece que a PSU bombeia o ar de toda a unidade do sistema. Qualquer modificação pode danificar seu computador!




A base foi tirada do Arduino nano com base no ATMEGA168PA, a partir de diferentes partes de projetos de outras pessoas que foram compiladas.



Como os recursos do controlador permitem, decidiu-se criar um indicador LED de três cores do tipo LED inteligente com várias piscadas e cores, dependendo da temperatura.



A temperatura é medida pelo sensor DS18B20, dependendo da temperatura, a velocidade do ventilador aumenta ou diminui. Ao atingir> 67 ° C, o detector de som é ativado. Transistor - qualquer NPN com a corrente atual do seu ventilador. Também tentei controlar um ventilador de três fios, tudo deu certo, mas não consegui fazê-lo parar completamente.

Inicialmente, ele usava a frequência PWM padrão (448,28 Hz), mas em baixas velocidades o cooler fazia um toque quase imperceptível, o que de maneira alguma coincide com o conceito de refrigeração silenciosa. Portanto, a frequência do software do PWM é aumentada para 25 kHz. Nas rotações mais baixas, o ventilador não pode iniciar imediatamente, portanto, nos primeiros dois segundos, um impulso com o máximo de rotações é aplicado a ele, depois as rotações de acordo com o programa.

Aqui está um vídeo demonstrando a operação do dispositivo.



Mas, na verdade, um esboço, peço que não chute muito.Este é o meu primeiro esboço para a Arduina :)

Clique para visualizar o código.
// 2 - DS18x20 data // 3 - green LED (a 330 Ohm resistor is necessary) // 5 - orange LED (a 330 Ohm resistor is necessary) // 6 - red LED (a 330 Ohm resistor is necessary) // 9 - PWM Fan // 8 - Buzzer #include <OneWire.h> byte temp; // temperature of sensor byte greenLED = 3; byte orangeLED = 5; byte redLED = 6; byte FanSpeed = 0; int piezoPin = 8; //     byte modes[] = { 0B00000001, //  0B00000101, //  0B00010101, //  0.5  0B01010101, //     0B10101010, //      0B00010101, //      0B01010101 //   (4   ) }; uint32_t ms, ms1 = 0, ms2 = 0, ms3 = 0, ms4 = 0, ms5 = 0; uint8_t blink_loop = 0; uint8_t blink_mode = 0; uint8_t modes_count = 0; bool FirstRun = 0; OneWire ds(2); // on pin 10 (a 4.7K resistor is necessary) void analogWrite25k(int pin, int value) { switch (pin) { case 9: OCR1A = value; break; case 10: OCR1B = value; break; default: // no other pin will work break; } } void setup(void) { pinMode(redLED, OUTPUT); pinMode(greenLED, OUTPUT); pinMode(orangeLED, OUTPUT); pinMode(9, OUTPUT); modes_count = 1; blink_mode = modes[modes_count]; TCCR1A = 0; // undo the configuration done by... TCCR1B = 0; // ...the Arduino core library TCNT1 = 0; // reset timer TCCR1A = _BV(COM1A1) // non-inverted PWM on ch. A | _BV(COM1B1) // same on ch; B | _BV(WGM11); // mode 10: ph. correct PWM, TOP = ICR1 TCCR1B = _BV(WGM13) // ditto | _BV(CS10); // prescaler = 1 ICR1 = 200; // TOP = 320 // Serial.begin(9600); } void loop() { byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; float celsius; if ( ( ms - ms3 ) > 1000 || ms < ms3 ){ ms3 = ms; if ( !ds.search(addr)) { // Serial.println("No more addresses."); // Serial.println(); ds.reset_search(); if ( ( ms - ms4 ) > 250 || ms < ms4 ){ ms4 = ms; //delay(250); return; } } // Serial.print("ROM ="); for( i = 0; i < 8; i++) { // Serial.write(' '); // Serial.print(addr[i], HEX); } if (OneWire::crc8(addr, 7) != addr[7]) { // Serial.println("CRC is not valid!"); return; } // Serial.println(); // the first ROM byte indicates which chip switch (addr[0]) { case 0x10: Serial.println(" Chip = DS18S20"); // or old DS1820 type_s = 1; break; case 0x28: Serial.println(" Chip = DS18B20"); type_s = 0; break; case 0x22: Serial.println(" Chip = DS1822"); type_s = 0; break; default: Serial.println("Device is not a DS18x20 family device."); return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); // start conversion, with parasite power on at the end } //delay(1000); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it. if ( ( ms - ms2 ) > 900 || ms < ms2 ){ ms2 = ms; present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for ( i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } // Convert the data to actual temperature // because the result is a 16 bit signed integer, it should // be stored to an "int16_t" type, which is always 16 bits // even when compiled on a 32 bit processor. int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; // 9 bit resolution default if (data[7] == 0x10) { // "count remain" gives full 12 bit resolution raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); // at lower res, the low bits are undefined, so let's zero them if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms //// default is 12 bit resolution, 750 ms conversion time } celsius = (float)raw / 16.0; temp = celsius; // Serial.println("TEMPERATURE IS:"); // Serial.println(temp); } ms = millis(); //    125  if( ( ms - ms1 ) > 125|| ms < ms1 ){ ms1 = ms; //       if ( temp <= 50 ) { digitalWrite(orangeLED, LOW); digitalWrite(redLED, LOW); if( blink_mode & 1<<(blink_loop&0x07) ) digitalWrite(greenLED, HIGH); else digitalWrite(greenLED, LOW); blink_loop++; if ( temp <= 40 ) { blink_mode = modes[0]; analogWrite25k ( 9, 0); FirstRun = 0; } if ( temp >= 41 && temp <= 45 ) { blink_mode = modes[1]; // Make a push impulse for starting fan (1 sec) if ( FirstRun == 0 ) { ms5 = ms; FirstRun = 1; } if (FirstRun == 1 && (2000 > (ms - ms5))) { analogWrite25k ( 9, 33); // Fan start impulse } if (FirstRun == 1 && (2000 < (ms - ms5))) { analogWrite25k ( 9, 28); // first speed } } if ( temp >= 46 && temp <= 50 && FirstRun == 1) { blink_mode = modes[2]; analogWrite25k ( 9, 29); } } if ( temp >= 51 && temp <= 61 ) { digitalWrite(greenLED, LOW); digitalWrite(redLED, LOW); if( blink_mode & 1<<(blink_loop&0x07) ) digitalWrite(orangeLED, HIGH); else digitalWrite(orangeLED, LOW); blink_loop++; if ( temp >= 51 && temp <= 54 ) { blink_mode = modes[0]; analogWrite25k ( 9, 30); } else if ( temp >= 55 && temp <= 58 ) { blink_mode = modes[1]; analogWrite25k ( 9, 31); } else if ( temp >= 59 && temp <= 61) { blink_mode = modes[2]; analogWrite25k ( 9, 32); } } if ( temp >= 62 && temp <= 120 ) { digitalWrite(greenLED, LOW); digitalWrite(orangeLED, LOW); if( blink_mode & 1<<(blink_loop&0x07) ) digitalWrite(redLED, HIGH); else digitalWrite(redLED, LOW); blink_loop++; if ( temp >= 62 && temp <= 66 ) { blink_mode = modes[0]; analogWrite25k ( 9, 33); } if ( temp >= 67 && temp <= 70 ) { blink_mode = modes[1]; analogWrite25k ( 9, 34); } if ( temp >= 71 && temp <= 120) { blink_mode = modes[2]; analogWrite25k ( 9, 50); tone(piezoPin, 2500, 30); } } } } 

Source: https://habr.com/ru/post/pt421267/


All Articles