Sistem electronic de monitorizare a nivelului de lichid dintr-un rezervor [304078]
Universitatea “Politehnica” [anonimizat] a [anonimizat], Optoelectronică și Nanotehnologii
Conducător științific Absolvent Ș.l. Dr. Ing. Andrei DRĂGULINESCU Alin Costescu
2016
CUPRINS
Lista figurilor si lista tabelelor………………………………………………………………………………..9
Lista acronimelor………………………………………………………………………………………………..11
Inroducere …………………………………………………………………………………………………………13
Lucrări asemănătoare……………………………………………………………..14
Obiective…………………………………………………………………….……15
Justificarea proiectului……………………………………………………………15
Dificultăți în realizarea proiectului……………..…………………………………15
CAPITOLUL 1- Sisteme de calcul………………………………………………………17
1.1 Introducere…………………………………………….………………………17
1.2 Calculatoare de birou: 1930-1960…………………………………………………………18
1.3 Calculatoare analogice avansate……………………….……………………..19
1.4 Calculatoare digitale………………………………………………………….20
1.5 Arhitectura von Neumann……………………………………………………21
1.6 Mașini von Neumann de primă generație .……………………………………22
1.7 Arhitectura Harvard…………………………………………………………..23
1.8 A doua generație: calculatoare cu tranzistoare……………………………….24
1.9 A treia și a patra generatie……………………………………………………25
CAPITOLUL 2 – Noțiuni teoretice …………………………………………………….27
2.1 Caracteristicile microcontrolerelor………….……………………………..…27
Memoria Microcontrolerelor………………………………………………28
Interfața externă……………………………………………………………30
Familii de microcontrolere……………………………………………….. 32
2.2 Caracteristicile tranzistorilor…………………………………………………37
2.3 Sistem de afișare LCD…………………………………………………….….46
CAPITOLUL 3 – Implementarea proiectului……………………………………………49
3.1 Metodologie…………………………………………………………………..49
3.2 Descrierea componentelor și a principiului de funcționare………………..…50
Rezervor……………………………………………………………………51
Senzori…………………………………………………………………….52
Circuit de comparare………………………………………………………52
Microcontroler………………………………………………………….…54
Unitate de afișare………………………………………………………….60
Pompa………………………………………………………………………63
3.3 Punerea în comun a componentelor și testarea circuitului………………….. 63
3.4 Lipirea componentelor pe placă și integrarea circuitului…………………….64
Concluzii…………………………………………………………………………………67
Bibliografie………………………………………………………………………………69
Lista figurilor și lista tabelelor
Figura 1.1 Calculatorul mecanic CURTA……………………………………………………..19
Figura 1.2 Arhitectura von Neumann……………………………………………………………21
Figura 1.3 Memorie cu ferite……………………………………………………..22
Figura 1.4 Arhitectura Harvard…………………………………………………..23
Figura 2.1 Schema simplificată a unui microcontroler XX51……………………32
Figura 2.2 Microcontroler XX51 cu impachetare DIP……………………………33
Figura 2.3 Arhitectura internă a microcontrolerelor 8051……………………….35
Figura 2.4 Ceasul sistemului……………………………………………………..36
Figura 2.5 Funcționarea unui tranzistor bipolar……………………………….…38
Figura 2.6 Simbolurile tranzistoarelor bipolare………………………………….38
Tabelul 2.1 Regimurile de funcționare ale tranzistorului în funcție de polarizarea joncțiunilor……………………………………………………………………….39
Figura 2.7 Model simplificat al tranzistorului bipolar la semnal mic…………….40
Figura 2.8 Scheme echivalente pentru tranzistorul bipolar saturat………………..41
Figura 2.9 Tipurile de conexiuni ale tranzistorului bipolar………………………42
Figura 2.10 Mărimile de intrare si de ieșire ale conexiunii emitor comun…..…..43
Figura 2.11 Familiile de caracteristici statice ale conexiunii emitor comun……..43
Figura 2.12 Caracteristica de transfer în tensiune……………………………..…44
Figura 2.13 Metode de afișare folosind celule LCD……………………………..46
Figura 2.14 Ecran LCD 16×2…………………………………………………….47
Figura 2.15 Interfața ecranului LCD 16×2……………………………………….48
Figura 3.1 Diagrama bloc a sistemului……………………………………………49
Figura 3.2 Diagrama funcțională a sistemului……………………………………51
Figura 3.3 Circuit de comparare nealimentat…………………………………….53
Figura 3.4 Circuit de comparare alimentat……………………………………….54
Figura 3.5 Descrierea pinilor ATmega32…………………………………………55
Tabel 3.1 Microcontrolere suportate de USBasp……………………………………………56
Figura 3.6 USBasp…………………………………………………………………………………….57
Figura 3.7 Descrierea pinilor interfeței ISP………………………………………57
Figura 3.8 Conectarea microcontrolerului cu USBasp……………………………58
Figura 3.9 Fragment din codul sursă..……………………………………………59
Figura 3.10 Conectarea microcontrolerului ATmega32 la un ecran LCD 16×2…61
Tabel 3.2 Cele mai utilizate comenzi ale modulului LCD……………………….62
Figura 3.11 Testarea circuitului…………………………………………………..63
Figura 3.12 Circuitul văzut din spate…………………………………………….64
Figura 3.13 Circuitul văzut de sus………………………………………………..65
Figura 3.14 Varianta finală a dispozitivului………………………………………66
Lista Acronimelor
CI = Serial Communications Interface
CPU = Central Processing Unit
DIP/DIL = Dual in-line Package
EEPROM = Electrically Erasable Programmable Read-Only Memory
EPROM = Erasable Programmable Read Only Memory
ISP = In System Programming
JTAG = Joint Test Action Group
LIN = Local Interconnect Network
NOVRAM = Non-Volatile Random-Access Memory
OTP = One Time Programmable
PLCC = Plastic Leaded Chip Carrier
PQFP = Plastic Quad Flat Package
RAM = Random-Access Memory
ROM = Read Only Memory
SOIC = Small Outline Integrated Circuit
SPI = Serial Peripheral Interface
SMD = Surface-Mount Device
TQFP = Thin Quad Flat Package
UART = Universal Asynchronous Receiver Transmitter
USB = Universal Serial Bus
Introducere
Insuficiența apei potabile este una dintre cele mai mari probleme pe care le confruntă orașele mari ale lumii, cauza principală fiind pierderile în timpul transportului. Această problemă a reprezentat motivația principală pentru cercetare, soluția fiind folosirea sistemelor computaționale pentru a diminua pierderile, a salva energie și de a ajuta mediul și circuitul apei în natură pentru a ne asigura apa pe viitor. Soluția este folosirea unui sistem automat de control a unei pompe, implementat prin diferite tehnologii.
Acest proiect: “Sistem electronic de monitorizare a nivelului de lichid dintr-un rezervor” este proiectat pentru a ușura controlul nivelului de lichid (apă, petrol, etc) dintr-un rezervor. Sistemul are o pompă atașată care pornește automat în momentul în care nivelul minim de lichid este atins și se oprește automat atunci când nivelul de lichid este maxim. O problemă importantă în lume este de a avea o rezervă sustenabilă de apă. Câteva din motivele care duc la această problemă sunt: rețea de apă slab alocată, utilizare ineficientă și lipsa unor sisteme integrate adecvate. Apa este folosită în agricultură, industrie și pentru consumul uman, așadar controlul și managementul bun sunt obiective obligatorii. Într-o casă obișnuită, metoda clasică de umplere a unui rezevor este pornirea manuală a pompei atunci când rezervorul este gol și oprirea ei după ce rezervorul s-a umplut. Sistemul propus asigură un flux continuu de apă la orice oră, controlează și menține nivelul de apă, elimină stresul de a porni și opri pompa manual, salvează timp, energie, apă și reduce uzura pompei.
Pompele sunt esențiale în domeniul furnizării apei, pompe din lemn au existat încă din anii 1700 și erau utilizate pentru a goli compartimentele inferioare ale navelor. Erau făcute din bușteni și pistoane de lemn pentru a crea sucțiune. La începutul anilor 1800 au apărut pompe din metal care funcționau pe abur, însă după apariția curentului electric s-au dezvoltat pompe mai performante la nivel industrial. Layne Bowler a inventat prima pompă de apă cu turbină verticală în 1894 și Jacuzzi a inventat prima pompă submersibila în 1920. Aceste invenții au permis dezvoltarea multor sisteme publice de apă la sfârșitul anilor 1800.
Controlul automat al pompei de apă reprezintă o serie de funcții ce modifică starea unui microcotroler atașat rezervorului. Senzorul de nivel este realizat dintr-o plăcuță din material conductor atașată pe rezervor, un senzor este montat în partea de sus a rezervorului pentru a detecta nivelul de supraplin și un senzor la fundul rezervorului pentru a detecta nivelul de gol. În viața de zi cu zi există câteva elemente fizice pe care trebuie să le controlăm spre confortul nostru. Așadar, un sistem de control poate fi definit ca o unealtă, sau un set de unelte, care manageriază, comandă, direcționează sau regulează comportamentul celorlalte unelte sau sisteme. În consecință, controlul automat implică crearea unui sistem de control care să funcționeze cu o minimă intervenție a omului (de preferat fără intervenția omului). Sistemele inteligente sunt utilizate într-o gamă largă de domenii, de la științele medicale la cele financiare, educaționale, legislative, și așa mai departe. Multe dintre acestea sunt implementate în lucrurile pe care le folosim zilnic.
Lucrări asemănătoare
Khaled Reza el al (2010) a introdus noțiunea de monitorizare și management al nivelului de lichid dintr-un rezervor în contextul conductivității electrice a apei. Autorii au fost motivați de prețurile destul de mici ale tehnologiei necesare realizării proiectului, precum și de ideea că managementul apei va ajuta la reducerea consumului de energie și diminuarea risipei de apă; investigând capabilitatea de control și senzitivitate a unui microcontroler prin fir sau wireless. Rezultatul cercetării a fost un sistem flexibil, economic și ușor de configurat, bazat pe un microcontroler ieftin de tip PIC16F84A și în final a fost propus un serviciu de monitorizare bazat pe internet care determină nivelul de apă global.
Un sistem automat de irigații a fost creat de Gunturi în anul 2013. Principalul scop al cercetării a fost crearea unui sistem de irigații care funcționează cu cât mai puțină mână de lucru, și care în final a salvat fonduri și apă. Cercetătorii au programat un microcontroler 8051 folosind un semnal de întrerupere din exterior, cu această idee au implementat tot sistemul. Senzori de temperatură și umiditate au fost conectați la porturile microcontrolerului prin intermediul unui comparator, de fiecare dată când acești senzori simțeau o schimbare în temperatură sau umiditate trimiteau un semnal de întrerupere microcontrolerului și acesta activa stropitorile.
Prin intermediul unei lucrări publicate de Hodgson și Walter care se baza pe un sistem global real și folosind un program optimizat în locul celui tradițional, au avut un real succes în ceea ce înseamnă costuri de fabricație. Acești cercetători au luat în discuție potențialul optimizării tehnologiei moderne din industrie și au prezentat exemple de reducere a costurilor pe baza experiențelor.
Rojiha (2013) a analizat sistemul existent de pompare al petrolului și a descoperit că acesta consumă multă energie și necesită o mână de lucru considerabilă. El a propus o rețea de senzori bazată pe un control inteligent pentru a economisi energie și o monitorizare eficientă a integrității puțurilor. Câțiva senzori au fost folosiți pentru a strânge date despre starea puțurilor, aceste date sunt trimise către microcontroler care va procesa datele și va trimite semnale către unitatea de control a fiecărei pompe. Dacă apare orice anormalitate, ea este detectată de către microcontroler care va trimite un sms inginerului de pe teren. Acest sistem a permis facilitarea controlului sistemelor de pompare din orice loc de pe pământ.
Pompele de circulație pentru instalațiile de incălzire se află printre consumatorii importanți de energie electrică al clădirilor datorită duratei anuale mari de funcționare. Pompele pentru instalatiile de incălzire fără sistem de reglare (necontrolate electronic) funcționează la turație constantă, astfel consumă multă energie și bani. Consumul de energie electrică aferent pompelor de circulație poate fi micșorat simțitor cu ajutorul unui sistem automat de reglare a debitului pompei. Prin acesta, costurile se pot reduce pană la 50%. Cu ajutorul pompelor de inaltă eficientă, se poate economisi chiar și pană la 90% comparativ cu pompele standard (fără sistem de reglare).
Obiective
Obiectivul acestei lucrări este de a construi o machetă total funcțională a unui sistem automat de monitorizare a nivelului de apă dintr-un rezervor. Acestă machetă va funcționa identic principial ca un sistem real de orice mărime (rezervor de cel puțin 200 de litrii și o pompă de putere corespunzătoare). Principalele obiective sunt:
Realizarea unui sistem automat de monitorizare ieftin, ce reduce consumul de apă;
Implementarea unui sistem de afișare folosind fotodiode sau ecran LCD;
Prevenirea utilizării excesive a pompei. După un anumit timp de funcționare pompa se va opri pentru a diminua uzura acesteia;
Realizarea unui dispoztiv economic din punct de vedere al consumului de energie (circuitul poate fi alimentat la o tensiune de 5V).
Justificarea proiectului
Acest proiect țintește să prezinte o viziune a implementării unui circuit de control într-un sistem automat de monitorizare a nivelului de lichid dintr-un rezervor prin intermediul unui microcontroler și a unei pompe de apă. Una dintre motivațiile pentru acest domeniu de cercetare a fost necesitatea de a elimina problema insuficienței apei în diferite zone diminuând cauzele majore: risipa apei în timpul pompării și colectarea ei în rezervoare. Este nevoie de un sistem autonom ce înlătură eroarea umană asociată pompelor de apă, eficacitatea acestui sistem este că un individ nu va știi niciodată nivelul de lichid din rezervor sau când să pună pompa în funcțiune fără să fie nevoit să verifice personal. Dacă se risipește mai puțină apă se vor reduce costurile de pompare și se va putea salva apă pe viitor.
Dificultăți în realizarea proiectului
Cele mai mari probleme pe care le-am întâlnit pe parcursul realizării proiectului au fost: dificultătile în a găsi o structură de design pentru proiect, căutarea materialelor și componentelor necesare cu specificațiile potrivite, dificultatea programării microcontrolerului și a ecranului LCD, și nu în ultimul rând lipirea componentelor pe placă.
Capitolul 1 – Sisteme de calcul
Introducere
La început, calculele dificile sau complexe erau efectuate de oameni al căror unic rol era acesta. Acești calculatori se ocupau de regulă de efectuarea calculelor unei expresii matematice, de exemplu pentru efemeride în astronomie, pentru navigație sau pentru tabelele de tragere în artilerie. Calculele acelor vremuri erau foarte specializate și costisitoare și necesitau ani de pregătire matematică. [1]
In antichitate și în evul mediu au fost contruite mai multe variante de calculatoare analogice pentru efectuarea de calcule astronomice. Printre acestea se numără mecanismul Antikythera și astrolabul din Grecia antică, fiind considerate primele calculatoare analogice mecanice. Alte versiuni vechi de aparate mecanice utilizate pentru calcule au fost: planisfera, invențiile lui Abū Rayhān al-Bīrūnī, equatoriumul și astrolabul universal al lui Abū Ishāq Ibrāhīm al-Zarqālī, turnul cu ceas astronomic al lui Su Song din timpul dinastiei Song și calculatoarele analogice astronomice ale altor astronomi și ingineri din lumea arabă medieval.
Primul calculator analogic programabil este considerat a fi „Ceasul din castel”, un ceas astronomic inventat de Al-Jazari în 1206. Acesta afișa zodiacul, orbitele lunii și soarelui, deschiderea automată a ușilor la fiecare oră era determinată de un arătător în formă de semilună ce se deplasa de-a lungul unei porți, și avea cinci cântăreți sculptați care cântau când erau loviți cu o pârghie declanșată de un arbore cu came atașat unei roți cu apă. Problema schimbării duratei zilei și nopții pe timpul anului era rezolvată deoarece duratele puteau fi schimbate în fiecare zi.
John Napier, matematician și fizician scotian, a descoperit că înmulțirea și împărțirea numerelor se poate efectua prin adăugarea, respectiv prin scăderea logaritmilor acestor numere. Napier a avut nevoie să efectueze multe înmulțiri pentru generarea tabelelor de logaritmi, așadar a proiectat oasele lui Napier, un dispozitiv similar abacului, utilizat pentru înmulțire și împărțire.
Primul calculator numeric mecanic a fost conceput de către omul de știință german Wilhelm Schickard în 1623. Acest calculator a fost numit „ceas calculator” pentru că folosea tehnici cum ar fi roțile dințate, ele fiind dezvoltate inițial pentru ceasuri. Schickard Johannes Kepler a revoluționat astronomia formulând legile mișcării planetelor cu ajutorul calculatorului. Au urmat mașinile lui Blaise Pascal (Pascaline, 1642) și Gottfried Wilhelm von Leibniz (1671). La muzeul Zwinger se păstrează un calculator original al lui Pascal (1640). Leibniz a spus odată că „este nedemn de un om excelent să irosească ceasuri întregi trudind ca un sclav efectuând calcule pe care le-ar putea liniștit lăsa în seama altora dacă s-ar folosi mașini”.
Aritmometrul Thomas, inventat de Charles Xavier Thomas (1820) a fost primul calculator mecanic produs în serie, el putea efectua adunări, scăderi, înmulțiri și împărțiri. Calculatoarele mecanice au continuat să fie folosite până în anii 1970 (Addiator, comptometrul, calculatoarele Monroe, Curta și Addo-X). Sistemul de numerație binar descris de Leibniz este principiul central al tuturor calculatoarelor moderne. Până în anii 1940, multe proiecte ulterioare s-au bazat pe sistemul zecimal (mașinile lui Charles Babbage din anii 1800 și chiar ENIAC din 1945); numărătoarele ENIAC emulau operarea roților cu cifre ale unei mașini mecanice de adunat. Ryoichi Yazu a brevetat in Japonia calculatorul mecanic denumit aritmometru Yazu (1903), era compus dintr-un singur cilindru și 22 de roți dințate, folosind sistemele mixte în bază 2 și 5, bine cunoscute de utilizatorii abacului japonez. Sfârșitul calculului și transportul se determinau automat, s-a vândut în peste 200 de exemplare, în special agențiilor guvernamentale cum ar fi Ministerul de Răzoi și stațiilor experimentale agricole.
1.2 Calculatoare de birou: 1930-1960
Evoluția calculatoarelor a însemnat reproiectarea calculatoarelor mecanice (case de marcat, mașini contabile, etc) folosind motoare electrice, astfel poziția roților dințate va reprezenta starea unei variabile. În jurul anilor 1920, datorită interesului lui Lewis Fry Richardson asupra domeniului meteorologic, a propus folosirea analizei numerice de către calculatori matematicieni pentru modelarea fenomenelor meteorologice; însă la începutul secolului al XXI-lea, sunt necesare cele mai avansate calculatoare existente pentru o modelare adecvată a atmosferei cu ajutorul ecuațiilor Navier-Stokes. O dată cu începutul anilor 1930, un grup de companii precum Friden, Marchant Calculator și Monroe au lansat calculatoare de birou capabile să facă adunări, scăderi, înmulțiri și impărtiri. Richard Feynman, un viitor laureat al premiului Nobel a monitorizat o echipă de matematicieni care înțelegeau ecuațiile diferențiale ce trebuiau rezolvate în cadrul proiectului Manhattan.
Curta este un calculator mecanic de dimensiuni mici (echivalent cu o râșniță de piper) lansat în anul 1948, însă în anii ce vor urma (1950-1960) vor apărea pe piață o sumă de mărci de mașini de calcul. Calculatorul fabricat în Marea Britanie ANITA Mk.VII a fost primul calculator de birou electronic, utilizând un afișaj cu tuburi Nixie și 177 de tiratroane miniaturizate. Mașina creată de Friden în luna iunie a anului 1963 denumită EC-130 a fost proiectată folosind numai tranzistoare, avea patru funcții, costa 2200 de dolari, o capacitate de 13 digiti și un afișaj CRT de 130 mm. Încă două funcții au fost adăugate la modelul îmbunătățit EC-132: calcul rădăcinii pătrate și inversarea funcțiilor. Laboratoarele Wang au lansat pe piață în anul 1965 LOCI-2, acest mini-calculator cu 10 digiți putea calcula logaritmi și avea un afișaj cu tuburi Nixie.
Figura 1.1 Calculator mecanic CURTA
Sursa: [1]
Calculatoare analogice avansate
Calculatoarele analogice mecanice și electrice erau considerate cele mai performante sisteme de calcul înaintea celui de-al doilea război mondial. Calculatoarele analogice se folosesc de similitudinile dintre matematica proprietăților microscopice, poziția și mișcarea roților sau potențialul și curentul electric și matematica altor fenomene fizice, ca de exemplu: traiectoriile balistice, inerția, rezonanța, transferul de energie, impulsul. Sunt modelate fenomenele fizice folosind drept cantități analogice tensiuni și curenți electrici.
În principal, modul de funcționare se bazează pe crearea unor circuite electrice corespondente ale altor sisteme, permițând inginerilor să prezică comportarea acelor sisteme de interes prin observarea corespondențelor lor analogice. Cea mai interesantă analogie este modul în care comportamentul la scară microscopică este reprezentat prin ecuații diferențiale și integrale, și poate fi utilizat pentru a rezolva acele ecuații. Integratorul cu apă construit în 1928 folosea apa drept cantitate analogică, mașină Mallock apărută în 1941 folosea curentul electric, iar planimetrul (dispozitiv ce calculează integrale) folosea distanța. Sistemele HVAC au utilizat aer atât drept cantitate analogică cât și ca element de control. Calculatoarele analogice prezintă necesitatea reconfigurării (reprogramării) manuale pentru a trece la rezolvarea altei probleme (nu sunt flexibile). Calculatoarele analogice prezentau avantajul că puteau fi utilizate pentru a rezolva probleme complicate utilizând analogii comportamentale, încercările pe primele calculatoare numerice fiind limitate.
Calculatoarele reprezentau o raritate în perioada aceea, soluțiile analogice ale unor probleme cum ar fi distribuția presiunilor și temperaturilor într-un sistem de incălzire erau date sub forma unor bucăți de hârtie (monograme). Funcționarea dispozitivelor de țintire (sistemul de ghidare a bombardamentelor Norden precum și sistemele de control al tragerilor) se bazau pe calculatoare analogice. Acestea s-au folosit câtiva zeci de ani după al doilea război mondial; de exemplu calculatorul de control al tragerilor Mark I a fost implementat de marina Statelor Unite Ale Americii pe mai multe nave de la distrugătoare la cuirasate.
Analizatorul diferențial a reprezentat apogeul științei calculatoarelor analogice, conceput în 1876 de James Thomson însă a fost construit de H. W. Nieman și Vannevar Bush la MIT începând cu 1927. Numărul de dispozitive construite a fost destul de redus, cel mai performant a fost construit la Școala Moore de Inginerie Electrică de la Universitatea Pennsylvania (aici a fost construit și ENIAC). Până la sfârșitul anilor 60 s-au mai folosit calculatoare analogice hibride (controlate de electronica digitală) în aplicații specifice, dar majoritatea calculatoarelor analogice au dispărut o dată cu apariția calculatoarelor electronice numerice (ENIAC).
1.4 Calculatoare digitale
În jurul perioadei celui de al doilea război mondial, mașinile de calcul s-au dezvoltat foarte mult deoarece componentele mecanice au fost înlocuite de cele electronice (bobine, condensatoare, rezistoare, relee și tuburi electronice). Calculatoarele analogice au fost înlocuite de calculatoarele digitale, astfel s-au putut construi mașini precum Z3, Colossus, ENIAC și calculatorul Atanasoff–Berry folosind circuite ce conțineau relee sau tuburi electronice (foloseau benzi perforate ca mediu de stocare). O dată cu dezvoltarea capabilităților, aceste mașini începeau să semene cu calculatoarele moderne. Momentul nașterii calculatoarelor digitale nu este fixat în istorie, însă calculatoare precum Colossus și EDSAC sunt recunoscute ca fiind printre primele dispozitive de calcul numerice.
Alan Turing a publicat o lucrare în anul 1936 ce s-a dovedit a fi un pas imens în dezvoltarea informaticii și a științei calculatoarelor, a constat în demonstrarea existenței unor probleme ce nu poate fi rezolvată de niciun procesor secvențial. Pe baza acelei lucrări a construit un calculator universal care execută un program stocat pe o bandă, denumit mașina Turing, înlocuind limbajul de o complexitate mare și bazat pe aritmetică dezvoltat de Kurt Gödel. Calculatoarele moderne sunt denumite Turing-complete deoarece au o capabilitate de rezolvare a algoritmilor echivalentă cu cea a mașinii Turing.
1.5 Arhitectura von Neumann
Ideea lui von Neumann a fost de a construi o mașină de calcul care să aibă o memorie suficient de mare pentru a stoca instructiuni alături de date și rezultatele calculelor. El a creat un sistem de calcul în care instrucțiunile pot fi la fel de ușor de modificat ca și operanzii cu care se lucrează, așadar pentru simplitate, instrucțiunile sunt codificate numeric și salvate în aceeași memorie ca și datele. S-a dezvoltat un subsistem de prelucrare a informației pentru a avea acces la instrucțiunile codificate. Instrucțiunile sunt încărcate din memorie pentru a fi executate și se face diferențierea între un operand și o instrucțiune, însă nu există nicio diferență formală între acestea.
Adresa instrucțiunii următoare este reținută de un contor de program (program counter), aceasta va fi ulterior încărcată din memorie și apoi executată (imediat după instrucțiunea curentă). Arhitectura von Neumann permite instrucțiunilor să poată prelucra și alte instrctiuni pe lângă date. Programul are un caracter dinamic deoarece se poate modela.
După cum se poate observa în figura de mai jos, arhitectura cuprinde patru module importante: un modul de procesare a instrucțiunilor și anume unitatea aritmetico-logică (UAL), o unitate de control ce supervizează rularea instrucțiunilor din program, o memorie centrală unde sunt stocate datele și instrucțiunile utilizate și porturi de intrare/ieșire (I/E) pentru comunicația cu alte medii. Toate acestea sunt conectate printr-o magistrală (bus) ce conduce datele de calcul și datele de program în diferite zone ale arhitecturii.
Figura 1.2 Arhitectura von Neumann
Sursa: [2]
1.6 Mașini von Neumann de primă generație
O mașină de calcul este un calculator universal dacă prezintă un mecanism de scirere-citire (ex: cartele sau benzi perforate). John von Neumann a creat o arhitectură bazată pe modelul teoretic al lui Alan Turing (modelul sistemului universal de calcul) ce folosește o memorie comună pentru stocarea datelor și programelor, fiecare calculator modern utilizează această arhitectură sau una derivată din aceasta. După cum am menționat în capitolele anterioare, este posibilă realizarea unui calculator complet mecanic (Babbage), însă tehnologia electronică vine cu o serie de avantaje: viteză sporită și un grad de miniaturizare inimaginabil.
Limitările proiectului ENIAC au fost recunoscute de către Eckert și Mauchly care au lansat un proiect îmbunătățit ce avea spațiu de stocare, acel proiect a fost numit EDVAC. Ulterior John von Neumann a realizat un raport despre proiectul EDVAC unde memoria de program și memoria de date erau salvate într-un singur spațiu comun. În urma raportului această arhitectură s-a denumit arhitectura von Neumann și a reprezentat baza dezvoltării viitoarelor calculatoare din întreaga lume. La aceea vreme, spațiul temporar de stocare era format din linii cu întârziere, tehnologia era bazată pe timpul de întârziere a sunetului prin diferite medii (ex: cablu, mercur lichid) pentru stocarea temporară a datelor. Impulsurile acustice se propagă de-a lungul unui cablu sau tub și atunci când ele ajung la capăt niște circuite electronice făceau detecția dacă acel impuls simbolizează un 1 sau un 0, apoi oscilatorul retransmitea impulsul. O altă metodă de stocare erau tuburile Williams, aceste tuburi catodice aveau proprietatea de a stoca și accesa date. Memoriile cu ferite au fost cele mai folosite mecanisme de stocare temporară până spre finalul anilor 1970.
Figura 1.3 Memorie cu ferite
Fiecare miez magnetic reprezintă un bit.
Sursa: [1]
1.7 Arhitectura Harvard
Arhitectura Harvard este în principal caracterizată prin faptul că memoria de date și memoria de instrucțiuni sunt separate. Denumirea este luată de la Harvard Mark I, o mașină de calcul care stoca instrucțiuni pe 24 de biți folosind o bandă perforată, iar datele erau stocate în contoare electromagnetice cu capacitate maximă de 23 de cifre. Un fapt important al acestei arhitecturi este că cele două memorii de date și de instrucțiuni nu au aceleași caracteristici, asta datorită tehnologiei de implementare, lungimii cuvintelor și a structurii memoriei. În cele mai multe cazuri memoria de instrucțiuni este mai mare decât cea de date. Un microcontroler PIC are datele pe 8 biți și lucrează cu instrucțiuni de la 12 până la 32 de biți. Memoriile pot fi de mai multe tipuri dar este practicat ca instrucțiunile să fie stocate într-o memorie de tipul “read-only” (doar citire) iar datele să fie salvate într-o memorie de tipul citire-scriere.
Într-o arhitectură von Neumann nu pot fi executate două instrucțiuni în același timp pentru că se utilizează aceeași magistrală pentru a aduce o instrucțiune pentru procesare și pentru a citii sau scrie date în memorie. În schimb arhitectura Harvard permite citirea unei instrucțiuni din memoria de program și accesul în memoria de date în același timp. Acest lucru este posibil deoarece există magistrale diferite pentru date și pentru instrucțiuni. Arhitectura Harvard este mai rapidă și prezintă spații de adresare diferite pentru date și instrucțiuni (ex: adresa 0 pentru date nu corespunde cu adresa 0 pentru instrucțiuni).
În perioada modernă, arhitectura Harvard este utilizată în mare parte în două tipuri de dispozitive:
Procesoare de semnal (DSP) specializate din cadrul aparatelor pentru prelucrarea semnalelor video și/sau audio.
Microcontrolere din aplicațiile electronice (ex: PIC de la compania Microchip, AVR de la compania Atmel); ele au dimensiunea memoriilor de date și de program redusă și utilizează arhitectura RISC ce permite executarea instrucțiunilor într-un singur ciclu mașină.
Figura 1.4 Arhitectura Harvard
Sursa: [3]
1.8 A doua generație: calculatoare cu tranzistoare
Tuburile electronice au fost înlocuite cu tranzistoare bipolare (TB) pe la jumătatea anilor 1950, dând naștere unei noi gererații de calculatoare. Inițial, opinia producătorilor a fost că se vor utiliza un număr mic de calculatoare la nivel global deoarece erau mari, scumpe și necesitau oameni instruiți pentru a le utiliza și a interpreta rezultatele. Însă folosirea tranzistorului a redus semnificativ prețul și dimensiunea calculatoarelor. Tranzistorul bipolar a fost inventat în anul 1947 de către John Bardeen, Walter Brattain și William Shockley, ulterior au primit premiul Nobel pentru Fizică (1956). Principiul de funcționare a acestui dispozitiv este următorul: dacă prin joncțiunea emitor-bază nu circulă curent rezultă că nu circulă curent nici între colector și emitor (tranzistorul este considerat blocat); iar dacă un curent suficient de mare este forțat prin bază atunci joncțiunea bază-emitor se va deschide și va circula curent între emitor și colector (tranzistor deschis sau saturat). Aceste două stări prin care trece tranzistorul sunt reprezentate prin cifrele binare 0 și 1. Avantajele față de folosirea tuburilor electronice sunt următoarele: costuri mici de fabricație, viteză mare de comutare (comutarea durează un timp de ordinul microsecundelor), capacitate de integrare mult mai mare (volumul unui tranzistor este de câțiva milimetrii, cu un ordin de mărime mai mic decât a unui tub electronic) și fiabilitate datorită temperaturilor joase de funcționare. Această tehnologie a permis calculatoarelor cu tranzistoare să fie dotate cu sute de mii de circuite logice binare.
Evoluția electronicii a dus și la îmbunătățirea dispozitivelor periferice, de exemplu IBM 350 RAMAC a fost primul hard-disk (1956). Capacitatea de stocare pe disc magnetic era de câteva zeci de milioane de litere și cifre, astfel unui procesor i se putea atașa mai multe periferice crescând capacitatea de memorare (sute de milioane de caractere). Mai existau și unități de disc deconectabile, astfel o stiva de discuri putând fi înlocuită imediat, însă nu aveau o capacitate de stocare la fel de mare ca cea a unui disc fix.
Mai multe din procesoarele de a doua generație funcționau împreună, astfel în timpul în care procesorul de comunicație controla citirea și perforarea cartelelor, executarea calculelor rămânea în sarcina procesorului principal. Procesorul principal trimitea datele către memoria principală prin magistrala de date și celelalte magistrale de date conectau dispozitivele periferice. Ca exemplu, pe un PDP-1 ciclul memoriei dura 5 µs rezultă că o instrucțiune dura 10µs (o sută de mii de operații pe secundă) pentru că o instrucțiune dura cel puțin două cicluri de mașină (aducerea instrucțiunii și operanzilor).
1.9 A treia și a patra generație
O dată cu invenția circuitului integrat de către Jack St. Clair Kilby numărul de calculatoare vândute a explodat. Următorul pas important a fost inventarea micrcoprocesorului (Ted Hoff, Federico Faggin, și Stanley Mazor de la Intel). Primul procesor integrat lansat în anul 1971 s-a numit Intel 4004 și avea 12 mm², fiind compus din 2300 tranzistoare.
Sperry Univac a fabricat calculatoare din a două generație (UNIVAC 494) până în anul 1975. Proiectarea limbajelor de programare a fost influențată de sistemele Burroughs (B5000) fiind mașini cu stivă și ușor de programat și au fost implementate în microprocesoare apărute ulterior. După apariția microprocesorului și-au făcut apariția microcalculatoarele (1970) ce erau vândute persoanelor private sau firmelor. Dezvoltatorul primului calculator personal fabricat în serie se consideră a fi Steve Wozniak (cofondator Apple Computer), însă așanumitul Apple I a apărut după după MOS Technology KIM-1 și Altair 8800.
Memoriile cu semiconductori sunt fiabile deoarece operează fără erori și sunt garantate pe viață iar unele sisteme de operare cum ar fi Unix poate rula teste de memorie pentru a verifica funcționalitatea hardware. În secolul XXI este nevoie de o fiabilitate cât se poate de mare .
Printre ultimele tehnologii apărute se numără și procesoarele cu mai multe nuclee ce folosesc tablouri de celule de memorare. O dată ce memoriile cu semiconductori s-au răspândit peste tot și limbajele de programare s-au simplificat, codurile sursă ale programelor au devenit ușor de înțeles, spre deosebire de programarea unei memorii cu tamburi ce presupunea ca programatorul să știe poziția în timp real a capului de citire de-a lungul rotațiilor tamburului. O dată cu apariția tehnologiei CMOS, consumul de energie al calculatoarelor s-a diminuat foarte mult și în același timp prețul a scăzut, aceste lucruri au fost fundamentale pentru dezvoltarea tehnologică din ziua de azi.
Capitolul 2 – Noțiuni teoretice
2.1 Caracteristicile microcontrolerelor
Un microcontroler este un microcircuit care incorporează o unitate centrală (CPU) și o memorie împreună cu resurse care-i permit interacțiunea cu mediul exterior [4]. Folosirea unui microcontroler reprezintă o metodă prin care se reduce drastic numărul de componente dar și costul proiectării și dezvoltării unui dispozitiv.
Aplicațiile în care se folosesc microcontrolere se regăsesc în categoria sistemelor încapsulate-integrate (“embedded systems”), unde sistemul de calcul nu este observat de către utilizator. Acestea sunt utilizate într-o gamă largă de aplicații: în industria construcțiilor de mașini (sisteme de alarmă, senzori de parcare, camere video, scaune electrice, etc.), în industria electronică de consum (televizoare, monitoare, laptopuri, camere de fotografiat, telefoane, jocuri, etc.), în fabricarea electrocasnicelor (frigidere, blendere, cuptoare cu microunde, aragazuri, etc), în medicină (RMN, analize, aproape toată aparatura din spitale conține componente electronice), în sistemele de securitate, în controlul mediului, în mijloacele de transport (avioane, nave, trenuri, metrou, etc.), în industria aerospațială, în instrumentația de măsură (traductoare, senzori, detectoare) și în multe alte domenii.
Un microcontroler este compus din urmatoarele componente fundamentale:
unitate centrală (CPU), cu un oscilator intern pentru ceasul de sistem;
o memorie locală tip ROM/PROM/EPROM/FLASH și eventual una de tip RAM;
un sistem de întreruperi;
I/O – porturi pentru intrări/ieșiri numerice;
un port serial de tip asincron și/sau sincron, programabil;
un sistem de temporizatoare (numărătoare) programabile.
Unitatea centrală de calcul (CPU) este cea mai importantă componentă a unui microcontroler pentru că aici se procesează informația, se citesc și se execută instrucțiunile apoi se scriu în memorie rezultatele. Unitatea centrală de procesare poate fi de două feluri:
RISC (Reduced Instruction Set Computer) reprezintă un tip de procesor ce a fost implementat cu succes și în cadrul microcontrolerelor. După cum spune și denumirea, această arhitectură poate executa un set mai redus de instrucțiuni dar care se realizează într-un timp scurt, astfel circuitul va avea o complexitate mai redusă și se va câștiga suprafață. Un procesor RISC are următoarele caracteristici: arhitectură von Neumann sau Harvard, viteză mare de execuție datorită tehnologiei pipeline, instrucțiuni simple și simetrice, adresare simplă a memoriei și complexitate minimă.
CISC (Complex Instruction Set Computer) are un număr mare de instrctiuni cu o complexitate ridicată, iar acest tip de procesor este des întâlnit în multe din microcontrolere. Instrucțiunile nu seamănă între ele: unele lucrează cu registre specifice, iar altele au implementate moduri de adresare diferite. Avantajul este că se ușurează codul programului deoarece este folosită o singură instrucțiune mai complexă în loc de o sumă de instrucțiuni fixe.
Microcontrolere în ziua de azi sunt foarte diversificate și pot îndeplini funcții complexe. Puterea de calcul este măsurată în funcție de lungimea cuvântului de date (dimensiunea informației ce este transportată pe magistrala de date). Aceasta variază de la 4 până la 32 de biți, existând variante chiar și de 64 de biți.
Tehnologia de fabricație pe baza căreia sunt fabricate microcontrolerele este CMOS din mai multe motive: capacitate mare de integrare, imunitate mare la perturbații și consum mic de energie dar care depinde de frecvența de lucru (pot fi alimentate la o baterie). Logica internă statică permite reducerea sau oprirea frecvenței de ceas pentru a obține un consum mai mic de energie. Domeniul temperaturilor de funcționare este extins de la -40oC până la +85oC, mărind în același timp și domeniul de utilizare al microcontrolerelor. Cele mai populare variante de încapsulare sunt din plastic sau ceramică. Există variante de încapsulare cu pini de tipul DIP/DIL (între 8 și 64 de pini) și variante de încapsulare ce se montează pe suprafață (SMD): PLCC, TQFP, PQFP, SOIC, etc.
Memoria Microcontrolerelor
Microcontrolere au fost optimizate pentru achiziții de date și aplicații de monitorizare și control, în general pentru aplicații de timp real [5]. Microcontrolerul are o memorie internă de tip RAM (Random Access Memory) de dimensiune desul de redusă (maxim câteva mii de octeți), scopul ei fiind de a memora date (variabile, rezultate) și poate fi implementată sub forma unui set de registre. Mai există un tip de memorie care este folosită de microcontroler și anume memoria de program, ea poate fi de tip ROM (Read Only Memory) sau EPROM (Erasable Programmale Read Only Memory) în scopul dezvoltării sau producției la scară mică, iar pentru producția în masă este folosită memoria de tip mask-ROM. În continuare sunt prezentate câteva tehnologii folosite:
1) OTP (One Time Programmable)- mulți dintre producători lansează pe piață tipuri de microcontrolere care sunt dotate cu o astfel de memorie, practic este o memorie PROM având o mică deosebire față de tipul EPROM, și anume îi lipsește fereastra de cuarț folosită pentru ștergere. Automat această variantă este mai ieftină și este ideală pentru un lot mic de producție, folosit pentru testarea codului. După validare se trece la folosirea tipului mask-ROM, acestea fiind cele mai economice pentru o producție în masă.
2) FLASH EPROM- este un tip de memorie folosită exclusiv ca memorie de program. Este nevolatilă (conținutul ei nu este șters după întreruperea alimentării), suportă zeci de mii de cicluri de programare (scriere/ștergere), ușor de programat și foarte rapidă. Este preferată în detrimentul memoriei EPROM atunci când avem nevoie de o memorie de program destul de mare.
3) EEPROM- memoria de tipul acesta este des întâlnită, însă are o dimensiune limitată de ordinul miilor de octeți. Este folosită pentru memorarea unei dimensiuni mici de informație (memorează variabile ce își schimbă valoarea constant) și este destul de lentă la scriere. Avantajul ei este că suportă sute de mii de cicluri de scriere/ștergere.
4) NOVRAM (RAM nevolatil)- memorează un volum foarte mare de date și de instrucțiuni, fiind nevolatilă înseamnă că își păstrează conținutul după oprirea alimentării. Permite un număr nelimitat de cicluri scriere/ștergere și este cel mai rapid tip de memorie.
Un microcontroler se poate programa fără a fi scos din sistemul de incorporare prin folosirea unei memorii nevolatile FLASH, această metodă poartă denumirea de ISP-În System Programming. Programarea este realizată printr-o interfață serială dedicată de tip ISP sau printr-o interfață standard JTAG. Programarea în acest mod este foarte flexibilă deoarece codul se poate modifica cu ușurință.
Bootloaderul este un cod de mici dimensiuni ce există în permanent în interiorul microcontrolerului ce este încărcat prin intermediul portului serial. El oferă posibilitatea de a scrie în memoria de program (de tip FASH) fără necesitatea unui circuit extern de programare. După încărcarea programului, bootloader-ul lansează în execuție programul.
Tipurile de memorii FLASH, OTP și EPROM au posibilitatea de a proteja codul programului împotriva pirateriei soft (o persoană neautorizată încearcă să obțină sau să modifice codul sursă). Protejarea codului este realizată la scriere și la citire, circuitul se șterge înainte de a fi posibil să se mai scrie ceva în el. Astfel codul original nu mai poate fi modificat . La modelele mask-ROM protecția este introdusă implicit.
Aproape toate familiile de microcontrolere au și posibilitatea de a conecta o memorie externă, fie de program (ROM) fie de date (RAM). Este nevoie de niște magistrale externe de date și adrese și din această cauză este mult redus numărul de conexiuni a interfeței exterioare (microcontrolerul nu mai este la fel de versatil). La microcontrolerele cu un număr mic de pini nici nu este posibilă atașarea unei memorii externe decât printr-o interfață serial (I2C sau SPI) și doar a unei memorii de date.
Interfața externă
Microcontrolerele au un număr maxim de câteva zeci de intrări/ieșiri organizate ca și porturi I/O. Ele pot fi bidirecționale sau unidirecționale și multifuncționale (se atribuie mai multe funcții aceluiași pin), iar unele au proprietatea de a absorbi curent (exemplu: la comanda unui LED cu IOLmax= -20mA). Pe lângă aceste porturi de intrare/ieșire mai există câteva facilități destul de importante pentru interfațarea exterioară:
1) Pentru implementarea unui protocol de comunicație asincron este folosit un port serial bidirecțional (UART), dar se mai poate folosi și portul sincron (USART) deoarece are o viteză mai mare de comunicație. Corporația Freescale (Motorola) a dezvoltat un circuit îmbunătățit pentru comunicația asincron numit SCI (Serial Communications Interface). În industria construcțiilor de mașini s-a creat o tehnologie mai ieftină și de mică viteză pentru protocolul CAN.
2) Porturile seriale sincrone dedicate sunt folosite pentru transferul prin cablu serial la viteză mare pentru conectarea cu alte periferice (sistem de afișare, senzori, convertoare analog-numerice) sau pentru conectarea în rețea. Acest tip de comunicație presupune setarea unui ceas la transmițător sau receptor pentru sincronizare și de asemenea sunt folosite protocoale complexe de transfer al informației. Iată câteva dintre cele mai populare implementări:
Microwire / Microwire Plus este o tehnologie dezvoltată de National Semiconductors, reprezintă o interfață serială sincronă dar este bidirecțională;
SPI (Serial Peripheral Interface) dezvoltată de Motorola și este o interfață serială sincronă;
I2C (Inter Integrated Circuits bus) reprezintă o interfață bidirecțională ce folosește doar două fire, tehnologia aparține firmei Philips și este folosită la comunicațiile pe 8 biți. Această interfață se mai numește și TWI (Two Wire Interface), dar nu toate dispozitivele sunt prevăzute cu o astfel de interfață;
Interfața CAN aparține firmei Bosch, este o interfață serială sincronă folosită în mare parte în industria construcțiilor de mașini fiind foarte populară în Europa și Japonia. Recent această tehnologie se folosește și în alte domenii cum ar fii în robotică, la acționările electrice sau în automatizările industriale. O tehnologie asemănătoare: SAE J1850 (Society of Automotive Engineers) este un tip de comunicație serială ce este utilizată exclusiv în industria automobilelor (în special în America de Nord).
3) Ethernet/Web- pentru a fi posibilă o astfel de conexiune trebuie implementat protocopul TCP/IP (Transmission Control Protocol/Internet Protocol) indispensabil unei rețele de tip Ethernet. Pentru aceasta avem nevoie de resurse pentru a face posibilă integrarea, resursele pot fi de tipul software (mărirea vitezei puterii de calcul a CPU) și hardware (stiva hardware). Cu ajutorul stivei se realizează conexiuni de tip HTTP, POP3, FTP, etc.
4) USB (Universal Serial Bus)- este o magistrală serială ce a fost concepută pentru a conecta cât se poate de facil dispozitivele periferice la un calculator. Acest tip de conexiune poate avea o rată de transfer maximă de 12MB/s dacă este folosită varianta învechită USB 1.1, însă USB 2.0 are o viteză de transfer a datelor de maxim 480MB/s. Există foarte multe firme în ziua de azi care realizează microcontrolere compatibile cu USB (cele mai multe compatibile USB 1.1) având un preț foarte scăzut la dispozitivele hardware și software; cele mai multe fiind interesate de realizarea perifericelor USB și nu a hosturilor USB (cele mai populare : Atmel, Microchip, Intel, Cypress, ST, Infineon, etc.
5) Conectivitatea Wireless- acest tip de conectare pune probleme vendorilor deoarece este nevoie de resurse hardware și software ca să se poată integra aceast tip de conexiune cât mai avantajos financiar, și în cele din urmă trebuie implementat un protocol. Cele mai populare astfel de rețele sunt Bluetooth (IEEE 802.15.1) și Zigbee (IEEE 802.15.4).
6) CAN (Convertor Analog Numeric)- acestea sunt folosite de obicei în intermediul unui sistem de colectare de date unde mai există și alte dispozitive cum ar fi multiplexoare analogice ( au un număr mare de intrări). De obicei ele sunt folosite pentru mărimi de intrare unipolare și au o precizie de la 8 până la 12 biți iar sursa de referință poate fi externă sau internă. Timpul în care valoarea analogică este convertită în digital este de la câteva microsecunde până la zeci de microsecunde. Precizia este menținută prin tehnici de recalibrare corecție câștig. Conversia este realizată fie prin aproximații repetate cu eșantionare (circuit Track-Hold intern), fie mai puțin întâlnit prin rampă digitală. Sunt și dispozitive care pot fi folosite pentru implementarea altor metode de conversie ce se bazează pe integrare cum ar fi circuitele comparatoare analogice standard, numărătoare de inpulsuri și intrări de captare (obligă reținerea unui număr în timpul numărătorii pentru a măsura intervalul de timp sau frecvență.
7) CNA (Convertoarele Numeric Analogice)- una din cele mai folosite metode de conversie a unei valori numerice într-o valoare analogică este modulația factorului de umplere (PWM- Pulse Width Modulation). Generarea impulsurilor cu un factor de umplere între 0 și 100% este programată pe oricare din canale și acest factor poate fi controlat cu o rezoluție de maxim 16 biți. În același timp se poate programa și frecvența trenului de impulsuri, dar cu o precizie mai scăzută. Ieșirile numerice și sistemele de numărare sunt controlate mai greu la microcontrolerele fără sistem PWM. Este posibilă obținerea unei tensiuni de ieșire proporționale cu factorul de umplere dacă se aplică un filtru trece-jos. Nu sunt prea des întâlnite convertoarele numeric analogice propriu-zise.
8) Interfațarea cu sisteme de afișaj LCD. Un astfel de ecran se poate conecta la majoritatea microcontrolerelor nou apărute prin intermediul unui subcircuit pentru conectare directă și folosirea unui număr redus de componente. Ecranul LCD este comandat prin acea interfață. Afișajul poate fi atât de complex pe cât numărul de segmente LCD este mai mare, dar crește și numărul de conexiuni externe (multiplexarea este folosită în acest caz).
Familii de microcontrolere
Familia 8051
În capitolul anterior am prezentat principalele caracteristici ale microcontrolerelor, însă acestea se împart în mai multe familii cu arhitecturi specifice. În continuare se vor pune în evidență caracteristicile arhitecturale ale familiei de microcontrolere 8051.
Primul microcontroler pe 8 biți a fost produs de Intel în anul 1976 sub numele MCS-48. Mai târziu, în anul 1980, aceeași firmă a lansat o variantă îmbunătățită a mirocontrolerului pe 8 biți sub numele de MCS-51. Urmărind succesul familiei 8051, multe alte firme din acest domeniu (Philips, Infineon, Atmel, Dallas, Temic) au scos pe piață microcontrolere care folosesc arhitectură MCS-51. Toate aceste microcontrolere puteau fi programate folosind setul de instrunctiuni al primului model, diferența între ele fiind de natura memoriei îmbunătățite, prezența unui ADC sau DAC etc. Apoi Intel a lansat primul microcontroler pe 8 biți sub denumirea MCS-96.
Pentru a înțelege cât mai bine arhitectura acestui microcontroler, am ales un model de împachetare simplu cu 40 de pini DIP. În general toate modelele de dispozitive din familia MCS-51 sunt reprezentate sub formă XX51, unde XX poate lua valori ca 80,89,90 etc.
Figura 2.1 Schema simplificată a unui microcontroler XX51
Sursa: [7]
În figura de mai sus este prezentată o schemă simplificată a unui microcontroler XX51 unde se pot evidenția: o sursă de alimentare (Vcc) și masă (GND), 3 semnale de intrare, 3 semnale de control și 4 porturi pentru interfațare în exterior. Semnalele de intrare sunt necesare pentru funcționarea microcontrolerului: XTAL1 și XTAL2 sunt intrările ceasului intern provenite de la un oscilator extern, RESET este intrarea care setează microcontrolerul la valorile inițiale pentru a putea reporni sistemul. Există 3 semnale de control EA (External Access), PSEN (Program Store Enable) și ALE (Address Latch Enable) folosite pentru interfațarea cu memorii externe. Mai sunt prezente și patru porturi numerotate 0,1,2,3 denumite Port 0, Port 1, Port 2 și Port 3 care pot fi folosite pentru conectarea dispozitivelor precum DAC, ADC, afișaj pe 7 segmente (LM016), LED etc. Fiecare port 8 pini reprezentând câte un bit programabil.
Figura 2.2 Microcontroler XX51 cu impachetare DIP
Sursa: [7]
Pe baza figurii 2.2 vom descrie fiecare pin în parte. Se observă că unii pini pot fi folosiți în două moduri, depinzând de codul programului.
Pinul 40: denumit VCC reprezintă principala sursă de alimentare, de obicei are valoare de 5V DC.
Pinii 32-39: reprezintă Port 0 (P0.0…P0.7) de intrare/ieșire, în plus adresele de ordine mică și semnalele de magistrală sunt multiplexate folosind acest port în scopul interfațării cu o memorie externă. Acesta este un port bidirecțional (singurul în arhitectura 8051) .
Pinul 31: EA (External Access) este folosit pentru a acorda sau anula accesul la memoria externă. În cazul în care nu este conectată o memorie externă, acest pin este setat ca fiind 1 prin conectarea la VCC.
Pinul 30: ALE (Address Latch Enable) este folosit pentru a demultiplexa semnalul adreselor de date din Port 0 atunci când este conectată o memorie externă. Două pulsații ALE sunt disponibile pentru fiecare ciclu mașină.
Pinul 29: PSEN (Program Store Enable) este folosit pentru a citi semnale provenite de la memoria externă.
Pinii 21-28: reprezentând Port 2 (P2.0…P2.7), pe lângă folosirea lui ca și port de intrare/ieșire, în plus semnalele adreselor de ordine mare ale magistralei sunt multiplexate cu acest port cvazi-bidirecțional.
Pinul 20: Denumit și Vss reprezintă conexiunea la potențialul de valoare 0.
Pinii 18-19: Sunt folosiți pentru conectarea cu un cristal extern pentru a furniza ceasul sistemului.
Pinii 10-17: reprezintă Port 3 (P3.0…P3.7). Pe lângă acest lucru, el are și mai multe funcții precum întreruperi, timer input, semnale de control cu memoria externă (RD și RW), semnale de comunicație pe cablu serial (RxD și TxD) etc. Este un port cvazi-bidirecțional cu resetare internă.
Pinul 9: RESET, este folosit pentru a modifica valorile registrelor microcontrolerului la valorile inițiale. Pinul de RESET trebuie să fie setat la valoare 1 pentru două cicluri mașină pentru a intra în funcțiune.
Pinii 1-8: reprezintă Port 1 (P1.0…P1.7). Nu are alte funcții, este un port de intrare/ieșire cvazi-bidirecțional cu resetare internă.
Figura 2.3 Arhitectura internă a microcontrolerelor 8051
Sursa: [7]
Arhitectura internă a microcontrolerelor din familia 8051 este reprezentată în figura de mai sus. Este o variantă simplificată dar cuprinde principalele blocuri funcționale și modul în care acestea sunt conectate. Magistrala sistemului conectează toate dispozitivele periferice cu unitatea centrală de procesare, ea este compusă dintr-o magistrală cu capacitatea de 8 biți pentru transferul de date și o magistrală cu capacitatea de 16 biți pentru transferul de adrese și semnale de control. Din această figură se poate înțelege că toate celelalte dispozitive precum memoria de program, porturile, memoria de date, interfața serială, controlul întreruperilor, timpii și unitatea centrală de procesare sunt legate împreună prin intermediul magistralei sistemului.
Organizarea memoriei pentru microcontrolerele 8051 este realizată după arhitectura Harvard, și anume există o memorie de program și o memorie de date total separate. Memoria internă de program a unui microcontroler 8051 este de 4 KB și la nevoie se poate adăuga o memorie externă de maximum 60KB. Microcontrolerele 8051 sunt capabile să își securizeze memoria internă prin setarea unor biți de blocare, astfel protejând conținutul ei împotriva pirateriei. Odată securizată, biții de blocare pot fi resetați numai prin ștergerea integrală a memoriei. De asemenea aceste microcontrolere sunt compatibile și cu tehnologia pipeline ce permite desfășurarea mai multor instrucțiuni în diferite stagii de execuție în același timp.
Memoria internă de date este de 128 bytes și permite conectarea unei memorii externe de maximum 64KB. Memoria internă de date este împărțită în trei zone: prima zonă este formată din 32 de registre de uz general împărțite în 4 blocuri: #0, #1, #2, #3 (fiecare bloc conține 8 registre de câte un octet). Doar un singur bloc de registre este selectat într-un ciclu mașină, însă se pot accesa și celelalte registre folosind adresarea directă. Registrele sunt folosite pentru a stoca operanzi sau date. După un reset, se folosește bancul #0 de registre. A doua zonă reprezintă zona variabilelor adresabile pe bit, este formată din 16 octeți (128 biți) și este folosită pentru a salva starea unor variabile din program, precum starea unor dispozitive (LED, motor). Avem nevoie decât de un bit pentru a stoca starea unui dispozitiv în memorie (ON sau OFF) și în felul acesta se salvează spațiu. A treia zonă se numește zona de scriere, are 80 de octeți și este folosită pentru o stoca variabile de uz general.
În general este folosit un cristal de quartz pentru a realiza ceasul sistemului. Frecvențele maxime și minime de ceas pot să difere de la un dispozitiv la altul, însă de obicei este folosită o frecvență de 12MHz iar pentru comunicarea pe cablu serial este folosită frecvența de 11.0592 Mhz. După cum se poate vedea în figura de mai jos, o oscilație completă a semnalului de ceas este numit puls, două astfel de pulsuri formează o stare și 6 stări reprezintă un ciclu mașină.
Figura 2.4 Ceasul sistemului
Sursa: [7]
Familia de microcontrolere MegaAVR
Microcontrolerele AVR au fost concepute în anul 1996 de către firma Atmel. Arhitectura a fost creată de Alf-Egil Bogen și Vegard Wollan. Acronimul AVR vine de la litera primului nume a inginerilor ce au dezvoltat arhitectura și litera R de la arhitectura RISC, mai fiind cunoscută și sub numele de Advanced Virtual RISC. Microcontrolerul AT90S8515 a fost primul microcontroler ce se baza pe arhitectura AVR, însă primul microcontroler scos pe piață a fost AT90S1200 în anul 1997.
Microcontrolerele AVR se împart în trei categorii:
TinyAVR – au memorie mică, sunt de dimensiuni mici, perfecte pentru aplicații simple;
MegaAVR – acestea sunt cele mai populare deoarece au o memorie destul de mare (până la 256KB), pot fi atașate un număr mare de periferice și sunt recomandate pentru aplicații cu un grad de complexitate destul de ridicat;
XmegaAVR – au o memorie de program foarte mare, viteză de procesare ridicată și sunt folosite în aplicații complexe.
Microcontrolerele din familia megaAVR sunt potrivite pentru aplicații ce au nevoie de puțin mai multe resurse. Acestea au o memorie de program și de date foarte mare, lucru necesar pentru rularea unui cod de dimensiuni mari. În același timp, tehnologia inovativă picoPower minimizează consumul de energie. Familia megaAVR oferă o gamă largă de dispozitive cu memorii, număr de pini și periferice diferite. Se includ modele ce conțin dispozitive de uz general și modele ce conțin periferice specializate cum ar fi PTC (Peripheral Touch Controller), USB, controler LCD, PSC (Power Stage Controllers), etc. Mai există și o serie de funcții analogice cum ar fi ADC, DAC, senzor de temperatură integrat cu referințe interne de tensiune și un comparator analogic.
Caracteristicile tranzistorilor
Tranzistorul este o componentă electronică a cărei rezistență electrică poate fi controlată cu ajutorul unui semnal electric numit semnal de comandă. Cea mai importantă mențiune referitoare la această definiție este faptul că tranzistorul ne permite să controlăm un curent electric mare cu ajutorul unei cantități foarte mici de energie electrică. Din acest motiv, una din principalele aplicații ale tranzistorului este cea de amplificator [8].
Figura 2.5 arată că funcționarea unui tranzistor este bazată pe conectarea simultană a acestuia la două circuite:
Circuitul de intrare este circuitul care impune semnalul de comandă asupra tranzistorului, furnizat de la o sursă de tensiune (pe figură este prescurtat S.C.În);
Circuitul de ieșire prin care trece curentul electric produs de o altă sursă de tensiune (pe figură este prescurtat S.C.Out).
Figura 2.5 Funcționarea unui tranzistor bipolar
Sursa: [8]
Tranzistorul bipolar (TB), este realizat dintr-un cristal semiconductor compus din trei regiuni dopate cu impurități de tip diferit, care se succed în ordinea: p-n-p sau n-p-n și care satisfac conditiile: 1) regiunea de mijloc, numită bază, are o lățime mică (fracțiuni de microni) față de lungimea de difuzie a purtătorilor minoritari care o parcurg si 2) una din regiunile din extremități, numită emitor, are un grad de impurificare mult mai mare decât baza. Cea de-a treia regiune a tranzistorului se numește colector [9].
În figura 2.6 sunt prezentate simbolurile tranzistoarelor bipolare, săgeata sugerează unde se află emitorul tranzistorului, iar sensul ei arată cum este poziționată joncțiunea emitorului și cum circulă curenții în tranzistor. De exemplu la tranzistorul pnp curentul circulă de la emitor la colector.
Figura 2.6 Simbolurile tranzistoarelor bipolare
Sursa [9]
Tranzistorul este format din două joncțiuni p-n. În funcție de modul de polarizare al joncțiunilor, tranzistorul se poate afla în una din cele patru regimuri de funcționare (Tabelul 2.1).
Tabel 2.1 Regimurile de funcționare ale tranzistorului în
funcție de polarizarea joncțiunilor
Sursa: [9]
De obicei tranzistorul este folosit în primele trei regimuri din tabel: regimul activ normal este folosit în aplicațiile liniare, iar regimurile saturat (UCE≅0) și blocat (IC≅0) sunt folosite în circuitele de comutație unde tranzistorul acționează precum un comutator. Ultimul tip de regim nu este folosit în circuitele obișnuite.
În circuit am folosit tranzistoare npn, în concluzie mă voi referi la această clasă atunci când voi descrie relațiile dintre curenți și tensiuni. În continuare voi descrie succint regimurile de funcționare ale tranzistorului pentru o mai bună înțelegere a modului de funcționare.
Tranzistorul bipolar in regim activ normal (RAN)
În regimul acesta joncțiunea bază-emitor este polarizată în mod direct iar joncțiunea bază-colector este polarizată în mod invers. În cazul tranzistorului npn:
UBE > 0; UBC < 0; (2.1)
UBE > UD0; UCE > UCEsat (2.2)
Unde UD0 reprezintă tensiunea de deschidere a diodei bază-emitor (UD0 ≅0,5V) și UCEsat reprezintă tensiunea de saturație a tranzistorului (de obicei are o valoare de ordinul zecimilor de volt).
În cazul acesta, curentul de colector este aproximativ egal cu curentul de emitor:
IC = αIE cu α = 0,98…0,998 (2.3)
Factorul de amplificare in curent este α.
Se consideră că tranzistorul se comportă că o diodă între bază și emitor și ca un generator de curent în colector.
Figura 2.7 Model simplificat al tranzistorului bipolar la semnal mic
Sursa: [8]
Curentul de colector este descris de următoarea ecuație exponențială:
IC = IS * exp(UBE/UT) (2.4)
IS= curent de saturatie (intre 10-15A si 10-12A);
UT= tensiune termica (≅25mV la 290K).
Ecuația de continuitate a tranzistorului este următoarea: IE=IC+IB. Din aceasta rezultă următoarele ecuații:
IC = αIE = αIC + αIB; IC(1-α) = αIB; IC = IB sau (2.5)
IC = βIB (2.6)
β = (2.7)
β= factor de amplificare în curent (ia valori intre 100 si 300).
Tranzistorul bipolar in regim de blocare
După cum se poate observa în tabelul 2.1, în acest regim ambele joncțiuni ale tranzistorului sunt polarizate în mod indirect. Pentru tranzistorul npn:
UBE < 0 si UBC < 0 (2.8)
Chiar dacă joncțiunile sunt polarizate direct dar cu o tensiune de valoare mică (sub tentiunea de deschidere) se admite că tranzistorul este blocat. Formule npn:
UBE < UD0; UCE > 0. (2.9)
Curenții au valori foarte mici (µA), fiind neglijabili in practică:
IB = 0, IC = 0, IE = 0. (2.10)
Tranzistorul bipolar in regim de saturație
În cazul acesta cele două joncțiuni ale tranzistorului bipolar sunt polarizate în mod direct. Pentru npn:
UBE > 0, UBC > 0 (2.11)
Condiția pentru care tranzistorul intră în regim de saturație este ca valoarea curentului de bază să fie mai mare decât valoarea curentului necesar pentru menținerea curentului de colector al tranzistorului:
IB > (2.12)
Joncțiunea bază-colector este deschisă de curentul: ∆IB = IB – (IC/β). Tensiunea UCE = UBE – UBC devine foarte mică (până la 0,3V), iar circuitul echivalent este:
Figura 2.8 Scheme echivalente pentru tranzistorul bipolar saturat
a)tranzistorul npn; b)schema simplificată pentru npn.
Sursa [9]
La tranzistoarele de putere mică se consideră tenisiunea de saturație UCEsat ≅0,2V. În cazul în care se analizează un circuit unde tensiunile din colector sunt mai mari de câțiva volți, atunci se consideră tensiunea de saturație colector-emitor ca fiind zero (circuitul simplificat din figura 2.8 b).
În regimul de saturație se definește factorul de amplificare în curent forțat, el fiind de valoare mai mică decât în cazul regimului activ normal:
βfortat = < β (2.13)
Se alege de obicei:
βfortat = 10…20 << β (2.14)
Se concluzionează că tranzistorul se comportă în regim de saturație ca un comutator închis între colector și emitor datorită aplicării unui curent mare în bază.
Tipuri de conexiuni ale tranzistoarelor
Tranzistorul bipolar poate fi privit ca un cuadripol dacă unul dintre terminalele sale va face parte atât din circuitul de intrare cât și din cel de ieșire. De regulă, terminalul respectiv este conectat la borna de potențial nul (masa circuitului). Astfel, există trei conexiuni posibile ale tranzistorului într-un circuit [10] :
Conexiunea emitor comun : figura 2.9a
Conexiunea baza comna : figura 2.9b
Conexiunea colector comun : figura 2.9c
Figura 2.9 Tipurile de conexiuni ale tranzistorului bipolar
Sursa: [10]
Conexiunea emitor comun
Figura 2.10 Mărimile de intrare si de ieșire ale conexiunii
emitor comun
Sursa: [10]
In figura 2.10 se pot observa marimile de intrare si de iesire ale conexiunii emitor comun, in total sunt patru marimi iar modificarea unuia dintre ele presupune modificarea celorlalte trei. In acest caz avem patru caracteristici statice de intrare, ieșire și de transfer:
UBE = f(IB)|UCE=constant caracteristica de intrare
IC = f(UCE)|IB=constant caracteristica de iesire
IC = f(IB)|UCE=constant caracteristica de transfer in curent
UBE = f(UCE)|IB=constant caracteristica de transfer invers in tensiune
Figura 2.11 Familiile de caracteristici statice ale conexiunii emitor comun
Sursa: [10]
Caracteristica de transfer în tensiune este foarte importantă la un tranzistor, este prezentată în figura 2.12 b pe baza circuitului din figura 2.12 a.
Figura 2.12 Caracteristica de transfer in tensiune
Sursa: [10]
Discuția asupra comportării tranzistorului se poate face dacă considerăm comportamentul celor două joncțiuni asemănător comportamentului unor diode. Vom numi în continuare joncțiunea emitoare drept dioda emitor DE, iar joncțiunea colectoare drept dioda colector, DC.
Pentru tensiuni UBE mai mici decât tensiunea de deschidere a diodei emitor, între emitor și colector nu poate circula nici un curent, căderea de tensiune pe rezistența Rc este nulă și UCE=Ec. În acest interval de tensiuni de intrare tranzistorul este blocat, între colector și emitor el acționând ca un întrerupător deschis. Odată cu creșterea tensiunii de intrare, dioda emitor se va deschide și va permite “curgerea” electronilor între emitor și colector peste dioda colector polarizată invers. Tensiunea UCE va începe să scadă foarte rapid, deoarece crește căderea de tensiune pe Rc, în condițiile în care tensiunea de alimentare, Ec, este păstrată constantă (Ec = Ic*Rc + UCE). Curentul de colector va crește și tensiunea UCE se va micșora până când se ajunge în regimul de saturație (cantitatea de sarcină disponibilă nu este nelimitată) în care ambele diode, emitor și colector, sunt în stare de conducție. Acest regim de lucru se numește saturat. În regimul saturat tensiunea între colector și emitor este foarte mică, UCE ≅ 0,1− 0,2V. Ea se numește tensiune colector-emitor de saturație, UCEsat. Zona de tranziție dintre regimurile blocat și saturat se numește zona activă. În zona activă curentul de colector și tensiunea de ieșire pot fi controlate de către tensiunea de intrare și implicit de către curentul de bază.
Putem sintetiza regimurile de funcționare ale tranzistorului bipolar în felul următor:
Regimul blocat: DE si DC – blocate,
IC=0, UCE = EC
Regimul in zona activa: DE – conductie, DC – blocata,
IC≠0, UCE=5 -> 0,2 V
Regimul saturat: DE si DC – conductie
IC≠0, UCE= 0,1 – 0,2V = UCEsat
În cadrul proiectului tranzistoarele vor lucra în regim de comutație deoarece vor trece foarte rapid prin zona activă, lucrând între starea de blocare și cea de saturație și invers. După cum am specificat, pe peretele interior al rezervorului vor fi plasați la diferite înălțimi senzorii (în cazul nostrum, vor fi fire de cupru) care sunt direct legați în bazele fiecărui tranzistor din circuitul de comparare. La fundul rezervorului există un fir conectat la alimentare. Fiecare colector al tranzistoarelor este alimentat la o tensiune de 5V. Atunci când rezervorul este gol, toți tranzistorii vor fi blocați deoarece curentul prin bază va fi nul, automat curentul IC este nul (formula 3.6), rezultă aceștia se vor comporta că niște comutatoare deschise (UCE=5V va prelua tensiunea aplicată pe colector). Atunci când nivelul apei va atinge primul senzor rezultă că baza acestui tranzistor va fi alimentată la 5V (se va forța un curent prin bază), joncțiunea emitoare DE și joncțiunea colectoare DC se vor deschide și prin tranzistor va trece un curent IC. În acest caz tensiunea UCE se va micșora la 0,2 V și tensinea de alimentare a colectorului va fi transferată microcontrolerului (figura 3.2). Astfel se modifică tensiunea aplicată pe portul respectiv (tensiunea de 5V este echivalentă cu nivelul 1 logic) și microcontrolerul va schimba informația afișată pe ecran. Sunt conectate rezistoare (1KΩ) în bazele tranzistorilor pentru a limita valoarea curentului ce intră în bază.
Același lucru se va întâmpla pentru fiecare tranzistor dacă nivelul apei va continua să crească. Invers, dacă apa începe să scadă, tranzistorii se vor bloca unul câte unul (firul de alimentare se va deconecta de la baza tranzistorului), schimbând valoarea tensiunii aplicate pe porturile microcontrolerului la 0V (0 logic). În acest fel microcontrolerul va ști în orice moment nivelul de apă din rezervor, deoarece este proporțional cu numărul de tranzistoare deschise din circuitul de comparare.
2.3 Sistemul de afișare LCD
Tehnologia LCD
Tehnologia TFT-LCD (Thin Film Transistors-Liquid Crystal Display) a permis apariția unei game lărgi de aplicații cum ar fi monitoare, televizoare, sisteme de afișare ( pentru mașini, avioane, locomotive etc.) și sisteme de semnalizare; înlocuind total sistemele vechi ce foloseau tehnologia CRT (Cathode Ray Tube). Ecranele LCD sunt subțiri și plate ceea ce la face ideale pentru aplicații mobile. În plus Tehnologia LCD funcționează cu tensiuni de alimentare mult mai mici și disipă puțină căldură. Se pot afișa imagini arbitrare (LCD grafic) sau imagini fixe cu conținut minim de informație (LCD alfanumeric).
Afișajul LCD este un dispozitiv optic modulat electronic, constituit dintr-un număr variabil de segmente ce controlează un strat de cristale lichide în spatele cărora se află o sursă de lumină (backlight) sau un strat reflector pentru a produce imagini. Elementul funcțional al unui ecran LCD este pixel-ul, format dintr-o celulă LCD. Fiecare pixel este format dintr-un strat de molecule aliniate între doi electrozi transparenți și două filtre polarizante (perpendiculare și paralele). Cristalele care formează celula își schimbă polarizarea sub acțiunea unei diferențe de potențial electric și modifică cantitatea de lumina care trece prin celulă.
Există două metode de a produce imagini folosind celule LCD: metoda segmentelor și metoda matricii. Metoda segmentelor afișează caractere folosind electrozi de forme specifice. Metoda matricii afișează caractere și imagini folosind electrozi în formă de puncte [11].
Figura 2.13 Metode de afișare folosind celule LCD
Sursa: [11]
Există două tipuri de adresare a elementelor matricii. Adresarea pasivă folosește un set de electrozi verticali și un set de electrozi orizontali. Fiecare pixel se află la intersecția unui electrod vertical cu un electrod orizontal. Pentru a controla strălucirea pixelului se transmite un curent pe fiecare din cei 2 electrozi. Matricea activă conține câte un tranzistor TFT(Thin Film Transistors) pentru fiecare pixel fiind nevoie de un curent mai mic pentru controlul stalucirii acestuia. De asemenea, acești curenți pot fi comutați mult mai rapid îmbunătățindu-se astfel rata de refresh a ecranului.
Afișaj LCD alfanumeric
Acest tip de afișaj este present în aproape toate proiectele ce conțin microcontrolere cum ar fi: ceas digital, sisteme de securitate, semnalizatoare, vitezometru, altimetru digital, etc. Acestea sunt de mai multe dimensiuni, cel mai des denumite după numărul de rânduri și coloane (lungimea în caractere a unui rând). Afișajul LCD pe care îl voi folosi în acest proiect se numește 16×2 (figura 2.10) deoarece are două rânduri cu câte 16 caractere, fiecare caracter fiind constituit dintr-o matrice cu 7 linii și 5 coloane. LCD-urile pot avea iluminare din spate (backlight) sau pot fi de tipul reflectiv (fără iluminare), modul de comandă fiind identic însă cele cu backlight au 2 pini în plus pentru alimentarea grupului de LED-uri.
Figura 2.14 Ecran LCD 16×2
Sursa: [12]
Controlerul LCD conține 3 blocuri de memorie: DDRAM (Display Data RAM), CGRAM (Character Generator RAM) și CGROM (Character Generator ROM). Memoria DDRAM este folosită pentru stocarea caracterelor ce vor fi afișate pe ecran, capacitatea de memorare este de 80 de caractere, o parte din ele fiind cele afișate direct pe ecran. Această memorie poate fi scrisă, dar și citită, însă conținutul ei se pierde la deconectarea de la alimentare. Memoria CGRAM este folosită pentru a afișa simboluri definite de utilizator. Memoria CGROM conține un set standard de caractere, toate variantele pe care le poate afișa controlerul respectiv, fiecare caracter având alocată o zonă de memorie.
În continuare vom analiza interfața unui ecran LCD 16×2 (figura 2.15) a modulului JHD162A.
Figura 2.15 Interfața ecranului LCD 16×2
Sursa: [12]
Pinul numărul 1 este denumit Vss, acest pin trebuie conectat la potențialul 0 (masă), iar al doilea pin Vcc trebuie conectat la alimentarea sistemului (5V).
Pinul VEE are rolul de a ajusta contrastul ecranului LCD prin variația tensiunii aplicate pe acesta. Tensiunea aplicată este variată între 0 și 5V prin intermediul unui potențiometru. Se va înțelege mai bine privind schema finală.
Modului JHD162A are două registre incorporate: un registru de date ( conține datele ce vor fi afișate) și un registru de control (conține comenzile utilizatorului). Dacă pinul RS (Register Sélection) este setat pe valoarea 1 atunci informația ce va intra pe cei 8 biți ai interfeței (DB0…DB7) va fi tratată ca o serie de simboluri ce vor fi afișate pe ecran, dacă pinul este setat pe valoare 0 atunci informația ce va intra va fi privită ca o instrucțiune de control.
Pinul R/W face trecerea de la modul de citire (valoare 1) la modul de scriere (valoare 0).
Pinul E este pinul de enable, o tranziție de la 1 la 0 va confirma modulul.
Pinii DB0…DB7 transferă datele sau instrucțiunile de la microcontroler la sistemul de afișare.
LED+ este anodul (conectat la alimentare) și LED- este catodul (conectat la masă) al sursei de lumină din spatele ecranului (backlight).
Capitolul 3 – Implementarea proiectului
3.1 Metodologie
Există multe metode prin care se pot proiecta sisteme automate de reglare a nivelului de apă prin echipamente electrice, dar nu toate funcționează fără asistență umană. În acest proiect este perezentat un exemplu de sistem cu două rezervoare de apă, unul reprezentă rezervorul pe care dorim să-l umplem și al doilea reprezintă rețeaua de apă de unde se face alimentarea primului rezervor prin intermediul pompei de apă. Acționarea pompei și afișarea nivelului de apă din primul rezervor este posibilă prin intermediul unui microcontroler care funcționează pe baza unui program prestabilit. Acest sistem este proiectat cu atenție astfel încât rezervorul să se umple automat dacă nivelul de apă scade sub un anumit procent, și în final pompa este scoasă din funcțiune atunci când rezervorul este plin, fără a risipi apă. Modul de abordare a acestui proiect a fost de a împărți diagrama structurală de bază în blocuri funcționale (vezi figura 3.1 din capitolul curent), unde fiecare bloc reprezintă o secțiune de circuit care îndeplinește o funcție specifică.
Figura 3.1 Diagrama bloc a sistemului
În această lucrare, sistemul automat de monitorizare a nivelului de apă dintr-un rezervor este format din principalele blocuri funcționale: senzori, circuit de comparare, microcontroler, unitate de afișare și pompă. Diagrama de mai sus descrie modul în care funcționează sistemul, precum și felul în care interacționează principalele componente între ele. Scopul acestei diagrame este de a înțelege la nivel de concept acest sistem, fiecare bloc va fi descris și analizat în parte în acest capitol.
Pentru a înțelege cât mai bine modul de funcționare a acestui sistem, în continuare voi explica pas cu pas rolul fiecărei componente din circuit pe baza diagramei funcționale (figura 3.2 din capitolul curent). Fiecare element din diagrama bloc a sistemului este format din unul sau mai multe componente care se regăsesc pe diagrama funcțională. În continuare voi analiza pe rând fiecare bloc structural, enumerând piesele componente și rolul lor în cadrul sistemului.
3.2 Descrierea componentelor și a principiului de funcționare
Rezervor
Acesta este unul dintre cele mai ușoare blocuri de explicat deoarece are un caracter intuitiv, este reprezentat pe diagrama funcțională în colțul din dreapta jos. El este recipientul în care se vor face măsuratorile, în viața reală reprezintă rezervorul conectat direct la rețeaua de apă. În domeniul industrial el poate fi de dimensiuni foarte mari și poziționat în hale special amenajate. Dacă ne gândim la un spital in care avem nevoie în permanență de apă potabilă, el poate fi poziționat la subsol. Pentru stocarea diferitelor lichide, soluția optimă este materializată în rezervoarele din poliesteri armați cu fibră de sticlă. Principalele avantaje sunt că pot fi realizate în diferite forme și mărimi, pentru poziționări diferite (orizontal, vertical, subteran, suprateran), au greutate redusă, sunt anticorozive și ușor de întreținut.
Figura 3.2 Diagrama funcțională a sistemului
Senzori
Conform diagramei bloc, puntea de legătură dintre rezervor și circuitul de comparare este reprezentată de senzori. Senzorul este un dispozitiv tehnic care reacționează calitativ sau cantitativ prin proprii mărimi măsurabile, la anumite proprietăti fizice sau chimice ale mediului din preajma lui. Ca parte componentă a unui aparat sau sistem tehnic detector poate măsura/înregistra de exemplu presiunea, umiditatea, câmpul magnetic, accelerația, forța, intensitatea sonoră, radiații ș.a. Senzorul este un dispozitiv care măsoară o cantitate fizică și o transformă într-un semnal care poate fi citit de către un observator printr-un instrument sau poate fi prelucrat. Senzorii se împart în două categorii: activi sau consumatori de energie (exemplu: radarul care este folosit pentru măsurarea distanțelor prin emitere de radiații electromagnetice) și pasivi (exemplu: fotorezistență cu care se poate măsura intensitatea luminii incidente).
Pentru simplitate, ne vom folosi de avantajul că apa conduce curentul electric și vom folosi fire de cupru ca și senzori de nivel. Acești senzori vor fi poziționați pe peretele interior al rezervorului la inălțimi diferite (cu cât numărul acestora crește, cu atât distanța dintre senzori scade și măsurătoarea nivelului de lichid va fi mai precisă). Trebuie observat că la baza rezervorului este poziționat firul de cupru alimentat la o ternsiune de 5 volți, necesar pentru a pune în funcțiune comparatorul. Atunci când apa intră in contact cu senzorul din cupru poziționat pe peretele interior al rezervorului, curentul va putea trece mai departe și va fi transferat comparatorului pentru procesare. Comparatorul primește două semnale la intrare: unul dat de senzorul de nivel și celălalt stabilit de o sursă de tensiune, iar la ieșire va răspunde în tensiune de ordin mare (“high”) sau de ordin mic (“low”), corespunzătoare nivelului de 0 logic (0V) sau 1 logic (5V) cu care lucrează microcontrolerul.
Circuit de comparare
Circuitul de comparare face legătura între senzori și microcontroler. Acesta furnizează informația necesară microcontrolerului, adică nivelul de 0 logic (0V) sau nivelul de 1 logic (5V). Circuitul de comparare este format dintr-un număr de tranzistoare și rezistoare. În capitolul anterior (2.2 Caracteristiile tranzistorilor) este explicat modul de funcționare al tranzistoarelor. Pentru a înțelege cât mai bine cum funcționează acest circuit, am realizat o simulare (Proteus 8 Professional).
Am folosit un tranzistor bipolar (BC547) pe post de comutator. În figura 3.3 este realizat circuitul de comparare în prima fază, atunci când senzorul nu este alimentat. În colector este aplicată o tensiune de 5 volți iar în bază sunt 0 volți. În acest caz tranzistorul este blocat și astfel în emitor (unde se face conectarea cu microcontrolerul) este o tensiune aproximativă de 0 volți. Intrarea microcontrolerului trebuie să fie conectată la masă (nivelul 0 logic). Rezistorul R2 de valoare mare (10KΩ) limitează curentul care trece prin ramura ce duce la masă.
Figura 3.3 Circuit de comparare nealimentat
În figura 3.4 este simularea circuitului de comparare atunci când senzorul este alimentat la o tensiune de 5 volți. După cum se poate observa, prin bază trece un curent de ordinul microamperilor, fapt ce duce la deschiderea tranzistorului. Tensiunea din colector este transmisă în emitor, iar tensiunea ce va intra în microcontroler este de aproximativ 4.4 volți deoarece o mică parte din tensiunea din emitor cade pe rezistorul R2.
Figura 3.4 Circuit de comparare alimentat
Microcontroler
Acesta este cel mai important bloc din diagramă, microcontrolerul este cel care primește informațiile din exterior și răspunde în consecință. Cu ajutorul acestui mini-calculator sunt preluate datele furnizate de senzori și sunt afișate pe ecranul LCD informațiile utile referitoare la nivelul de apă din rezervor și în același timp este controlată pompa.
În cadrul proiectului am folosit un microcontroler din familia megaAVR lansată de firma Atmel. Tipul microcontrolerului se numește ATmega32. Este un microcontroler pe 8 biți bazat pe o arhitectură RISC cu 131 de instrucțiuni generale (majoritatea instrucțiunilor se execută într-un singur ciclu de ceas). Frecvența maximă de lucru este de 16MHz. Dispune de 32KB de memorie de program FLASH (10000 de cicluri de scriere/ștergere), 1KB de memorie EEPROM și 2KB de memorie internă SRAM. Este dotat cu interfețe JTAG, USART, SPI pentru programarea memoriei FLASH și EEPROM. Tipul de încapsulare PDIP folosit are 40 de pini care operează la o tensiune cuprinsă între 4.5 și 5.5 volți.
La partea practică am folosit ceasul intern al microcontrolerului de 1MHz, astfel consumul este de aproximativ 1.1mA în stare de funcționare și de 0.35mA în modul de stand-by.
Figura 3.5 Descrierea pinilor ATmega32
Sursa: Atmel
După cum se poate observa în figura de mai sus, microcontrolerul ATmega32 dispune de 4 porturi bidirecționale de intrare/ieșire pe câte 8 biți. Portul A servește ca intrarea convertorului analog-digital atunci când pinul 30 (AVCC) este alimentat. Fiecare port în parte poate îndeplinii funcții speciale ce sunt descrise în foile de catalog.
Pinul 9 este cel de resetare a microcontrolerului, pentru a reseta trebuie ca acesta să stea pe nivelul 0 logic mai mult de o perioadă minimă de ceas. Pinii de alimenare și de masă sunt 10, 11 și 31. Pinii 12 și 13 (XTAL1 și XTAL2) sunt intrările și ieșirile oscilatorului extern. Pinul 32 (AREF) este pinul de referință analogică pentru convertorul analog-digital.
Programarea microcontrolerului prin USBasp
USBasp este un circuit de programare pentru microcontrolerele AVR (firma Atmel) ce se poate conecta la un calculator printr-o interfață USB. Este compus dintr-un microcontroler ATmega8 (având firmware-ul adecvat) și câteva componente pasive. Acest programator poate scrie și citii memoria de program a microcontrolerelor, fiind și accesibil din punct de vedere financiar (prețul este de până la 50 RON). Viteza de programare este de până la 5 KB/s și este testat pe diferite sisteme de operare: Linux, MAC OS X și Windows.
În tabelul de mai jos sunt listate toate tipurile de microcontrolere ce pot fi programate cu USBasp.
Tabelul 3.1 Microcontrolere suportate de USBasp
Sursa: [13]
In urmatoarea figură este prezentat circuitul programatorului.
Figura 3.6 USBasp
Sursa: [13]
În partea stângă se află portul USB cu ajutorul căruia se poate face conexiunea cu un calculator/laptop. După cum se poate observa, există pe figură două conexiuni de tip “jumper”: J1 este folosit atunci când vrem să programăm microcontrolerul de pe circuit (pentru a reinoi firmware-ul microcontrolerului ATmega8), iar conexiunea J2 este folosită atunci când dorim să programăm un microcontroler extern circuitului. Cele două diode LED se aprind în funcție de conexiunea J1 sau J2. Pentru programarea microcontrolerelor este folosită o interfață serială ISP 1 cu 10 pini sau ISP 2 cu 6 pini.
Figura 3.7 Descrierea pinilor interfeței ISP
Sursa: [13]
În figura 3.7 este prezentată interfața ISP cu 10 pini. Conexiunea cu microcontrolerul se face în felul următor:
Pinul 1 MOSI (Master Out Slave In) al interfeței se va conecta la pinul 6 al microcontrolerului ATmega32;
Pinul 2 VCC este alimentarea și se conectează la pinul 10 al microcontrolerului;
Pinul 5 este pinul de resetare și se conectează la pinul 9 al microcontrolerului;
Pinul 7 SCK (Serial Clock) comunică cu pinul 8 al microcontrolerului pentru sincronizarea ceasurilor celor două sisteme;
Pinul 9 MISO (Master In Slave Out) se conectează la pinul 7 al microcontrolerului;
Pinul 10 este conectat la pinul de masă al integratului (pinul 11);
Ceilalți pini nu sunt folosiți.
În figura de mai jos este prezentat modul conectării microcontrolerului la programatorul USBasp. Am folosit un breadboard (placă cu găurele pentru conectarea experimentală a componentelor electronice) și conectori.
Figura 3.8 Conectarea microcontrolerului cu USBasp
Următorul pas este de a conecta circuitul de programare cu calculatorul. Pentru ca programatorul USBasp să fie recunoscut de către calculator este nevoie de instalarea unui set de programe (drivere) pe sistemul de operare al acestuia. Pentru scrierea, compilarea și transferul codului în memoria de program a microcontrolerului am folosit programul WinAVR. WinAVR este constituit dintr-un set de programe: avr-gcc (compilatorul de linii de comandă), avr-libc (conține librăria compilatorului), avr-as (programul ce traduce codul în limbaj de asamblare), avrdude (interfața de programare), programmers notepad (programul în care este scris codul în limbaj c) și multe altele.
Figura 3.9 Fragment din codul sursă
În figura 3.9 se găsește codul sursă al proiectului, este scris în limbajul de programare C. Întreg setul de instrucțiuni este încadrat în funcția while(1) pentru că este un ciclu infinit. Prima acțiune este de a citii senzorii de pe pinii microcontrolerului. Avem patru pini de intrare (senzorii de nivel) și un pin de ieșire (motorul). După citirea senzorilor, microcontrolerul va intra pe unul din cele 5 cazuri posibile. Dacă toți senzorii sunt zero, atunci motorul pompei este pus în funcțiune și se afișează pe ecranul LCD nivelul corespunzător de lichid din rezervor. Atunci când rezervorul este plin, pompa va fi scoasă din funcțiune pentru a nu risipi apă. In cazul unei defecțiuni a senzorilor, adică nu se respectă ordinea în care sunt activați senzorii, atunci va fi afișat pe ecran cuvântul “NULL” pentru ca operatorul să știe că există o defecțiune. Codul complet se gasește în anexa 1.
Unitate de afișare
Conectarea ecranului LCD la un microcontroler ATmega32
În figura de mai jos este arătat modul de conectare a unui microcontroler ATmega32 (fiind exact tipul de microcontroler folosit în acest proiect) la un ecran LCD 16×2.
Pinii PD.0…PD.7 ai microcontrolerului sunt conectați direct cu pinii D0…D7 ai ecranului LCD, prin ei se transmit cei 8 biți de date sau de control. Semnalele de control sunt transferate către modulul LCD prin conectarea directă a pinilor PC6 și PC7 cu pinii de enable și register sélection. Pinul R/W (Read/Write) este conectat la potențialul 0 deoarece se efectuează doar operația de scriere. VEE este pinul de contrast și este conectat printr-un potențiometru la modulul LCD.
Figura 3.10 Conectarea microcontrolerului ATmega32 la un ecran LCD 16×2
Tabel 3.2 Cele mai utilizate comenzi ale modulului LCD
Sursa: [14]
Inițializarea modulului LCD:
Se trimite valoarea 38H pentru a instrui ecranul să folosească cele 2 linii de afișare și matrici de 5×7;
Se trimite valoarea 0FH pentru a porni ecranul și pentru a muta cursorul pe prima poziție;
Se trimite 06H pentru a incrementa poziția cursorului;
Se trimite 01H pentru a șterge ecranul și a întoarce cursorul la poziția inițială.
Pompa
În cadrul proiectului am ales pe post de pompă un motor ce funcționează la o tensiune constantă de 5 volți. Rolul acestui motor este de a evidenția faptul că pompa este pusă în funcțiune. Atunci când nivelul de apă din rezervor atinge nivelul de minim, microcontrolerul pornește motorul, el furnizează o tensiune constantă de 5 volți pe portul PA0. Când rezervorul s-a umplut, microcontrolerul întrerupe semnalul de pe portul respectiv și motorul este oprit. Pe același principiu poate funcționa și o pompă.
3.3 Punerea în comun a componentelor și testarea circuitului
Pentru a testa funcționalitatea circuitului am folosit o placă de test cu găurele (breadboard) și conectori.
Figura 3.11 Testarea circuitului
După cum se poate observa în figura 3.11, pe placa de testare nu se regăsesc toate componentele. Circuitul de comparare despre care am vorbit în capitolul anterior nu este prezent și nici motorul. Acele componente nu erau necesare pentru a verifica dacă microcontrolerul funcționează. Am alimentat mircocontrolerul și senzorii la o tensiune de 5 volți. În acest caz, pe ecran este afișat cuvântul plin deoarece toți senzorii sunt activați iar motorul este oprit (am verificat măsurând tensiunea de pe pinul PA0 cu un multimetru, rezultatul fiind o tensiune de 0 volți).
3.4 Lipirea componentelor pe placă și integrarea circuitului
Pentru lipirea microcontrolerului pe placa de test am folosit un soclu, acesta este conceput special pentru tipul de împachetare al microcontrolerului folosit. Toate componentele sunt lipite cu pistolul de lipit și cositor. În figurile ce urmează este prezentat circuitul văzut din față și spate. Acest circuit respectă diagrama funcțională de la începutul capitolului.
Figura 3.12 Circuitul văzut din spate
Figura 3.13 Circuitul văzut de sus
Circuitul este integrat într-o cutie de plastic pentru a avea un aspect plăcut și pentru a proteja circuitul din interior. În cazul în care acest circuit este folosit într-o fabrică sau într-un loc izolat cu umiditate crescută, este de preferat ca această capsulă de plastic să fie închisă etanș pentru a nu lasă umiditatea să deterioreze componentele din interior. Varianta finală a dispozitivului (Figură 3.14) are un buton de oprire și pornire a dispozitivului și un potențiometru pentru a regla luminozitatea ecranului LCD.
Figura 3.14 Varianta finală a dispozitivului
Concluzii
Această lucrare de diplomă este complexă deoarece înglobează o mare parte din ramurile electronicii. Programarea și electronica aplicată se îmbină pentru a produce un dispozitiv funcțional și practic. Primul lucru pe care l-am făcut a fost să mă gândesc la o schemă bloc și apoi să analizez fiecare bloc în parte pentru a alege componentele electronice potrivite. O dată ce am strâns toate componentele, următorul pas a fost de a programa microcontrolerul. Programarea a fost destul de dificilă pentru că a trebuit să învăț unele comenzi din limbajul de programare pe care nu le cunoșteam. După programare a urmat testarea funcționalității sistemului pe o placă de test, apoi gândirea unui mod de aranjare eficientă pe placa finală. Următoarea etapă a fost de a lipi componentele și a integra tot sistemul într-un mod cât mai practic, în final obținându-se dispozitivul dorit. O dată cu trecerea prin toate aceste etape am învățat foarte multe lucruri care îmi vor folosi pe viitor.
Dispozitivul are ca scop diminuarea risipei de apă și economisirea banilor prin înlăturarea erorii umane. Poate fi folosit în industrie sau in orice cladire pentru a dispunde de o rezerva de apa. Costurile de realizare au fost minime.
Bibliografie
[1] Istoria mașinilor de calcul, https://ro.wikipedia.org/wiki/Istoria_ma%C8%99inilor_de_calcul, accesat la data: 25.03.2016
[2] Arhitectura von Neumann, https://sites.google.com/site/niciunsitefa/istorie/arhitectura-von-neumann, accesat la data: 27.03.2016
[3] Arhitectura Harvard, http://www.rasfoiesc.com/educatie/informatica/calculatoare/Concepte-de-baza-arhitectura-c23.php, accesat la data 27.03.2016
[4] Descrierea generală a microcontrolerelor, http://web.ulbsibiu.ro/laurean.bogdan/html/Micro controlere%20introducere.pdf, accesat la data: 04.04.2016
[5] M. Popa, Proiectarea microsistemelor digitale, Orizonturi Universitare, Timișoara, 2003
[6] John Crisp, Introduction to Microprocessors and Microcontrollers, Ed. TECHNOLOGY IN ACTION, 2003
[7] Familia de microcontrolere 8051, http://www.circuitstoday.com/8051-microcontroller, accesat la data: 15.04.2016
[8] Tranzistorul, http://www.hobbytronica.ro/despre-tranzistor-principii-fizice-de-functionare/, accesat la data 24.04.2016
[9] Craciun Elena, Tranzistoare bipolare, http://etc.unitbv.ro/~craciun/ElnAn/Curs/C3_TB_fundam.pdf, accesat la data: 03.05.2016
[10] S.D. Anghel – Bazele electronicii analogice și digitale, http://www.phys.ubbcluj.ro/~anghels/teaching/Electronics/capitole%20electronica%20pdf/Tranzistorul%20bipolar.pdf, accesat la data: 03.05.2016
[11] Ecrane LCD, http://ctmtc.utcluj.ro:8080/romana/Cursuri/Televiziune%20-%20EA/Plasma %20vs%20LCD.pdf, Universitatea tehnica din Cluj-Napoca, accesat la data: 05.05.2015
[12] Modul LCD 16×2 JHD 162A, http://www.circuitstoday.com/interfacing-lcd-to-arduino, accesat la data: 06.05.2016
[13] Descriere programator USBasp, http://eecs.oregonstate.edu/education/docs/ece375/USBASP-UG.pdf, accesat la data 16.05.2016
[14] Interfatare LCD cu microcontroler 8051, http://www.circuitstoday.com/interfacing-16×2-lcd-with-8051, accesat la data 17.05.2016
Anexa 1
Codul sursă
Codul principal
#ifndef F_CPU
#define F_CPU 1000000UL // 1 MHz clock speed
#endif
#include <avr/io.h>
#include <stdbool.h>
#include <util/delay.h>
#include "lcd.h"
#define RS_DDR DDRC
#define EN_DDR DDRC
#define RS_BIT PC6
#define EN_BIT PC7
#define DATA_DDR DDRD
#define D0_BIT PD0
#define D1_BIT PD1
#define D2_BIT PD2
#define D3_BIT PD3
#define D4_BIT PD4
#define D5_BIT PD5
#define D6_BIT PD6
#define D7_BIT PD7
#define MOTOR_DDR DDRA
#define MOTOR_PORT PORTA
#define MOTOR_PIN PINA
#define MOTOR_BIT PA0
#define SENSOR_DDR DDRA
#define SENSOR_PORT PORTA
#define SENSOR_PIN PINA
#define PLIN_BIT PA1
#define TREI_SFERTURI_BIT PA2
#define JUMATATE_BIT PA3
#define SFERT_BIT PA4
bool sfert, jumatate, trei_sferturi, plin;
void Hardware_Init(){
// Display config OUTPUT pins
DATA_DDR |= _BV(D0_BIT);
DATA_DDR |= _BV(D1_BIT);
DATA_DDR |= _BV(D2_BIT);
DATA_DDR |= _BV(D3_BIT);
DATA_DDR |= _BV(D4_BIT);
DATA_DDR |= _BV(D5_BIT);
DATA_DDR |= _BV(D6_BIT);
DATA_DDR |= _BV(D7_BIT);
RS_DDR |= _BV(RS_BIT);
EN_DDR |= _BV(EN_BIT);
MOTOR_DDR |= _BV(MOTOR_BIT); // configure MOTOR pin as OUTPUT
MOTOR_PORT &= ~_BV(MOTOR_BIT); // set 0 logic to output motor bit
SENSOR_DDR &= ~_BV(PLIN_BIT);
SENSOR_DDR &= ~_BV(TREI_SFERTURI_BIT); // configure sensor pins as input
SENSOR_DDR &= ~_BV(JUMATATE_BIT);
SENSOR_DDR &= ~_BV(SFERT_BIT); }
int main(void){
Hardware_Init();
Lcd8_Init();
while(1)
{ // citirea senzorilor
sfert = SENSOR_PIN & _BV(SFERT_BIT);
jumatate = SENSOR_PIN & _BV(JUMATATE_BIT);
trei_sferturi = SENSOR_PIN & _BV(TREI_SFERTURI_BIT);
plin = SENSOR_PIN & _BV(PLIN_BIT);
if(sfert==0&&jumatate==0&&trei_sferturi==0&&plin==0) //cand rezervorul este gol
{
Lcd8_Cmd(0x80); // mutarea cursorului pe prima pozitie din ecranul LCD
Lcd8_Write_String("GOL "); // scrierea cuvantului "GOL" pe ecran
MOTOR_PORT |= _BV(MOTOR_BIT); // porneste pompa
}
else if(sfert==1&&jumatate==0&&trei_sferturi==0&&plin==0)
{
Lcd8_Cmd(0x80);
Lcd8_Write_String("SFERT "); // afisare "SFERT" pe ecranul LCD
}
else if(sfert==1&&jumatate==1&&trei_sferturi==0&&plin==0)
{
Lcd8_Cmd(0x80);
Lcd8_Write_String("JUMATATE "); // afisare "JUMATATE" pe ecran
}
else if(sfert==1&&jumatate==1&&trei_sferturi&&plin==0)
{
Lcd8_Cmd(0x80);
Lcd8_Write_String("3xSFERTURI "); // afisare "3XSFERTURI" pe ecran
}
else if(sfert==1&&jumatate==1&&trei_sferturi&&plin==1)
{
Lcd8_Cmd(0x80);
Lcd8_Write_String("PLIN "); // afisarea cuvantului "PLIN" pe ecran
MOTOR_PORT &= ~_BV(MOTOR_BIT); // pompa se opreste
}
else
{
Lcd8_Cmd(0x80);
Lcd8_Write_String("NULL "); // se afiseaza cuvantul "NULL" pe ecran
MOTOR_PORT |= _BV(MOTOR_BIT); // porneste pompa
}
_delay_ms(100);
}
}
Codul modului LCD
//LCD 8 Bit Interfacing Functions
void Lcd8_Port(char a)
{
if(a & 1)
pinChange(D0,1);
else
pinChange(D0,0);
if(a & 2)
pinChange(D1,1);
else
pinChange(D1,0);
if(a & 4)
pinChange(D2,1);
else
pinChange(D2,0);
if(a & 8)
pinChange(D3,1);
else
pinChange(D3,0);
if(a & 16)
pinChange(D4,1);
else
pinChange(D4,0);
if(a & 32)
pinChange(D5,1);
else
pinChange(D5,0);
if(a & 64)
pinChange(D6,1);
else
pinChange(D6,0);
if(a & 128)
pinChange(D7,1);
else
pinChange(D7,0);
}
void Lcd8_Cmd(char a)
{
pinChange(RS,0); // => RS = 0
Lcd8_Port(a); //Data transfer
pinChange(EN,1); // => E = 1
_delay_ms(1);
pinChange(EN,0); // => E = 0
_delay_ms(1);
}
void Lcd8_Clear()
{
Lcd8_Cmd(1);
}
void Lcd8_Set_Cursor(char a, char b)
{
if(a == 1)
Lcd8_Cmd(0x80 + b);
else if(a == 2)
Lcd8_Cmd(0xC0 + b);
}
void Lcd8_Init()
{
pinChange(RS,0);
pinChange(EN,0);
_delay_ms(20);
///////////// Reset process from datasheet /////////
Lcd8_Cmd(0x30);
_delay_ms(5);
Lcd8_Cmd(0x30);
_delay_ms(1);
Lcd8_Cmd(0x30);
_delay_ms(10);
/////////////////////////////////////////////////////
Lcd8_Cmd(0x38); //function set
Lcd8_Cmd(0x0C); //display on,cursor off,blink off
Lcd8_Cmd(0x01); //clear display
Lcd8_Cmd(0x06); //entry mode, set increment
}
void Lcd8_Write_Char(char a)
{
pinChange(RS,1); // => RS = 1
Lcd8_Port(a); //Data transfer
pinChange(EN,1); // => E = 1
_delay_ms(1);
pinChange(EN,0); // => E = 04
_delay_ms(1);
}
void Lcd8_Write_String(char *a)
{
int i;
for(i=0;a[i]!='\0';i++)
Lcd8_Write_Char(a[i]);
}
void Lcd8_Shift_Right()
{
Lcd8_Cmd(0x1C);
}
void Lcd8_Shift_Left()
{
Lcd8_Cmd(0x18);
}
//End LCD 8 Bit Interfacing Functions
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Sistem electronic de monitorizare a nivelului de lichid dintr-un rezervor [304078] (ID: 304078)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
