Sida 1 av 2

PWM och PC-fläkt

Postat: 14 mars 2007, 18:24:21
av barbarossa
Hej

Jag tänkte styra en 12V fläkt i PC:n med en 5V PWM-signal från en PIC till en MOSFET i en "low side drive".

Jag är lite osäker på vilken mosfet och frihjulsdiod jag ska använda och behövs det något motstånd mellan PIC:n och MOSFET:en?

Fläkten är ganska kraftig (1 A), så jag kommer nog inte att ha mer än 50% duty cycle för annars kommer datorn att flytta på sig.

Går det att använda IRF3708 (har några över)

MVH
Andreas

Postat: 14 mars 2007, 20:22:51
av squiz3r
Ska PICen göra annat också eller? För att om man bara ska PWM.a den o kunna styra hastigheten manueltgår det ju bra med en 555-krets. Om du är intreserad av det har jag gjort en sån till en mindre fläkt, jag har laggt upp det på min hemsida. Fast den var lite fusk :eh: men den funkar bra iallafall. (http://www.crazycasemod.se) ligger längst ner i menyn "moddar och byggen".

//Daniel A

Postat: 14 mars 2007, 21:04:39
av barbarossa
Planen är att den ska byta duty cycle när tempen på grafikkortet går över ~60°C. Jag ska klistra fast en eller kanske två temperatursensorer TC622 på kortet. Sensorn skickar ut en logisk etta när temperaturen går över en specifik nivå.

Jag har ett BTX-system så processorfläkten blåser rakt på grafikkortet, sedu..

TC622:
http://www.microchip.com/stellent/idcpl ... e=en010742

Postat: 14 mars 2007, 21:09:38
av JimmyAndersson
Jag gjorde en liknande grejj för en tid sedan. Projekt-tråden.

Jag använde en PIC och styrde fläkten med en transistor.
Provade först med en 555-baserad pwm-koppling, men det blev väldigt ostabilt och fungerade inte särskillt bra. En PIC12F675 är lika liten som en 555, men betydligt mindre känslig för temperaturförändringar.

Titta i min projekt-tråd, så hittar du kanske lite inspiration. Där finns även några scheman.

Postat: 14 mars 2007, 21:48:06
av barbarossa
Hur generar du PWM med 12F675? mjukvaru-PWM?

Jag tycker att 12F683 ligger närmare tillhands i såfall.

Postat: 14 mars 2007, 22:12:43
av JimmyAndersson
Jo det blev mjukvaru-PWM. Men det var inga problem att hinna med PWM, läsa en analog ingång och styra tre utgångar för lysdioder. Tyvärr har jag inte koden kvar pga en hårddisk som "gick hem från jobbet" lite för tidigt.

Men 12F683 passar som sagt bättre om man vill ha hårdvaru-PWM.

Postat: 15 mars 2007, 14:34:33
av PHermansson
Kan väl bidra med lite kod för 12F675 och microC. Finns lite mer finesser än PWM i koden.
Detta fungerar i princip, dock hade jag svårt att hitta rätt kombination av väden och fläkt för att undvika massa oljud från fläkten...

Kod: Markera allt

/*PicAmp
PHermansson 2006-2007
For mikroC compiler for PIC, www.mikroelektronika.co.yu
*/

int temp;
int test;
int sndlevel;
long sndHyst;
unsigned short pwmcounter;
unsigned short pwmlen;

void interrupt(){
//Interrupt routine. Declared by mikroC
   if (INTCON.T0IF) {
      //Timer0 interrupt
      TMR0   = 50;
      INTCON = 0x20;             // set T0IE, clear T0IF = Reset interrupt
      pwmcounter ++;                // increment counter
   }
   return;
   if (PIR1.TMR1IF) {
      //Timer1 interrupt
      if (test >= 1) {
         GPIO.GP5 = 1;
         test = 0;
      }
      else {
         GPIO.GP5 = 0;
         test = 1;
      }
      PIR1.TMR1IF = 0;  //Clear interrupt flag
   }
}

void main() {
    //Settings
    OPTION_REG = 0b11010000;  //GPIO pullup and TMR0 setup
    T1CON = 0b00000101;   //Setup Timer1
    TMR1H = 0;            //Reset Timer1 registers
    TMR1L = 0;
    PIR1.TMR1IF = 0;

    //Outputs
    TRISIO = 0b00010010;    //GP4, GP1 = input
    GPIO = 0xFF;    // initialize gpio
    GPIO = 0b00000000;       // GP2(fan), GP5(relay) off
    GPIO.GP5 = 1;
    
    //Parameters
    pwmcounter = 0;    // reset counter
    pwmlen = 160;      //Higher value, higher fan speed
    TMR0 = 254;     // set timer0

    
    //Enable interrupts
    PIE1.TMR1IE = 1;      //Timer1 interrupt enable
    INTCON = 0b10100000; // TMRO interrupt enabled, Global Interrupt Enabled
    
    //Tempsensor = GP4/AN3
    //Setup AD
    //GP4/AN3, GP1/AN1 = analog input, rest is digital. x,010(Fosc/32),1010(AN3:AN0)
    //1 indicates analog, 0 = digital.
    ANSEL = 0b00101010;
    //ADCON0. 0 (ADFM), 0 (Vref=VDD),00 (dont care),10 (channel select, chan 02),0 (Go/Done), 1 (AD is on)
    ADCON0 = 0b00001101;

    do{                         // Loop

        //------------Start AD-conversion, check temperature-------------//
	/*
	10bit/5V
	1024 = max => 0,0048828125 V/bit
	Omslag vid hudkontakt läser ca 155
	155*0,004...= 0,7568359
	TC1047 ger 500mV@0C
	0,7568359-0,5= 0,2568 = 26C
	*/
        
	temp = Adc_Read(3);
        //10 bits -> max=1023

        if (temp>160) {
           INTCON = 0b10100000; // TMRO interrupt enabled
           //PWM
           if (pwmcounter > pwmlen)      // Counts from n to 255 and then flips to 0
              GPIO.GP2 = 0;              
           else                      
              GPIO.GP2 = 1;     //GP2(fan) on
        } else {
           GPIO.GP2 = 0;    //Fan off
           INTCON = 0b10000000; // TMRO interrupt disabled
        }
     
        //Detect audio level
        //Relay on as soon as audio is detected, but off a few minutes after
        sndlevel = Adc_Read(1);
        if (sndlevel > 610)  { //Sound in detected
           GPIO.GP5 = 1;  //Relay on
           sndHyst = 100000;          
        }
        else {
           //GPIO.GP5 = 0;
           sndHyst--;
        }
        if (sndHyst < 100)
           GPIO.GP5 = 0;
        
    } while(1);
}

Postat: 15 mars 2007, 16:26:31
av barbarossa

Postat: 15 mars 2007, 16:42:01
av PHermansson
Bidde fel på länken?
Här är min variant:

Bild

Postat: 15 mars 2007, 16:48:25
av barbarossa
länken fixad

Postat: 16 mars 2007, 21:09:17
av barbarossa
Jag tänkte köra PWM med ganska hög frekvens så bör jag undgå (hörbart) oljud. Jag har inte hunnit testa min MikroC-kod ännu men nånting åt detta hållet för en PIC12F683 bör väl funka:

void main(){
TRISIO = 0x03; //PORT config GPIO 0,1 digital input GPIO2
ANSEL = 0 ; //digital output
Pwm_Init(20000); //Config and start PWM at 50%
Pwm_Change_Duty(127);
Pwm_Start();
Vdelay_ms(3000);
Pwm_Change_Duty(64);

while (1){
if ((GPIO.F0 = 0) & (GPIO.F1 = 0)) // GP0 & GP1 < treshold
Pwm_Change_Duty(64); // pwm = 25%
else if ((GPIO.F0 = 1) & (GPIO.F1 = 0)) // GP0 >= treshold
Pwm_Change_Duty(80); // pwm = 31.25%
else // GP0 & GP1 >= treshold
Pwm_Change_Duty(96); // pwm = 37.5%
Vdelay_ms(1000);
}
}

Postat: 17 mars 2007, 13:53:59
av $tiff
Jag rekommenderar att du slänger på ett LC-filter efter din PWM-signal, så kommer dina fläktar må bättre på sikt, och bete sig mer som du hade tänkt dig.

Postat: 17 mars 2007, 14:16:51
av barbarossa
Jo, jag har läst nåt om det i ett AN från microchip om fläktljud. Ska testa mig fram lite på den fronten.

PS. Felstavning i din signatur

Postat: 17 mars 2007, 16:41:37
av JimmyAndersson
Du var uppmärksam! Det är ingen som har sett det tidigare. :D

Iofs kanske det ska vara en väte-etablerad metod? :)

Postat: 18 mars 2007, 01:13:39
av $tiff
Ah, tack för den, har uppenbarligen inte sett det själv :)