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.
Proiectul este alcatuit din:
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.
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.
Inainte
Poza din teste, placuta initiala cu toate piesele montate (in afara de ATtiny13A)
Dupa
Poza cu demontarea pieselor
Rezultatul (ce-a ramas)
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]); } }
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.
Sursa: leddisplay.zip
Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.
TODO: Resurse