PWM och PC-fläkt

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
barbarossa
EF Sponsor
Inlägg: 544
Blev medlem: 8 december 2006, 11:18:14
Ort: Tågarp, Svalöv

PWM och PC-fläkt

Inlägg 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
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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
barbarossa
EF Sponsor
Inlägg: 544
Blev medlem: 8 december 2006, 11:18:14
Ort: Tågarp, Svalöv

Inlägg 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
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg 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.
barbarossa
EF Sponsor
Inlägg: 544
Blev medlem: 8 december 2006, 11:18:14
Ort: Tågarp, Svalöv

Inlägg av barbarossa »

Hur generar du PWM med 12F675? mjukvaru-PWM?

Jag tycker att 12F683 ligger närmare tillhands i såfall.
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg 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.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Inlägg 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);
}
barbarossa
EF Sponsor
Inlägg: 544
Blev medlem: 8 december 2006, 11:18:14
Ort: Tågarp, Svalöv

Inlägg av barbarossa »

Senast redigerad av barbarossa 15 mars 2007, 16:47:55, redigerad totalt 1 gång.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Inlägg av PHermansson »

Bidde fel på länken?
Här är min variant:

Bild
barbarossa
EF Sponsor
Inlägg: 544
Blev medlem: 8 december 2006, 11:18:14
Ort: Tågarp, Svalöv

Inlägg av barbarossa »

länken fixad
barbarossa
EF Sponsor
Inlägg: 544
Blev medlem: 8 december 2006, 11:18:14
Ort: Tågarp, Svalöv

Inlägg 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);
}
}
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg 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.
barbarossa
EF Sponsor
Inlägg: 544
Blev medlem: 8 december 2006, 11:18:14
Ort: Tågarp, Svalöv

Inlägg 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
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg 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? :)
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Ah, tack för den, har uppenbarligen inte sett det själv :)
Skriv svar