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

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:

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.
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
