» Advertenties

Zo 5 Februari 2012, 12:32

Fan die op hun nominale spanning lopen kunnen nog wel eens een hoop herrie maken terwijl dit niet altijd echt nodig. Een temperatuur geregelde fan controller zal ervoor zorgen dat een fan niet meer toeren (en lawaai) maakt dan nodig om de boel toch op acceptabele temperaturen te houden.
Je zou een fan aan gewoon kunnen under-volt'en naar 5V en 7V ipv normale 12V maar dan nog blijft het fenomeen dat deze onnuttig staat te draaien op rustige momenten en misschien zorgt de fan voor net niet gewoon luchtstroom op piekmomenten.
Dus wat doen we dan? We maken zelf een temperatuur geregelde fancontroller.

File #227
Bovenaan links zit de temperatuursensor-ingang (Gewone analoge sensor LM35 ofzo). Links in het midden zit de microcontroller die de boel stuurt. Boven en onder de grote 220µF buffercondensator zitten de 2 fan uitgangen. De fancontroller is geschikt voor 2 en 3pin fans, dus fans zonder inwendige toeren regeling.
Als er 3pin fan word gebruiken (dus eentje met tacho-signaal) is het 4e pinnetje om dit tachosignaal door te linken naar het moederbord zodat het toerental kan worden uitgelezen.

File #232

De toerental regeling gebeurt door de voeding van de fan te choppen zodat deze niet continue zijn nominaal 12V krijgt maar slechts een deel van de tijd. De fan word gePWM'ed op een frequentie van 38KHz, een heel stuk boven het gebied waarop het hoorbaar zou zijn.

De temperatuursensor en de AVR microcontroller nemen hun voeding van de 5V lijn welke naar 3,3V word gebracht door de LDO die rechts bovenaan zit. De fan worden rechtstreeks vanuit de 12V lijn gevoed, de grote 220µF condensator staat over de 12V lijn om deze extra te bufferen.

Het schema:
File #230
Gemakkelijkheidshalve staat het PWM signaal op de GND draad van de FAN. De BCV27 is een 1A sot23 NPN darlington transistor. De vrijloopdiodes zijn denk ik niet strikt noodzakelijk aangezien er in een PC fan ook wat elektronica zit.
De AVR ATTiny13 loops op zijn interne 9,6Mhz clock om zo een PWM signaal te maken van 37,5KHz.

De firmware voor de AVR is niet echt spannend, ADC ingang lezen, ADC waarde naar temperatuur omzetten. De gemeten temperatuur word dan vergeleken met vooraf ingestelde waarden en aan de hand daarvan zal de fan 4 gebieden kunnen komen:
- Maximaal aan (Maximum PWM waarde is in te stellen)
- Linear regelbied (PWM waarde afhankelijk van de temperatuur)
- Hysteresis, minimum snelheid (Temperatuur is onder de minimum waarde gezakt waarvoor de fan zou moeten aanspringen. Om geen aan/uit gekletter te krijgen draait de fan nog enkele graden op zijn minimum ingestelde snelheid.)
- Fan uit (Temperatuur is onder de ingestelde threshold)

De fancontroller heeft 2 onafhankelijke fan kanalen. Deze 2 fans worden onafhankelijk van elkaar aangestuurd op basis van ingestelde gegevens in de firmware. Zo kan Fan 1 op 30° al beginnen te draaien en fan 2 pas op 45° als hulp om de boel toch niet te warm laten lopen. De eindtemperatuur waarop de fans hun maximale snelheid bereiken kan ook worden ingesteld.

C code -
  1. #define F_CPU 9600000UL
  2.  
  3. // == SETTINGS
  4. #define HYSTERESIS   5   // ° (To turn off the fan)
  5.  
  6. // ==== FAN CONTROL 0
  7. #define TEMP0_MAX   50   // Fan @ full speed
  8. #define TEMP0_MIN   25   // Fan start
  9. #define PWM0_MAX   255   // Max fan speed
  10. #define PWM0_MIN   20   // Starting fan speed
  11.  
  12. // ==== FAN CONTROL 1
  13. #define TEMP1_MAX   60   // Fan @ full speed
  14. #define TEMP1_MIN   45   // Fan start
  15. #define PWM1_MAX   255   // Max fan speed
  16. #define PWM1_MIN   30   // Starting fan speed
  17.  
  18.  
  19.  
  20.  
  21. // CALCULATIONS
  22. #define TEMP0_MIN_H   (TEMP0_MIN - HYSTERESIS)
  23. #define dPWM0   (PWM0_MAX - PWM0_MIN)
  24. #define dTEMP0   (TEMP0_MAX - TEMP0_MIN)
  25. #define FAN_RATIO0 (dPWM0 / dTEMP0)
  26. #define range0   (FAN_RATIO0 * dTEMP0)
  27. #define PWM0_MINc   (PWM0_MAX - range0) // Corrected min
  28. #define TEMP1_MIN_H   (TEMP1_MIN - HYSTERESIS)
  29. #define dPWM1   (PWM1_MAX - PWM1_MIN)
  30. #define dTEMP1   (TEMP1_MAX - TEMP1_MIN)
  31. #define FAN_RATIO1 (dPWM1 / dTEMP1)
  32. #define range1   (FAN_RATIO1 * dTEMP1)
  33. #define PWM1_MINc   (PWM1_MAX - range1) // Corrected min
  34.  
  35.  
  36. #include <avr/io.h>
  37. typedef unsigned char   u08;
  38. typedef unsigned short   u16;
  39. typedef unsigned long u32;
  40. #define BV(bit)       (1<<(bit))
  41. #define cbi(reg,bit)   reg &= ~(BV(bit))
  42. #define sbi(reg,bit)   reg |= (BV(bit))
  43.  
  44.  
  45. u16 getTemp(){
  46.   sbi(ADCSRA, ADSC); // Start adc cenversion
  47.   while(bit_is_set(ADCSRA, ADSC)); // wait for complete
  48.   return ((u16)(((u32)((u32)ADCH*(u32)3300))/((u32)256*(u32)10)));
  49. }
  50.  
  51. int main(void){
  52.   sbi(DDRB, 0);
  53.   sbi(DDRB, 1);
  54.   cbi(DDRB, 3);
  55.  
  56.   ADMUX = (0<<REFS0) | (1<<ADLAR) | (1<<MUX1) | (1<<MUX0); // ref, right, channel 3
  57.   ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // Prescale = 128, adc enable
  58.   DIDR0 = (1<<ADC3D); // Disable digital  
  59.  
  60.   TCCR0A = (1<<COM0A1) | (1<<COM0B1) | (1<<WGM01) | (1<<WGM00); // pwm
  61.   TCCR0B = (1<<CS00); // prescale = 1 (37,5 Khz pwm)
  62.   OCR0A = 0;
  63.   OCR0B = 0;
  64.  
  65.   u08 fan0Status = 0;
  66.   u08 fan1Status = 0;
  67.   u16 temp=0;
  68.   while(1){
  69.     temp = getTemp();
  70.     if(temp>TEMP0_MAX){ // full speed
  71.       OCR0A = PWM0_MAX;
  72.     }
  73.     else if(((temp<TEMP0_MIN) && (fan0Status == 0)) || ((temp<(TEMP0_MIN_H)) && (fan0Status == 1))){ // off
  74.       OCR0A = 0;
  75.       fan0Status = 0;
  76.     }
  77.     else if(temp<TEMP0_MIN){ // In hysteresis
  78.       OCR0A = PWM0_MINc;
  79.       fan0Status = 1;
  80.     }
  81.     else{ // Linear control
  82.       OCR0A = (FAN_RATIO0 * (temp - TEMP0_MIN)) + PWM0_MINc;
  83.       fan0Status = 1;      
  84.     }
  85.  
  86.     if(temp>TEMP1_MAX){ // full speed
  87.       OCR0B = PWM1_MAX;
  88.     }
  89.     else if(((temp<TEMP1_MIN) && (fan1Status == 0)) || ((temp<(TEMP1_MIN_H)) && (fan1Status == 1))){ // off
  90.       OCR0B = 0;
  91.       fan1Status = 0;
  92.     }
  93.     else if(temp<TEMP1_MIN){ // In hysteresis
  94.       OCR0B = PWM1_MINc;
  95.       fan1Status = 1;
  96.     }
  97.     else{ // Linear control
  98.       OCR0B = (FAN_RATIO1 * (temp - TEMP1_MIN)) + PWM1_MINc;
  99.       fan1Status = 1;      
  100.     }      
  101.   }
  102.  
  103.   return 0;
  104. }
Ondertussen heb ik een 2de versie gemaakt. Deze fancontroller komt in men versterker en neemt voeding van de 33V rail van de versterker zelf. Daarom moest er op de fancontroller zelf nog een 12V switcher komen.
File #234
Ingangspanning: 14-40VDC


File #233
Vanaf de zijkant


Dit is het mini-printje dat ondersteboven op de fancontroller zit.
File #235
SGA12V - Fixed 12V switcher


En zo word hij gebruikt: 33V railspanning in. Temperatuursensor op de koelplaat en een fannetje die mooi in toerental word geregeld.
File #236
Nog geen reacties.
Naam
a-z A-Z 0-9 _

 
E-mail
Wordt niet getoont.
  (niet verplicht)
 
Mail sturen als
(optie)
Smoerijf reageerd
Eender wie reageaard
Nooit
 
Mail sturen
(optie)
Enkel mailen bij eerste reactie
Bij elke reactie mailen
 
Reactie
Laatste wijziging: Vr 14 Mei 2010, 14:51