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

//Daniel A
-
- EF Sponsor
- Inlägg: 544
- Blev medlem: 8 december 2006, 11:18:14
- Ort: Tågarp, Svalöv
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
Jag har ett BTX-system så processorfläkten blåser rakt på grafikkortet, sedu..
TC622:
http://www.microchip.com/stellent/idcpl ... e=en010742
- JimmyAndersson
- Inlägg: 26586
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
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.
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.
-
- EF Sponsor
- Inlägg: 544
- Blev medlem: 8 december 2006, 11:18:14
- Ort: Tågarp, Svalöv
- JimmyAndersson
- Inlägg: 26586
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
- PHermansson
- EF Sponsor
- Inlägg: 4340
- Blev medlem: 22 december 2004, 00:46:38
- Ort: Särestad Grästorp
- Kontakt:
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...
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);
}
-
- EF Sponsor
- Inlägg: 544
- Blev medlem: 8 december 2006, 11:18:14
- Ort: Tågarp, Svalöv
Senast redigerad av barbarossa 15 mars 2007, 16:47:55, redigerad totalt 1 gång.
- PHermansson
- EF Sponsor
- Inlägg: 4340
- Blev medlem: 22 december 2004, 00:46:38
- Ort: Särestad Grästorp
- Kontakt:
-
- EF Sponsor
- Inlägg: 544
- Blev medlem: 8 december 2006, 11:18:14
- Ort: Tågarp, Svalöv
-
- EF Sponsor
- Inlägg: 544
- Blev medlem: 8 december 2006, 11:18:14
- Ort: Tågarp, Svalöv
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);
}
}
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);
}
}
-
- EF Sponsor
- Inlägg: 544
- Blev medlem: 8 december 2006, 11:18:14
- Ort: Tågarp, Svalöv
- JimmyAndersson
- Inlägg: 26586
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt: