PWM Fan controller

Introducere

Proiectul meu este foarte similar cu fan controllerele pentru PC gasite in comert. Daca cineva nu stie ce este un fan controller, este un dispozitiv ce regleaza turatia unui ventilator (sau mai multe) in functie de preferinta utiizatorului sau pentru a mentine temperatura constanta. Mi-am ales acest proiect deoarece voiam inca din liceu sa fac asa ceva, dar nu prea stiam cum si nici nu prea am avut timp. Cred ca e o aplicatie foarte utila deoarece se poate folosi direct in calculator, pentru a mentine temperatura scazuta, fara a suporta zgomotul ingrozitor al ventilatoarelor.

Descriere generală

Proiectul este alcatuit din:

  • Placa de baza
  • Placa de alimentare si control PWM
  • Placa cu afisaj LED si control al temperaturii tinta
  • Placa cu senzorul de temperatura

Schema bloc hardware

Circuitul se alimenteaza la 14V sau mai mult. Placa de alimentare contine 2 regulatoare de tensiune, un LM7812 (pentru ventilator) si un LM317 (pentru alimentarea placii de baza). LM317 este reglat din potentiometrul de pe placa pentru a oferi 5.12V (pentru a se scala uniform pe 1024 pasi, cat are ADC-u). Senzorul de temperatura scoate 10mV/grad C, deci 1 grad = 2 pasi ADC. De aici rezulta ca putem masura cu o precizie de jumatate de grad, de 4 ori mai mult decat precizia senzorului (+- 2 grade). Temperatura este citita de uC, apoi se face conversia din pasi ADC in temperatura reala, se face conversia pentru afisajul LED si in functie de temperatura masurata si cea dorita, se regleaza duty-ul de PWM. Semnalul PWM comanda un MOSFET de putere (IRLR120N) care alimenteaza ventilatorul in functie de semnalul din poarta.

Schema bloc software

Hardware Design

Lista piese

Descriere Cod Cantitate
Placa alimentare
Tranzistor MOSFET de putere IRLR120N 1
Regulator tensiune LM7812 1
Condensator 330nF 1
Condensator 100nF 1
Regulator tensiune LM317 1
Condensator 1uF 1
Condensator 100nF 1
Rezistenta 240 ohmi 1
Potentiometru 2K TS53YL2K 1
Conector alimentare 1
Dioda Sottky de protectie MOSFET 1N5819 1
Rezistenta 32 ohmi 1
Conector Molex 3 pini 1
Bareta 3 pini 1
Placa senzor
Senzor temperatura MCP9700 1
Dioda protectie (merge cam orice)1) 1N4148 1
Placa afisaj/reglare
Display LED 2x7seg KW2-561CGA 1
Rezistenta 300 ohmi 16
Potentiometru 10K2) TS53YL10K 1
Bareta 2×10 pini 1
Conectare
Cabluri panglica
Mufe pentru cabluri panglica
Mufe Molex cablu 1 pin

Pentru proiectare am folosit Eagle 6.1. Cablajele de fac relativ usor cu o imprimanta laser cu hartie de cadouri (se vinde in toate magazinele mari la sul) printata pe partea alba, un fier de calcat si clorura ferica. Sfat: Cititi cu atentie datasheet-urile!

Initial, am vrut sa fac proiectul complet cu piese SMD si cat mai restrans posibil (pentru uz real). Problema a fost ca mi-am dat seama in ultima zi (duminica, 20.05.2012) ca shift-register/driver-ul LED pe care il cumparasem si voiam sa-l folosesc (SCT2024) era open-drain si eu aveam display LED cu catod comun. A trebuit sa reproiectez complet circuitul si sa fac alte placute.

Rezultatul neatentiei

Inainte

Poza din teste, placuta initiala cu toate piesele montate (in afara de ATtiny13A)

Dupa

Poza cu demontarea pieselor

Rezultatul (ce-a ramas) LOL

Poze din momentul realizari si testelor

Senzorul MCP9700 in format SC70-5 SMD (a sfarsit ars in cele din urma) Placuta cu afisajul LED Placuta de alimentare

The Adobe Flash Plugin is needed to display this content.

Software Design

Am folosit Atmel Studio 6.0 si Notepad++. Codul e destul de simplu in esenta. Contine valorile byte-ilor pt fiecare cifra in format 7 segmente, initializarile PWM-ului si ADC-ului si intreruperile aferente.

Temperatura de la senzor si temperatura dorita (potentiometru) sunt citite de ADC prin canalele 0, respectiv 7. Valoarea ADC este citita si convertita in temperatura reala. In functie de temperatura citita si cea dorita se seteaza duty-ul PWM dupa urmatoarea formula:

duty = (T - Tdorita) / (ΔT) * 225 + 30

Offset-ul de 30 este pus deoarece ventilatorul are nevoie de un duty minim pentru a porni. Sub acest prag ventilatorul nu se roteste decat daca are inertie initiala (daca se reduce turatia).

Pentru afisare, se seteaza porturile C si D (cifra zecilor, respectiv unitatilor) in concordanta cu temperatura, folosind valorile predefinite.

#define _DISP(a,b) PORTC = (a); PORTD = (b)

const unsigned char num[] = {	252,	//0
				96,	//1
				218,	//2
				242,	//3
				...
				};


void disp(int n)
{
	if (n < 0)
	{
		_DISP(lo[0],lo[1]);
	}
	else if (n > 99)
	{
		_DISP(hi[0],hi[1]);
	}
	else
	{
		int tens = (n/10)%10;
		int units = n%10;
		
		_DISP((tens>0?num[tens]:0), num[units]);
	}
}

Rezultate Obţinute

The Adobe Flash Plugin is needed to display this content. The Adobe Flash Plugin is needed to display this content. The Adobe Flash Plugin is needed to display this content.

Concluzii

A fost un proiect la care am lucrat cu mare entuziasm si mi s-a parut foarte interesant. Am invatat o gramada de chestii noi si mi-am adus aminte de altele de la ED.

Download

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

TODO: Resurse

1) Am pus-o pentru ca am ars un senzor din greseala alimentandu-l invers
2) Pentru reglare temperatura dorita
pm/prj2012/mdobre/pwm_fan_controller.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0