Introducere …1 [307777]
Cuprins
Introducere ………………………………………………………………………………………….1
Capitolul I
Analiza critică a stadiului de național/internațional de dezvoltare a sistemului realizat în lucrarea de licență …………………………………………………………………3
Capitolul II
Rezolvarea problemei propuse ……………………………………………………………….14
2.1 Analiza problemei ………………………………………………………………….14
2.2 [anonimizat] …………………………..14
2.3 Aspecte teoretice ……………………………………………………………………19
2.3.1 Transformata Fourier discretă ……………………………………..19
2.3.2 Discretizarea frecvenței ………………………………………………20
Capitolul III
Proiectarea unui sistem pentru analiza spectrală a semnalelor cu ajutorul unui microcontroller …………………………………………………………………………………….22
3.1 Blocul de achiziție de date ………………………………………………………24
3.1.1 Filtrul trece jos …………………………………………………………..24
3.1.2 [anonimizat] …………………………………………..29
3.1.2.0 Topologii ale CAN …………………………………………32
3.1.2.1 CAN cu rampă în trepte ………………………………….32
3.1.2.2 CAN cu aproximări succesive ………………………….34
3.1.2.3 CAN paralele …………………………………………………35
3.1.3 Simularea circuitelor electronice ………………………………….41
3.1.3.0 [anonimizat] ………………..41
3.1.3.1 Etapele dezvoltării unui produs electronic
……………………………………………………………..42
3.1.3.2 Descrierea programului PSPICE ………………………45
3.1.3.3 Rezultatele simulării în PSPICE ………………………48
3.2 Modulul de prelucrare numerică și calcul ……………………………..55
3.2.1 Microcontroller vs Microprocesor ………………………………..55
3.2.2 Arhitectura Harward …………………………………………………..57
3.2.3 Arhitectura Princeton ………………………………………………….66
3.3 Dispozitive periferice ……………………………………………………………..67
3.3.0 Porturi paralele……………………………………………………………67
3.3.1 Circuite de temporizare TIMER …………………………………..71
3.4 Modulul de afișare …………………………………………………………………75
Capitolul IV
4.1 Implementarea soluției ……………………………………………………………93
4.1.1 [anonimizat] ……………………………………………93
4.1.2 [anonimizat] …………………………………………….95
4.1.2.1 Generalități ……………………………………………………95
4.1.2.2 Diagrama bloc a programului …………………………..95
4.1.2.3 Funcția de eșantionare …………………………………….96
4.1.2.4 Implementarea algoritmului pentru
Transformata Fourier discretă …………………………..99
4.1.2.5 Afișarea rezultatelor. Funcția de afișare și interacțiune cu utilizatorul………………………………101
4.1.2.6 Primitive grafice. Funcția grafică pentru desenarea unui dreptunghi ……………………………………………106
4.1.2.7 Funcția panou informare utilizator ……………………109
Bibliografie …………………………………………………………………………………………pag
Anexa1 ……………………………………………………………………………………………….pag
Anexa2 ……………………………………………………………………………………………….pag
Anexa3 ……………………………………………………………………………………………….pag
Anexa4 ……………………………………………………………………………………………….pag
Introducere
Această temă a fost dezvoltată din dorința de a realiza în primul rănd o aplicație practică cu ajutorul căreia să fie implementată transformata Fourier pe un sistem autonom construit în jurul unui microcontroller.
Domeniul de aplicabilitate ales se limitează la spectrul semnalelor de audiofrecvență avănd valori cuprinse între 1000 și 10000Hz dar cu o bandă de frecvență destul de largă încăt să acopere semnalele percepute de urechea umană.
În ultima vreme, marea majoritate a studiourilor de televiziune căt și cele de înregistrari audio, pun un accent foarte puternic pe utilizarea dispozitivelor de măsură și analiză spectrală a sunetului.
Astfel, parametrii unei inregistrări audio sunt ajustați cu o rigurozitate de calcul matematic pe baza interpretării rezultatelor unor masurători realizate în timp real, lucru bine de evidențiat, avănd în vedere că timpul de reacție al operatorului trebuie să fie foarte mic.
În ultimul deceniu, tehnica de calcul electronic și-a facut simțită prezența mai peste tot neocolind nici domeniul multimedia.
Procesarea în timp real din domeniul audio cât si video a condus la rezultate spectaculoase, de la efectele speciale ale sound-track-urilor filmelor SF până la înregistrările audio de înaltă calitate.
Alt aspect al aplicării transformatei Fourier se poate regăsii în aplicații de recunoastere a voci umane, cu diversele sale implementări de la comenzi vocale păna la sisteme de securitate ce folosesc amprenta vocală.
Provocările și experiența avuta în timpul proiectării și implementării acestui sistem nu a fost deloc ușoare, trebuind alese acele soluții care sau dovedit a fi cele mai bune și mai optime pentru a fi implementate pe microcontroller.
Existența unor limitări, raportat la un sistem de calcul modern dotat cu memorie ce poate fi expandată prin adăugarea de noi module de memorie căt și a unor procesoare puternice, și-a făcut din plin resimțită prezența.
Începănd cu limitări datorate frecvenței maxime de lucru a microprocesorului și memorie de lucru limitată ca dimensiune și continuănd cu faptul ca aceasta generație de microcontrollere are o magistrala de 8 biți lucruri care au făcut imperios necesara testarea mai multor versiuni de implementare a calculului transformatei Fourier.
Dar toate acestea au crescut mai mult interesul pentru realizarea practică a sistemului
Deasemenea modul de afișare a rezultatelor prelucrării calculelor și anume pur grafic folosind un afișaj color LCD-TFT face ca implementarea să se distingă de altele ce sunt realizate fie în mod traditional , utilizănd diodele electroluminiscente fie utilizănd afișaje cu cristale lichide orientate pe caractere.
În consecința utilitatea realizării acestui proiect are și un aspect practic , economic pe deoparte datorat performanțelor sale la un cost destul de redus, iar celălalt aspect este reprezentat de latura didactică , aceasta deoarece implică acumularea de noi cunoștințe din domeniul electonici cât și al programării.
Capitolul I
Analiza critică a stadiului național și internațional de dezvoltare a sistemului realizat în lucrarea de licența.
În plan profesional , analizând diferite produse ce se încadreaza în domeniul de frecvență propus în lucrarea de față, respectiv domeniul frecvențelor audio, am evidențiat căteva dispozitive , utilizate cu precădere în studiourile de înregistrare a sunetului.
Astfel firma DK-Technologies produce un analizor spectral, MSD200C cu următoarele caracteristici tehnice:[ http://www.dk-technologies.com/msd600m/#techspec]
Afișaj de tip LCD (cristale lichide TFT) color cu o rezoluție de 640×480 pixeli VGA
Dimensiunea unui pixel 0.2mm
Contrastul 100:1
Intrare analogică:
Nivel maxim semnal +24dBu
Rata de eșantionare , folosind oscilatorul intern 48KHz
Rata de eșantionare , folosind oscilator extern de la 32KHz la 50KHz
Rezoluția convertorului ADC 24biți
Domeniul frecvențelor de intrare 30Hz păna la 20KHz
Tensiunea de alimentare 12V păna la 24V curent continuu
Puterea consumata 18W la o tensiune de alimentare de 12V
Algoritm FFT cu 1024 puncte de eșantionare
Alte facilitați oferite de acest dispozitv, utile in domeniul destinat sunt:
Funcția de goniometru – ce permite afișarea pe ecran a unor figuri “Lissajous”.
Practic, un osciloscop clasic la care intrarea pentru canalul X , ce realizează deflexia pe orizontală a spotului, este conectată la o sursă audio de semnal, iar intrarea pentru canalul Y, ce realizează deflexia spotului pe verticală , este conectată la cea de a doua sursă de semnal.
În cazul în care ambele surse sunt în fază și sunt identice, pe ecrean se vizualizează o dreaptă suprapusă peste axa ordonatei.
În cazul în care între semnalele celor doua canale audio apare o diferență de fază (opoziție de fază) , aceasta va fi afișată pe ecran sub forma unei drepte ce va forma un unghi față de ordonată, unghi a cărei mărime este proporțional cu abaterea.
Funcția de generator de ton, utilizată pentru etalonarea aparaturii audio, acesta va genera un semnal sinusoidal cu frecvența de 1KZh și amplitudinea de 1.5Vvv.
Nivel-metru, ce poate afișa valorile semnalelor pe ambele canale audio.
Conform datelor puse la dispoziție de către producător, soluția tehnică adoptată a fost utilizarea unui DSP (eng. Digital Signal Processor) produs de firma Analog Devices ADSP- 2181.
Configurarea parametrilor principali se face cu ajutorul unor meniuri, accesul la meniuri realizându-se cu ajutorul unor taste dispuse liniar în partea inferioară a LCD-ului, taste ce acționează contextual.
În ceea ce privește conectivitatea aceasta este extrem de versatilă, făcând față cu succes oricarei cerințe a utilizatorului.
Găsim disponibil pe panoul inferior conectori de intrare pentru semnalul analogic dar și conectori de intrare pentru semnalul digital , ce respecta standardele de sunet de televiziune AES/EBU[https://tech.ebu.ch/docs/other/aes-ebu-eg.pdf].
Deasemenea , tot pe panoul inferior avem și ieșiri corespunzatoare de sunet analogice cât și digitale.
Conversia semnalelor audio este realizata folosind circuite specializate , destinate acestui scop.
Pentru eliminarea zgomotului de quantizare a fost folosit un ADC de tipul “delta-sigma”, acesta soluție realizată practic prin folosirea unui circuit integrat specializat CS4812 produs de catre firma CyrrusLogic, circuit care, conform fișei de catalog , este dedicat prelucrării digitale a semnalelor audio analogice, provenite de la diverse surse de semnal, efecte acustice, fiind un circuit integrat proprietar, algoritmii utilizati nu sunt cunoscuți de către public.
Folosindu-se această metodă, s-a reușit o captare cât mai fidelă a semnalului, eliminandu-se foarte mult zgomotul de cuantificare.
Comparativ , soluția abordată de către producător duce la o reprezentare mai fidelă, fară zgomot a semnalului in raport cu utilizarea unor convertoare paralele de tip flash.
Diferite impementări ale transformatei Fourier discrete se pot realiza utilizand microcontrollere de cost scăzut, in funcție de capacitatea registrelor interne (8biți sau 16biți) performanțele variaza semnificativ.
Deasemenea frecvența de ceas a microcontrolerului este decisivă, mai ales daca dorim sa obținem un sistem de analiză in timp real.
Avand in vedere faptul că transformata Fourier discretă utilizează numere complexe a căror parte reală respectiv imaginară sunt reprezentate in virgulă fixa, pentru realizarea algoritmului in general se utilizează artificii ce implică utilizarea numerelor intregi.
Deasemeni se folosește foarte mult tabelarea valorilor pentru funcțiile trigonometrice cosinus respectiv sinus.
Înainte de a trece in revistă cațiva dintre algoritmii folosiți, trebuie sa menționăm ca aceștia se pot îmbunatați într-un ciclu ce se pote repeta la infinit.
Ideea care stă la baza acestor algoritmi, pornește de la formula de bază a transformatei Fourier discrete și de la modalitațile de rearanjare a succesiunii calculelor , in implementarea metodelor de calcul, cât și de la exploatarea unor proprietați distincte ale transformatei Fourier, acestea fiind analizate in detaliu in capitolul curent.
În toate cazurile se pornește de la definiție, in care componenta de ordinul k este data de relația :
(1)
Unde N reprezintă numarul de puncte
K reprezintă linia curentă
Expresia : poate fi pusa în formă trigonometrică astfel :
)+jsin( (2)
cum funcția cosinus este o funcție trigonometică pară, adica cos(-x)=cos(x), iar funcția trigonometrică sinus este o funcție impară adica sin(-X) = -sin(X), relația de mai sus se poate rescrie in felul următor
)-jsin( (3)
Pentru a simplifica scrierea relația de mai sus (3) se notează astfel :
(4)
O primă idee de implementare a FFT este realizarea unor tabele cu funcțiile sinus si cosinus pentru o anumita valoare a lui N.
Spre exemplificare, considerăm N=8;
Vom calcula cel 8 linii din spectrul de frecvență a semnalului eșantionat x(n);
Ceea ce corespunde cu:
X[0] = x(0)*+x(1)*+x(2)*+x(3)*+x(4)*+x(5)*+x(6)*+x(7)*
Pentru k=1;
Care se scrie:
X[1]=x(0)*+x(6)*
Pentru k=2;
X[2]=x(0)*+x(6)*+x(7)*
Pentru k=3;
X[3]=x(0)*+x(2)*+x(3)*+x(6)*
Pentru k=4;
X[4]=x(0)+x(4)*+x(6)*
Pentru k=5;
X[5]=x(0)*+x(4)*+x(5)*+x(7)*
Pentru k=6;
X[6]=x(0)*+x(3)*+x(4)*
Pentru k=7;
X[7]=x(0)*
Putem realiza în acest fel două matrice ce conțin valorile funcțiilor trigonometrice, ca în exemplul de mai jos:
Iar matricea funcției sinus este :
Generalizănd, se pot scrie matrice pentru numere N=16, 32, 64, 128 puncte.
Desigur se poate intui că o primă limitare este dată de dimensiunea memoriei microcontrolerului, memorie ce trebuie sa stocheze permanent cele doua matrici.
Dacă, pentru valori mici ale lui N , de 16 sau 32 de puncte , această problemă nu constituie un impediment, odată cu creșterea valorii numărului de puncte , găsirea unui microcontroller cu o memorie EEPROM foarte mare este dificilă, deasemenea crește corespunzător și prețul acestuia.
Transpunerea in pseudocod a acestui algoritm se face astfel:
Table_cos[8][8]={};
Table_sin[8][8]={};
K, n;
N
N<-8;
Ft[8][2];
Semnal[8];
Factor;
Factor<-10000;
Pentru k=0 la N
Execută
Pentru n=0 la N
Execută
Ft[k][0] <-Ft[k][0] + semnal[n]*Tabel_cos[k][n];
Ft[k][1]<-Ft[k][1] + semnal[n]*Tabel_sin[k][n];
Sfărșit
Ft[k][0] <- Ft[k][0]/8;
Ft[k][0]<-Ft[k][0]/Factor;
Ft[k][1]<-Ft[k][1]/8;
Ft[k][1]<-Ft[k][1]/Factor;
Sfărșit
Algoritmul este simplu de implementat pe microcontroller si des utilizat datorită vitezei sale de execuție mari.
Un impediment este reprezentat de rigiditatea lui, adică odată calculată tabela de loockup pentru cele doua funcții trigonometrice la un număr dat de puncte aceasta trebuie recalculată pentru alt număr de puncte.
Consultând literatura de specialitate [1], se observă cu ușurință anumite proprietați ale vectorului de rotire , acestea fiind :
=*
Dar : =cos()-jsin(
Deci
Rezulta ca : =
O alta proprietate importanta este :
Evident , deoarece:
)-jsin);
Și ultima proprietate:
= (1.3)
Exploatănd aceste proprietați , a fost realizat un algoritm ce calculează transformata Fourier discreta , algoritm numit cu decimare in timp sau prescurtat DIT (Decimation in Time).
Semnalul analogic, după ce este eșantionat cu o frecvență aleasa conform teoremei lui Nyquest, este memorat sub forma unui vector ce are de regulă un număr de eșantioane.
Ideea care stă la baza acestui algoritm este de a rearanja aceste eșantioane în eșantioanele pare si cele impare.
Atunci vom avea :
Dar x(n) = x(2p)+x(2p+1)
(1.4)
Această scriere este echivalentă cu ecuația fundamentală a transformatei Fourier
Aplicând proprietatea (1.4)
+ (1.5)
Dar =cos( (1.6)
Pentru k=[0,1,2 ….., N/2]
X[k] = + * (1.7)
În continuare x(u) se poate separa la rândul lui în elementele sale pare și impare, asta pană când x(u) va conține doar doua elemente.
Avem atunci:
X[0] = x(0)*+x(1)* (1.8)
X[1]=x(0)*+x(1)* (1.9)
Din care rezultă că :
X[0] = x(0) + x(1)
X[1] = x(0) – x(1)
În literatura de specialitate [1] acesta poartă numele de “fluture” sau din engleză “butterfly”
Această metodă de calcul , presupune o anumită aranjare a biților la intrarea blocului de calcul , cunoscută sub numele de [1] “bit reversal order”
Complexitatea calculului este de [1] N*(N) ceea ce este mult mai mica decât la prima metodă.
Avantajele care rezidă sunt, că se poate implementa un “butterfly” hardware în structura microprocesorului [2] metodă des întalnită la procesoarele de semnal.
Deasemenea există și algoritmi “software”, de regulă implementarea fiind recursiva [3] ceea ce implică o atenție sporită in alegerea microcontrolerului, fiind folosită intensiv stiva.
Cele doua implementări , cu tabele de loockup și cu decimarea in timp sunt prezentate prin cele două aplicații anexate la sfarșitul lucrării si desigur in format executabil , program ce se gasește pe CD-ul anexă al lucrarii.
Aceste două metode funcționează cu o precizie bună și în timp real pentru frecvențe de pănă la 100MHz.
Evident se pune întrebarea cum va arăta acestă implementare, ce procesoare se vor folosii , ce putere de calcul și câtă memorie program avem nevoie pentru semnalele care variază foarte rapid în timp.
Aceste semnale ar fi , desigur semnale cu frecvențe de zeci până la sute de GHz.
Soluția găsită poartă numele de “Metoda heterodinei”.
Schema bloc a acestei metode este ilustrată în figura de mai jos.
Figura1.1 Schema bloc a metodei heterodinei Analizoarele spectrale [2] ce funcționează pe această metodă, sunt de regulă foarte scumpe, piesele componente fiind de mare precizie, avand un zgomot foarte mic (de exemplu mixerul de semnal)
Sunt aparate folosite cu precădere în laboratoare de cercetare.
Capitolul II
Rezolvarea problemei propuse
2.1 Analiza problemei
Punctul de pornire înspre rezolvarea problemei propuse in lucrarea de față este acela de a imagina o metodă de rezolvare bazată pe datele ce le avem la dispozitie, reprezentarea acesteia la un nivel abstract , folosind așa numitele “Black-Box-uri”, urmănd ca fiecare din blocurile funcționale sa fie dezvoltate ulterior, intr-un mod etapizat.
Datele problemei in acest pas al rezolvarii temei propuse sunt urmatoarele:
Date de intrare
Un semnal analogic ce poate avea o frecvență în domeniul 0- 10KHz.
Date intermediare
Semnale numerice , proporționale cu amplitudinea componentei liniei spectrale analizate.
Date de iesire
Reprezentare grafica, proportionala cu valoarea numerica a datelor intermediare
Implementarea temei propuse se va face utilizănd un microcontroller.
Din cele expuse mai sus putem deduce ca la nivel de schema bloc , sistemul este compus din urmatoarele blocuri funcțional
2.2 Reprezentarea abstractă, module componente
Modulul de achiziție și conversie
Modulul de prelucrare numerică și calcul
Modulul de afișare
Fig2.1 Modulele componente ale sistemului
Fiecare din modulele componente ale sistemului are un rol binedefinit in comportamentul acestuia, de buna funcționare a acestuia depinzând caracteristicile globale ale sistemului si respectiv funcționalitatea acestuia.
Aceasta afirmație fiind adevărată ea pornind din însași definiția sistemului care spune ca :
“Un sistem este o colectie de obiecte care interactioneaza atat intre ele cat si cu mediul inconjurator , in vederea atingerii unui scop, al unui obiectiv”[4]
Vom vedea pe parcursul acestei lucrari modul în care interacționează sistemul cu mediul inconjurator si modalitatea de captare si prelucrare a informației.
Semnalul aplicat la intrarea sistemului, este un semnal analogic variabil în timp si bineînțeles măsurabil.
Citim in lucrari de specialitate [1] , condiția pentru ca un semnal sa fie măsurabil este ca acesta să fie de modul integrabil finit, ceea ce se poate scrie astfel:
Cel mai simplu semnal pe care-l putem analiza este :
x(t) = A*sin(ωt+ϕ); unde A=amplitudinea semnalului
ω=pulsatia semnalului
ϕ=faza semnalului
Grafic , acest semnal este ilustrat în figura de mai jos.
Figura.2.2 Semnal analogic sinusoidal
Acest tip de semnal prezinta o variație continuă în domeniul sau de valori, practic între două valori adiacente avem o infinitate de valori, semnalul fiind definit pentru orice valoare a lui t.
Un alt parametru important este perioada semnalului definită ca distanța dintre doua puncte ce au aceiași valoare.
Frecvența semnalului reprezintă numărul de oscilații (perioade) în unitatea de timp.
Relația dintre frecvența și perioadă este :
(2.1)
Semnalele pot fi , semnale elementare simple sau complexe, cu ajutorul lor sistemul transmite informație către mediul înconjurător.
O altă clasificare a semnalelor se poate face în funcție de natura lor fizică astfel
Semnale sonore
Semnale luminoase
Semnale electrice
Semnale chimice (transmiterea informatiei prin feromoni) , aici se detașează un domeniu vast ce prezinta comunicarea și schimbul de informație ca o necesitate “universala” a tuturor făpturilor, astfel conform unui studiu publicat în revista “Discover”, cercetatorii au descoperit că … plantele vorbesc, ei au descoperit că, o specie de fasole de Lima emite un “strigat de ajutor” când este atacată de către paianjanul roșu, iar stigatul ei nu este în van ci are drept efect atragerea unei specii de acarieni care se hrănește cu … paianjenul roșu. [http://wol.jw.org/ro/wol/d/r34/lp-m/102003682 – Watchtower – Biblioteca Online]
Parafrazănd pe Stephen Hart putem spune negresit că : „Fără comunicare orice făptură ar fi doar o insulă izolată.“ [Limbajul animalelor – Stephen Hart]
Indiferent de modalitatea aleasa, scopul este același , adică de a transmite informația de la sursă la receptor printr-un canal de comunicație.
Caracteristicile fizice ale canalului va determina pe deoparte natura semnalului căt și modalitatea de codificare a acestuia.
Modelul de comunicare (unidirecțională ) este ilustrat in figura de mai jos.
Figura 2.3 Modelul de comunicație unidirecțional
Analiza și prelucrarea semnalelor ne oferă informații despre fenomenele care au loc in interiorul sistemului.
Putem face o analogie cu un vas care navighează pe mare , de jur împrejur fiind o ceață foarte densă.
Din timp in timp vasul emite un semnal acustic facăndu-și astfel simțită prezența sa către alte vase și evitănd o eventuală coliziune cu efecte catastrofale.
Bineințeles că în cele mai multe cazuri este util să avem o comunicație duplex, în această situație modelul de comunicație va arăta astfel :
Fig2.4 Model de comunicație duplex
În cazul lucrării de fața semnalul este din domeniul de audiofrecvență avănd limitare in frecvența pentru spectrul audio de 10KHz.
Semnalul poate provenii din diverse surse cum ar fi de exemplu vocea umana, caz în care este necesară o conversie , realizată cu un traductor acustic care poate fi un microfon.
Astfel observăm că semnalul provenit de la sursa, coardele vocale in cazul nostru , are inițial drept canal de comunicare mediul ambiant.
Vibrațiile sonore, concretizate prin mișcările molecuclelor de aer, vor fi transformate in variații ale unei mărimi electrice (tensiune) cu ajutorul unui traductor acustic.
Canalul de comunicație va avea o acțiune asupra semnalului util, adaugănd acestuia un zgomot, reprezentat printr-un semnal cu o variație in timp aleatoare.
Apare astfel necesitatea codificarii si modularii semnalului, de tehnicile folosite depinzand gradul de perturbare a semnalului.
Se face imperios necesară eliminarea, la recepție , pe cât posibil a zgomotului, aceasta realizandu-se prin operații de filtrare asupra semnalului.
O alta caracteristică importantă a canalului de comunicație , o reprezintă atenuarea pe care o introduce canalul de comunicare asupra semnalului util.
Pentru a facilita calculele matematice respectiv analiza semnalelor, in acest domeniu se folosesc semnale simple a cărui efect asupra circuitelor electronice este binecunoscut.
Astfel , pe langa semnalul sinusoidal putem avea semnale de tip treaptă unitate, semnale de tip impuls unitar, semnale exponențiale.
2.3 Aspecte teoretice.
Problema descompunerii unui semnal oarecare, periodic, într-o sumă de semnale elementare sinusoidale respective cosinusoidale a fost propusă pentru prima dată de către matematicianul Joseph Fourier.
Având în vedere natura discretă a semnalului obținut după operațiile de eșantionare, respectiv conversie din domeniul analogic în numeric, am utilizat transformata Fourier discretă.
Aceasta se obtine din transformata Fourier continuă, deci nu reprezinta un tip nou de operator, aplicand o funcție de convoluție semnalului analogic cu un semnal de tip impuls unitar dar care se repetă la intervale regulate de timp.
Astfel, semnalul analogic a carui variatie este continua în timp, el intre doua valori avand o infinitate de valori, se va transforma intr-un sir numeric cu N elemente.
2.3.1 Transformata Fourier discretă
Reprezentarea unui semnal discret (digital) în domeniul frecvență prezintă unele dezavantaje în cazul în care se folosește Transformata Fourier în Timp Discret (TFTD) din doua motive importante
în cazul TFTD funcția este o funcție ce are o variabilă continuă ω fapt ce o face dificil de prelucrat în cazul unor calcule efectiv numerice.
avem nevoie, pentru efectuarea calculului, de un numar infinit de eșantioane ale semnalului.
Din cele expuse mai sus rezultă că este imperios necesar utilizarea unor forme de calcul astfel încăt să se facă posibilă implementarea metodelor numerice de evaluare.
Acest lucru îl face Transformata Fourier Discretă.
Două aspecte trebuiesc urmărite, anume discretizarea frecvenței ω și limitarea numarului de eșantioane .
2.3.2 Discretizarea frecvenței
În acest proces , determinarea funcției este substituită prin calculul a N eșantioane ale sale, sau altfel spus este discretizata transformata Fourier, eșandioane ce sunt echidistante , obtinîndu-se , unde Kω poartă denumirea de armonica frecvenței de bază ω.
Datorită faptului că functia este o functie periodica , avand perioada 2π , vom împarții intervalul [0, 2π) in N subintervale egale de lungime .
Eșantionarea transformatei Fourier se face prin multiplicarea cu o succesiune de impulsuri Dirac δ
Semnalul corespunzator acestei transformate Fourier este succesiunea periodica de impulsuri unitate pe perioada N
Transformata Fourier eșantionată, notată cu are expresia
Produsului algebric îi corespunde în timp discret convoluția semnalelor care se poate scrie
Drept urmare semnalul este obținut prin repetarea periodică a semnalului x[n] cu perioada N dictată de frecvența de eșantionare a transformatei Fourier
fiind un semnal periodic admite o dezvoltare în serie Fourier exponentială și o transformată Fourier generalizată de forma
SFED
TFTD
coeficienții ai SFED sunt dați de relația
Comparănd relațiile 6 si 3 se obține formula ce leagă coeficienții SFED corespunzătoare semnalului periodic și transformata Fourier a semnalului x[n] ce se periodizeaza.
Pentru simplificarea scrierii se notează cu eșantioanele transformatei Fourier.
=>
Cu această notație, SFED șirelațiile de calcul a coeficiențiilorsăidevin :
respectiv,
Unde este semnalul discret periodicizat.
În practică realțiile se scriu astfel:
Capitolul III
Proiectarea unui sistem pentru analiza spectrală a semnalelor cu ajutorul unui microcontroller.
Avănd în vedere limitările datorate pe de o parte de frecveța relativ scăzută a microcontrolerullui (semnalul de ceas) si pe de altă parte de lațimea magistralei de date, in cazul nostrul magistrala internă a microcontrolerului fiind de 8 biți, trebuie aleasă acea implementare care sa evite in mod deliberat calculele intensive in virgulă mobilă cât și operații multiple de înmulțire și împărțire respectiv cele trigonometrice , sinus și cosinus ce sunt mari consumatoare de timp si se reflectă în mod global asupra sistemului, afectănd în primul rănd timpul de răspuns al acestuia la stimulii de intrare.
De asemenea dupa cum vom vedea, performanța sistemului este afectată și de subsistemul de afișare grafic, fiind necesar un timp căt mai mic de transfer între microcontroller si LCD.
În ceea ce privește problema transferului informației dintre microcontroller si subsistemul de afișare, aceasta a fost rezolvată prin doua moduri , anume eliminarea pe cât posibil (acolo unde se poate) a înarzierilor între secvențele de instrucțiuni ce compun comenzi le elementare date LCD-ului, respectiv modul cum a fost gândita subrutina de afișare a informației grafice pe ecranul LCD-ului.
O alta problemă este ridicata de modul de tratare a resurselor critice, respectiv vectorul ce memorează eșantioanele din semnalul analizat.
Prioritatea cu care sunt deservite funcțiile asociate vectorilor de întreruperi reprezintă un alt aspect important al problemei.
Acuratețea frecvenței de eșantionare, reprezintă o altă problemă importantă, reformulat această chestiune reprezintă menținerea constantă a perioadei cu care efectuam eșantionarea semnalului de intrare.
Rezumand cele expuse anterior, în proiectarea sistemului avem problem legate de :
Gestionarea resurselor critice
Prioritizarea întreruperilor
Stabilitatea frecvenței de eșantionare
Viteza de transfer prin porturi
Putere de calcul
Rezoluția conversiei AD
Erori de conversie AD
3.1Blocul de achiziție de date
Este sistemul care face interfațarea dintre semnalele analogice si cele digitale , scopul principal este acela de a realiza pe de o parte eliminarea zgomotului din semnalul de intrare iar pe de cealalta parte realizează conversia semnalului din marime continuă , analogică în cea discretă.
Blocul de achiziție de date este compus din trei subansambluri ce au un rol binedeterminat care contribuie la îndeplinirea funcționalitații sale, acestea fiind
Filtrul trece jos
Convertorul analog digital
Circuite de comanda
3.1.1 Filtul trece-jos
Filtrul trece jos , este un circuit electronic pasiv ce are scopul de a limita banda de frecvență a semnalului reducând astfel spectrul semnalului de la curent continuu până la frecvența sa maxima de tăiere notate cu .
În cazul prezent frecvența maximă de tăiere a filtrului este .
Figura 3.1 Filtru trece jos pasiv de tip RC
Atenuarea semnalului de ieșire este de -3dB iar conform definiției decibelului avem urmatoarea relație matematică:
Unde :
– reprezintă atenuarea circuitului exprimată în decibeli
– semnalul de iesire
– semnalul de intrare
Figura 3.2 Atenuarea filtrului pasiv funcție de frecvența semnalului
Deoarece intrarea convertorului analog digital nu este diferențială ci lucrează doar cu valori pozitive ale semnalului analogic cuprinse in domeniul 0 – 5 v am prevazut un amplificator operațional conectat astfel încat să realizeze această translatare de niveluri (deoarece semnalul audio va fi un semnal simetric centrat în jurul valorii de 0v).
În schema de mai jos observăm circuitul electronic ce realizează acest deziderat.
Figura 3.3 Amplificator operațional și filtru pasiv trece jos
Amplificatorul operațional este alimentat dintr-o singură sursă de tensiune continuă de 5 volți, tensiunea la iesire incadrându-se in limitele Vmin = 0V, Vmax=5V.
Gruparea de rezistențe R1, R2 are rolul de a realiza un divizor de tensiune , tensiunea de ieșire aplicată pe intrarea neinversoare a amplificatorului operațional fiind egala cu
Dar cum rezulta =2.5V
Știm că impedanța de intrare pentru intrarile diferențiale ale amplificatorului operațional tinde la infinit și în consecința curentul consumat pe fiecare intrare este zero.
Aplicând relațiile de circuit pentru amplificatorul operațional avem:
deoarece ΔV=0;
Amplificarea este:
(3.2)
Din prima ecuație obținem : și înlocuind în cea de a doua ecuație expresia lui I avem:
Efectuînd în continuare operații elementare asupra ecuației de mai sus ajungem la forma :
Astfel rearanjată ecuația ne putem da seama mai ușor că daca Vcc=0 atunci relația de mai sus devine:
Unde raportul reprezintă amplificarea operaționalului
Circuitul format din si alcatuiește filtrul trece jos.
Figura 3.4 Variația tensiunii la ieșirea filtrului trece-jos in funcție de valoarea frecvenței
Figura 3.5 Atenuarea la 3decibeli
Frecvența de atenuare este dată de relația
Observăm în figura 3.5 cum la frecvența de 10KHz apare atenuarea de 3dB pentru valorile componentelor pasive de 1,5KΩ a rezistenței filtrului respectiv 10nF capacitatea condensatorului.
În acest fel vor fi in principal eliminate frecvențele ce depășesc valoarea maximă de 10KHz evitându-se în acest mod efectul de aliasing.
Conform teroemei lui Nyquest frecvența de eșantionare trebuie să fie cel puțin dublul celei mai mari frecvențe din componența semnalului eșantionat.
Toate celelalte component ale semnalului ce au frecvențe mai mari decât frecvența de eșantionare trebuiesc eliminate din specrul considerat.
3.1.2 Convertorul analog digital
Reprezintă “inima” blocului de achiziție a semnalului, componenta de a cărei caracteristici depinde în mare măsura acuratețea de reprezentare a semnalului.
Rolul convertorului analog digital este acela de a transforma o marime analogică, ce variază în timp în mod continuu, într-o mărime discretă ce poate lua anumite valori la moment bine stabilite de timp, valori cuantificate printr-un simbol numeric.
În decursul timpului s-au dezvoltat diferite topologii de convertoare analog numerice, fiecare dintre ele prezentând avantaje si dezavantaje.
O clasificare a convertoarelor analog numerice se poate face dupa principiul de funcționare, distingând doua tipuri, și anume :
Convertoare analog-numerice integratoare
Convertoare analog-numerice neintegratoare
Principalele caracteristici ale unui convertor analog numeric
Rezoluția unui convertor analog numeric reprezinta numarul de niveluri în care este divizat domeniul semnalului de intrare.
De exemplu un convertor care are rezolutia de 256 de niveluri furnizează la ieșirea lui un numar de n=8 biți.
Dacă variația semnalului analogic la intrarea convertorului se afla in domeniul 0,…5 V atunci cuanta de tensiune este de :
Unde reprezintă valoarea maxima a tensiunii la intrarea convertorului analog-digital, valoare care este egala cu valoarea de referinta interna a ADC-ului.
Aceasta reprezentând precizia convertorului analog numeric, fiind cea mai mica valoare a tensiunii de intrare pentru care avem o tranzitie de 1LSB la iesirea convertorului.
Figura 3.6 Caracteristica de transfer al unui convertor analog-numeric
Raportul semnal-zgomot , reprezintă un parametru ce masoară proporția dintre nivelul semnalului util si nivelul zgomotului de cuantizare
[5] [ Cristian Bucur, “Dispozitive și Circuite Numerice”, note de curs]
Unde n reprezintă numarul de biți ai convertorului analog-digital prin care se exprimă valoarea numerică de ieșire.
Acest raport este de 6,0206*n [dB]
Zgomotul de cuantizare se refera la semnalul analog ce se obține din semnalul numeric prin compararea cu semnalul analogic original.
Alt parametru este neliniaritatea, considerată ca o abatere, pe anumite regiuni a caracteristicii de transfer de la forma ideală.
Aceasta se datorește unor efecte cauzate de imbatranirea in timp a unor component electronice ce intra în componența convertorului analog-numeric, abateri ale valorilor componentelor electronice datorate temperaturii.
Legat de cele expuse mai sus, putem amintii o metodă de reducere a neliniaritații, anume calibrarea.
Calibrarea consta în aplicarea la intrarea convertorului analog-numeric a unui semnal analogic cunoscut dupa care se memorează valoarea ieșirii numerice.
Factorul de corecție se calculează ca diferență între valoarea memorată la pasul anterior și valoarea numerică corectă .
Astfel, după operația de calibrare, la orice măsuratoare realizată cu ajutorul convertorului analog-numeric se va adăuga acest factor de corecție, dispozitivul comportându-se în acest fel în mod liniar, având o caracteristică de transfer ca cea din figura 3.6.
Un efect des întâlnit în practică și care se manifestă în special la semnalele periodice în sensul că pastrând perioada constanta pentru doua puncte eșantionate din semnalul considerat vom avea mici diferențe de amplitudine.
Acest efect poartă numele de jitter.
3.1.2.0 Topologii ale convertoarelor analog-numerice
În funcție de utilizarea operației de integrare, convertoarele se clasifică în integratoare si neintegratoare
Fiecare din acestea avănd avantaje si dezavantje, de exemplu cele neintegratoare sunt rapide dar au un cost ridicat, in schimb cele integratoare sunt mai lente dar cu un cost mai mic.
Din categoria convertoarelor analog-numerice neintegratoare putem amintii cele cu bucla de reactie:
3.1.2.1 CAN cu rampa in trepte
Figura 3.7 Schema bloc a convertorului analog-numeric cu rampa în trepte
Principiul de funcționare a convertorului analog-numeric cu rampa în trepte este ilustrat in figura 3.7
Tensiunea de măsurat se aplică la intrarea neinversoare a comparatorului COMP concomitent cu tensiunea care la momentul de timp t0 este zero volți.
În aceste condiții și avănd în vedere principiul de funcționare al comparatorului, poarta P va fi deschisa lasând impulsurile de tact ale oscilatorului OSC să treacă spre numărătorul electronic (NUMĂRĂTOR) acesta va incrementa la fiecare impuls de ceas valoarea ieșirii N cu o unitate până când la un moment dat tensiunea va fi mai mare sau egală cu tensiunea măsurata fapt ce va provoca în mod inevitabil anularea tensiunii la iesirea comparatorului si implicit blocarea porții P.
Acest proces poartă denumirea de ciclu de conversie, la sfârșitul căruia vom avea pe ieșirea numerică N a numărătorului o valoare proporțional cu tensiunea de intrare măsurată .
Pentru un comparator analogic avem urmatoarele relatii:
Dezavantajele acestui tip de convertor ar fi că timpul de conversie depinde de valoarea marimii de intrare, in sensul ca va creste odata cu crestera valorii lui
3.1.2.2 CAN cu aproximari succesive
Se bazeaza pe compararea tensiunii de măsurat necunoscute cu o valoare U(N) generată de un convertor numeric-analogic pe baza unui algoritm numit cu aproximari succesive [5 Cristian Bucur, cur”]
Pentru a începe un ciclu de conversie , trebuie aplicat un 1L pe intrarea SC (START CONVERSIE) sfărșitul conversiei este semnalat prin trecerea în 1L a ieșirii FC (FINISH CONVERSION)
Conversia are loc în n-1 pași și se derulează astfel :
Pe durata primului impuls de ceas se înscrie o valoare de 1L pe bitul MSB iar restul biților rămânând 0L
CMP testează U(N) în raport cu Ux iar în cazul în care Ux>U(1000) bitul MSB se setează la 1L
În cazul în care Ux<U(1000) bitul MSB se resetează la 0L
La al doi-lea impuls de tact se va testa bitul MSB-1 iar dacă Ux>U(X100) al doi-lea bit semnificativ se va seta la 1L iar în cazul Ux<U(X100) atunci cel de al doil-ea bit semnificativ se va reseta la 0L.
Procesul continuă pâna când se va testa si ultimul bit LSB.
3.1.2.3 CAN Paralele – Flash
O altă categorie de convertoare analog-numerice este cea reprezentată de convertoarele fără buclă de reacție, folosită în această lucrare.
Acestea mai sunt cunoscute în literatura tehnică de specialitate sub denumirea de CAN paralele sau FLASH.
O denumire aleasă sugestiv dacă avem în vedere faptul că transformarea marimii de intrare într-o marime numerică se face (aproape) instantaneu, limitările fiind impuse de timpii de propagare prin circuitele logice combinaționale ce intră în componența blocului convertor de cod.
În figura 3.8 este prezentată schema de principiu a convertorului paralel
Figura 3.8 Schema bloc a convertorului paralel
Modul de funcționare este următorul:
Pe intrarea pozitiva a fiecarui comparator se aplică simultan tensiunea de masurat iar pe intrarea negativă se va aplica o fracțiune din tensiunea de referinta astfel domeniul semnalului analogic va fi împarțit în intervale egale de lungime constantă, încadrănd în acest mod valoarea necunoscută a tensiunii măsurate într-unul dintre intervale lucru ce determina modificarea ieșirii comparatoarelor din valoarea de 0L in 1L.
Decodificatorul, prin circuitele sale logice va face, conform tabelei de adevăr, conversia de cod, la ieșirea lui obținăndu-se de regulă un cod binar natural ponderat de tipul (8421).
Valoarea numerica astfel obținuta va fi proporțională cu tensiunea măsurată fiind egala cu :
În consecința va trebui, pentru o rezoluție a convertorului de n biți, să avem comparatoare electronice și o rețea rezistivă de divizare de rezistori.
Privind cele spuse mai sus putem deduce o primă idee asupra complexitații convertorului în cazul în care rezoluția impusă este foarte mare.
De regulă acest tip de convertor se realizează practic pentru rezoluții de maximum 8 biți, cum este si cazul convertorului utilizat în această lucrare si anume cel produs de firma Analog Devices – AD7820.
Conform datelor din foaia de catalog acest convertor analog-digital este un convertor de tip paralel de înaltă viteză cu rezoluția de 8 biți.
Este astfel proiectat încât să faciliteze o integrare ușoară în sistemele controlate cu microprocesor sau microcontroler.
Constructiv, acest convertor are nevoie de o singură sursă de alimentare asimetrică de 5v, fiind disponibil într-o variată forma de capsule (de la 20 PIN DIP PLASTIC, 20 PIN PLCC si 20 PIN LCCC) atât în formatul comercial dar si militar.
În figura 3.9 avem reprezentată configurația pinilor circuitului electronic.
Avem pini de alimentare , GND, intrarea de măsură , tensiunea de referinta , busul de date alcătuit din pinii , pini de comandă și sincronizare , MODE, , ,
Figura 3.9 Configurația pinilor
Analizănd documentația pusă la dispoziție de catre producător cât și faptul că achizitia valorilor măsurate trebuie să se efectueze în mod continuu fără momente de discontinuitate, putem opta pentru operarea in modul WR-RD.
În acest mod , controlul îl va deține microcontroller-ul , el luînd decizia cănd va declanșa conversia și tot el va declanșa evenimentul “sfarsit conversie”, folosind bucle de intarziere software pentru acceptarea datelor de intrare.
Pentru a beneficia de aceasta facilitate convertorul va trebui conectat cu microcontrollerul și prin intermediul pinilor , și .
Datorită faptului că microcontroller-ul este alimentat de la o tensiune de 3.3 V iar convertorul analog-digital este alimentat de la o tensiune de 5V a fost necesară folosirea unui buffer de magistrala în special pentru intrările convertorului, dat fiind faptul ca microcontroller-ul , conform foii de catalog poate accepta niveluri TTL de 5V în situația în care alimentarea se face la o tensiune mica de 3.3V
Implementarea acestor buffere translatoare de nivel a fost făcută în modul cel mai simplu cu tranzistori bipolari (în special datorită faptului că frecvențele semnalelor nu au valori foarte mari încât să pună probleme de propagare prin traseele de cablaj imprimat, întârzieri, efecte ale capacitaților parazite sau al inductantelor) .
Modul de lucru al convertorului și alegerea pinilor din componența porturilor microcontroller-ului se va reflecta în felul cum sunt alcatuite funcțiile ce fac referire la achizitia datelor.
Vom vedea mai încolo o exemplificare a celor spuse .
Deci alegând modul de operare și inspirați din exemplele de interconectare puse la dispoziție de producator putem trece la elaborarea schemei electrice de principiu.
Figura 3.10 Diagrama de timp ciclu de conversie
O prima simplificare rezidă din faptul că utilizând doar un singur convertor putem menține în permanența linia =0L prin conectarea ei la GND.
Analizând diagrama de timp observăm că pornirea conversiei se face printr-un impuls de durata egală cu datele fiind disponibile pe busul paralel dupa o perioada de timp acest fapt fiind semnalizat de catre convertor printr-o tranzițe negativa de nivel al liniei de întrerupere .
Intervalele de timp , reprezinta valori minime absolute ce trebuiesc respectate ele fiind precizate in foaia de catalog a circuitului.
Schema electrică completă o putem vedea în anexa 1 a acestei lucrări în figura 1.
Porturile la care au fost conectate intrarile și ieșirile convertorului cu microcontrollerul au fost alese in mod arbitrar.
Înainte de a realiza practic blocul respectiv a fost realizată o simulare în programul PSPICE a cărui succinta prezentare este expusă în rândurile următoare, rezultatul simularii putand fi observat în figura 3.12
Figura 3.11 Blocul de achizitie de date complet (filtru + convertor)
3.1.3 Simulatoare electronice – PSPICE
Primele preocupări în domeniul analizei și simularii circuitelor electronice apar in perioada anilor 50, de atunci acestea s-au intensificat foarte mult culminând cu perioada anilor 80 când rezultatele au atins un asemenea nivel încat pot fi considerate incredibile sau spectaculoase.
Aceste activitați, au aparut mai întâi ca un hobby care mai apoi sa transformat în profesii iar metodele de proiectare a circuitelor electronice au depașit cu mult pe cele tradiționale.[13]
[Tudor Marian, “SPICE” , Editura Teora]
3.1.3.0 Evolutia simulatoarelor, scurt istoric
Un scurt istoric ce punctează momentele de timp în dezvoltarea simulării circuitelor electronice și a sistemelor se prezinta astfel:
În 1965 au aparut primele programe din seria ECAP (Electronic Circuit Analysis Programme) și PREDICT (Programme for determining the response of electronic systems to transient nuclear radiation), realizate de firma IBM
1967 SCEPTRE si NET1 (NETwork analysis program) LosAlamos SUA
1968-1970 CANCER (Compute Analysis of Nonlinear Circuits Excluding Radiation)
1973 SPICE(Simulation Programme with Integrated Circuit Emphasis) născut din CANCER a fost prima versiune a cunoscutului simulator
1975 SPICE2 care în scurt timp devine un program foarte cunoscut și foarte utilizat în analiza circuitelor electronice
1976 se dezvolta versiunea SPICE2G.6 ce devine standard în domeniul programelor pentru analiza și simularea circuitelor electronice.
1978 se dezvoltă versiunea SPICE 3E.2 care va aduce îmbunatațiri în tipul modelelor folosite intern.
1980 apare versiunea SPICE 3E.2 , versiune ce ramâne și în prezent un standard de care , toți producătorii ce realizează programe sau pachete de programe SPICE țin cont.
După apariția pe piața a calculatoarelor de tip “PersonalComputer” PSPICE cunoaște o largă raspândire, listingul codului sursă scris în limbajele Fortran si C, este distribuit în mod gratuit sau la un preț mai mult simbolic, mai intâi universitaților americane interesate apoi tuturor universitaților din intreaga lume si ulterior altor utilizatori.
3.1.3.1 Etapele dezvoltării unui produs electronic
Etapele dezvoltării unui produs electronic , urmează urmatorii pasi:
specificarea cerințelor
proiectarea schemei bloc
alegerea metodelor de proiectare (proiectarea schemelor de principiu, simularea si analiza rezultatelor, optimizarea rezultatelor)
realizarea practică a modelului de laborator
măsurarea performanțelor
reluarea proiectarii dacă cerințele dorite nu sunt îndeplinite
realizarea documentației de execuție
producția în serie
Simularea si analiza ,în acest proces , are un rol foarte important deoarece cu ajutorul ei se găsesc răspunsuri la multe întrebari cum ar fi de exemplu:
ce se întamplă dacă tensiunea de alimentare variază cu un anumit procent?
care sunt componentele de circuit ce necesita o toleranța a valorii cât mai mica?
ce se întamplă dacă se înlocuiește o componentă activă cu altă componentă echivalentă?
Cum se va comporta circuitul dacă folosim CMOS în loc de TTL?
exista componente critice? Și dacă da care sunt acestea?
cum influențeaza variațiile de temperatură circuitul?
cum influențeaza dispunerea traseelor în PCB?
Simularea ca etapă, este un reper , un punct de unde inginerul proiectant poate face anumite aprecieri asupra posibilitaților de îmbunatațire a schemei electronice în vederea optimizării funcției obiectiv.
În acest sens , proiectarea circuitelor electronice poate fi considerata un proces iterativ, prin care pas cu pas , inginerul se va apropia de o soluție optima aleasă dintr-o multitudine de soluții ale problemei date.
Proiectanții de simulatoare de circuit , având în minte aspectele expuse mai sus, au realizat pachete de programe menita sa vină în ajutorul Inginerilor , astfel a apărut conceptul CAD – Computer Aided Design din el derivând doua concepte foarte importante și anume :
CAE Computer Aided Engineering
CAM Computer Aided Manufacturing
Programe reprezentative din domeniul CAE sunt :
Designer
MicroCap
Micrologic
AeroSpace (Program Romanesc produs de Aerofina Bucuresti)
OrCAD
MasterDesigner
Dealungul timpului programele de analiză și simulare au devenit din ce în ce mai evoluate.
Un mediu integrat CAD conține :
un program principal , interactiv , ce posedă o grafică deosebită, cât mai atrâgâtoare, care în fiecare moment este gata să lanseze în execuție orice componentă a mediului
un editor intern de text, cu ajutorul căruia se descriu schemele electronice folosind cuvinte cheie cât și argumente
programul de simulare propriuzis
procesor grafic care prezintă în forma cât mai relevantă, atractivă și convingătoare rezultatele simularii
extensii capabile de a face legatura cu aplicații grafice de introducere a schemei electrice
În ceea ce priveste domeniul CAE putem trece în revistă urmatoarele pachete de programe:
CADSTAR produs de firma englezească RecalRedac
OrCAD4.0 produs de firma americana OrCAD
În figura de mai jos prezentăm diagrama bloc ce ilustreaza fluxul în procesul de simulare
3.1.3.2 Descrierea programului Pspice
Pspice este un program general de simulare a circuitelor electronice, cu ajutorul caruia se pot face urmatoarele tipuri de analiză:
analiză de curent continuu DC-Analysis
analiză de curent alternativ AC-Analysis
analiză in regim tranzitoriu TRANSIENT-Analysis
Circuitele electronice care pot fi analizate în Pspice pot conține rezistoare, condensatori, inductante, diode, tranzistori, tranzistori cu efect de camp, surse de tensiune și/sau curent , generatoare de semnal sinusoidal, trapeizoidal, de tip treaptă, impuls unitar, dreptunghiular etc.
Deasemenea există o cantitate impresionantă de biblioteci cu circuite integrate unde putem găsi de la simple porți logice, numărătoare, registre de deplasare, multiplexoare, decodificatoare, formatoare de cod arii de porți logice FPGA, microprocesoare si microcontrollere , memorii RAM statice sau dinamice , memorii EEPROM , FLASH-NAND, iar in domeniul analogic amplificatoare, amplificatoare operationale , sumatoare, integratoare, derivatoare, filtre (trece-jos, trece-sus, trece-bandă), surse stabilizate de tensiune mono/multipolare/simetrice/asimetrice, linii de intarziere PAL, relee mono/multi-polare, optocuploare, dispozitive optice de avertizare luminoasa, LED-uri, IRASER/LASER și lista poate continua, mai ales datorită faptului că orice producător serios de componente electronice pune la dispoziție în afară de foaia completă de catalog a produsului și o librarie ce conține modele PSPICE a componentelor produse de firma respectivă.
De asemenea în PSPICE se pot definii subcircuite sau se pot utiliza subcircuite din biblioteci.
Aceste subcircuite reprezintă de fapt circuite electronice realizate și testate în prealabil ce se prezintă inginerului proiectant sub form unor “black-box-uri” cu intrările și ieșirile aferente funcționalității circuitului respectiv.
De exemplu, în biblioteca LINEAR.LIB toate circuitele integrate sunt definite ca subcircuite, dând posibilitate proiectantului de a-și face munca mult mai usoară, acesta lucrand la nivel de blocuri funcționale, urmând ca proiectantul să stabilească pentru subcircuitul ales doar un set de valori cât și conexiunile aferente cu alte subcircuite sau/și circuite.
Un punct forte al pachetului PSPICE este acela că dă posibilitate utilizatorului sa-și creeze singur modele de componente, cât și să conceapă și genereze modele de stimuli (STIMULUS EDITOR)
Deasemenea descrierea unui circuit in PSPICE se face foarte usor, in principal se folosesc două strategii și anume :
utilizarea textului plan
metoda grafică
În cazul în care se face descrierea sub forma de text ASCII circuitul trebuie specificat urmarind urmatoarea paradigma:
numele elementului
nodurile de circuit din care face parte
un nume sau model sau o valoare al elementului
Exemplu:
Pentru rezistori
R_nume $N1 $N2 VAL
Bobine si Condensatoare
L_nume $N1 $N2 VAL
C_nume $N1 $N2 VAL
Bobine cuplate mutual
K_nume L_nume_1 L_nume_2 VALUE
Linii de transmisie
T_nume $N1 $N2 $N3 $N4 Z0=VALUE
unde $N1 si $N2 sunt nodurile de intrare
$N3 si $N4 sunt nodurile de iesire
Z0 reprezinta impedanta caracteristica
Algoritmii de calcul ce stau la baza programului SPICE au la baza o metodă ce aplică convergența soluției, adică inițial se pornește de la un set de date de bază reprezentat de valorile elementelor de circuit, se aplică în mod iterativ legile lui Kirchhoff privind tensiunile și curenții până când se atinge solutia finală.
Totuși pot apărea probleme în ceea ce privește convergența soluției în sensul că după un anumit număr de pași încă nu a fost găsită soluția finală a problemei.
În acest caz programul va semnala utilizatorul cu un mesaj de eroare.
Dacă această problemă de convergența apare la calculul punctului static de funcționare, eroarea nu va permite să se gaseasca soluții și pentru celelalte tipuri de analiză , respectiv AC-Analysis, Transient-Analysis.
Această eroare de convergentă poate avea doua cauze:
erori în descrierea și cerințele de analiză
puterea limitată a algoritmilor de calcul
Un exemplu simplu de circuit a cărei descriere este în mod text ASCII este prezentat în rândurile ce urmează.
Să presupunem că vrem să studiem comportamentul în curent continuu al unui divizor rezistiv de tensiune, ilustrat în figura de mai jos.
Fisierul sursa va arăta în modul următor
R_R1 1 2 1K
R_R2 2 0 1K
V_V1 1 0 DC 5v
.DC
.tran 0.0001 0.01 1
.PROBE
.END
Rezultatele simulării în PSPICE
Figura 3.12 Simularea în PSPICE
În figura 3.12 putem vedea simularea în PSPICE a blocului de achiziție de date.
Semnalul pieptene simulează ieșirea pinului microcontrollerului, în schemă fiind înlocuit cu o sursa de impulsuri de tensiune cu frecvența de 20KHz.
În graficul central a fost simulată o tensiune electrică sinusoidală cu frecvența de 625Hz, iar în graficul superior putem observa ieșirea numerică a convertorului analog-digital.
Datorită faptului că exista o diferență de nivel între semnalele microcontrollerului și nivelurile de intrare al convertorului se evidențiază necesitatea utilizării unor driver-e de magistrală translatoare de nivel .
Un astfel de circuit realizat de către Fairchild Semiconductor îndeplinește funcția de driver bidirecțional de magistrală cu translatare de nivel.
Astfel, el poate conecta două magistrale A și B în ambele sensuri , în condițiile în care magistrala A va utiliza semnale cu o amplitudine de 5v iar magistrala B – 3.3V conform foii de catalog dată de producător
În cazul de fața datorită faptului că datele se vor transmite în permanența într-un singur sens de la convertor către microcontroller pinul ce stabilește sensul comunicării a fost conectat fizic la Vcc blocând astfel transmisia doar de la magistrala A catre B.
Figura 3.13 Fluxul datelor prin magistrale cu niveluri de tensiune diferite
Consultând foaia de catalog observăm în afară de cele doua tensiuni de alimentare și anume si , un pin ce stabilește sensul comunicării între cele două magistrale , anume dinspre A spre B (caz în care magistrala A este sursa a semnalelor iar magistrala B este destinație) cât și dinspre B spre A (caz în care în mod evident magistrala B devine sursa iar magistrala A receptorul).
Figura 3.14 Extras din foaia de catalog reprezentând configurația la pini a IC-ului
Conform tabelului de adevăr , pentru a putea fi operațional pinul trebuie să fie în 0L, iar , pentru ca datele sa fie transmise într-un singur sens de la busul A (unde se află conectat convertorul) către busul B (unde se află conectat un port de 8 biti al microcontrollerului) , pinul de comandă T/ trebuie să se găsească în 1L.
Modul de conectare integral se poate observa în schema de principiu din anexa 1, figura1
Acest circuit rezolvă problema compatibilitații nivelelor de semnal pentru magistrala de date de 8biți , magistrală a cărei lațime este dictată în principal de rezoluția convertorului analogic-numeric.
Rămâne de rezolvat problema de niveluri de tensiune pentru cei trei biți de comandă, și anume , ,.
În acest caz nu se justifică utilizarea a incă unui circuit integrat , problema fiind rezolvata cu ajutorul unor tranzistoare care lucreaza în modul de comutație, circuit pe care îl putem vedea în figura de mai jos
Acesta fiind alcătuit din două tranzistoare bipolare cuplate în conexiune emitor comun și care lucrează în clasă D.
Figura 3.15 Schema realizata în PSPICE
Semnalul este aplicat la intrarea primului tranzistor între bază și masă prin rezistența de limitare de 3k3
Calculul elementelor pasive de circuit se realizează în modul următor:
Se alege ochiul de circuit format din sursa de tensiune , R și jonctiunea C-E aplicănd relația :
Valoarea curentului iar valoarea tensiunii de saturație , din foaia de catalog pentru tranzistorul BC237 este
Figura 3.16 Caracteristici electrice
Efectuând calculul rezultă => => R=220Ω
Deoarece amplificatorul lucreaza în clasa D aceasta însemnand ca ieșirea lui trebuie sa comute între două stari blocat – saturat, rolul cât și dimensionarea rezistorului din baza tranzistorului este acela de a limita curentul de baza astfel încât acesta să nu depașească valoarea maximă admisă.
Conform foii de catalog avem
Figura 3.16 Valorile limită ale tranzistorului BC237
Dimensionarea rezistorului din baza tranzistorului se face aplicând teorema a 2-a a lui Khirchhoff pe ochiul de circuit format de elementele : , Rb, jonctiunea baza-emitor
Rezultatul simularii în PSPICE ne arată că lucrurile se desfașoară cum trebuie și circuitul își realizează funcția cu success.
Figura 3.17 Semnale de intrare și de ieșire în circuitul de comandă
Analizând cele două semnale din figura 3.17 și anume semnalul de comandă venit de la microcontroller , reprezentat prin forma de undă ce are culoarea verde și respectiv semnalul de ieșire al circuitului electronic ce realizează translatarea nivelului de tensiune, putem face două observații importante , și anume :
cele doua semnale sunt în fază
amplitudinea semnalului de ieșire asigură comanda circuitului de conversie.
Desigur problema fazei putea fi rezolvată și prin metode software, cel mai important lucru însa rămâne faptul ca sa realizat o corelare a nivelului de semnal cu cel necesar atacării convertorului analog digital , evitandu-se astfel lucrul în zona interzisa de nivel, cea ce ar fi provocat situații de nedeterminare datorate faptului că nivelul de ieșire al porților din microcontroller fiind de 3v creează o stare de “confuzie” intrării TTL standard a circuitului ADC, acesta neputând discerne dacă la intrarea sa are un semnal de 0L sau 1L, existând deasemenea situații când nivelul, situat fiind permanent în 1L sa fie interpretat , la o citire 1L iar la urmatoarea citire 0L.
În anexele 2, 3, 4 găsim foile de catalog pentru transistor, driver-ul de magistrală și convertorul analog numeric.
3.2 Modulul de prelucrare numerică și calcul
Rolul acestui bloc este pe de o parte acela de prelucrare numerică a datelor, de coordonare a echipamentelor periferice.
Componenta principală ce intra în structura acestui bloc este microcontroller-ul.
Vom evidenția în acest capitol avantajele utilizarii unui microcontroller fața de utilizarea unui microprocessor, arhitecturi uzuale de microcontrolere cât și un istoric și evoluția acestora.
Desigur microcontroller-ul evolueaza în baza unei aplicații software, cunoscută în literatură de specialitate drept firmware atunci când prin software-ul proiectat se implementeaza atat algoritmii necesari rezolvarii problemei propuse dar și tratarea evenimentelor legate de operațiile de intrare – iesire, gestiunea perifericelor , gestiunea spatiului de memorie, stivei software , a resurselor critice, managementul variabilelor de tip semafor totul fară existanța unui sistem de operare.[5]
3.2.1 Microcontroller vs microprocessor
Concept, arhitecturi.
Sa presupunem că nu am fi avut la dispoziție microcontrolere, ce ar fi însemnat acest lucru?
Practic realizarea modulului de calcul s-ar fi făcut în mod “tradițional” folosind un microprocessor.
Pentru problema noastră, un intel 8086 ar fi fost deajuns, dar pe lângă microprocessor am fi avut nevoie și de circuite de support, generator de ceas, decodoare, buffer-e de magistrală, memorii EPROM si RAM, circuite specializate pentru comunicația paralelă.
Microcontroller-ul a apărut ca răspuns al dorinței de simplitate, de concentrare asupra faptului cum se rezolvă problema, eliminând circuitele electronice de suport externe, circuite ce puneau deseori probleme de sincronizare.
Pe de altă parte componentele electronice sunt destul de scumpe, circuitele de memorie SRAM, EEPROM, multiplexoare, decodificatoare, circuite dedicate, cresc prețul produsului final.
Lucrând la frecvențe ridicate, pun probleme în ceea ce privește proiectarea structurilor electronice de interconectare, la frecvențe foarte mari circuitele electrice devin linii de transmisie, guvernate de legi ale fizicii al caror modele matematice implica ecuații și sisteme de ecuații diferențiale de ordine superioare ce sunt dificil de rezolvat(bineânțeles , această problemă apare la frecvențe de ordinul 100MHz – GHz).
În cazul aplicației curente principala problemă o reprezintă costul pe de o parte, iar pe de altă parte faptul că o proiectare folosind un număr mare de circuite integrate va duce la realizarea unor PCB-uri dublu sau multi-strat, care în final se reflectă tot în prețul produsului final.
În figura de mai jos este reprezentat sub forma unei scheme bloc structura funcțională a unui microcontroller, evidențiindu-se principalele blocuri.
Figura 3.18 Structura unui microcontroller
Componenta principală a unui microcontroller este reprezentata de CPU , unitatea centrală de prelucrare.
Aceasta realizează operațiile matematice și logice evoluând în permanența sub controlul unui program.
Arhitecturile cele mai raspândite , folosite in realizarea unui CPU sunt:
Arhitectura Harvard
Arhitectura Princeton (von Neumann)
3.2.2 Arhitectura Harward
Arhitectura Hardvard deși a fost proiectată de ceva vreme, nu a fost utilizată pe scara largă fiind ignorată până la sfarșitul anilor 1970, acest lucru datorandu-se în principal impedimentelor tehnologice .
Aceasta arhitectură , presupune separarea memoriei de instrucțiuni de cea de date, creeând doua spații distincte de memorare.
Figura 3.19 Unitatea logică și aritmetică
Unitatea aritmetico-logică are rolul de a efectua calcule preluând un set de date numit date de intrare și furnizând un alt set de date – date de ieșire.
În figura de mai sus s-au facut urmatoarele notații :
DI – setul de date de intrare
DO – setul de date de iesire
F – bit(biți) pentru selecția funcției ce se aplică asupra datelor de intrare
A – adresa registrului ce contin datele
CLK – semnal de sincronizare cu evenimentele externe (ceas de sistem)
FL – bit fanion
Pentru a putea realiza un microprocesor mai avem nevoie de o unitate de control ce are drept scop coordonarea fluxului de date și instrucțiuni cât si sincronizarea CPU cu evenimentele externe acestuia
Această unitate de control este un sistem din categoria automatelor finite ce evoluează pe baza unui microprogram .
Figura 3.20 Structura unui microrocesor
Din punct de vedere constructiv , unitatea de comandă poate fi realizată folosind logica cablata și circuite logice sau poate fi realizată sub forma unui automat finit cu logică microprogramată, în acest ultim caz putem afirma că avem un procesor in procesor.[6] Ștefan CID
În figura 3.20 observăm blocurile funcționale ce intră în alcatuirea unui microprocesor și anume :
RALU – Unitatea logică aritmetică plus memoria interna (registre)
UC – Unitatea de comandă
AA – Automat de adresare
După cum am amintit mai înainte funcția RALU este aceea de a efectua calcule elementare aritmetice și logice între operanzi, cum ar fi adunări, scăderi , funcții logice ȘI, SAU NOT, XOR , rotire pe bit și deasemenea la acest nivel exista implementat și un registru care realizează operații cu puteri ale lui 2 și anume înmulțire și împărțire aceasta deoarece acest tip de operații sunt des utilizate iar o astfel de facilitate integrată în procesor nu poate dacât să aducă un plus de viteză programelor. (operația de înmulțire cu 2 ne mai fiind efectuată cu ajutorul unor adunări repetate ci direct într-un ciclu masina).
Operația elementară de adunare are la bază legile algebrei booleene, aceasta efectuându-se bit cu bit asupra celor doi operanzi conform următorului tabel:
Este demn de remarcat faptul că în marea majoritate a cazurilor, reprezentarea numerelor în formatul intern (cel recunoscut de procesor) se face în modul complement față de doi, lucru ce reprezintă două avantaje și anume, nu este necesar bitul de semn și există o singură reprezentare pentru cifra zero.
Figura 3.21 Program ce ilustrează modul de memorare intern
Un program simplu scris în limbajul C dovedeste că așa stau lucrurile, iar confirmarea supoziției stă în rezultatele afișate de către program.
Un calcul simplu de mână confirma corectitudinea rezultatelor totul pornind de la relația :
Unde n – reprezintă numărul de biți utilizați pentru memorarea valorii numărului N
N – reprezintă numărul considerat
Pentru N=-2 avem:
254 transformat in binar
Inițial N=254 considerăm un număr mai mic sau egal cu N, acesta este 128 și reținem 1*
N1 = 254-128 N1=126 procedăm la fel ca mai sus și luăm 1*
N2 = 126-64 N2=62 și luăm 1*
N3 = 63-32 N3=30 => 1*
N4=30-16 N4=14 => 1*
N5=14-8 N5=6 => 1*
N6=6-4 N6=2 => 1*
N7=2-2 N7=0 =>0*
Numărul rezultat in baza 2 este 11111110.
Implementarea unui sumator de opt biți se poate realiza atât hardware cât și software.
Hardware se poate face folosindu-se porțile logice conform tabelului de adevăr
Folosind FDC (forma disjunctiv canonică[14])avem:
Suma(Operand_A, Operand_B, Intrare_transport)
Iesire_transport(Operand_A, Operand_B, Intrare_transport)
Pentru funcția sumă vom considera acele combinații ale variabilelor de intrare pentru care ieșirea este 1L
Suma = *+Operand_A*+
**Intrare_transport+Operand_A*Operand_B*Intrare_transport
Iesire_transport=Operand_A*Operand_B*+*Operand_B*Intrare_transport+Operand_A*+Operand_A*Operand_B*Intrare_transport
Aplicand
Iesire_transport= =Operand_A*Operand_B+Intrare_transport(+Operand_A*)
Figura 3.22 Implementarea cu porți logice a unui sumator complet de 1 bit
O a doua variantă, utilizată îndeosebi de către simulatoare , cum ar fi de exemplu Z80-Simulator, este implementarea software a unui sumator complet de 8 biți.[ http://www.z80.info]
Int sumator8bit(char *rez, char *opA, char *opB, int Cin)
{
Int idx;
Int Cout;
Cout=0;
For(idx=7;idx>=0;idx–)
{
If((opA[idx]==’0’)&&(opB[idx]==’0’)&&(Cin==0)){Cout=0; rez[idx]=’0’;}
If((opA[idx]==’0’)&&(opB[idx]==’1’)&&(Cin==0)){Cout=0; rez[idx]=’1’;}
If((opA[idx]==’1’)&&(opB[idx]==’0’)&&(Cin==0)){Cout=0;rez[idx]=’1’;}
If((opA[idx]==’1’)&&(opB[idx]==’1’)&&(Cin==0)){Cout=1;rez[idx]=’0’;}
If((opA[idx]==’0’)&&(opB[idx]==’0’)&&(Cin==1)){Cout=0;rez[idx]=’1’;}
If((opA[idx]==’0’)&&(opB[idx]==’1’)&&(Cin==1)){Cout=1;rez[idx]=’0’;}
If((opA[idx]==’1’)&&(opB[idx]==’0’)&&(Cin==1)){Cout=1;rez[idx]=’0’;}
If((opA[idx]==’1’)&&(opB[idx]==’1’)&&(Cin==1)){Cout=1;rez[idx]=’1’;}
Cin=Cout;
}
Return Cout;
}
Arhitectura Harvard presupune separarea instrucțiunilor de date în acest fel se poate implementa un pseudoparalelism.
Pentru a executa o instrucțiune microprocesorul va întreprinde trei secvențe distincte și anume :
Aducerea instrucțiunii din memoria de lucru (Fetch)
Decodificarea instrucțiunii
Executarea instrucțiunii
Microprocesoarele au evoluat în mod constant, odată cu noile descoperiri tehnologice și progresele făcute în domeniul fizicii solidelor și microelectronicii wafer-ul de siliciu a devenit din ce în ce mai mic integrând pe unitatea de suprafața sute , mii, zeci de mii și mai apoi milioane de tranzistoare.
Frecvențele de ceas au urcat și ele permițand viteze de zeci de mii de milioane de instrucțiuni pe secunda , dar , lucru cel mai important în proiectarea unui microprocesor îl reprezintă faptul cum sunt alese și implementate setul de instrucțiuni ale acestuia.
De acest fapt depinde în mare măsura performanțele viitoare ale microprocesorului, abilitatea acestuia de a rula mai rapid o secvență de program.
O clasificare a microprocesoarelor se poate face și după setul de instrucțiuni folosit având astfel procesoare :
RISC
CISC
Procesoarele RISC (Reduced Instruction Set Computing) folosește un set mai restrâns de instrucțiuni (este și cazul procesorului utilizat în microcontrollerul ATmega 1284P)
Procesoarele de tip CISC (Complet Instruction Set Computing) , din contră va folosi un set mai amplu de instrucțiuni.
Ideea de bază care a stat la dezvoltarea procesoarelor RISC a fost aceea că , un program poate fi scris folosind cele mai elementare instrucțiuni (cărămizi) această afirmație impune și o anumită rezervă, deoarece lucrurile nu stau întotdeauna așa, plus faptul că având la dispoziție un set minimal de instrucțiuni, efortul programatorului va creste.
În contrast cu arhitectura RISC avem arhitectura CISC und putem spune că “avem instrucțiuni pentru aproape orice “ , de exemplu pot exista o suita de instrucțiuni pentru adunare ce suportă diferiți operanzi și moduri de adresare (directă, indirectă, imediată, bazată si indexată, bazată sau indexata etc…)
În acest caz scrierea unui program în limbajul de asamblare a mașinii devine mai facilă.
Implementarea paralelismului are avantaje și dezavantaje , schematizat lucrurile se petrec astfel :
Figura 3.23 Implementarea pseudoparalelismului
În perioada de timp cât se decodifică instrucțiunea 1 procesorul poate aduce instrucțiunea 2.
Totuși, în acest model pseudoparalel pot intervenii anumite situații când pseudoparalelismul nu poate funcționa ca în exemplul de mai jos.[7]
Să presupunem urmatoarea secvența de două instrucțiuni și la momentul execuției flag-ul Z=0 din PSW
……….
Jnz Loop1
Add AX, 2
………
……..
Loop2 :
Mov ax, dx
……..
Microprocesorul va executa un ciclu de fetch în urma căruia va aduce din memoria externă instrucțiunea jnz Loop1
Urmează ciclul mașină 2 în care pe de o parte se decodifică instrucțiunea precedentă și pe de altă parte se aduce noua instrucțiune în ciclul FETCH2
La cel de al trei-lea ciclu masină , când se execută instrucțiunea jnz , se va constata că program counterul va trebui să facă un salt la începutul zonei de memorie Loop2, instrucțiunea ADD trebuie să fie expulzată nemaifiind utilă.
Figura 3.24 Arhitectura harward
În figura de mai sus este reprezentată sub forma diagramelor bloc arhitectura Harward
Abrevierile reprezintă :
AP – magistrala de adrese program
MI – magistrala de instrucțiuni
AD – magistrala de adrese pentru date
MD – magistrala de date
C – magistrala de comenzi
Arhitectura microprocesorului, realizează independența dintre hardware și software, fiind liantul care uneșteîntregul sistem. Procesorul este integrat în hardware-ul existent tocmai de către software, neputănd functiona de sine stătător.
3.2.3 Arhitectura Princeton
În contrast, arhitectura Princeton unește cele două memorii într-un spațiu de memorie comun o concluzie imediată ce merită remarcată este, că în acest caz datele procesate pot devenii instrucțiuni, putând apărea astfel o buclă de reacție informaționala.[8]
Figura 3.25 Arhitecura Princeton
Unde :
MA reprezinta magistrala de adrese
MD magistrala de date
C magistrala de control
3.3 Dispozitivele periferice
Au rolul de a asigura comunicarea dintre procesor și lumea exterioară, deasemenea o parte dintre dispozitivele periferice îndeplinesc funcția de protecție a microcontrollerului.
Tot în categoria dispozitivelor periferice intra și sursa de alimentare cu energie electrică și generatorul de tact.
3.3.0 Porturile paralele
Cele mai utilizate dispositive periferice ale unui microcontroller sunt porturile paralele de date.
Acestea au un mod de transfer de date bidirectional, fiind accesibile din exterior grație pinilor de conexiune electrica disponibili în diferite configurații pe capsula fizica a microcontrollerului.
În figura de mai jos putem observa configurația la pini a microcontrollerului ATMega1284P în capsula sa PDIP40.
Figura 3.26 Dispunerea pinilor
Un pin al circuitului va îndeplini , de regulă mai multe funcții, el fiind multiplexat, în acest fel asigurându-se și un cost rezonabil componentei fizice, știut fiind faptul că acesta crește odată cu creșterea numarului de pini.
Porturile paralele asigură transferul simultan al datelor folosind mai multe linii de comunicație (pentru ATmega1284P se folosesc 8 linii de comunicație).
Sensul în care se face transferul de date poate fi configurat de către programator, astfel porturile putând fi configurate ca porturi de ieșire sau porturi de intrare.
Transferul datelor se face sincron cu semnalul de ceas pe frontul acestuia.
Elementul principal cu ajutorul căruia este construit portul paralel este bistabilul de tip D denumit și LATCH, el facănd parte din așa numiții regiștrii cu destinație specială sau SFR.
Trebuie menționat faptul că un port este configurat ca port de ieșire atunci când microcontrollerul comandă perifericul, iar un port este configurat ca port de intrare atunci cand perifericul comanda microcontrollerul.
Figura 3.27 Comanda unui LED
În exemplul de mai sus portul C trebuie configurat ca port de ieșire , numai în acest fel microcontroller-ul va putea aprinde sau stinge led-ul
Există două latch-uri alocate fiecărui pin din port , unul pentru configurarea sensului portului iar celalalt pentru memorarea starii portului.
Un bistabil de tip D este un circuit logic secvential , funcționarea lui făcându-se conform tabelei de adevăr prezentata mai jos.
Simbolic , un bistabil de tip D se reprezintă ca în figura de mai jos :
Figura 3.28 Bistabil de tip D
Stabilirea sensului unui port se face prin scrierea unor valori de 0L sau 1L intr-un SFR dedicat care , printr-un element de tip buffer tristate va ruta calea de la pinul fizic al portului către LATCH-ul considerat.
Analizând schema electrică a portului parallel, putem observa că există doua modalitați de citire respectiv scriere, astfel putem efectua operații de citire direct din portul fizic (pinul considerat) sau din registrul SFR alocat portului, la fel putem scrie direct in port (fizic) sau in registrul SFR alocat pinului respectiv.
Această arhitectură, a portului are implicații directe asupra modului cum pot fi implementate instrucțiunile în program.
Astfel putem scrie următoarea secvența :
…………..
DDRC = 0xFF; //Configurează PORTC ca port de ieșire
//Instrucțiuni și expresii
…………
PORTC |= (1<<PC0); care este o scriere condensată a expresiei PORTC = PORTC | (1<<PC0);
Compilatorul va evalua mai întai partea dreaptă a expresiei și VA CITI PORTC , împotriva faptului că este configurat ca port de ieșire, va efectua SAU pe bit cu valoarea 0x01 iar rezultatul îl va scrie în portul PORTC.
Observăm că proiectarea portului a fost făcută în așa manieră încât să ofere o flexibilitate maximă în scrierea programului.
Portul microcontrollerului mai dispune și de alte facilități , precum posibilitatea activarii pe fiecare pin din port a unor rezistoare de PULL-UP sau PULL-DOWN folosind instrucțiuni specifice.
3.3.1 Circuite de temporizare TIMER
Principalul element al acestui periferic este reprezentat de către numărătorul electronic.
Acesta este un circuit logic secvențial care realizează pentru un număr natural N operația de identificare a clasei de resturi modulo C (N.Paraschiv, 2014, curs CN).
O clasificare a numărătoarelor poate fi facută după :
Codurile utilizate (binar, hexazecimal , exces-3)
Modul de comutare al elementelor de memorare (sincron si asincron)
Sensul de numărare (direct sau invers)
Elementul de baza îl reprezintă bistabilul de tip J-K
Din tabela de adevăr se poate observa că pentru situația în care J=K=1L obținem un bistabil care, la fiecare impuls de ceas ieșirea se află în stare complementară față de starea anterioară.
Prin legarea în serie a mai multor bistabili, după cum este ilustrat mai jos , se obține un numărător electronic, numărul de celule de memorare(bistabili) va dicta capacitatea de numărare (în microcontrollerele ATmega avem numărătoare, conform foii de catalog, cu capacitatea de 8 sau 16 biți, ceea ce înseamnă că intervalul de numărare este , pentru 8 biți de la 0 la 255, iar pentru 16 biți de la 0 la 65535).
Figura 3.29 Numărător asincron de doi biți
În figură observăm conexiunea în cascadă a doi bistabili de tip J-K realizând un numărător asincron de 2 biti a cărei capacitate de numărare este de .
În microcontroller , circuitul de temporizare (TIMER) este foarte versatil astfel încât acesta poate realiza, printr-o configurare corespunzatoare a regiștrilor specifici, funcțiile de numărător, temporizator , comparator, generator de impulsuri cu lațime variabilă (PWM).
Prima configurație, cea mai simplă este cea de numărător-temporizator
Figura 3.30 Schema bloc a ciruitului de temporizare
În acest caz, sursa semnalului este variată, poate fi oscilatorul intern sau semnalul aplicat din exterior pe un pin notat , fiind selectată cu ajutorul multiplexorului, urmează o divizare cu un factor programabil , după care este atacat numaratorul.
La fiecare depășire a capacității sale de numărare, numărătorul va semnala acest lucru prin activarea ieșirii OVF.
Situația este tratată în diferite moduri, astfel dacă se activează sistemul global de intreruperi, cât și întreruperea numărătorului atunci , evenimentul de depășire a capacității de numărare va genera o oprire în execuția normală , secvențială a instrucțiunilor (cu salvarea pe stivă a adresei de unde se va relua execuția) și se va executa secvența de instrucțiuni asociată vectorului de întrerupere corespunzator numărătorului(pentru ATmega 1824P de exemplu in C avem void ISR(Timer0_OVF_vect, ISR_NAKED); ).[9]
O altă configurație este cea de numărător – comparator situație în care evenimentul întrerupere va fi generat când valoarea registrelor numărătorului va fie egală cu cea memorată într-un set de registre speciale SFR.
Figura 3.31 Timer-ul în configurație de comparator
Iesirea OC (output comparator) poate să fie un pin fizic al microcontrollerului sau poate să fie rutata către sistemul de întreruperi al microcontrolerului, declanșând în acest caz execuția funcției corespunzătoare vectorului de întrerupere asociat – ISR(TIMER0_COMPA_vect);
În figură au fost utilizate următoarele abrevieri :
– reprezintă frecvența ciclului de instrucțiuni, semnalul intern de ceas
– reprezintă intrarea externă de ceas
OC- iesirea comparatorului
Ultimul mod în care poate fi configurat timerul este acela denumit PWM (Eng. Pulse Width Modulation), putând realiza în acest fel un semnal al cărui factor de umplere este variabil, cei doi timpi , si stabilind factorul de umplere a semnalului
Figura 3.32 Semnal dreptunghiular
Factorul de umplere este iar pentru semnalele digitale de ceas acesta trebuie să fie ½.
În mod normal, numărătorul pornind de la valoarea N=0 va produce o întrerupere la un interval
Iar frecvența executării intreruperii este de
Coroborand cele două ecuații (3.19), (3.20) va rezulta o valoare N ce trebuie încarcat în numărător , acesta fiind egală cu:
Există situații practice cănd pentru anumită frecvență dorită în aplicație N să depășească capacitatea numărătorului, pentru astfel de situații se poate seta factorul de divizare, acesta obținându-se prin următorul procedeu
Se va alege cu grijă acest raport astfel încât să rezulte un număr natural întreg.
La final valoarea cu care se va seta registrele numărătorului se calculează (luând în considerare rezoluția acestuia – numărul de biți ) astfel:
În prezenta lucrare s-au folosit două timere, unul cu rezoluția de 8 biți , utilizat pentru generarea semnalului de eșantionare, iar celalalt cu rezoluția de 16 biți utilizat pentru citirea periodică a dispozitivului de intrare de tip touch-screen.
În secțiunea dedicată aplicației software vom observa în amănunt setările registrelor, cum trebuie făcute și ce registre sunt utilizate cât și descrierea funcțiilor ce îndeplinesc aceste obiective.
În anexa 1 figura 4 se observă schema unui numărător de 2 biți (limitare impusă datorită faptului că simulatorul PSPICE este o versiune pentru student), asincron, iar în figura 5 rezultatul simulării sub forma unor oscilograme în domeniul timp.
3.4 Modulul de afișare
Ultimul element din lanț este reprezentat de modulul de afișare, un dispozitiv de ieșire ce are ca rol afișarea informațiilor într-un format grafic acceptat de către utilizator.
Componenta principală a acestui modul este reprezentată de către un sistem optoelectronic, ales în așa fel încât să faciliteze interpretarea cantitativă a informației furnizată de către sistem.
Cel mai uzual mod de reprezentare a componentelor spectrale ce intră în alcătuirea semnalului analizat se face reprezentând grafic în coordonate carteziene ce au pe ordonată ampitudinile relative iar pe abscisa frecvența ca în figura de mai jos.
Figura 3.33 Spectrul semnalului
În decursul timpului, în era sistemelor analogice dispozitivele de afișare erau alcătuite din barete de diode electroluminiscente , montate în cascadă , operatorul putând face aprecieri asupra amplitudinii componentei spectrale inspectând vizual “lungimea” părtii luminoase a baretei de leduri.
În domeniul audio se folosea o codificare sub formă de reprezentare în diferite culori, în acest fel pentru domeniul nivelului în care amplitudinea semnalului este acceptabilă, se folosea culoarea verde, iar în afara domeniului de acceptabilitate se folosea culoare roșie, atenționând în acest mod operatorul asupra riscului prezentat de distorsionarea înregistrării audio.
Aceste analizoare utilizau filtre analogice și un sistem de comparatoare analogice, alese în funcție de acuratețea reprezentării grafice) ce aveau ca sarcina pe ieșire diodele led din baretă.
Informații suplimentare erau scrise adiacent prin gradare unor scale în unitați de masură corespunzătoare, în jurul dispozitivului de afișare și cât mai aproape de acesta prin litografiere cu cerneluri serigrafice astfel încât durabilitatea scrierii să fie maxima.
Acest sistem este rigid, nepermițand o scalare a sa , decât prin modificări fizice operate asupra sistemului de afișare (suplimentarea numărului de barete cât și modificări aduse parții de filtrare prin suplimentarea corespunzatoare a filtrelor analogice).
În figura de mai jos putem observa un sistem de afișare liniar cu led-uri(http://www.precisioninstrument.com/Bargraph_Displays.htm).
Figura 3.34 Sistem de afișare ce flosește barete de led-uri
Lucrurile sunt cât se poate de clare pentru acest sistem de afișare, domeniul semnalului de intrare este imparțit în subdomenii egale ,de regulă cu ajutorul unei rețele resistive de precizie, încadrarea în unul din aceste subdomenii fiind realizată de către comparatorul analogic.
În acest fel , sistemul de afisare va transmite informația către operator, acesta fiind în masură să o interpreteze și să ia deciziile corespunzătoare.
Mai jos , este prezentată o schemă electrică pentru un sistem de afișare cu led-uri de tipul “bargraf”.
Figura 3.35 Simularea in PSPICE a unui nivel-metru cu led-uri
Sursa de tensiune alternativă, în acest caz simulează semnalul de intrare, tensiunea ei variind cu o frecvență de 10herți.
În partea superioara a schemei observăm divizorul rezistiv , alcătuit dintr-un set de 10 rezistrori, tensiunile generate de ei (care împart domeniul de referință de 5V în 10 subdomenii) constituie intrările de referință pentru fiecare dintre comparatoare din lanțul de comparatoare.
Pentru orice valoare a tensiunii de intrare care este mai mare decat valoarea de referinta pe borna inversoare a comparatorului, ieșirea acestuia va fi egală cu tensiunea de alimentare (5V).
Rezistorii montați la ieșirile comparatoarelor au rolul de a limita curentul ce circulă prin LED-uri , prevenind în acest fel deteriorarea acestora.
O altă variantă de implementare a blocului de afișare este aceea în care se folosește un display (de regulă graphic) , practic o matrice activă TFT cu cristale lichide.
Avantajele care decurg din aceasta sunt, fiabilitate și flexibilitate mult mai mare.
Consum de energie electrica mult mai mic.
Design atragător, precizie sporita , afișare la cerere în caseta de dialog a parametrilor unei barete grafice selectate de către operator.
Posibilitate de informare sporită în sensul că se pot implementa baloane de ajutor care ghidează utilizatorul în procesul de setare și/sau utilizare, pentru o bună exploatare a sistemului.
Cristalul lichid este un lichid anizotrop, care se află într-o stare intermediară, situate între starea solidă și cea lichidă.[10]
Cristalele lichide sunt :
Termotrope , caz în care starea de cristal lichid se află între două temperaturi
Liotrope , când starea de cristal lichid se află între 2 concentrații
Cristalele lichide există în mai multe stări fizice și anume , nematică, smectică și colesterică, toate deosebindu-se prin modul de aranjare a moleculelor.
Generic , un sistem de afișare cu cristale lichide este alcătuit din filtre de polarizare a luminii, elemente mecanice de distanțare , elemente de difuzare a radiației luminoase, elemente optice transparente pe care se depune un strat extrem de subtire de metal constituind electrozii de polarizare, cristalul de cuarț lichid.
Figura 3.36 Principiul de funcționare a LCD-ului
Conform legii lui Malus , intensitatea luminoasă a radiației incidente va depinde de unghiul de rotire conform relatiei:
În cazul afișajelor cu cristale lichide color, fiecare pixel din imagine are în componența sa trei elemente corespunzătoare celor trei culori primare si anume R – pentru roșu , G – pentru verde și B – pentru albastru.
În această situație avem deaface cu un amestec aditiv al culorilor.
Comanda cristalelor lichide se face în curent alternativ, pentru a se evita fenomenul de electroliză, curent ce are de regula o frecvența de 25Hz … 1KHz și factor de umplere 1/2.
Panourile TFT moderne includ, pe langă matricea LCD și controllere dedicate interfațării cu microprocesoare / microcontrollere, acestea dispunând de memorie RAM, eventual generator de caractere specific codului ASCII, circuit de ceas, circuit formator de semnal pentru alimentarea LCD, controlul contrastului, iluminare de fundal reglabila prin convertor DAC.
Un astfel de controller , utilizat foarte des , este ILI9341 ce echipează display-ul folosit în aplicație.
Vom trece în revistă atât caracteristicile sale , moduri de funcționare, setul de instrucțiuni disponibile, cât și anumite diagrame de timp, utilizate în realizarea unor instructiuni grafice primitive implementate în software-ul ce rulează pe microcontroller.
Modul de conectare a display-ului cu microcontroller-ul se poate realiza atât serial cât și paralel, controlerul afișajului punând la dispoziția utilizatorului o interfață paralelă de 18 biți cât și una serială de tipul I2C-bus.
Deasemenea , pinii de comandă trebuiesc conectați cu microcontroller-ul și nu în ultimul rând sursa de alimentare cât și iluminatul de fundal.
Din datele puse la dispoziție în foaia de catalog, se observă existența mai multor moduri de configurare a interfeței de comunicație, moduri ce sunt evidențiate în urmatorul tabel
Tabelul 1 Configurarea interfeței de comunicație a ecranului LCD
În principal , marea majoriate a operațiilor cu display-ul sunt de scriere, foarte puține operații necesită citirea din GRAM (Graphic-RAM).
modalitatea de conectare pentru modul paralel al buss-ului de date (cel mai rapid transfer) se realizează astfel :
Figura 3.37 Modalitatea de conectare a afișajului cu microcontroller-ul
Afișajul dispune de un bus de date de 18 biți , configurabil , în funcție de stările logice ale pinilor notați cu IM0 .. IM3, astfel pentru o utilizare judicioasa care să nu complice inutil structura de conectare și implicit necesitatea de a utiliza cablaje imprimate multistrat, s-a ales configurația de 8-bit data bus Interface I situație în care pinii de configurare IM0, IM1, IM2, IM3 trebuie să se afle in 0L implicit conectați la potențialul 0V (masa).
În această situație transferul datelor se va face utilizând primii 8 biti de date din magistrală , notați cu DB0, DB1, DB2, DB3, DB4, DB5, DB6, DB7 aceștia se vor cupla direct (conform schemei din Anexa 1 – Figura1) pe portul B al microcontroller-ului, ocupând toți cei 8 biți de date ai portului).
Pentru a comunica datele înspre și dinspre LCD , controller-ul acestuia trebuie să cunoască atât direcția de transfer a datelor, lucru realizat prin tranzitiile semnalelor de pe pinii WR – (scriere) , RD – citire , cat și registrele ce vor fi utilizate , registrele de control sau memoria grafica.
Deasemenea trebuie facuta distincție între operații ce se efectuează asupra registrelor controller-ului LCD de cele adresate direct memoriei grafice GRAM, pentru aceasta există un semnal denumit D/Cx.
În situația în care sunt folosite mai multe panel-uri grafice de afișare activarea secvențiala a acestora se face prin comutarea lor cu ajutorul semnalului CS – chipselect.
Initializarea hardware a afișajului se face printr-o tranziție negativă aplicată pe pinul RSTx.
Figura 3.38 Modurile de operare ale afișajului
Pentru a implementa în software primitivele utilizate în vederea afișării pe ecran a datelor,în figura de mai sus găsim tranzițiile ce trebuiesc efectuata pe pinii porturilor alocate semnalelor.
Observăm că semnalul D/CX face diferențierea între operațiile adresate comenzilor de cele adresate datelor ce vor fi afișate pe ecran, astfel dacă D/CX = 1L operațiile de scriere WRX respectiv citire RDX se face asupra memoriei video GRAM sau datele vor fi considerate argumente al unor funcții, din contră daca D/CX=0 operatiile se adreseaza registrelor controllerului LCD fiind interpretate ca apeluri de funcții interne , ce pot avea sau nu un număr de parametrii .
Pe toată durata funcționării sale , semnalul CSX trebuie să se afle permanent în starea 0L.
În Anexa 2 sunt atașate funcțiile ce pot fi utilizate , codurile lor , cât și o descriere succintă.
Alocarea pinilor se face conform urmatorului tabel
Pe baza diagramelor de semnal, se pot elabora , în primă fază funcții necesare scrierii datelor în controller-ul afisajului, cât și apelul registrelor afișajului.
Figura 3.39. Diagrama de semnal pentru ciclul de scriere
Analizând diagrama de semnal se poate observa că înscrierea efectivă a datelor se face pe tranziția de front pozitivă a semnalului WRX.
Un exemplu este mai jos.
Inițial pinii portului C și anume PC5, PC3 și PC2 trebuie să se afle în 1L, respectiv semnalele RSTX, RDX si WRX se află în 1L.
După o întârziere de 3 microsecunde pinii PC1 și PC0 se vor schimba în 0L deoarece se va face o operație de ȘI pe bit între valoarea citită din portul PORTC și valoarea 11111100 în binar, deasemenea portul PA6 va trece în 0L.
Urmează o întârziere de 3 microsecunde precedată de o noua tranziție a PORTC astfel încât pinii PC2, PC1 și PC0 vor trece în 0L moment de timp marcat pe diagrama de semnal cu tranziția semnalului WRX din 1L în 0L.
Se realizează o scriere în portul de date PORTB prin instrucțiunea PORTB=ctrl;
Iar , dupa o întarziere de 3 microsecunde se va face tranziția pinului PC2 din 0L în 1L , confirmând în acest fel transferul datelor către LCD.
Efectul va fi, pentru functia write_ctl(unsigned char ctrl) apelarea unei funcții a LCD-ului care va fi urmata sau nu de parametrii (transmiși prin apelul funcției utilizator write_data(unsigned char data) sau activarea unui pixel pe ecran dacă se apelează direct write_data(unsigned char data).
Observație: expresia 1<<PCn echivalentă cu 1<<n deplasează valoarea de 1L la stânga cu un număr de n biți într-un octet de date.
O construcție de genul
PORTC &=(1<<PC7)|(1<<PC6)|(1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2) este echivalentă cu :
PORTC = PORTC &((1<<PC7)|(1<<PC6)|(1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2));
Evaluarea se va face de la dreapta la stânga,în acest caz arietatea cea mai mare având-o operatorul << deplasare stânga , se vor forma 6 octeți fiecare având 1L pe poziția corespunzătoare deplasării după care se va face operația SAU pe bit între octeți, rezultatului fiindui aplicat operatorul ȘI pe bit cu valoarea citită din SFR-urile portului C, urmând ca mai apoi portului C să i se atribuie noua valoare astfel calculată.
Pentru expresia de mai sus vom avea:
10000000|
01000000|
00100000|
00010000|
00001000|
00000100|
11111100&
Xxxxxxxx
Xxxxxx00 – starea curentă a portului C
În acest mod se aduce la valoarea de 0L doar biții doriți ceilalți biți păstrându-și valoarea anterioară, operând-se la nivel de bit pe portul respectiv.
void write_ctl(unsigned char ctrl)
{
PORTC |=(1<<PC5)|(1<<PC3)|(1<<PC2);
_delay_us(3);
PORTC &= (1<<PC7)|(1<<PC6)|(1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2);
PORTA &= (1<<PA0)|(1<<PA1)|(1<<PA2)|(1<<PA3)|(1<<PA4)|(1<<PA5)|(1<<PA7);
//Prin omiterea bitului PA6 , efectul este de aducere la nivelul 0L al pinului PA6 din portul A
//Transmițând în acest mod controller-ului că operațiile se vor face cu regiștrii acestuia și nu cu
//memoria grafică GRAM
_delay_us(3);
PORTC &=(1<<PC7)|(1<<PC6)|(1<<PC5)|(1<<PC4)|(1<<PC3);
_delay_us(3);
PORTB=ctrl;
_delay_us(3);
PORTC |= (1<<PC2);
}
Funcția utilizator write_data(unsigned char dat) funcționează asemănător cu funcția descrisă mai sus , respectând tranziția semnalului WRX din 1L în 0L după care revenind în 1L.
Singura deosebire este reprezentată de faptul că pinul PA6 va fi în 1L (PORTA |=(1<<PA6)) astfel încât controller-ul LCD-ului va înscrie datele direct în memoria video GRAM.
void write_data(unsigned char dat)
{
PORTC |= (1<<PC7)|(1<<PC6)|(1<<PC5)|(1<<PC3)|(1<<PC2);
PORTA |=(1<<PA6);
_delay_us(5);
PORTC &= (1<<PC7)|(1<<PC6)|(1<<PC5)|(1<<PC4)|(1<<PC3);
_delay_us(5);
PORTB=dat;
_delay_us(5);
PORTC |= (1<<PC2);
}
Figura 3.40 Modul de comunicație 80 Interface I
Conform fișei de catalog dată de către producător , avem acest mod de interconectare din punct de vedere electric.
Observăm conectarea magistralei de date realizată pe primii biți de date, iar pentru biții de control sunt folosite semnalele CSX, D/CX, WRX, RDX (simbolul X specifică faptul că semnalul este negat, adică activ pe OL).
În funcție de setările controller-ului , efectuate prin apelul anumitor funcții puse la dispoziție utilizatorului, afișarea se poate face utilizând anumite adâncimi de culoare și anume 8biți, 16biți, 18biți, putând atinge un maximum de 256Kculori.
Tabelul 2 – Funcția COLMOD
Apelând funcția 3Ah, cu parametrul DBI=“110”, se va afișa imaginea având adâncimea de culoare de 256Kcolor RGB astfel :
Void main(){
//declaratii variabile
…………….
Initializari
………..
write_ctl(0x3A);
write_data(0x66);}
Pixelii ce compun imaginea , vor fi scriși în ordine începând de la stânga la dreapta și de jos în sus.
Tabelul 3 – Ordinea afișării pixelilor unei linii
Pe orizontală în table avem reprezentat numărul pixelului pentru o linie din imagine, iar deoarece pe o linie sunt 240 de triade (RGB) rezultă un număr de 720 de pixeli ce se vor transmite succesiv, folosind ulimii 6 biți ai magistralei de date (coloana 1) în ordinea de la stânga la dreapta R-G-B.
În mod de operare normal dupa transmiterea valorii unui pixel, automat numaratorul se incrementează cu o unitate adresând pixelul urmator.
Bineințeles, se poate utiliza intreaga suprafața a ecranului, sau se poate definii o suprafața de o anumită arie (exprimată în pixeli) folosind funcții puse la dispoziție și implementate în controller-ul LCD-ului.
Cu ajutorul funcțiilor 2Ah si 2Bh se poate definii o astfel de arie, ce mai apoi va fi colorată, rezultând spre exemplu un dreptunghi.
Un exemplu de utilizare a funcțiilor 2Ah si 2Bh este prezentat în rândurile de mai jos, unde se definește o regiune de 40 / 40 pixeli, care mai apoi va fi umplută cu o culoare.
De exemplu în Borland C această acțiune putea fi intreprinsa apelând in ordine urmatoarele funcții din biblioteca graphics.h.
Setcolor(BLUE);
Setfillstyle(SOLID_FILL, GREEN);
Setviewport(pozx, pozy, pozfx, pozfy, 0);
Rectangle(0, 0 , pozfx-pozx, pozfy-pozy);
Floodfill(1, 1, BLUE);
#define Red 0x12
#define Green 0xAD
#define Blue 0x1C
Write_ctl(0x2A);
Write_data(0x00); //pozx_high_byte
Write_data(0x00);//pozx_low_byte
Write_data(0x00);//pozfx_high_byte
Write_data(0x28);//pozfx_low_byte
Write_ctl(0x2B);
Write_data(0x00);//pozy_high_byte
Write_data(0x30);//pozy_low_byte
Write_data(0x00);//pozfy_high_byte
Write_data(0x70);//pozfy_low_byte
Write_ctl(0x2C);//Apelul funcției de scriere în memoria GRAM
For(int i=0;i<1600;i++){
Write_data(Red);
Write_data(Green);
Write_data(BLUE);
}
Tabelul 4 Funcția CASET
Astfel funcția CASET va delimita pe ecran două coloane verticale notate SC si EC definite prin parametrii P1 până la P4
Unde SC – reprezinta pozitia coloanei de start in număr de pixeli, iar EC pozitia coloanei de sfarsit.
Observație coordonatele X=0 Y=0 se situează în stânga jos.
Tabelul 5 – Funcția PASET
Următoarea funcție , necesară în definirea ariei este PASET -2Bh, aceasta va realiza o delimitare pe orizontală a zonei din imagine , delimitare dată de coordonatele trimise funcției PASET ca argument și anume SP[15:8], SP[7:0] respectiv EP[15:8], EP[7:0]
Efectul va fi de a delimita imaginea după cum se observă în figura de mai jos.
Astfel numărul de pixeli se va determina utilizând urmatoarea formulă :
Reprezentând aria în pixeli a imaginii.
Se pot astfel creea forme geometrice simple, în acest caz formele dreprungiulare fiind interesante deoarece vor reprezenta modalitatea de afișare a informației pe ecran.
Pentru orice scriere în memoria grafică se apelează mai întâi funcția 0x2Ch – RAMWR
Tabelul 6 – Funcția RAMWR
Datele transmise ulterior apelului funcției , reprezentând valoarea intensitații pixelilor pe ecran.
Alte funcții , utile , folosite în programul aplicație sunt :
Software reset 0x01h SWRESET
Stralucire ecran 0x51 WRDISBV
Sleep out 0x11 SLPOUT
Ordinea apelării funcțiilor în program, conform specificațiilor producătorului este :
SWRESET
SLEPOUT
Delay 100 ms
Apelul funcției SLPOUT are ca efect activarea convertorului DC/DC , pornirea oscilatorului local, pornirea scanner-ului matricei TFT.
Secvența de inițializare se reprezintă schematic astfel:
Capitolul IV
4.1 Implementarea soluției
Implementarea soluției problemei presupune pe deoparte realizarea fizică a montajului electronic ce include circuitele electronice ce vor realiza interconectarea diferitelor subansamble astfel încât functionarea întregului sistem să fie corectă, respectând indicațiile prevăzute în foile de catalog ale fiecărei componente electronice.
Pe de altă parte , având în vedere că acest sistem este un sistem care evolueaza pe baza unui program, trebuie realizată și implementarea software a acestuia.
În implementarea software, unele rutine trebuie să țină seama și de modul în care au fost conectate subansamblele cu microcontrollerul, diferite semnale ale modulelor componente fiind conectate fizic pe anumite porturi, având anumite configurații de intrare sau ieșire , în funcție de dispozitiv.
Proiectarea hardware.
Știind scopul propus, respectiv subsistemele ce vor intra în componența sistemului, proiectarea începe prin alegerea microcontroller-ului.
Acesta pe de o parte trebuie să îndeplinească criterii de performanță privind capacitatea de calcul, iar pe de altă parte, microcontroller-ul trebuie să asigure numărul de porturi necesar conectării cu celelalte sisteme (de achiziție și de afișare), fiecare dintre ele necesitând semnale pentru comunicație, lucru ce duce la ocuparea unui număr mai mic sau mai mare de porturi disponibile.
În cazul de față utilizarea unui microcontroller din seria Mega, produsă de către Atmel este destul de eficienta.
Atmega1284P asigură o comunicație cu perifericele, dispunând de un număr de patru porturi de 8 biți ce lucrează în mod paralel, funcționează la o frecvență de maximum 20MHz și este compatibil cu logica TTL.
Un aspect important reprezintă și asigurarea tensiunilor de alimentare, mai ales datorită faptului că sunt necesare doua surse de alimentare, una de 5v si cealalta de 3.3v.
Această problemă a fost rezolvată utilizând surse stabilizate integrate ca de exemlu LM7805, acesta pentru varianta în capsula TO220 asigurând un curent de 1A, utilizarea este simplă iar conexiunea se poate realiza urmând indicațiile date de către producator astfel:
Pentru alimentarea microcontroller-ului si a afișajului se poate folosi un stabilizator integrat de tipul LM8703 care, comform foii de catalog a producătorului poate debita pe sarcină un curent de maximum 1A la o tensiune fixă stabilizată de 3.3V.
Pentru realizarea conexiunii electrice cu sistemul de afișare , trebuie folosite inevitabil 2 porturi ale microcontroller-ului.
Având în vedere faptul că LCD-ul este echipat și cu un dispozitiv touch-screen de tipul rezistiv ceea ce face ca interacțiunea sa fie mai simplă, eliminand push-butoane-le, dar care necesită utilizarea unui convertor analog-digital pentru determinarea coordonatelor pe cele două axe X-Y.
În consecinta touch-screen-ul va ocupa din portul PORTA primii patru biți PA0, PA1, PA2, PA3, unde PA0 și PA1 vor fi utilizați ca intrări analogice, iar PA2 si PA3 ca ieșiri digitale.
Din acest motiv, portul A a fost folosit parțial pentru semnale digitale, două dintre intrările lui fiind rezervate neapărat ca intrări analogice pentru ADC.
Pentru busul de date și comenzi, se alocă două porturi alese pseudoaleator în cazul de față PORTB (B=>buss) pentru transmiterea datelor pe buss-ul de 8 biți către LCD iar PORTC (C=>comanda) pentru transmiterea comenzilor către LCD.
Portul D (PORTD) este utilizat ca port de intrare pentru achiziția datelor provenite de la convertorul analog-digital extern, fiind ocupat în totalitate, deasemenea sunt folosiți 3 pini pentru comanda eșantionarii ce vor utiliza PORTA și PORTC , și anume PA4, PA5, PC7.
Pentru comanda luminii de fundal se folosește PC4 din PORTC fiind configurat ca pin de ieșire digital.
Stabilind toate aceste elemente , nu mai rămane decât a realiza conexiuni electrice între microcontroller și periferice, conexiuni ce în final vor arăta ca cele din Anexa1 – figura 1 unde putem observa schema finală a montajului.
4.1.2 Proiectarea software-ului
4.1.2.1 Generalități
Componenta software reprezintă „liantul” cel care coordonează întreaga structură hardware
Datorită faptului că nu există niciun sistem de operare, software-ul îndeplinește pe de o parte și rolul unui sistem de operare monolitic, cei drept minimal, asigurând , prin funcțiile sale , o serie de servicii.
Aici au fost implementate , pe lânga rutina de calcul efectivă a transformatei fourier rapide, un set de funcții, ce asigură :
Inițializarea componentelor hardware
Gestionarea resurselor critice
Configurarea porturilor
Configurarea sistemului de întreruperi
Decodificarea și afișarea imaginilor de tip bitmap
Desenarea de primitive grafice , punct, linie, dreptunghi
Inițializarea și citirea coordonatelor touch-screen-ului
4.1.2.2 Diagrama bloc a programului
Schema logică a programului , realizată sub forma diagramelor bloc vine în ajutorul întelegerii funcționării acestuia și reprezintă în primul rănd un ghid în implementarea și modificarea lui ulterioara.
Figura 4.1 – Schema bloc a programului
În program se declară și inițializează un set de variabile globale, unele dintre acestea au rol de semafor, gestionând secvența în care trebuie executate anumite instrucțiuni (de exemplu completedaquire, reeval cu rolul de a impiedica calculul transformatei fourier discrete cât timp achiziția eșantioanelor din semnal nu este completa), astfel se realizează un sincronism între bucla principală a programului și bucla subprogramului de achiziție de date, avănd în vedere că ele evoluează independent una de cealaltă.
4.1.2.3 Funcția de eșantionare
Implementarea funcției care realizează eșantionarea semnalului se face astfel:
ISR(TIMER1_OVF_vect, ISR_BLOCK)
{
TCCR1B=0x00; //Timmer 1 STOP //
TCNT1H = (frecventa>>8)&0xFF;
TCNT1L = frecventa&0xFF;
TCCR1B |= (1<<CS11);
PORTA |= (1<<PA4)|(1<<PA5);
_delay_us(10);
PORTA &= ~(1<<PA4);
_delay_us(10);
PORTA |=(1<<PA4);
_delay_us(10);
PORTA &= ~(1<<PA5);
//Se execută un ciclu de conversie al ADC extern //
//Datele fiind disponibile pe PORTD //
if(reeval==1){
if(baleaj_fft<32){completedaquire=0;fx[baleaj_fft]=(int8_t)((PIND)*0xFC)-128;baleaj_fft++;}
else {baleaj_fft=0;reeval=0;completedaquire=1;}
}
//
_delay_us(10);
PORTA |=(1<<PA5);
}
Prima instrucțiune , TCCR1B=0x00 are ca efect oprirea numărătorului timer1, după care , seîncarca în registrele numărătorului o valoare numerică calculată astfel încât frecvența de apelare a funcției serviciului de întreruper ISR sa fie corelată conform teoremei lui Nyquest.
Registrul TCCR1B
Pentru o funcționare corectă , în funcție de frecvența oscilatorului microcontroller-ului trebuie stabilit un factor de divizare prin atribuirea corespunzatoare a valorilor biților CS[2:0] conform tabelului de mai jos
Tabelul 4.1 Configurarea timer-ului prin alegerea factorului de divizare
Efectul instrucțiunii TCCR1B=0x00; este oprirea timer-ului în vederea încarcarii valorii registrelor numărătorului, aceasta prin execuția instrucțiunilor
TCNT1H = (frecventa>>8)&0xFF;
TCNT1L = frecventa&0xFF;
Urmat de activarea funcționării timer-ului prin setarea factorului de divizare corespunzator N=65486 valoare rezultată din următorul calcul :
Cunoscînd :
Iar factorul de divizare DIV=8
După efectuarea calculelor obținem valoarea ce trebie încarcată în registrul de 16biți al numărătorului
Urmează o tranziție în 0L a pinului PA4 ceea ce determină declanșarea unei noi conversii a ADC-ului extern prin apelul instrucțiunii PORTA &= ~(1<<PA4);iar după o intârziere de 10uS , stabilită prin instrucțiunea _delay_us(10); PA4 revine la starea sa inițială prin apelul instrucțiunii
PORTA |=(1<<PA4); urmată de operația de citire a datelor din convertorul extern ADC prin executarea instrucțiunii PORTA &= ~(1<<PA5);.
Cele două blocuri decizionale au scopul de a realiza sincronizarea între procesul principal și instrucțiunile de atribuire a valorilor vectorului ce conțin eșantioanele de semnal , lucru realizat de prima instrucțiune de decizie if(reeval==1), cea de a doua instrucțiune if(baleaj_fft<32) asigură o ciclicitate a variabilei index baleaj_fft, aceasta fiind incrementată cu o unitate la fiecare tratare a intreruperii timer1 iar în acelaș timp această variabilă nefiindu-i permisă depașirea valorii dată de numărul de elemente ale vectorului.
Ideea este mai bine prezentată dacă expunem cele două blocuri de instrucțiuni, anume din programul principal și din ISR-ul vectorului de întrerupere, față în față.
if(reeval==1){
if(baleaj_fft<32){completedaquire=0;fx[baleaj_fft]=(int8_t)((PIND)*0xFC)-128;baleaj_fft++;}
else {baleaj_fft=0;reeval=0;completedaquire=1;}
}
If((completedaquire==1)&&(viewf==0)){
TRANSFORM();
………………………………..
……………………………….
completedaquire=0;
reeval=1;
}
}
Astfel în momentul în care baleaj_fft devine mai mare decât 32 , execuția instrucțiunilor se va face pe ramura else a instrucțiunii if aceast lucru având ca efect inițializarea cu zero a contorului baleaj_fft cât și a variabilei reeval concomitent cu setarea variabilei completedaquire (achiziție completă), rezultatul fiind că vectorul nu-și va mai schimba valorile elementelor sale oricâte apeluri ale funcției ISR(Anexa) se vor face.
Concomitent ,în programul principal se va detecta faptul că sa realizat o achizitie completă de eșantioane , prin testarea variabilei completedaquire, urmând ca în cel mai scurt timp posibil să se realizeze transformata fourier discretă prin apelul funcției TRANSFORM(),în clipa în care funcția TRANSFORM() s-a încheiat și după afișarea pe ecran a rezultatelor se resetează variabila completedaquire la 0 și se setează variabila reeval cu 1L, permițând astfel prelevarea de noi eșantioane de semnal.
4.1.2.4 Implementarea algoritmului pentru transformata Fourier discretă
Avănd la bază elemente din teoria matematică a transformatei Fourier, implementarea algoritmului presupune realizarea de calcule iterative pentru fiecare element din componenta spectrală a semnalului X[k].
Reamintindu-ne principiul care stă la baza calculului și anume :
Pornind de la această definiție , observăm că este necesară utilizarea a două structuri iterative, cu număr cunoscut de pași, ceea ce , în limbajul C corespunde buclei „for”.
Avănd în vedere capacitatea limitată de calcul a microcontroller-ului, pe deoparte datorată limitarii frecvenței maxime ceea ce se traduce printr-un numar mai mic de instrucțiuni executate pe unitatea de timp, iar pe dealtă parte faptului că este un microcontroller de 8 biți, rezultă necesitatea evitarii calculelor complexe cum ar fi : extragerea radăcinii patrate, funcții trigonometrice , împarțiri și înmulțiri excesive etc.
Ideea este de a tabela funcțiile trigonometrice sinus și cosinus cât și unghiurile corespunzătoare vectorului de rotire exprimat prin arctg() (4.4).
Astfel funcțiile sinus și cosinus vor fi tabelate cu o rezoluție de un grad și memorate într-un tablou cu dimensiunea de 360 de elemente , sub forma numerelor întregi, fiecare element fiind înmulțit cu 10000.
Valorile unghiurilor vectorului de rotație W vor fi și ele tabelate și memorate într-un tablou de dimensiunea n*k, adică 32*16=512 elemente, astfel aranjat încât valoarea corespunzatoare unui unghi calculat să reprezinte un index în tablourile de lookup pentru sinus si cosinus.
Secvența de instrucțiuni ce realizează implementarea funcției este următoarea :
void TRANSFORM()
{
int16_t count,degree;
uint8_t u,k;
count = 0;
for (u=0; u<16; u++) {
Fu[u][0]=0;
Fu[u][1]=0;
for (k=0; k<32; k++) {
degree = (uint16_t)pgm_read_byte_near(degree_lookup + count)*2;
count++;
Fu[u][0] += fx[k] * (int16_t)pgm_read_word_near(cos_lookup + degree);
Fu[u][1] += -fx[k] * (int16_t)pgm_read_word_near(sin_lookup + degree);
}
Fu[u][0] /= 32;
Fu[u][0] /= 2000;
Fu[u][1] /= 32;
Fu[u][1] /= 2000;
}
}
Unde Fu[][] este o matrice de 16 linii si 2 coloane ce memorează atât partea reală a transformatei cât și partea imaginară astfel Fu[x][0] stochează elementele parții reale iar Fu[x][1] cele ale parții imaginare
Fx[k] conținând elementele semnalului eșantionat.
4.1.2.5 Afișarea rezultatelor. Funcția de afișare și interacțiune cu operatorul
Afișarea rezultatelor se face grafic, secventa de instrucțiuni fiind urmatoarea:
if((tactilx>90)&&(tactilx<123)&&(tactily>300)&&(tactily<317)){viewf=1;viewblok=1;}//Afisare fereastra viewf=1 face sa se execute functia fereastra(bitmap) din main()//
if((viewf==1)&&(tactilx>120)&&(tactilx<152)&&(tactily>170)&&(tactily<186)){viewf=0;viewblok=1;} //Apasand CANCEL => viewf=0 se executa destroy_vindow() din main()//
if((viewf==1)&&(tactilx>20)&&(tactilx<160)&&(tactily>220)&&(tactily<230)){
frecventa=tactilx*436;
orizontal_bar(20, 220, tactilx, 0x0A, 0xFC, 0x0A);
orizontal_bar(tactilx, 220, 160-tactilx, colbar1[0], colbar1[1], colbar1[2] );}
if((viewf==1)&&(tactilx>20)&&(tactilx<160)&&(tactily>200)&&(tactily<210)){
orizontal_bar(20, 200, tactilx, 0x0A, 0xFC, 0x0A);
orizontal_bar(tactilx, 200, 160-tactilx, colbar1[0], colbar1[1], colbar1[2] );}
if((completedaquire==1)&&(viewf==0)){
TRANSFORM();
//fft_r();
//level=tactily;
//PORTD=tactilx;
if((tactilx>50)&&(tactilx<70)&&(tactily>20)&&(tactily<179)&&(viewf==0)){
level=(uint8_t)(Fu[0][0]+Fu[0][1]/4);
if(level>162) {
level=162;}
else level=(uint8_t)(Fu[0][0]+Fu[0][1]/4);
if(bareta_nr!=1) {infopanel(2300, (unsigned int)fabs(level));}
if(level<=21){bargraph(50, 20, 199-22, 0xFC, 0x00, 0x00);}
else{bargraph(50, level-1, 199-level, 0xFC, 0x00, 0x00);}
bargraph(50, 20, level, 0xFC, 0xFC, 0x5C);press=1;bareta_nr=1;
}//Sfarsit bloc decizie nr 1 //
if((tactilx>80)&&(tactilx<100)&&(tactily>20)&&(tactily<179)&&(viewf==0)){
level=(uint8_t)(Fu[2][0]+Fu[2][1]/4);
if(level>162) {level=162;}
else level=(uint8_t)(Fu[2][0]+Fu[2][1]/4);
if(bareta_nr!=2) {infopanel(5800, level);}
if(level<=21){bargraph(80, 20, 199-22, 0xFC, 0x00, 0x00);}
else{bargraph(80, level-1, 199-level, 0xFC, 0x00, 0x00);}
bargraph(80, 20, level, 0xFC, 0xFC, 0x5C);press=1;bareta_nr=2;
}//Sfarsit bloc decizie nr 2 //
if((tactilx>110)&&(tactilx<130)&&(tactily>20)&&(tactily<179)&&(viewf==0)){
level=(uint8_t)(Fu[4][0]+Fu[4][1]/4);
if(level>162) {level=162;}
else level=(uint8_t)(Fu[4][0]+Fu[4][1]/4);
if(bareta_nr!=3){infopanel(12400, level);}
if(level<=21){bargraph(110, 20, 199-22, 0xFC, 0x00, 0x00);}
else{bargraph(110, level-1, 199-level, 0xFC, 0x00, 0x00);}
bargraph(110, 20, level, 0xFC, 0xFC, 0x5C);press=1;bareta_nr=3;
}//Sfarsit bloc decizie nr 3 //
if((tactilx>140)&&(tactilx<160)&&(tactily>20)&&(tactily<179)&&(viewf==0)){
level=(uint8_t)(Fu[6][0]+Fu[6][1]/4);
if(level>162) {level=162;}
else level=(uint8_t)(Fu[6][0]+Fu[6][1]/4);
if(bareta_nr!=4){infopanel(12400, level);}
if(level<=21){bargraph(140, 20, 199-22, 0xFC, 0x00, 0x00);}
else{bargraph(140, level-1, 199-level, 0xFC, 0x00, 0x00);}
bargraph(140, 20, level, 0xFC, 0xFC, 0x5C);press=1;bareta_nr=4;
}//Sfarsit bloc decizie nr 4 //
if((tactilx>170)&&(tactilx<190)&&(tactily>20)&&(tactily<179)&&(viewf==0)){
level=(uint8_t)(Fu[8][0]+Fu[8][1]/4);
if(level>162) {level=162;}
else level=(uint8_t)(Fu[8][0]+Fu[8][1]/4);
if(bareta_nr!=5){infopanel(22000, level);}
if(level<=21){bargraph(170, 20, 199-22, 0xFC, 0x00, 0x00);}
else{bargraph(170, level-1, 199-level, 0xFC, 0x00, 0x00);}
bargraph(170, 20, level, 0xFC, 0xFC, 0x5C);press=1;bareta_nr=5;
}//Sfarsit bloc decizie nr 5 //
if((tactilx>200)&&(tactilx<220)&&(tactily>20)&&(tactily<179)&&(viewf==0)){
level=(uint8_t)(Fu[10][0]+Fu[10][1]/4);
if(level>162) {level=162;}
else level=(uint8_t)(Fu[10][0]+Fu[10][1]/4);
if(bareta_nr!=6){infopanel(120, level);}
if(level<=21){bargraph(200, 20, 199-22, 0xFC, 0x00, 0x00);}
else{bargraph(200, level-1, 199-level, 0xFC, 0x00, 0x00);}
bargraph(200, 20,level, 0xFC, 0xFC, 0x5C);press=1;bareta_nr=6;
}//Sfarsit bloc decizie nr 6//
for(baleaj_barete=1;baleaj_barete<16;baleaj_barete++){
if(Fu[baleaj_barete][0]<0) Fu[baleaj_barete][0] *= (-1);
if(Fu[baleaj_barete][1]<0) Fu[baleaj_barete][1] *= (-1);
level=(int8_t)((Fu[baleaj_barete][0]+Fu[baleaj_barete][1])/4)*2;
if(level>162)// level=level%162;
if((baleaj_barete)==0){ if(bareta_nr!=1) {}
if(level<level_anterior[baleaj_barete]){
bargraph(50, 20+level-1, 20+100-level, 0xFC, 0x00, 0x00);}
bargraph(50, 20, level, 0xFC, 0xFC, 0x5C);
press=1;bareta_nr=1;level_anterior[baleaj_barete]=level;}
if((baleaj_barete)==1){if(bareta_nr!=2) {}
if(level<level_anterior[baleaj_barete]){
bargraph(60, 20+level-1, 20+100-level, 0xFC, 0x00, 0x00);}
bargraph(60,20,level,0xFC,0xFC,0x5C);
press=1;bareta_nr=2;level_anterior[baleaj_barete]=level;}
if((baleaj_barete)==2){if(bareta_nr!=3){}
if(level<level_anterior[baleaj_barete]){
bargraph(70, 20+level-1, 20+100-level, 0xFC, 0x00, 0x00);}
bargraph(70, 20, level, 0xFC, 0xFC, 0x5C);
press=1;bareta_nr=3;level_anterior[baleaj_barete]=level;}
if((baleaj_barete)==3){ if(bareta_nr!=4){}
if(level<level_anterior[baleaj_barete]){
bargraph(80, 20+level-1, 20+100-level, 0xFC, 0x00, 0x00);}
bargraph(80, 20, level, 0xFC, 0xFC, 0x5C);
press=1;bareta_nr=4;level_anterior[baleaj_barete]=level;}
if((baleaj_barete)==4){ if(bareta_nr!=5){}
if(level<level_anterior[baleaj_barete]){
bargraph(90, 20+level-1, 20+100-level, 0xFC, 0x00, 0x00);}
bargraph(90, 20, level, 0xFC, 0xFC, 0x5C);
press=1;bareta_nr=5;level_anterior[baleaj_barete]=level;}
if((baleaj_barete)==5){ if(bareta_nr!=6){}
if(level<level_anterior[baleaj_barete]){
bargraph(100, 20+level-1, 20+100-level, 0xFC, 0x00, 0x00);}
bargraph(100, 20,level, 0xFC, 0xFC, 0x5C);
press=1;bareta_nr=6;level_anterior[baleaj_barete]=level;}
if((baleaj_barete)==6){ if(bareta_nr!=7) {}
if(level<level_anterior[baleaj_barete]){
bargraph(110, 20+level-1, 20+100-level, 0xFC, 0x00, 0x00);}
bargraph(110, 20, level, 0xFC, 0xFC, 0x5C);
press=1;bareta_nr=7;level_anterior[baleaj_barete]=level;}
if((baleaj_barete)==7){if(bareta_nr!=8) {}
if(level<level_anterior[baleaj_barete]){
bargraph(120, 20+level-1, 20+100-level, 0xFC, 0x00, 0x00);}
bargraph(120, 20, level, 0xFC, 0xFC, 0x5C);
press=1;bareta_nr=8;level_anterior[baleaj_barete]=level;}
if((baleaj_barete)==8){if(bareta_nr!=9){}
if(level<level_anterior[baleaj_barete]){
bargraph(130, 20+level-1, 20+100-level, 0xFC, 0x00, 0x00);}
bargraph(130, 20, level, 0xFC, 0xFC, 0x5C);
press=1;bareta_nr=9;level_anterior[baleaj_barete]=level;}
if((baleaj_barete)==9){ if(bareta_nr!=10){}
if(level<level_anterior[baleaj_barete]){
bargraph(140, 20+level-1, 20+100-level, 0xFC, 0x00, 0x00);}
bargraph(140, 20, level, 0xFC, 0xFC, 0x5C);
press=1;bareta_nr=10;level_anterior[baleaj_barete]=level;}
if((baleaj_barete)==10){ if(bareta_nr!=11){}
if(level<level_anterior[baleaj_barete]){
bargraph(150, 20+level-1, 20+100-level, 0xFC, 0x00, 0x00);}
bargraph(150, 20, level, 0xFC, 0xFC, 0x5C);
press=1;bareta_nr=11;level_anterior[baleaj_barete]=level;}
if((baleaj_barete)==11){if(bareta_nr!=12){}
if(level<level_anterior[baleaj_barete]){
bargraph(160, 20+level-1, 20+100-level, 0xFC, 0x00, 0x00);}
bargraph(160, 20,level, 0xFC, 0xFC, 0x5C);
press=1;bareta_nr=12;level_anterior[baleaj_barete]=level;}
if((baleaj_barete)==12){if(bareta_nr!=13){}
if(level<level_anterior[baleaj_barete]){
bargraph(170, 20+level-1, 20+100-level, 0xFC, 0x00, 0x00);}
bargraph(170, 20, level, 0xFC, 0xFC, 0x5C);
press=1;bareta_nr=9;level_anterior[baleaj_barete]=level;}
if((baleaj_barete)==13){if(bareta_nr!=14){}
if(level<level_anterior[baleaj_barete]){
bargraph(180, 20+level-1, 20+100-level, 0xFC, 0x00, 0x00);}
bargraph(180, 20, level, 0xFC, 0xFC, 0x5C);
press=1;bareta_nr=10;level_anterior[baleaj_barete]=level;}
if((baleaj_barete)==14){if(bareta_nr!=15){}
if(level<level_anterior[baleaj_barete]){
bargraph(190, 20+level-1, 20+100-level, 0xFC, 0x00, 0x00);}
bargraph(190, 20, level, 0xFC, 0xFC, 0x5C);
press=1;bareta_nr=11;level_anterior[baleaj_barete]=level;}
if((baleaj_barete)==15){if(bareta_nr!=16){}
if(level<level_anterior[baleaj_barete]){
bargraph(200, 20+level-1, 20+100-level, 0xFC, 0x00, 0x00);}
bargraph(200, 20,level, 0xFC, 0xFC, 0x5C);
press=1;bareta_nr=12;level_anterior[baleaj_barete]=level;}
Variabilele tactilx si tactily memorează coordonatele punctului de pe ecran corespunzatoare rezultat în urma interacțiunii cu ecranul tactil.
Citirea ecranului tactil , respectiv ale coordonatelor , se face cu o frecvența de 30 Hz prin execuția instrucțiunilor vectorului de întrerupere ISR aferente timer0, secvența de cod fiind cea de mai jos.
ISR(TIMER0_OVF_vect)
{
PORTA |= (1<<PA3);
PORTA &= ~(1<<PA2);
ADMUX &=(1<<REFS1)|(1<<REFS0);
while((ADCSRA&(1<<ADSC))!=0);
ADCSRA |=(1<<ADSC);
while((ADCSRA&(1<<ADIF))!=0x10);
ADCSRA &= (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
pzx=ADCL&0xE0;
pzy=ADCH;
tactilx=(((pzy*256)+pzx)/2.90);
PORTA |= (1<<PA2);
PORTA &= ~(1<<PA3);
while((ADCSRA&(1<<ADSC))!=0);
ADMUX |=(1<<MUX0);
ADCSRA |=(1<<ADSC);
while((ADCSRA&(1<<ADIF))!=0x10);
ADCSRA &= (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
pzx=ADCL&0xF0;
pzy=ADCH;
tactily=((pzy*256)+pzx)/2.36;
ADMUX &=(1<<REFS1)|(1<<REFS0);
PORTA |=(1<<PA3);
PORTA &= ~(1<<PA2);
}
4.1.2.6 Primitive grafice. Functia grafică pentru desenarea unui dreptunghi
Funcția care afișează pe ecran o bară colorată de anumită lungime este bargraph(pozx,pozy,lungime, RED, GREEN,BLUE).
Pentru accelerarea procesului de afișare, algoritmul de afișare a fost gândit în așa fel încât dacă valoarea curentă<valoarea_ anterioara se va șterge bareta desenată anterior prin umplerea acesteia cu o culoare identică cu cea a fundalului, urmată de redesenarea baretei la nivelul curent și culoarea setată.
Astfel în cazurile complementare , când level>level_anterior, nu se mai șterge bareta, accelerandu-se în acest mod procesul de afișare.
Valorile anterioare ale nivelelor sunt memorate la fiecare ciclu de afișare , într-un tablou de tip vector cu 16 elemente corespunzatoare celor 16 barete prin apelul level_anterior[baleaj_barete]=level.
Variabila baleaj_barete se va incrementa cu o unitate la fiecare ciclu , iar la atingerea valorii maxime de 16 se va inițializa cu 0, asigurându-ne în acest fel corectitudinea indexului în tabloul de date.
Variabila de interblocare viewf asigură blocarea calculului transformatei Fourier atunci când este afișat pe ecran meniul.
Blocul de instrucțiuni de decizie if() asigură afișarea pe ecran a baretei corespunzatoare iterației curente
Acest algoritm implementează și o modalitate de afișare a valorilor numerice prin perechi de valori frecvență-amplitudine, cu ajutorul funcției utilizator infopanel.
În acest caz, blocul decizional alcătuit din instrucțiuni if()încadrează, în cazul atingerii de catre operator a unei anumite barete grafice de pe ecran, pe baza coordonatelor furnizate cu ajutorul variabilelor globale tactilx respectiv tactily, o anumită evoluție a secvenței de instrucțiuni ce vor fi executate astfel încât pe ecran într-o casetă grafică să se afișeze parametrii baretei respective.
Deasemenea și în această situație sa utilizat o variabilă de interblocare pentru a impiedica, în cazul unei atingeri de lungă durată, efectul de pâlpâire cauzat de afișările repetate ale casetei de dialog, variabila utilizata purtând denumirea de „bareta_nr”.
Primitivele grafice utilizate în acest caz sunt bargraph și infopanel, funcțiile respective sunt listate mai jos.
void bargraph(int pozx, int pozy, int lungime, unsigned char red, unsigned char green, unsigned char blue) //Coordonate X , Y , Z , R G B //
{ int dimens;
int index;
dimens=lungime*5;
write_ctl(0x2A);
write_data(0x00);
write_data(pozx);
write_data(0x00);
write_data(pozx+5);
write_ctl(0x2B);
write_data(0x00);
write_data(pozy);
write_data(0x00);
write_data(pozy+(lungime-1));
write_ctl(0x2C); //Comanda Memory Write //
PORTA |=(1<<PA6);
for(index=dimens;index>=0;index–)
{
PORTC |= (1<<PC5)|(1<<PC3)|(1<<PC2);
PORTC &=(1<<PC7)|(1<<PC6)|(1<<PC5)|(1<<PC4)|(1<<PC3);
PORTB=blue;
PORTC |= (1<<PC2);
PORTC |= (1<<PC5)|(1<<PC3)|(1<<PC2)|(1<<PC1);
PORTC &=(1<<PC7)|(1<<PC6)|(1<<PC5)|(1<<PC4)|(1<<PC3);
PORTB=green;
PORTC |= (1<<PC2);
PORTC |= (1<<PC5)|(1<<PC3)|(1<<PC2);
PORTC &=(1<<PC7)|(1<<PC6)|(1<<PC5)|(1<<PC4)|(1<<PC3);
PORTB=red;
PORTC |= (1<<PC2);
}
}
În cadrul acestei instrucțiuni se delimitează pe ecran o regiune de formă dreptunghiulară având coordonata orizontală transmisă prin parametrul pozx, respectiv cea verticală transmisă prin parametrul pozy.
Instructiunea for() urmând să umple zona delimitata cu o anumită culoare , a cărei componente primare (RGB) sunt transmise prin argumentele red, green, blue.
4.1.2.7 Functia panou informare operator
Funcția infopanel realizează afișarea într-un panou a valorilor numerice ale frecvenței și amplitudinii.
Această funcție este definită după cum urmează:
void infopanel(unsigned int freq, unsigned int amplit)
{
unsigned int auxfr, auxamp;
unsigned int valuefr[10];
unsigned int valueam[10];
int idxf, idxa;
idxf=0;
idxa=0;
auxfr=freq;
auxamp=amplit;
while(freq!=0)
{
auxfr=freq%10;
valuefr[idxf]=auxfr;
freq=freq/10;
idxf++;
}
while(amplit!=0)
{
auxamp=amplit%10;
valueam[idxa]=auxamp;
amplit=amplit/10;
idxa++;
}
int loc;
int pozitie;
pozitie=0;
write_ctl(0x2A);
write_data(0x00);
write_data(0x24);
write_data(0x00);
write_data(0xCE);
write_ctl(0x2B);
write_data(0x00);
write_data(0xEE);
write_data(0x01);
write_data(0x23);
write_ctl(0x2C);
scrie_display_c(9234, 0x00, 0x50, 0xDC);
puttext(50, 240, "amplitude");
outextxy(140, 240, 't');
puttext(50, 260, "frecventa");
for(loc=idxf-1; loc>=0;loc–)
{
switch(valuefr[loc]) {
case 1 : outextxy(140+pozitie, 260, unu10); break;
case 2 : outextxy(140+pozitie, 260, doi10); break;
case 3 : outextxy(140+pozitie, 260, trei10); break;
case 4 : outextxy(140+pozitie, 260, patru10); break;
case 5 : outextxy(140+pozitie, 260, cinci10); break;
case 6 : outextxy(140+pozitie, 260, sase10); break;
case 7 : outextxy(140+pozitie, 260, sapte10); break;
case 8 : outextxy(140+pozitie, 260, opt10); break;
case 9 : outextxy(140+pozitie, 260, noua10); break;
case 0 : outextxy(140+pozitie, 260, zero10); break;
}
pozitie=pozitie+7;
}
pozitie=0;
for(loc=idxa-1; loc>=0;loc–)
{
switch(valueam[loc]) {
case 1 : outextxy(140+pozitie, 240, unu10); break;
case 2 : outextxy(140+pozitie, 240, doi10); break;
case 3 : outextxy(140+pozitie, 240, trei10); break;
case 4 : outextxy(140+pozitie, 240, patru10); break;
case 5 : outextxy(140+pozitie, 240, cinci10); break;
case 6 : outextxy(140+pozitie, 240, sase10); break;
case 7 : outextxy(140+pozitie, 240, sapte10); break;
case 8 : outextxy(140+pozitie, 240, opt10); break;
case 9 : outextxy(140+pozitie, 240, noua10); break;
case 0 : outextxy(140+pozitie, 240, zero10); break;
}
pozitie=pozitie+7;
}
}
Fereastra în care sunt afișate datele, are o dimensiune și o poziție fixă pe ecran.
Pentru afișarea caracterelor alfanumerice au fost utilizați vectori avand 73 de elemente , un exemplu fiind dat mai jos
unsigned char e10[73]= { 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
0xFC, 0xA3, 0x00, 0x00, 0xA3, 0xFC, 0xFC,
0xF3, 0x00, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
0xF3, 0x00, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
0xF3, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFC,
0xF3, 0x00, 0xFC, 0xFC, 0x00, 0xFC, 0xFC,
0xF3, 0x00, 0xFC, 0xFC, 0x00, 0xFC, 0xFC,
0xEC, 0x53, 0x00, 0x00, 0x53, 0xFC, 0xFC,
0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC,
0x0A, 0x07, 0xFF};
Câmpurile de date ale vectorului codifică imaginea caracterului având dimensiunea de 7×10 pixeli fapt exprimat în ultimele elemente ale vectorului și anume 0x0A, 0x07, 0xFF spunând funcției de afișare că aici se termină șirul de elemente ale vectorului.
Afișarea propriuzisă a caracterelor fiind făcuta de către funcția outextxy.
Datorită faptului că atât valoarea frecvenței cât și a amplitudinii este reprezentată ca un număr întreg pe 16 biți, a fost necesară o separare a simbolurilor din componența numărului urmată de stocarea acestor simboluri într-un vector
while(freq!=0)
{
auxfr=freq%10;
valuefr[idxf]=auxfr;
freq=freq/10;
idxf++;
}
În structura switch urmând să se facă afișarea pe ecran, caracter cu caracter, de la stânga la dreapta respectând spațierea minima dictată de lațimea standard a unui caracter plus un offset.
Funcția ce afișază textul pe ecran este prezentată mai jos corpul funcției având urmatoarele instrucțiuni:
void outextxy(int pozx, int pozy, unsigned char *text)
{
int par;
int impar;
int scalx, scaly;
int dimfont=0;
int j=0;
while(text[j]!=0xFF){
dimfont++;
j++;
}
scalx=text[dimfont-1];//Determină mărimea fontului pe axa X (ex 0x0A)
scaly=text[dimfont-2];//Determină mărimea fontului pe axa Y (ex 0x07)
int pzfylow;
int pzfyhigh;
if(pozy>255){pzfylow=(pozy-255)+scaly-1;pzfyhigh=0x01;}
else{pzfyhigh=0; pzfylow=pozy+scaly-1;}//Rutină necesară deoarece pozitia pe //axa Y poate fi mai mare ca 256
write_ctl(0x2A);
write_data(0x00);
write_data(pozx);
write_data(0x00);
write_data(pozx+scalx-1);
write_ctl(0x2B);
write_data(pzfyhigh);
write_data(pzfylow-scaly);
write_data(pzfyhigh);
write_data(pzfylow);
int index;
write_ctl(0x2C); //Scrie in memoria video //
for(index=0;index<dimfont-2;index++)
{
write_data(text[index]);
write_data(text[index]);
write_data(text[index]);
}
}
Bibliografie
[1] Adelaida Mateescu – „Semnale Circuite și Sisteme” – Ed. Teora București 2001
[2]
[3]
[4] Vasile Cîrtoaje – “Teoria Sistemelor Automate” – Editura UPG PLOIEȘTI 2013
[5] Gabriel Rădulescu – “Sisteme de Operare”
[6] Gheorghe Ștefan – “Circuite Integrate Digitale” – Editura Tehnică, București 2000
[7] Cornel Marinescu – “Proiectarea cu microcontrollere “ – note de curs , UPG 2016
[8] Cornel Marinescu – “Sisteme cu Intrare Ieșire”- note de curs , UPG 2016
[9] http://www.atmel.com/webdoc/AVRLibcReferenceManual/
[10]Edmond Nicolau, “Manualul inginerului electronist”- Editura Tehnică, București 1988
[11] http://www.atmel.com/images/doc8059.pdf
[12] http://www.atmel.com/webdoc/AVRLibcReferenceManual/group_avr_interrupts.html
[13] Andrei Vladimirescu – „SPICE” Ed. Tehnică, București 1999
[14] Paul M. Chirlian – „Digital Circuits with Microprocessor aplications” , Ed. Matrix Publisher, Inc,
1982
[5] Cristian Bucur – Dispozitive si Circuite Electronice, note de curs
Anexa 1
Figura1 – Schema electrica de principiu.
Figura 2. Schema bloc a portului paralel
Figura3 Schema bloc a numaratorului/temporizator
Figura 4 Circuit numerator asincron de 2 biti realizat cu 2 bistabili de tipul J-K
Figura 5 Rezultatul simularii numaratorului pe 2 biti
Anexa 2
BC237 Descriere generală
BC237 Caracteristici electrice
Anexa 3
74LVX4245 – Descriere generală
Parametrii absoluți
Conectarea circuitului la magistrale cu niveluri diferite de tensiune
Anexa 4
Diagramele de timp pentru ciclu de conversie modurile RD și WR-RD
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: Introducere …1 [307777] (ID: 307777)
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.
