Enfriamiento de fuente de alimentación de computadora semi pasiva

Hola Este dispositivo es aplicable no solo en una fuente de alimentación de computadora, sino que hablaremos sobre una computadora como urgente :)



La tecnología de proceso para la producción de procesadores está disminuyendo constantemente, junto con el consumo de energía también está disminuyendo. Los procesadores de las últimas generaciones contienen un sistema de video gráfico adecuado para las tareas cotidianas. Si no es muy exigente con el rendimiento en los videojuegos, entonces, por un presupuesto relativamente modesto, puede pensar en una computadora silenciosa que solo emitirá sonidos bajo una carga pesada, lo que no sucede con frecuencia.

Luego viene mi visión de una configuración de computadora para enfriamiento semi-pasivo.

La CPU promedio en el pico de su carga genera 65 vatios de calor, puede ser enfriada por un enfriador de fábrica con una potencia mayor (que la normal) de 120-150 vatios configurando la configuración del BIOS para que comience a girar solo cuando se carga el 30-40% de la CPU o a una temperatura superior a 40 ° C.

Otra fuente de ruido es el HDD, pero es simple, lo reemplacé con un SSD.

Había un ventilador de fuente de alimentación que gira constantemente. Puede comprar un pasivo completo o semi-pasivo inicialmente, pero aquí está el precio de la pregunta: (desde $ 150) ¿quizás tenga sentido dirigir estos fondos a una mayor productividad?

Una fuente de alimentación ordinaria de 500 W ($ 50) tiene una gran reserva de energía en mi caso, así que decidí apagar el ventilador por completo. Pero durante una operación prolongada bajo una carga pesada, los radiadores en el interior comenzaron a calentarse por encima de los 60 ° C, por lo que se decidió devolver el ventilador pero hacer que su velocidad fuera controlada.

Las diferentes fuentes de alimentación tienen varias características de diseño, quizás en algunos casos es necesario un flujo de aire constante. Por lo tanto, antes de realizar cambios en el diseño de su PSU, tenga en cuenta que comprende el proceso, que tiene bastante "manos iguales" y que los cambios realizados no afectarán negativamente el funcionamiento de su PSU y el equipo relacionado. A menudo sucede que la PSU bombea el aire de toda la unidad del sistema. ¡Cualquier modificación puede dañar su computadora!




La base fue Arduino nano, basado en ATMEGA168PA, de diferentes piezas de proyectos de otras personas compiladas.



Dado que los recursos del controlador lo permiten, se decidió hacer un indicador LED de tres colores del tipo de LED inteligente con varios parpadeos y colores dependiendo de la temperatura.



La temperatura es medida por el sensor DS18B20, dependiendo de la temperatura, la velocidad del ventilador aumenta o disminuye. Cuando alcanza> 67 ° C, el detector de sonido se activa. Transistor: cualquier NPN con corriente> corriente de su ventilador. También intenté controlar un ventilador de tres cables, todo funcionó, pero no pude detenerlo por completo.

Inicialmente, usaba la frecuencia PWM predeterminada (448.28 Hz), pero a bajas velocidades el enfriador hizo un timbre apenas perceptible, que de ninguna manera coincide con el concepto de enfriamiento silencioso. Por lo tanto, la frecuencia de software del PWM se eleva a 25 kHz. A las velocidades más bajas, el ventilador no puede arrancar de inmediato, por lo que en los primeros dos segundos se le alimenta un impulso con la velocidad máxima, luego la velocidad de acuerdo con el programa.

Aquí hay un video que demuestra el funcionamiento del dispositivo.



Pero en realidad, un boceto, te pido que no patees mucho. Este es mi primer boceto para Arduina :)

Haga clic para ver el 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/es421267/


All Articles