Introducere… … …pag.2 [629838]
Universitatea Ioan Slavici pag. 1 CUPRINS
Introducere………………………………………………………………… …………………………. ……….pag.2
CAPITOLUL I. INTENSITATEA CURENTULUI ELECTRIC …………….. ……….pag.3
1.1 Efectul magnetic.……………………………………………. …………………………. ………pag.4
1.2 Efectul hall……………………………………………………. …………………………. ……..pag.5
1.3 Efectul pi ezoelectric……………….…………………………. …………………………. ……..pag.6
1.4 Efectul fotoelectric………..………………………………….. …………………………. …….pag.8
1.5 Efectul termoelectric……………………………………… ………………….…………….. ……pag.9
II. AMPERMETRUL ȘI UTILIZAREA AMPERMETRULUI, PUTEREA ………pag.10
2.1 Noțiuni generale despre ampermetru……………………….. …………………………. ………..pag.10
2.2 Ampermetrul de tip analog ic……………………………………. …………………………. ………..pag.11
2.3 Ampermetrul de tip electronic…………………………………… …………………………. ……….pag.12
2.4 Ampermetrul de tip magnetoelectric. ………………………….. …………………………. ………pag.14
III. MĂSURAREA CURENTULUI CONTINUU ȘI ALTERNATIV, MĂSURAREA
TENSIUNII, MĂSURAREA ENERGIEI ELECTROMAGNETICE ……….. ……….pag.14
3.1 Măsurarea curentului continuu și a te nsiunii…………………. …………………………. ………pag.15
3.2 Măsurarea curentului alternativ și a tensiunii…………………. …………………………. ……..pag.15
3.3 Măsurarea energiei electromagnetice de câmp…………… ………………………………. …….pag.17
IV. MĂSURAREA CURENTULUI CONTINUU UTILIZÂND TRADUCTOR HALL
4.1 Implementarea cu microcontroller PIC16F887 și a unui afișor un dispozitiv de măsurare a
curentului continuu utilizând tranductor hall ratiometric………… …………………………. ……pag.18
4.2 Date tehnice pentru senzorul ratiometric TLE4997…………… …………………………. …..pag.23
4.3 Schema electrică și descrierea funcționării………………………….. ………………………. ….pag.50
4.4 Diagrama programului pentru microcontroler …………………………… ………………….. …pag.53
4.5 Rezultate și concluzii……………………………………………………………… ………………….. ..pag.60
V. Anexa cod sursa program microcontroler C++ …………. …………………………….. …pag.61
VI. BIBLIOGRAFI E……………………. ……………. ……………………………… …………………….pag.156
Universitatea Ioan Slavici pag. 2
Introducere
Subiectul propus pentru lucrarea de licență este :
“ Ampermetru De Curent Continuu Mare Cu Separare Galvanica ”
În această lucrare vom descrie principiul tehnic de măsurare a currentului continuu
realizat cu un traductor de câmp magnetic și partea logică și funcțională a aparatului
implementat cu microcontroler de tipul PIC16F887(schema electrică și codul în Flow code
pentru microcontroller).
Deseori ne întâlnim cu situația de a măsura un current electric î ntr-un circuit fără a avea
acces direct la cuplajul electric (inserarea unui ampermetru cu sondele de măsură sau a unui
șanț rezistiv). În cel mai fericit caz currentul alternativ se poate măsura prin transformare
directă prin cuplaj cu izolare galvanică.
Se știe principiul inductiv al curentului alternativ trecut printr -un transformator cu miez
magnetic prin raport de transformare 1:n, dar ce ne facem când avem nevoie de măsurarea unui
curent continuu?
În cazul acesta se va face un artificiu tehnic, transf ormatorul de ferită se secționează,
iar în întrefierul miezului fero -magnetic se va însera un traductor magnetic.Cu ajutorul
traductorului hall de tip ratiometric vom măsura magnetizarea feritei ce trebuie să fie direct
proporțională cu currentul străbătut . Prin torul de ferită va trece un conductor a cărei intensități
o vom afla cu ajutorul traductorului hall și a unui dispozitiv electronic de conversie
analogic/digital realizat cu microcontroler de tipul PIC16F887 și a unui afișor digital LCD cu
2 rândur i și 16 caractere cu controller de tipul HD44780A..
Senzorul Hall de tipul TLE4997, este unul ratiometric direct proporțional
magnetic/current electric. Tensiunea rezultată va fi proporțională cu curentul electric de tip
continuu.
Pe parcursul lucrării vom dezbate următoarele teme:
Efectele currentului electric;
Utilizarea ampermetrului și modul de lucru;
Măsurarea curentului continuu; Măsurarea tensiunii și a curentului alternativ;
Măsurarea curentului continuu utilizând traductorul hall;
Implementarea cu microcontroller a unui dispozitiv de măsurare a curentului continuu
utilizând tranductor hall ratiometric;
Rezultate și concluzii;
Universitatea Ioan Slavici pag. 3
CAPITOLUL I. INTENSITATEA CURENTULUI ELECTRIC
Intensitatea curentului electric este definită ca fiind o mărime fiz ică scalară,
caracterizează curentulul electric, măsoară sarcina electrică traversată de secțiunea unui
conductor pe unitatea de timp. În Sistemul internațional este simbolizat (A) amper și este egală
cu intensitatea curentului ce trece prin doi conductori identici expuși în vid între care forța este
egală cu 2*10 -7 N.
Legea lui Kirchoff arată că în fiecare nod al unui circuit electric, suma curentiilor
pozitivi ce intră în acel nod dacă curentul intră în nod și negative dacă curentul iasă din nod
este ega lă cu zero.
În cazul în care secțiunea conductorului nu poate fi considerată neglijabil de mică va fi
necesar să descriem repartiția curentului electric pe suprafața secțiunii,iar curegerea curentului
electric se caracterizează printr -o altă masrime fizică (densitatea de curent). Descrierea
transportului de sarcină electrică prin secțiunea unui condctor ca urmare a mișcări dirijate a
purtătorilor liber, se definește ca fiind o mărime fizică scalară numită intensitatea curentului
electric.Intensitatea curent ului electric reprezintă una dintre cele șapte mărimi fizice în sistemul
internațional ȘI, iar unitatea de măsură fiind amperul.Definirea acestei unități de măsură o vom
afla în sutdiul campui magnetic și al curenților electrici.
Mișcarea ordonată de sarci nă electrică se poate realiza astfel încât purtătorii care
traversează o secțiune a conductorului să transporte sarcini egale în intervale de timp egale. În
aceste condiții, în mediul conductor se stabilste un curent electric continuu.Debitul de sarcină
va fi exprimat ca sarcină electrică totală transportată prin suprafața unei secțiuni transversale a
conductorului în unitatea de timp definește valoarea medie a intensității curentului electric
străbătut prin acea suprafață.
Ca o mică paranteză în definirea curentului electric ca și sarcină pentru:
1 Ampere reprezintă un flux de încărcare electrică de un Colomb pe secundă. ȘI Unitate
de bază pentru curentul electric. De aceea este numit un Amper.
1 Coulomb pe secundă este definiția pentru un amper. Amperul e ste Unitatea de ba ză
pentru curentul electric în S I. 1C/s=1A.
Prin apariția curentului electric se evidențiază și efectele sale precum efect magnetic,
efect termic, efect chimic efect biologic,efect termoelectric etc.
Efectul termic este denumit și efectul Joule -Lenz și este reprezentat de disiparea
căldurii într -un conductor traversat de un curent electric. Aceasta apar datorită interacțiunii
particulelor de electroni cu atomii conductorului.În urma procesului de interacțiuni primele
cedează ultimelor din energia lor cinetică, contribuind la apariția termică în masa
conductorului.
Universitatea Ioan Slavici pag. 4 Utilizarea cu precădere în încălzire industrială, uzul casnic toate stau la baza efectului
lui Joule -Lenz. Elementele de circuit comun în construcția produselor cu efect termic es te
rezistorul. Rezistorul este un element rezistiv cu disipație termică rezliat din diverse materiale
Ni-Crom, Fer -Ni-Crom, Kantal, Cromal etc. Aceste materiale au rezistența la temperaturi
înalte, rezistivitate electrică ridicată și un coeficient de tempe ratură mare al rezistivității.
Aplicații ale efectului termic cu multiple întrebuințări industriale: tăierea metalelor,
sudarea cu arc electric, topirea și turnarea metalelor, cuptoare de încălzire etc.
Arcul electric al curentului este definit ca fiind un curent de mare intensitate. În
separarea sub sarcină electrică a două piese metalice în contact crește densitatea de curent
datorită mișcării zonelor de contact pe măsura depărtării pieselor și datorită tensiunii
electromotoare de auto -inductie la care ia naștere întreruperea curentului.Metalul este topit
local și vaporizat datorită efectului Joule -Lenz. În cazul apariției vaporiilor metalici și a
contactelor puternic încălzite aerul dintre contacte se ionizează și apare o plasmă a cărei
temperaturi variaz ă între 6.000 -7.000K. Curentul continuă să existe și după inreruperea
mecanică a circuitului sub acțiunea de potențial dintre contacte și plama ce se deplasează.
Prin procesele de recombinare a purtătorilor de sarcină, arcul electric eliberează energie
sub forma de radiații luminoase intense. Exemplu sudarea metalelor, arcul electric se formează
între electrod și piesă pentru sudat.
Dacă un material conductor este inserat într -un câmp magnetic alternativ, curenții
induși determină încălzirea materialului. Frecvențele de pulsație mari determină încălzirea
rapidă a suprafeței materialului conductor efectul fiind utilizat la topirea metalelor sau
lipire.Exemplu de utilizare a curentiilor în câmp magnetic alternativ: Cuptoare electrice pentru
topire sau sudare cu inducție, cuptoare cu microunde pentru încălzirea alimentelor etc.
1.1 Efectul magnetic
Efectul magnetic constă în apariția unui câmp magnetic în jurul unui conductor Fig.1
parcurs de curentul electric I.
Fig. 1
Universitatea Ioan Slavici pag. 5
Modulul vectorului inductiv într -un punct va fi notat:
B=μI/2πr
μ – reprezintă permeabilitatea magnetică absolut ă;
I – intensitatea curentului care străbate conductorul;
Modulul vectorului a câmpului magnetic creat în centrul unei spire circlare de rază r
parcursă de curent electric este:
B=πI/2r
B – iductia magnetică; (B) ȘI =1T(tesla);
1.2 Efectul hall
Între două plăci de formează un câmp electrostatic de intensitate E Fig.2 , care exercită
asupra fiecărui electron o forță electrică Fe egală și de sens opus forței Lorentz.
Fig.2
Considerând curentul electric determinat de mișcarea unor purtători de sarcină pozitivă
q, forța Lorentz care acționează asupra fiecărui purtător este: FL = qvB și determină deviația
laterală a fluxului de purtători mobili ce duce la crearea unui câmp electric transversal E, care
acționează în sens invers forței Lorentz. Se ajunge foarte rapid la o stare staționară în care forța
Lorentz este echilibrată de forța datorată câmpului electric transversal: qE = qvB
Se presupune câmpul unifo rm în interiorul conductorului, atunci:
E=U/l
Tensiunea creată transversal se scrie:
Universitatea Ioan Slavici pag. 6 U = Blv
Între fețe se menține constantă diferența de potențial Uh=Ua -Ub numită tensiune Hall.
Se demonstrează că Uh=KhxIxB unde Kh se numește constantă Hall și depinde de temperatură
și de natura materialului.
Cea mai răspândită tehnica a efectului Hall este teslametrul. Acest dispozitiv este format
dintr -o sondă ce conține o plăcută semiconductoare de minensiuni mici plasată la extremitatea
unei tije, iar cu ajutorul unui milivoltmetru gradat în mulitesla și a unui generator de tensiune
continuă dă naștere curentului din plăcută. Teslametrele moderne conțin milivoltmetre digitale
sensibile. Traductoarele Hall Fig.3 se folosesc la măsurarea inducției câmpurilor magnetice și
stau la transformarea unui semnal magnetic într -unul electric.
Fig.3 Traductor Hall
1.1 Efectul piezoelectric
Efectul piezoelectric constă în propietatea unor cristale de a se încărca cu sarcină electrică
pe unele dintre fețele acestora când sunt supuse la solicitări de compresiune sau întindere pe o
anumită direcție.
Efectul piezoelectric invers se numește electrostricțiune și constă în propietatea cristalelor
de a se deforma după anumite direcții, dacă pe unele dintre fețele acestora se află o di ferență
de potențial. Mărimea sarcinii electrice este direct proporțională cu mărimea forței aplicate.
Prin acțiunea forțelor F pe direcția axelor mecanice rețeaua se deformează și centrele de
greutate ale particulelor cu sarcini negative și ale particule lor cu sarcini nu mai coincid. Apare
un moment electric bipolar și de sarcini electrice polarizate.
Utilizare și aplicații ale efectelor piezoelectrice
Doza de pickup este un cristal piezoelectric care este supus forțelor de compresiune
variabile și în fu ncție de adancimiea șanțului de pe disc se va genera o tensiune cu amplitudine
Universitatea Ioan Slavici pag. 7 variabilă corespunzătoare semnalului înregistrat. Brichetele piezoeletrice sunt cristale
piezoeletrice iar arcul electric rezultat aprinde gazul.
În cazul măsurătorilor de deformare a materialelor se folosesc timbre tensiometrice Fig.4
realizate din cristale piezoelectrice.
Fig. 4 Timbru tensiometric
Acestea au întrebuințări multiple în industrie de la simplu StrainGauge deformation pentru
determinarea unor compresiuni a unui material, structură de rezistena a unui pod, clădiri sau
chiar în medicină în structuriile de reparații osoase, până la cântare de uz industrial general
sau chiar casnic. Toate stau la baza acestor timbre tensiometrice realizate cu cristal
piezoelectric.
Efectul invers constă în electrostricțiune și este folosit elementul piezoelectric în generarea
sunetelor de frecvențe variabile Fig.5 . Buzzer piezoeletric.
Fig.5 Buzzer piezoeletric
În funcție de tensiunea aplicată pe fețele cristalului piezoelectric aceasta își va modifica
dimensiunea pe o anumită direcție direct proporțional cu tensiunea aplicată. Princispiul
electrostricțiunii este folosit pe post de difuzor și la generatorul de ultrasunete. Generatorul
conține do uă plăcuțe de cuarț cu taietura Curie, șlefuite și lipite între două plăci groase de oțel.
La aplicarea unei tensiuni alternative pe o anumită direcție, sisteml devine o sursă de sunete de
frecvență foarte mare. Prin recepționarea ecoului recepționat de ul trasunete se pot măsura
Universitatea Ioan Slavici pag. 8 distanțele. Cu un cristal piezoelectric se face recepția ce va virbra elastic în urma presiunii
exercitate de ultrasunete urmând să apară tensiuni electrice pe suprafețe opuse.
Folosirea traductoarelor piezoelectrice pot măsura acc elerația; aparatele se mai numesc
accelerometre piezoelectrice. În determinarea presiunii se folosesc traductoare cu efect
piezoelectric.
1.4 E fectul fotoelectric
Se definește ca fiind energia purtată de radiația electromagnetică de natură discretă sub
formă de cuante de energie numite fotoni.
Dacă pe suprafața unei plăcuțe semiconductoare cade un flux Φ de radiații
electromagnetice acesta se vă despărții în trei componente (flux absorbit, transmis și reflectat).
Fluxul aborbit conduce la mărirea de nivele energetice inferioare pe nivele energet ice
superioare, iar atomii din nodurile rețelei cristaline va crește energia de vibrație în jurul poziției
de echilibru din nodurile rețelei cristaline.
Creșterea energiei de vibrație a atomilor se asociază cu o rețea a unor purtători de
sarcină de vibrație numiți fotoni.Efectul piezoelectric intern are loc când energia preluată
contribuie numai la desprinderea electronilor de valență ce devin electroni liberi.
Efectul piezoelectric extern are loc atunci când e nergia incidentă reținută în interior
este mai mare decât energia ce leagă electronii, iar în rețea se formează fotoni și în exerior se
emit electroni.
În cazul unui semiconductor impurificat sub influența luminii apare efectul
piezoelectric, iar energia de radiație incidentă va fi preluată de purtătorii de sarcina urmând ca
energia cinetică să crească Fig. 6 .
Fig.6 Structura PN a unei fotodiode
Universitatea Ioan Slavici pag. 9
Se observă că în joncțiunea PN apare o barieră de potențial sub influența luminii, la
joncțiunea fotosensibilă urmând că mărimea electrică să crească.
Elementul ce conține o astfel de joncțiune se numește fotoelement și este un generator
de tensiune electromotoare. Fotoelementul este o fotodiodă care sub influența luminii generaza
curent electric în c ircuit fără o altă sursă de energie din exterior. În cazul în care fotodioda este
polarizată invers, curentul din circuit este dat de curentul de câmp la care participă purtătorii
generați pe cale termică și prin efect fotoelectric intern ce va fi direct p roporțional cu fluxul
luminos și cu sensibilitatea spectrală a fotodiodei.
1.5 Efectul termoelectric
Efectul termoelectric “Peltier,Seebeck și Thompson”
Efectul Peltier se comportă prin absorbția sau degajarea unei cantități de căldură diferită de cea
degajată de efectul Joule al curentului electric într -un circuit.
Efectul Peltier se caracterizează ca fiind o joncțiune Fig.7 ce trece un curent electric cu
semnul de la cupru la aluminiu, iar electronii din zona de contact capătă enrgie cinetică
supliment ară și temperatura joncțiunii crește.În polarizare inversă temperatura joncțiunii scade.
Fig. 7 Structura internă a unui Element Peltier
Într-un circuit electric ca cel de mași sus cu două joncțiuni circulă un curent electric cu
sens corespunzător, se poate realiza un transport de căldură de la joncțiunea rece la joncțiunea
mai caldă. Efectul peltier este folosit în realizarea lăzilor frigorifice, răcire microprocesoare
pentru tehnica de calcul, micro -aeroterme etc.
Universitatea Ioan Slavici pag. 10 II. AMPERMETRUL ȘI UTILIZAREA
AMPERM ETRULUI, PUTEREA
2.1 Noțiuni generale despre ampermetru
Pentru determinarea unor constante fizice într -un circuit rezistența electrică a unui
rezistor sau pentru a determina variația unei mărimi fizice exemplu intensitatea curentului
electric printr -un rezistor în funcție de tensiunea aplicată pe rezistor sau realizarea în laborator
a unor montaje electrice. În general instrumentul de măsură utilizat este clasicul ampermetru
pentru determinarea intensității curentului electric și voltmetrul pentru măsura rea tensiunii.
Ampermetrul se conectează în serie cu circuitul de măsurat, iar voltmetrul în paralel. Aceste
instrumente ce au fost adăugate în circuitul electric devin elemente ale montajului
respectiv,deoarece prin introducerea instrumentelor de măsurare acestea pot denatura semnalul
electric din circuit. În realitate aceste instrumente atât ampermetrul cât și voltmetrul sunt
considerate elemente ideale, ce nu modifică starea electrică a sistemului prin intercalarea lor în
montaj. Câmpul electric mai este numit și electrostatie, în cazul în care nu depinde de timp ca
sarcină electrică fiind o noțiune primară. Nu este definit prin intermediul altor mărimi fizice,
ce putem face este să deducem existența lui și să i descriem propietatile. Sarciniile electrice
incrca spațiul în jurul lor cu propietati fizice particulare și creează un câmp electric. Prezemta
câmpului electric în jurul oricărei sarcini este o propietate inerentă a acesteia.
Câmpul electric se pune în evidență prin forța care exercită asupra unei sarcini de proba
adusă în câmp adică a unei sarcini mici,pozitive și punctiforme care nu modifică sarcinile de
pe corpul care creează câmpul. Notând cu q mărimea sarcinii de probă, forța care acționează
asupra ei se scrie F=qE unde vectorul E, numit intens itatea câmpului electric, nu depinde de q
ci este determinat de corpul încărcat cu acesta. Din relație rezultă că intensitatea curentului
electric E reprezintă forța electrică ce acționează asupra unității de sarcină proba E=F/Q.
Legea lui Coulomb Electros tatica studiază câmpurile electrice create de sarcini imobile
aflate în starea de echilibru electrostatic, când sistemul de sarcini nu implică deplasariale
sarcinilor unele în raport cu altele. Se afirmă că un sistem de sarcini electrice aflate în echilibr u
electrostatic permite alegerea unui sistem de referință unic sau în repaus față de toate sarcinle
electrice în care cel ce experimentează poate verifică toate legile electrostaticii.
Câmpul electric produs de un astfel de sistem de sarcini și măsurat din acest referențial
se numește câmp electrostatic, el reprezintă un câmp electric statioar. Un caz particular de câmp
electromagnetic. Legea cantitativă fundamentală a electrostaticii a fost descoperită de Coulomb
în anul 1785 pentru două sarcini punctiform e, q și q prim, este reprezentat prin expresia forței
de interacțiune dintre cele două sarcini, unde razele vectoarecare intervin cu semnificația
indicată mai sus. În ceea ce privește limita de plicabilitate a legii lui Coulomb, trebuiesc
precizate cele do uă scări în raport cu care se consideră în general fenomenele fizice. La scară
microscopică la distanțele dint -un atom de ex. atomul de H , pt.comportarea dinamică a
electronului se folosește mecanica cuantică, dar forța electrostatica este cea obișnuită,
coulombiană. Dovadă este ca energiile atomului, calculate pe baza legii lui Coulomb, se
verifică experimental la distanțe mici inferioare lui 10 la minus 14 cmn nu se știe dacă legea
lui Coulomb mai rămâne valabilă . La scară macroscopică la distanțele sup eriaoare celor
geografice, nu există confirmări experimentale directe ale lui legii coulomb. Totuși dacă
această lege nu ar fi adevărată pentru, distanțe mari, în conformitate cu electrodinamica
Universitatea Ioan Slavici pag. 11 cuantică, masă de repaus a cuanteinde lumina (fotonul) nu ar fi zero, așa cum rezultă din teoria
relativității.
Accest fapt ar implica dependența de lungime a vitezei undelor electromagnetice în vid
“dispersia în vid” , ceea ce nu s -a observat exprimental cel puțin pentru distanțe de ordinul mai
multor kilometri. Pentru ca să se realizeze această condiție ,ampermetrul trebuie să aibă
rezistența electrică nulă iar voltmetrul trebuie să aibă o rezistența electrică enorm de mare,
teoretic infinită. Instrumentele reale nu pot îndeplini această condiție. Fiecare instrum ent de
măsură se apropie de condiția ideală dacă sunt folosite pentru anumite intervale de valori.
Ampermetrul real are rezistența electrică (R A) diferită de zero, dar mult mai mică decât
rezistența electrică (R) a rezistorului cu care se înseriază (R A<< R).
Voltmetrul real are rezistența electrică (R V),finită ,dar mult mă i mare decât rezistența
electrică a rezistorului cu care se conectează în derivație (R V>>R).
Pentru a îndeplini aceste condiții instrumentele de măsură se utilizează pentru anumite
domenii de valori măsurate. Aceste domenii sunt indicate de scală instrumentului respectiv. În
montajul respectiv trebuie să folosim un instrument corespunzător. De exemplu dacă
intensitatea curentului care trebuie determinată este de ordinul câtorva ampe ri se utilizează un
ampermetru cu scala 0 -10 A. De asemenea dacă estimăm că tensiunea măsurată este de ordinul
volților utilizăm un voltmetru cu scala 0 -12 V. Aceste restricții au consecințe practic nedorite,
conducând la necesitatea de a dispune de o mare varietate de instrumente de măsură .
Măsurările presupun determinarea unor intensități necunoscute, la introducerea
ampermetrului în circuit se alege la început domeniul cel mai mare posibil. Dacă acul
ampermetrului a deviat foarte puțin se poate folosi o altă bornă inferioară fără a deteriora
aparatul, astfel încât citirea să fie cât mai exactă . Valoarea maximă a diviziunilor cadranului
coincide cu valoarea intensității curentului la care ampermetrul a fost conectat în circuit. De
exemplu dacă acul amp ermetrului s -a oprit în dreptul diviziunii 90, atunci I=5×90/100 =4.5A
2.2 Ampermetrul de tip analogic
În general pentru măsurarea curentului electric este necesară întreruperea circuitului și
introducerea unui ampermetru A, de rezistența r, în circuitul parcurs de curentul de măsurat.
Înainte de introducerea ampermetrului în circuit, curentul electric are valoarea I și se numește
valoarea adevărată a curentului de măsurat: unde UAB este tensiunea la bornele AB iar R C
este rezistentă circuitului parcurs de curentul I. UAB
Ca urmare a introducerii ampermetrului în circuit, curentul măsurat Îm, mai mic decât
I, va avea valoarea:
, unde r A este rezistentă internă a ampermetrului. Eroarea relativă ce apare ca urmare
a introducerii ampermetrului în circuit este:
Universitatea Ioan Slavici pag. 12
Pentru ca această eroare să fie cât mai mică trebuie că rezistența ampermetrului să fie
cât mai mică față de rezistența circuitului.
2.3 Ampermetrul de tip electronic
Schema de principiu este alcătuită dintr -un amplificator operațional conecta t în reacția negativă
un ampermetru magnetoelectric Fig.8
Fig.8 Schema electrică a ampermetrului de curent continuu
Rezultă ecuația:
Deoarece U
R
n ≈ U p rezultă și se obține:
dar U n – U1 = U = RI rezultă că
Universitatea Ioan Slavici pag. 13 Deci curentul măsurat de către ampermetrul magnetoelectric este o măsură a curentului de
măsurat.
Dacă raportul R/R 1 este foarte mare (R>>R 1) atunci aparatul poate măsura curenți foarte mici
(nA)
2.4 Ampermetrul de tip magnetoelectric
Ampermetre magnetoelectrice sunt alcătuite dintr -un miliampermetru conectat la
bornele unui șanț. Ampermetre magnetoelectrice se construiesc cu șunturi interioare pentru
domenii cuprinse între 0,1 și 100 A și cu șunturi exterioare pentru curenți de până la 10 kA.
unde I este curentul de măsurat, I0 este curentul prin ampermetru, 0 este rezistentă internă a
ampermetrului iar RS este rezistentă șuntului. În cazul în care ampermetrul trebuie să măsoare
un curent I, de n ori mai mare că domeniul de măsură al acestuia I0, (I = nI0), rezistența șuntului
se calculează cu relația:
Schema electrică pentru un sunt multiplu este prezentată în Fig.9
Fig.9 Schema electrică a unui șanț multiplu
Rezistența R T este realizată din manganina produce compensarea
pragului de temperatură. Rezistența R a + R T variația cu temperatura este
mai mică (R T = 1 … 5 R a,).
Universitatea Ioan Slavici pag. 14 III. MĂSURAREA CURENTULUI CONTINUU ȘI
ALTERNATIV, MĂSURAREA TENSIUNII, MĂSURAREA
ENERGIEI ELECTROMAGNETICE
La realizarea schimburilor de energie și în schimburile de informație se realizează cel
mai adesea pe baza mărimilor de tip electromagnetic.
Se deduce din măsurători electrice măsurarea prin determinare mărimilor cu caracter
electromagnetic, cu oricare di n mijloace, electronice electromecanice, electromagnetice,
electro -optice etc.
Obiectivul măsurării este obținerea unor rezultate experimentale a unor valori
cantitative ale unui sistem și demonstrarea ei sub o formă potrivită pentru utilizator. Procesul
de măsură constituie un ansamblul de operații pentru experimentare ce se execută cu scopul
obținerii unor rezultate.
Procesul de măsură are la bază următoarele elemente: mărimea de determinat, metodă
de determinat, etalonul și aparatul de determinat.
1. Masurandul –Nu putem face o dereminare măsurabilă pentru orice sistem sau obiect. Una
din condiții pentru a putea fi măsurate este că mărimea de măsurat să fie mulțime ordonabila,
o mulțime ce este definită ca o relație mai mic, mai mare sau egale ale e i.
2. Metoda de determinare măsurare prezintă mărimi de referință (etalonul), chiar dacă unori
este mai puțin la îndemână, ea fiind relevantă. Se pot deosebi măsurări prin comparație de tip
simultan și măsurări prin comparație de tip succesiv.
Aparatul de măsurat
În practică mărimea de ieșire depinde nu numai de mărimea de intrare, ci și de alte
mărimi de influența ale aparatului. Aceste mărimi mai numesc și mărimi de influență.
Cele mai dese sunt mărimile de caracteristica mediului în care se măsoară ș i sunt: mărimi cu
perturbații electromagnetice și mărimi ce face obiectul unei măsurări.
Etalonul
În orice moment se simte nevoia unui sistem de etaloane ce trebuie să îndeplinească:
generarea de semnal ale unități de măsură, menținerea unităților d e măsură și corelarea între
unitățile de măsurat. Sunt trei operații fundamentale în metodologi metrologică și se efectuează
în mod normal cu următoarele categorii de etaloane: etalon de definiție, etalon de conservare
și etalon de transfer.
Universitatea Ioan Slavici pag. 15 3.1 Măsurarea curentului continuu și a tensiunii
Tensiunea continuă și curentul continuu sunt mărimi a căror măsurare este necesară în
sisteme de transmitere a energiei electrice cât și în cele de transmitere a informației pe suport
electric.
Generatoa re de tensiune de referință
Generaorul de tensiune de referință trebuie să debiteze un curent neglijabil se pot folosi
elemente normale sau circuite cu diode Zener, care furnizează o tensiune de referință fixă. În
cazurile în care este necesar că generator ul de tensiune de referință să debiteze un curent
apreciabil fără să -și modifice tensiunea de ieșire se recurge la stabilitoare de tensiune calibrate
speciale.
Metoda compensării complete
Se exprimă prin măsurarea tensiunii continue printr -un procedeu d e zero, echilibrând
tensiunea de măsurat Ux cu o tensiune cunoscută Ue egală cu Ux,obținută prin trecerea fie a
unui curent constant printr -un resistor variabil, fie a unui curent variabil printr -un resistor
constant.
Metoda compensării incomplete ,voltme tre diferențiale
Metoda compensării incomplete pentru măsurarea tensiunii continue este o metodă
diferențială, constând în măsurarea cu un voltmetru indicator a diferenței dintre tensiunea
necunoscută și o tensiune de compensare reglabilă, cunoscută și r ezultă că tensiunea de măsurat
este egală cu tensiunea de compensare + tensiunea măsurată cu voltmetrul indicator.
Măsurarea curentului continuu
Măsurarea curentului continuu se face cu ajutorul ampermetrelor magnetoelectrice și
electrodinamice. Măsura rea indirectă se face fie cu ajutorul șunturilor fie prin intermediul
convertoarelor magnetice de c.c.
3.2 Măsurarea curentului alternativ și a tensiunii
Curentul alternativ se determină cu precizie în frecvențe de 10 Hz și 10 kHz. Din punct
de vedere al comportamentului global, un semnal de tip alternativ în regim staționar va fi
caracterizat prin valoare de efectivă, valoare medie și valoare de vârf .
Valoarea efectivă
Valoarea efectivă a unei tensiuni alternative este egală cu valoarea unei tensiuni
continue ce ar dezvolta o putere medie egală în aceeași rezistența.
Valoarea medie
Valoarea medie a unei tensiuni alternative este valoarea medie în timp a modulului
tensiunii.
Universitatea Ioan Slavici pag. 16
Valoarea de vârf
Valoarea de vârf a unei tensiuni alternative este valoarea instantanee și modul maxim a
tensiunii. Măsurarea tensiunii și a curentului alternativ prin comparare este de precizieiar cea
de măsurare a tensiunii alternative și a curentului alternativ se poate face prin comparare cu
mărimea continuă corespunzătoare observând egalitatea efectelor electrodinamice, termice sau
altele asupra unui element.Metoda se numește comparare curent alternativ sau curent continuu
abreviat c.a sau c.c, elementul sensibil poartă numele de element de transfer c.a -c.c, iar
instrumentul bazat pe aceasta metodă este un comparator c.a -c.c.
Măsurarea tensiunii alternative prin conversiune c.a. -c.c.
În practică curentă măsurarea prin comparare c.a. -c.c. se folosesc numai la calibrarea
aparatelor și în măsurări speciale, de mare precizie. Mă surarea tensiunii alternative se face prin
conversiune c.a -c.c. cu ajutorul unui convertor c.a. -c.c. care furnizează la ieșire o tensiune
continuă egală sau proporțională cu valoarea efectivă, valoarea medie sau valoarea de vârf a
tensiunii alternative de intrare.
Metode de raport aplicate la măsurările în c.a.
Metodele de raport ating precizii bune decât ale măsurărilor similare în c.c. datorită
dispozitivelor inductive de raport. Transformatorul este unul din dispozitivele inductive
fundamentale; el poa te fi folosit ca transformator de tensiune sau ca transformator de curent.
Divizorul inductiv este un alt dispozitiv fundamental utilizabil pentru a genera sau a compara
două tensiuni sau doi curenți într -un raport dat.
Măsurarea puterii
Măsurarea puterii reprezintă una din puținele măsurări electrice ce se poate efectua în
întregul spectru de frecvență al mărimilor electromagnetice de curent continuu până la
frecvențele cu spectrul în infraroșii. Puterea măsurată este puterea absorvita de aparatul de
măsurat de la un generator sau puterea transmisă pe un circuit dintr -un generator spre o sarcină.
În primul caz determinarea se face cu un wattmetru de absorție, iar cazul doi cu un wattmetru
de trecere.
Măsurarea puterii absorbite
Măsurarea puterii absorb ite se execută în cazurile în care este necesar să se determine
puterea pe care o poate debita un generator, sau un alt sistem de generare și/sau de transmitere
a puterii, pe o sarcină specificată. Măsurarea puterii absorbite în audiofrecvență se efectueaz ă
cu aparatele specializate numite wattmeter de ieșire.
Măsurarea puterii transmise
Măsurarea puterii transmise este necesară multiplicarea tensiunii și a curentului urmată
de medierea produsului obținut. Măsurarea energiei oricare din aparatele de măsurat puterea
activă poate fi utilizată pentru măsurarea energiei (active), dacă se int egrează în timp mărimea
de ieșire a aparatului.
Exemplu sunt contoarele electro -mecanice utilizate pentru citirea curentului și sunt bazate pe
multiplicatorul cu inducție . Contoarele electronice s -au oprit la multiplicatorul cu modulație
Universitatea Ioan Slavici pag. 17 în amplitudine și durata care le asigură o precizie superioară tuturor contoarelor
electromecanice cunoscute.
3.3 Măsurarea energiei electromagnetice de câmp
Primele instrumente comerciale concepute special pentru măsurarea câmpurilor de
frecvență au devenit disponibi le în anii 1980. Există acum multe instrumente disponibile, care
variază în funcție de numărul de axe pe care le măsoară, de cât de sofisticate sunt elementele
electronice, indiferent dacă înregistrează câmpuri și dacă sunt destinate utilizării de studiu s au
ca instrument de utilizare normală.
Nu există un metru "corect" sau "cel mai bun". Cel mai bun metru de utilizat depinde de scopul
pentru care trebuie utilizat.
Răspunsul în frecvență. Instrumentele pot fi sensibile la o singură frecvență, de ex. 50 Hz sau
60 Hz sau într -un interval de frecvențe. Dacă este sensibil la un interval de frecvențe, răspunsul
poate fi plat sau poate fi proporțional cu frecvența. Un răspuns de frecvență plat între 20 sau
30 Hz și câțiva kiloherz este în general considerat adec vat pentru multe măsurători cu scop
general.Măsurarea intensității câmpului electric -masurarea câmpului electric continuu
interesează în special în legătură cu problemele ganerarii de câmpuri electrostatice intense.
Măsurarea intensității câmpului magnet ic
Dispozitivele destinate acestui scop se numesc teslametre.
Măsurarea se întinde asupra unui interval larg de valori ale inducției , de la 0 –2T până la 10 T,
precizia de măsurare curentă este între 0,01 și 5%.
Pentru măsurarea inducției magnetice conti nue se folosesc teslametre cu bobină detectoare.
Măsurarea intensității câmpului radioelectric
Dispozitivele pentru măsurat câmpuri electrice folosesc de obicei ca senzori două
plăci conductoare paralele. Senzori alternativi, de ex. bazate pe rotația luminii polarizate, sunt
mai puțin frecvente. Sunt disponibili instrumente cu trei axe de măsurat câmpuri de câmp
electric, dar instrumentele cu o singură axă sunt mai frecvente. Acest lucru se datorează
parțial faptului că este mai greu să se facă câmpur i cu trei axe pentru câmpurile electrice
decât pentru câmpurile magnetice și, parțial, pentru că, într -o situație comună de măsurare,
aproape de sol sub sau aproape de liniile electrice aeriene, câmpul electric este polarizat liniar
și într – direcție (vert icală) și, prin urmare, un contor cu o singură axă este perfect suficient.
Pentru a măsura câmpului electric neperturbat, senzorul este, de obicei, suspendat la
capătul unei lungi tije orizontale neconductoare sau a unui trepied vertical. Citirea se execut ă
de la o distanță pe un afișaj de dimensiuni adecvate, înregistrată în contor pentru analiză
ulterioară sau transmisă unui dispozitiv de citire prin fibră optică. Acest lucru poate reduce
perturbarea la niveluri acceptabile. Cu toate acestea, având în ved ere ușurința de perturbare a
câmpurilor electrice, este ușor să se efectueze măsurători eronate.
Universitatea Ioan Slavici pag. 18 IV. Măsurarea curentului continuu utilizând traductorul hall
4.1 Implementarea cu microcontroller PIC16F887 și a unui afișor un dispozitiv de
măsurare a cur entului continuu utilizând tranductor hall ratiometric
Scopul lucrării propuse este un dispozitiv de măsurare al curentului electric continuu
cu izolare galvanică. Sunt situații în practică de zi cu zi când nu putem măsura într -un circuit
curentul străbătut prin conductor prin intercalarea banalului ampermetru. Se dorește
monitorizarea curentului electric străbătut prin conductor, și determinarea unor praguri limită
pentru protecție supracurent. În general aceste praguri de supracurent fac deliciul clasicele
siguranțe fusibile, dar deseori întâmpinăm problema ca ele nu sunt suficient de rapide în
protecția echipamentului. Putem să înlocuim cu sisteme de protecție cu varistori sau chiar diode
zenner, și ele au dezavantaje odată ce intră în scurt circu it, aparatura numai funcționează, iar
ele trebuiesc înlocuite.
În această situație delicată rezolvarea problemei se va face cu tehnica modernă de
monitorizare și control realizat cu microcontroller de tipul PIC16F887. Acest circuit integrat
programabil fa ce posibilă interpretarea unor date analogice de intrare și convertirea lor în date
digitale de ieșire pentru monitorizare și control.
Circuitul PIC16F887 este un microcontroller clasic pe 8 biți realizat într -o arhitectură
cu 40 sau 44 Fig12 de termina le în funcție de capsulă. Intern adăpostește un eeprom memorie
de date cu spațiu de 256bytes, 2 comparatoare, 14 canale de 10bit convertorare analog/digital
A/D, o intrare de captură/comparare pwm,existența unui port serial pentru transmisii de date
sincro ne ce poate fi configurat pe SPI folosind 3 conexiuni sau I2C folosind două conexiuni.
Fig.12 Capsula smd 44pin QFN sau THD 40 pin Dip
Acest microcontroller este folosit pe o scară largă în domeniu precum automotive,
industrial sau chiar pentru uti lizări de larg consum. În esență datorită peretului de producție
relativ mic în comparație cu alte microcontrolere și datorită fiabilității crescute am ales în
cadrul acestui proiect dezvoltarea unui ampermetru cu senzor Hall ratiometric și transformator
de ferită. Un alt avantaj al microcontrolerelor din seria PIC reprezintă porturile de ieșire ce
suportă un curent de 20mA astfel încât pot comanda direct un releu fără folosirea unui tranzistor
tampon pentru creșterea curentului.
Oscilatorul de tact este se lectabil de către utilizator, utilizatorul având posibilitatea de
a selecta frecvența de la 8Mhz până la 32Khz pentru economisire de energie având o precizie
de +/ -1%.
Universitatea Ioan Slavici pag. 19 În cazul de față noi vom folosi un oscilator extern pilotat cu cristal de cuarț pe frecv ența
de 20Mhz pentru a obține o mai bună stabilitate și un factor mai mare de acurtatete pentru
măsurători. Pentru afișarea informației se va folosi un afișor de tip LCD cu 2 rânduri și 16
caractere având la bază controllerul HD44780 cu descrierea pinilor în Fig.15 .
Fig.13 Afișor LCD bazat pe controller HD44780
Acest controller a fost implementat de către firmă japoneză Hitachi și face posibilă
demultiplexarea unor semnale digitale pentru a putea fi afișate pe un afișor cu cristale lichide
de tip punct matricial denumit în termeni populari LCD. În acest controlle r include librărie
pentru caractere ACII, caractere japoneze și alte simboluri cu 28 de caractere și 2 linii. Prin
utilizarea unei driver de extensie se poate duce dispozitivul la afișarea până la 80 de caractere.
În zilele de astăzi acest LCD controller monocrom se utilizează în copiatoare, mașinări
fax, imprimante laser, echipamente industriale, rețele, routere, echipamente de stocare până la
automate de cafea, dozatoare de apă, gama de exploatare fiind largă și foarte utilă. Aceste LCD –
uri se găsesc în diverse configurații cu 1,2,4 sau 8 linii și de la 8 până la 80 de caractere. Pentru
un LCD cu configurația de 4linii și 40 caractere trebuiesc 2 controllere de tipul HD44780.
Evoluția acestui tip de display a dus la îmbunătățiri lumina pe fundal verde f luorescent,
albastru, roșu, sau chiar a fost înlocuit tipul de cristal lichid cu OLED diode organic
electroluminescente .
Schema bloc pentru controllerul HD44780 este afișată în Fig.14
Universitatea Ioan Slavici pag. 20
Fig.14 Schema bloc LCD cu controller HD44780
Descrierea piniilor de legătură este în felul în care urmează:
1- Gnd sau masă se leagă la potențial negativ
2- Alimentare +5V
3- Ajustare contrast deobicei conectat la cursorul unui potențiometru miniatură cu
valoarea de 1k -4.7k iar extremitățile rezistorului la alimentare și masă.
4- Register select (RS) RS=0 trimite comenzi sau RS=1 trimite date
5- Read/Write (R/W) R/W=0 Scrie, R/W=1 Citește ( în marea majoritate a cazurilor nu
este necesară citirea).
6- Clock enable
7- Nu se utilizează pentru operații pe 4 biți
8- Nu se utilizează pentru operații pe 4 biți
9- Nu se utilizează pentru operații pe 4 biți
10- Nu se utilizează pentru operații pe 4 biți
11- Bit 4
12- Bit 5
13- Bit 6
14- Bit 7
15- Lumina de fundal, Anod + numai pentru afișor cu această funcție
16- Lumina de fundal, Katod – numai pentru afișor cu această funcție
Universitatea Ioan Slavici pag. 21 Instru cțiunile pentru realizarea comunicării software cu microcontrolerul sunt afișate
în Tabelul 1:
Tabelul 1
HD44780U instructiuni de baza
Instructiuni Cod binnar
Descriere Timp de
executie
pentru
frecventa
fcp =
270 kHz) RS R/W B7 B6 B5 B4 B3 B2 B1 B0
Ștergere
display
0 0 0 0 0 0 0 0 0 1 Ștergere
display și
returnare
cursor pe
primul rand
pozitia 0 1.52 ms
Cursor home 0 0 0 0 0 0 0 0 1 * Retu rneaza
cursor in
pozitia
presetata
memoria
DDRAM
ramane
neschimbata . 1.52 ms
Setare cursor
0 0 0 0 0 0 0 1 I/D S Seteaza
cursor muta
directia (I/D);
specificat la
shift. Aceasta
operatie
dureaza mai
mult pentru
citire/scriere . 37 μs
Display on/off
control 0 0 0 0 0 0 1 D C B Seteaza
on/off la tot
display ul (D),
cursor on/off
(C), si indica
pozitia
cursorului cu
caracter (B). 37 μs
Universitatea Ioan Slavici pag. 22 Cursor/display
shift 0 0 0 0 0 1 S/C R/L * * Seteaza
cursor -muta
sau display –
shiftuie (S/C),
shift directie
(R/L).
DDRAM
remane
neschimbat . 37 μs
Setare functie 0 0 0 0 1 DL N F * * Setaza
lungimea
datelor (DL),
afisare pe
linie din
display lini
(N), si
caracter font
(F). 37 μs
Seteaza
CGRAM
adresa 0 0 0 1 CGRAM adresa Seteaza in
CGRAM
address.
CGRAM
datele sunt
trimise si
receptionate
dupa aceasta
setare . 37 μs
Seteaza
DDRAM
adresa 0 0 1 DDRAM adresa Seteaza in
DDRAM
adresa.
DDRAM data
este trimisa si
receptionata
dupa aceasta
setare . 37 μs
Citeste fanion
ocupat si
numara adrese 0 1 BF CGRAM/DDRAM Adrese Reads busy
flag (BF)
indicating
internal
operation
being
performed
and reads
CGRAM or
DDRAM
address
counter 0 μs
Universitatea Ioan Slavici pag. 23 contents
(depending
on previous
instruction).
Scrie
CGRAM sau
DDRAM 1 0 Scrie Data Scrie data in
CGRAM sau
DDRAM. 37 μs
Citeste din
CG/DDRAM 1 1 Citeste Data Citeste data
din CGRAM
sau DDRAM. 37 μs
Instructiuni nume bits
I/D – 0 = decrement cursor pozitie , 1 = increment cursor pozitie ; S – 0 = fara display shift,
1 = display shift; D – 0 = display off, 1 = display on; C – 0 = cursor off, 1 = cursor on; B – 0
= cursor blink off, 1 = cursor blink on ; S/C – 0 = muta cursor, 1 = shift display; R/L – 0 =
shift stanga, 1 = shift dreapta ; DL – 0 = 4 -bit interfata, 1 = 8 -bit interfata ; N – 0 = 1/8 or
1/11 serviuciu (1 lin e), 1 = 1/16 serviciu (2 linii ); F – 0 = 5×8 puncte, 1 = 5×10 puncte ; BF –
0 = poate accept a instructiune , 1 = operatie interna in derulare .
Aceste instrucțiuni sunt folosite pentru legătură software de comandă a dispozitivului
pentru măsurarea curentului continuu cu traductorul Hall.Vom mai revenii în codul sursă cu
aceste comenzi.
Legătura afișorului hardware cu microcontrolerul este simplă și trebuie ținut cont de
legătura piniilor de comandă așa cum au fost amintiți mai sus.
4.2 Date de catalog pentru senzorul ratiometric TLE4997
Pentru a efectua o măsurătoare precisă s -a folosit un traductor Hall ratiometric creeat
de către in fineon technology. Aceasta a fost dezvoltat de grupul german pentru a satisface cele
mai critice cerintesi anume măsurarea curentului continuu fără sunt și monitorizarea lui.
Ca aplicativitate și -a găsit loc în domeniul automotive, echipamente industriale și chiar
și în lumea de larg consum. Ca exemplu în automotive se utilizează la monitorizarea
acumulatorilor ale noilor autovehicule electrice ca și circuit de protecție suplimentar.În
domeniul industrial în zone de mare risc unde orice arc electric al unui contact imperfect poate
fi fatal. În domeniul de larg consum poate fi găsit în bicicletele și trotinetele electrice ba chiar
în mașini de găurit profesionale.
Caracteristici ale TLE4997
Este un senzor de mare liniaritate și ratiometric push -pull rail to rail cu ieșire de semnal
analogic
Universitatea Ioan Slavici pag. 24 Conține un procesor de semnal digital pe 20 bits
Are funcție de comensare cu temperatura cu o rezoluție de 12 bits
Stabil în temperaturi -40grade C până la 150grade C
Are derive mici de semnal la temperatura și ciclu de v iață
Parametrii programabili memorați în memoria internă cu un singur bit de corecție:
-plaja magnetică de măsură
-zero absolut (offset)
-banda
-polaritate
-optiuni de clampare
-coeficient de temperatură pentru toate tipurile de miezuri magnetice
-blocare memorie
Reprogramare memorie blocată
O singură tensiune de alimentare 4.5V -5.5V
Operează între -200mT și +200mT cu trei plaje
Capsula slim cu trei terminale
Protecție la inversare polaritate și supratensiune
Protejat la scurticruit extern
Diagnostic inten on-board diagnostic
Citire digitală de temperatură internă pentru senzori multiplii cu sursă comună de
alimentare
Două puncte de calibrare pentru funcția de transfer magnetic
Calibrare precisă fără iterarea pașilor
Imunitate ridicată la stres mecanic EMC, descărcări electrostatice ESD
Fig.15 vedem locația cu elementul Hall în chip și distanța dintre proba Hall și suprafața
capsulei.
Universitatea Ioan Slavici pag. 25
Fig.15 Configurația pinilor și centrul senzorului Hall
Pin1-Alimentare/interfața de programare
Pin2-Masa
Pin3-Semnal tensiune/interfața de programare
Schema bloc internă este prezentată în Fig.16
Fig.16 Schema bloc internă simplificată al circuitului TLE4997
Universitatea Ioan Slavici pag. 26
Senzorul linear Hall IC a fost creeat special pentru măsurători de mare precizie și pentru
detectarea poziției sau rotației unui obiect. Senzorul este unul ratiometric cu ieșire analogică
facandul ideal în conversia analog digitală A/D cu sursa de tensiune de referință.
Integratul este produs în tehnologie BICMOS cu protecție la supravoltare și polaritate
inversă.
Arhitectura internă a procesorului DSP utilizează procesarea pe 2 octeți (16 bits)
concomitent intră și compensarea cu temperatura ce garantează o excelentă stabilitate pe o
perioadă lungă de timp.
Rezoluția minimă este 12 bits. Nicioda tă blocurile interne nu vor lucra cu rezoluție de
20bits.
Principiu de funcționare
Un flux magnetic va fi măsurat de către senzorul cu efect Hall, semnalul de intrare va
fi astfel convertirt în semnal Analogic/Digital urmând să fie prelucrat digital.
Un filtru trece jos programabil va reduce zgomotul alb.
Temperatura este și ea măsurată și procesata din analogic în digital
Procesorul digital este setat pentru tensiunea de 0V ieșire cu flux magnetic 0
În final procesorul va converti semnalul digital în sem nal analogic,iar tensiunea de
ieșire va fi direct proporțională cu ratiometric HALL efect (câmpul magnetic apicat senzorului)
Funcții de transfer
Un exemplu este în Fig.17 arată cum un câmp magnetic diferit poate fi mapat cu o tensiune de
ieșire.
Modul d e polaritate:
-Unipolar: Numai Nord sau Sud orientat câmp magnetic expus măsurării
-Bipolar: Câmpul magnetic poate fi măsurat în orice orientare, punctele de limitare nu sunt
simetrice la punctul de zero.
Inversat: Amplificarea tensiunei de ieșire poate fi pozitivă sau negativă.
Universitatea Ioan Slavici pag. 27
Fig.17 Exemple de operare
Ratiometria ce înseamnă?
Acest senzor Liniar Hall lucrează precum un potențiometru, adică pe ieșire va exista o
tensiune proporțională cu tensiunea de alimentare. Factorul de divizare depinde de câmpul
magnetic aplicat senzorului. De aceea se cheamă senzor ratiometric .
Tensiunea d e alimentare poate fi utilizată ca referință pentru A/D convertor pentru
microcontroler. În acest caz variația tensiunii de alimentare va fi compensată.
Eroarea de reatiometrie este definită cu următoarea formula:
Eroarea ratiometrica exista, se vor ved ea ca aripi de fluture în curbură Fig.18
Universitatea Ioan Slavici pag. 28
Fig.18 Eroarea ratiometrica
Parametrii magnetici
Parametru Simbol Valori limită absolute Unitate de
măsură Note
Min. Normal Max.
Sensibilitat
e S +/-12.5 – +/-300 mV/mT 1)
Sensibilitat
e eroare cu
temperatură Se -4 – 4 % 2)
Pragul
magnetic MFR +/-50 +/-100 +/-200 mT Programabil
4)
Neliniaritat
e integrală INL -15 – 15 mV =+/-0.3%
din tensiune
5)
Magnetic
offset Bos -400 – 400 µT 6)7)8)
Magnetic
offset drift ΔBos -5 – 5 µT/°C Eroare
banda 7)
Universitatea Ioan Slavici pag. 29
1) Pas programabil cu 0.024%, Vdd=5V și Tj=25/°C
2) Eroare reziduală de sinsibilitate utilizează minim 2 temperaturi
3) Acest rang este utilizat pentru temperatura și offset în pre -calibrare
4) Depinde de Offset și setările de amplificare,ieșirea se saturează la nivele mici de câmp.
5) ÎN=Vout -Vout,lse cu Vout,lse=ultima eroare de pătrat din Vout
6) Operare cu temperatura cu rang foarte mare de viață
7) Pentru sensibilitate S>25mV/mT. Pentru sensibilități mici deriva de zero volți este
dominantă.
8) Măsurată la +/ -100mT prag
Procesarea de semnal
În Fig.19 se prezintă diagrama cu algoritmul pentru procesare.
Fig.19 Procesarea semnalelor
Interpretarea câmpului magnetic
-Iesirea analogică de semnal este convertită în timp -continuu de către A/D convertor.
Universitatea Ioan Slavici pag. 30 – Pragul A/D convert or poate fi setat în pași.
-Dupa conversia A/D un filtru digital trece jos îngustează banda de trecere.
-Semnalul trece printr -un un amplificator multiplicator de semnal pentru aducerea la o anumită
valoare a semnalului plus compensarea cu temperatura.
-Valoarea offset este adăugată.
-Un limitator va reduce semnalul rezultat la 12 bits și trece în D/A converter
Compensarea cu temperatura
-Semnalul pentru temperatura este trecut prin A/D convertor.
-Temperatura este normalizată prin scăderea lui T0 valoar e.
-Calea liniara este multiplicta cu valoarea lui TC1.
-In calea quadratica diferența de temperatură este ridicată pătrat și multipliplicata cu valoarea
lui TC2.
-Ambele căi de ieșire sunt aduse împreună și multiplicate cu câștig.
Gama de măsură a câmpur ilor magnetice
Acest senzor lucrează cu o gamă bine definită pentru intrare conversie A/D. Acesta este
întotdeauna simetrică la punctul de zero.Orice două puncte în gama magnetică poate fi selectată
și punctul din ieșirea curbei. Tensiunea de ieșire rep rezintă gama între două puncte.
În cazul câmpului magnetic mai mare decât valoarea de gama selectată, ieșirea semnalului este
deteriorată. Gama trebuie setată înainte de calibrare cu offset și câștig în amplificare.
Gama de măsură setări:
Low=+/50mT ->para metru Registru=3
Mid=+/ -100mT ->parametru Registru=1
High=+/ -200mT ->parametru Registru=0
Gama de măsură nu este garantată cu acuratețe . Temperatura de precalibrare este efectuată în
zona Mid pentru pragul +/ -100mT.
Definirea câștigului
Sensibilitatea este definită de gama și de setările de amplificare. Ieșire lui A/D converter este
multiplicată cu valoarea de câștig.
Setări pentru câștig:
Dimensiunea registrului ->G=15bits;neasignata ca valoare de întreg
Gama de castig ->Gain= -4 *
Universitatea Ioan Slavici pag. 31 Pas de câștig cuantizat ->Gain=244.14 ppm (corespunde cu 1/4096)
*Pentru valoare setată între -0.5 și +0.5 acuratețea numerică scade. La obținerea unei ieșiri
curbe este recomandat să selectăm gama cea mai înaltă.
*Valoarea gamei de +1.0 corespunde la 40mv/mT sensibilitate. (100mT nu este garantat)
*Senzorul este precalibrat de la producător pentru valoarea 60mv/mT în gama aleasă de
+/100mT. Nu este garantată acurtateta acestei calibrări. este esențial să se efectueze o calibrare
finală a fiecărui IC în cadrul aplicației utilizând valoarea câștigului Vos .
Gain value (câștigul se calculează cu următoarea formula):
Setări de Offset
Tensiunea de offset corespunde tensiunii de ieșire egală cu zero câmpului magnetic aplicat
senzorului.
Dimensiunea Registrului ->OS=15 bits
Offset range -> Vos= -400 sau 399% Vdd
Pas de cuantizare Offset ->Vos=1.22mV (Vdd=5V corespunde pentru 4095)
Senzorul este precalibrat pentru câmp magnetic zero la 50% din tensiunea de alimentare.Gama
aleasă de producător la care s -a făcut calibrarea este + /-100mT.
Valoarea de offset poate fi calculată cu următoarea formula:
DSP filtru trece jos
Un filtru digital trece jos este plasat între Hall A/D coverter și DSP ce ajută la diminuarea
zgomotului de nivel. Filtru trece jos este cu amplificare constantă la 0db deci are o
amplificare
Universitatea Ioan Slavici pag. 32 unitară exactă egală cu 1, ceea ce însemna că această setare n u influențează circuitul intern
Hall A/D convertor.
Banda acestui filtru poate fi aleasă în 8 pași:
Paramentru LP Frecvența de tăiere în HZ cu atenuare la 3db
0 78
1 244
2 421
3 615
4 826
5 1060
6 1320
7 off
Acest filtru digital funcționează cu un oscilator RC,iar frecvența de tăiere poate varia cu
+/25%.
Comportamentul din ieșirea filtrului digital interpolat rămâne principala componentă din
calea semnalului.
Filtru trece jos caracteristici
Dimensiunea registrului ->LP=3bits
Variația de frecve nță în colțuri -> f=+/25%
Dacă se alege setarea 7 pentru dezactivarea filtrului atunzi zgomotul de ieșire va crește.
Deoarece DSP va fi încărcat cu funcții în plus consumul de curent va crește simțitor.
În Fig.20 vedem caracteristicile filtrului ,cea mai m are stare este marcată. Pentru
poziția de off avem o caracteristică liniară la 0db. În acest caz ieșirea filtrului este limitat de
către banda de trecere a senzorului. Rata de actualizare după filtru trece jos este 16Khz.
Universitatea Ioan Slavici pag. 33
Fig.20 Caracteristică de trecere a filtrului trece jos
Intrarea DAC Filtru de Interpolare
Un filtru de interpolare este plasat între DSP și ieșirea DAC convertor. Caracteritica de trecere
a acestui filtru vezi Fig.21 . Filtrul nu poate fi dezactivat. Acest fil tru limitează frecvențele cu
comportament din întreg sistemul dacă intrarea filtrului din DSP este dezactivată. Rata de
actualizare după interpolarea filtrului este 256khz.
Fig.21 Caracteritica de trecere a filtrului de interpolare
Universitatea Ioan Slavici pag. 34 De reținut, acesta este un filtru digital ce are la bază un oscilator RC, iar frecvența de tăiere
poate varia cu +/ -25%.
Clampare
Funcția de clampare este necesară pentru împărțirea tensiunii de ieșire în gama de funcționare.
Dacă câmpul magnetic este exterior selectat în g ama de măsurare, atunci ieșirea Vout va fi
limitată de sistemul de clampare.
Date tehnice pentru clmapare și setări de regiștrii:
Dimenziunea Registrului ->CL,CH=2x12bits
Tensiunea de clampare mica ->VCLL=0 -98.98 %Vdd
Tensiunea de clampare mare ->VCLH=0 -99.98 %Vdd
Pasul de cuantizare pentru clampare -> VCLQ=1.22mV la VDD=5V
Fuga în tensiune în momentul clampării (drift) ->VCL=+/ -15mV
Valorile de clampare sunt calculate cu următoarea relație:
Clampare tensiune joasă:
Clampare tensiune înaltă:
Pentru un setup precis valorile de registru pot fi reajustați în condițiile de clampare. Ieșirea de
tensiune are și ea limitările sale electrice.
În Fig.22 avem un exemplu în care câmpul magnetic are o gamă între Bmin și Bmax
ce este mapata la o tensiune cu vloare î ntre 0.8 și 4.2V.
Dacă nu este necesar semnalul de erori, tensiunea maximă este între 0.3V și 4.7V.7
Universitatea Ioan Slavici pag. 35
Fig.22 Exemplu clampare
Dacă VCLL este setatat cu o valoare mai mare decât VCLH atunci VCLH domineaza.Această
duce la o tensiune constantă independentă de câmpul magnetic aplicat.
Detecția de erori
În caz de eroare se poate detectată de sistemul On -Board -Diagnostic (OBD) și raportat la
microcontroler. Sistemul OBD este util atunci când funcția de clampare este activată. Ea este
importată la setarea campării pragului valorei interne de eroare pentru a se asigura că este
posibil să se facă distincția între tensiunea corectă de ieșire și semnalul de eroare.
Compensarea cu temperatura
Intensitatea câmpului magnetic a unui magnet depinde de tempe ratură. Se oferă o compensare
cu temperatura de ordinul 2 de tip polynomial,în care semnalul Hall de ieșire este multiplicat
în DSP.Există trei parametrii pentru compensare:
Referința de temperatură T0
O parte liniară de ordinul 1 TC1
O parte pătrățica (qu adratic) de ordinul 2 TC2
Se descrie următoarea formulă de sensibilitate dependentă cu temperatura în relație cu
sensibilitatea la temperatura de referință T0.
Universitatea Ioan Slavici pag. 36
Compensarea cu temperatura a sistemului complet este făcut în două etape:
1.Pre -calibrare în testul final la Infineon
Parametrii TC1,TC2,TC0 sunt setați la maxim pentru o caracteristică liniară de temperatură în
ceea ce privește proba Hall și partea de procesare internă analogică.
2.Sistem total de calibrare
Parametrii TC1,TC2,T0 ai circuitelor magnetice sunt programate. Acest lucru se poate face
determinist, deoarece algoritmul al DSP -ului este pe deplin reproductibil.Setările finale ale lui
TC1,TC2,T0 sunt relative la pre -calibrarea valorilor.
Compensarea cu temperatura setări:
Dimensiune reg istru Tc1 ->Tl=9bits neasignat valaoare întreg (unsigned integer)
Coeficient de ordin 1 TC1 ->TC1= -1000 -2500ppm/°C
Cuantizare pașilor TC1 ->Tc1=15.26 ppm/°C
Dimensiune registru TC2 ->TQ=8bits neasignat valaoare întreg (unsigned integer)
Coeficient de ordin 2 TC2->TC2= -4/4 ppm/°C
Cuantizare pașilor TC2 ->Tc2=0.119 ppm/°C
Dimensiune registru T0 ->TR=3bits neasignat valaoare întreg (unsigned integer)
Temperatura de referință T0= -48/64°C
Cuantizare pașilor lui T0 ->T0=16 °C
Calculul Parametrilor
Parametrii TC1, Tc2 și T0 se calculează cu următoarele formule:
Universitatea Ioan Slavici pag. 37
Acum ieșirea Vout pentru un anumit domensiu Bin la temperatura specificată poate fi calculată
cu următoare formulă:
BFSR reprezintă gama completă a câmpului magnetic și este dependentă de gama setată 100mT.
S0 sensibilitatea nominală a probei Hall
STC este temperatură dependentă de factorul de sensibilitate calculat de DSP
STCHall reprezintă temperatura de comportament a probei Hall
Pre-calibrarea se efectuează astfel încât să fie îndeplinită condiția următoare:
În aplicație un factor adițional B IN(T)/ B IN(T0) va fi dat pentru sistemul magnetic. S TC duce la
o nouă valoare S TCnew prin aplicarea următoarei formule:
În cele din urmă noua sensibilitate, parametrul S TCnew poate fi calculat cu setarea din pre –
calibrare S TC utilizând relația:
Universitatea Ioan Slavici pag. 38
Calibrarea
În realizarea procesului de calibrare este necesară o interfață hardware externa și a unui
echipament de măsurare pentru calibrarea senzorului. Toate calibrările și setările de biți pot fi
scrise în memoria RAM. Accesul la EEPROM rămâne neatins pe parcursu l procesului de
calibrare.
Atenție acest senzor este OTP (One time prigramming) se pot executa până la 10
calibrări, apoi senzorul devine intutilizabil.
Procesarea semnalului digital este complet determiniat. Această permite o calibrare în
două puncte înt r-un singur pas fără iterații. Cele două câmpuri magnetice (descrise aici că două
"poziții" ale unui circuit magnetic extern) trebuie aplicate o singură dată. În plus, se poate
realiza o procedură completă de configurare și calibrare, care necesită un sing ur ciclu de
programare EEPROM .
După stabilirea coeficienților de temperatură, valorile Hall A / D ale ambelor poziții
trebuie să fie citite, iar semnalele de ieșire ale senzorului (folosind un mod de testare DAC).
Folosind aceste date, parametrii de prelu crare a semnalului pot fi calculați imediat cu un
program care rulează pe sistemul de calcul extern.
Harta memoriei interne este ilustrată în Fig.23 . Când biții MEMLOCK sunt programați
(doi biți redundanți), conținutul memoriei este înghețat și nu mai poat e fi modificat. Interfața
de programare este blocată, iar chip -ul rămâne numai în modul de aplicare. Acest lucru previne
programarea accidentală datorită influențelor mediului.
Fig.23 Harta Eeprom
Universitatea Ioan Slavici pag. 39 O arhitectură de paritate matriceală permite corectarea automată a oricărei erori de biți
unice. Fiecare rând este protejat de un bit de paritate de rând.
Suma setată de biți care include acest bit trebuie să fie un număr impar (paritatea ODD).
Fiecare coloană este protejată suplimentar de un bit de paritate a coloanei.
Suma tuturor biților în pozițiile uniforme (0, 2 etc.) ale tuturor liniilor trebuie să fie un
număr par (EVEN PARITATE “Pară”); suma tuturor biților în pozițiile (1,3, etc.) trebuie să fie
un număr impar (PARITATE DE ODD “Impară”).
Acest meca nism al calculelor de paritate diferite protejează împotriva multor erori bloc
(cum ar fi ștergerea unei linii întregi sau chiar a întregului EEPROM). Când modificați biții de
aplicație (cum ar fi Gain, Offset, TC etc.), biții de paritate trebuie să fie ac tualizați. Pentru biții
de coloane, zona de pre -calibrare trebuie de asemenea citită și luată în considerare pentru
generarea corectă a parității.
Caracteristici de programare
Ciclu de programare EEPROM ->Nprog=10
Temperatura ambientală de programare ->Tprog =10-60C
Timp de programare ->tprog=100ms
Calibrarea memoriei=135biti “toți biții activi ai epromului”
Eroare de corecție=25biti “biții de paritate ai eepromului”
Interfața de programare
Interfața de programare digitală utilizează cadre specifice, care pot avea una din
următoarele două funcții: Cadrele de comandă conțin o sarcină specifică (de exemplu, date de
citire / scriere, selectare programare EEPROM etc.) și o adresă corespunzătoare
Cadre de date conțin date de 16 biți valoare transmisă sau primită de la dispozitiv –
aceste cadre pot urma doar un cadru de comandă adecvat pentru citirea sau scrierea datelor Un
cadru valid are următoarele proprietăți: un cadru constă din 21 de biți î n total.
Un bit este deplasat sau ieșire cu o margine de ceas în creștere pe linia de alimentare .
Un cadru întotdeauna începe și se termină cu un "1" (biți de cadru)
LSB-ul unui cadru transmis la senzor este schimbat în primul. LSB -ul a unui cadru a
răspuns de către senzorul este mutat mai întâi. Întregul cadru transmis dispozitivului, inclusiv
biți de cadru, este protejat cu un bit uniform de poziție și un bit de paritate.
Primul cadru trimis trebuie să fie o comandă valabilă pentru a activă modul de in terfață
și trebuie să fie trimis în 19 de secunde după pornire. Ca protecție suplimentară, dispozitivul
nu dezactivează starea de ieșire în timpul acestei transmisii (folosind 21 de impulsuri de ceas).
Acest lucru înseamnă că driver -ul de interfață al prog ramatorului trebuie să depășească stadiul
de ieșire a scurgerilor deschise al senzorului în timpul acestei transmisii inițiale.
Universitatea Ioan Slavici pag. 40 Structura unui cadru de comandă este prezentată în Figură 24 . Comenzile disponibile
sunt prezentate în următorul Tabelul 2 . Para metrii biți PE (biți 17) și PO (biți 18) trebuie să fie
setați în modul următor (bitul 0 este LSB, bitul 20 este MSB): bit0 XOR bit2 XOR bit4 XOR
…. XOR bit20 = 0 bit1 XOR bit3 XOR bit5 XOR …. XOR bit19 = 0
Fig.24 Structura de cadre de comandă
Tabelul 2
Comanda “CMD” Bits MSB…LSB Funcția de executat
0h 000000 Părăsește programarea
1h 000001 Date unice de citire de la
adresă dată fără increment
(răspunsul senzorului: un
cadru de date)
3h 000011 Citirea datelor de la adresa
dată cu increment (citirea se
termină când adresa
"xxx111B" este atinsă)
9h 001001 Date unice se scriu la adresa
dată fără increment (urmată
de un cadru de date)
Bh 001011 Datele se scriu la adresa dată
cu increment (urmate de mai
multe cadre de date, se
termină la adresa "xxx111B"
sau prin trimiterea unui alt
cadru de comandă
Ch 001100 Activare modul de scriere
EEPROM (programe "1" –
bits)
Dh 001101 Activați modul de ștergere
EEPROM (programe "0" –
bits)
Universitatea Ioan Slavici pag. 41 Eh 001110 Activați modul de verificare
a marjei EEPROM
(verificarea nivelului
programelor)
Fh 001111 Actualizarea EEPROM
(actualizarea registrelor
EEPROM) 1
Structura unui cadru de date trimis către dispozitiv este prezentată în Fig 25 . Parametrii
biți PE (biți 17) și PO (biți 18) trebuie să fie setați în același mod ca și pentru cadrul de comandă
(bitul 0 este LSB, bitul 20 este MSB): bit0 XOR bit2 XOR bit4 XOR …. XOR bit20 = 0 bit1
XOR bit3 XOR bit5 XOR …. XOR bit19 = 0
Fig.25 Cadru de date trimis către senzor
In Fig.26 vedem un cadru de date structură primit de la senzor. În loc de un bit zero,
urmat de doi biți de paritate, cei mai puțin semnificativi 3 biți ai adresei folosite pentru citire
sunt transmiși împreună cu datele. Aceasta este de a verifica integritatea datelor primite .
Fig.26 Cadru de date receptionat de la senzor
Specificații tehnice pentru interfațare
În Tabelul 3 specifică condițiile de funcționare ale interfeței de programare, care
trebuie îndeplinite pentru a asigu ra funcționarea corectă a TLE4997 în timpul programării. Toți
parametrii specificați se referă la aceste condiții de funcționare, cu excepția cazurilor în care se
specifică altfel de interfațare .
Tabelul 3
Parametru Simbol Min. Tipic Maxim Unitate
măsură Notă
Tensiune
alimentare Vdd 4.5V – 5.5V V –
Cs 47 – 1000 nF Vdd la masă
Universitatea Ioan Slavici pag. 42 CL 0.0 – 210 nF Ieșire spre
masă
TPRG 10 60 C
NPRG 10 Cycles OTP
tPRG – 100 – ms
tPRG_START – – 19 ms Pentru a
porni modul
de
programare,
o primă
comandă de
citire va fi
trimisă în
această
fereastră de
timp după
pornire
Specificațiile pentru timpi și nivelele electrice ale interfeței de programare sunt
prezentate în Tabelul 4 . Semnificația parametrilor de sincronizare este ilustrată în Fig 27 .
Fig.27 Cadre de timp (Frame timing)
Universitatea Ioan Slavici pag. 43 Tabelul 4
Parametru Simbol Min. Tipic Max. Unit Notă
Vdd clock
high Vdd, clkHI 8.8 9.4 10 V
Vdd clock
low Vdd,
clkLow 4.8 5 5.2 V Out
urmează
dacă
Vdd=High
Ieșire date
High Vo,oHigh 3.0 Vdd Vdd+0.1 V
Ieșire date
în Low Vo,oLow -0.2 0.0 0.1 V
Out data
cureent de
intrare Io -50 – 50 mĂ
Vdd clock
High timp tCH 2.4 50 100 s
Vdd clock
Low timp tCL 1.6 4.0 100 s
tSU 1.5 2.0 – s
tHLD 2.3 3.0 – s
tSET – 1.0 1.7 s
tMIN 10.0 – – s
tDEL 10.0 25.0 – s
tHLM – 5.0 10.0 s
Pentru a stoca permanent un set de parametri programat pe EEPROM, trebuie trimise
comenzile "EEPROM erase" și "EEPROM write", urmate de un impuls de programare. Fig.
28 vedem timpii impulsului de programare.
Universitatea Ioan Slavici pag. 44
Fig.28 Durata impusului pentru programare
După programare, este necesară verificarea marginei de timp Fig.29 pentru a testa
stabilitatea datelor programate. Verificarea marginii este inițiată printr -o comandă de
"verificare a marjei EEPROM" urmată de o margine de tensiune.
Fig.29 Verificarea duratei de timp a unei margini
Tensiunea marjei variază în timpul e tapelor ulterioare din intervalul de nivel al marjei
de prag. O valoare de tensiune marginală prea mică indică o durată prea lungă a impulsului de
programare sau o tensiune de programare prea mică. O valoare prea mare a tensiunii de margine
indică o durată prea lungă a impulsului de programare sau o tensiune de programare prea mare .
Registrii de memorie
In Tabelul 5 vom vedea adresele ce trebuiesc a fi trimise pentru programarea
senzorului.
Tabelul5
Adresa de memorie Simbol Functia Citire/Scriere
05h HCAL Cal. Valoare Hall Numai citire
06h TCAL Cal. temperatura Numai citire
07h VDAC Calcul DAC, include
valoare de clamping Numai citire
0Ah HADC Necalibrat Hall
ADC Numai citire
0Bh TADC Necalibrat
temperatura ADC Numai citire
Universitatea Ioan Slavici pag. 45 0Fh Status Stare registru Numai citire
10h…19h Eeprom Eeprom registru Citire / scriere
20h Dac_Set Setare DAC Citire /Scriere
21h Test Test de registru Citire/Scriere
HCAL Acest registru conține măsurarea magnetică cu compensare l a temperatură ca
valoare de 16 biți. Această valoare este în intervalul +/ – 30000.
TCAL Acest regist ru conține o valoare pe 16 biți și oferă temperatura curentă de
joncțiune a dispozitivului . Temperatura de joncțiune în ° C se calculează pornind de la valoarea
înregistrării prin: TJ = (TCAL / 16 + 48) [° C].
VDAC Acest registru conține un rezultat zecimal nesemnat de 12 biți aplicat la DAC
intern pentru etapa de ieșire ra tiometrică. Intervalul de valori este de la 0 la 4095 și corespunde
la 0% până la 100% din VDD.
HADC Acest reg istru conține o valoare de 16 biți care corespunde valorii măsurate a
celulei Hall. Această valoare se situează în intervalul +/ – 20000.
TADC Acest registru conține o valoare a temperaturii brute de 15 biți nesemnată.
STATUS Conținutul registrului de star e este prezentat în Fig.30
Fig.30 Stari registrii
– CRC ok trebuie să fie "1", altfel auto -testul DSP încorporat a eșuat și dispozitivul este
defect
– LOCKED trebuie să fie "0" atâta timp cât nu sunt programate butoanele de blocare.
După setarea blocurilor de blocare, blocarea poate fi verificată prin reîmprospătarea
conținutului EEPROM și verificarea acestui bit înainte ca alimentarea dispozitivului să
fie eliminată sau interfața să fie închisă.
– Perr_adr trebuie să fie pe adresa FH ("1111B"), în caz contrar se afișează prima adresă
EEPROM unde verificar ea parității interne a eșuat.
– perr_more trebuie să fie "0", altfel mai mult de o adresă EE PROM are o eroare de
paritate.
– perr_col trebuie să fie "0", altfel una sau mai multe coloane EE PROM au o eroare de
paritate.
– HWver conține revizuirea efectivă a siliciului începând cu 0 (= "000"). Cea mai recentă
versiune din linia de producție 8 este versiunea 3 (= "011", disponibilă de la mijlocul
anului 2006 și disponibilă pentru utilizare productivă).
– ROMSIG trebuie să fie 1FH, altfel DSP ROM -ul nu este valid și aparatul este defect.
Universitatea Ioan Slavici pag. 46 DAC_SET Acest registru conține o valoare zecimală nesemnată pe 12 biți. Când este
setat bitul de testare DAC, valoarea registrului este utilizată pe ieșirea raportată.
TEST Conținutul registrului de testa re este prezentat în Fig.31 . Toți biți sunt "0" după
resetare. Toți biți care nu sunt descriși sau utilizați trebuie să fie păstrați la "0".
Fig.31 Registru de test
"Margin zero on" este folosit pentru select area modului de testare a marginei . Acesta
este setat la '1' pentru testarea tensiunilor de prag EEPROM ale celulelor programate la '0' și
este setată la '0' pentru testarea tensiunilor de prag EEPROM al e celulelor programate la '1'.
"FEC off" oprește corecția de eroare a EEPROM -ului. Acest bit trebuie să fie setat la
citirea conținutului EEPROM.
"REF off" dezactivează actualizarea automată (ciclică) efectuată de DSP pentru a
actualiza registrele EEPROM din celulele EEPROM. Acest bit trebuie să fie setat la scrierea
de noi valor i în registrele EEPROM.
"DSP off" oprește unitatea de procesare a semnalului (DSP). Acest bit trebuie să fie
setat înainte de a accesa valorile registrului intern prin interfața (HCAL, TCAL, SCAL și
EEPROM).
"Dezactivare DSP" trebuie setată înainte de a dezactiva DSP (ca o comandă separată)
înainte de citirea datelor calculate HCAL, TCAL și / sau SCAL. Aceasta permite DSP să
termine calculul și toate v alorile din RAM sunt coerente.
"Testu l DAC" trece de la valoarea DAC_ DAC la valoarea DAC_SET. Acest lucru
permite setarea directă a valorii DAC pentru măsurarea tensiunii de ieșire pentru o valoare
DAC in vederea calibrari .
In Fig.32 ne sunt descrise continutul de registrii EEPROM.
Universitatea Ioan Slavici pag. 47
Fig.32 Harta cu registrii EEPROM
Câmpurile marcate cu roșu sunt parametrii de configurare pentru hardware -ul
senzorului. Cele marcate în galben sunt folosite de algoritmii DSP pentru procesarea
semnalelor. Câmpurile violet sunt utilizate pentru a determina starea parametrilor printr -un
software de programare extern (definit de utilizator), iar câmpurile albastru și cyan sunt biți de
paritate pentru liniile și coloanele corespunzătoare utilizate de corecția internă de eroare internă
(FEC). Toți parametrii sunt valori întregi nesemnate. Camp urile rezervate marcate în alb nu se
modifică.
Paritatea Pc pentru fieca re coloană (include pragurile de precalibrare) este EVEN
pentru pozițiile de biți (bit0 = LSB, bit2, bit4, … bit14) și paritatea PI pentru toate coloanele
(bit1, bi t3, … bit15 = M SB) este ODD . Paritatea Pl a fiecărei linii EEPROM (adresa 0x10 …
0x19) trebuie calculată astfel încât suma biților săi să fie întotdeauna ODD. Înainte de a accesa
EEPROM -ul, corecția de eroare înainte (FEC) va fi dezactivată prin intermediul registrului
TEST.
Cei doi biți de utilizator sunt biți liberi care pot fi utilizați de către integratorul de sistem,
de exemplu pentru a urmări pașii de calibrare.
Blocurile de blocare LH și LL sunt biti de blocare (LH blocat dacă '1', LL blocat dacă
'0'). Dacă LH, LL sau ambele sunt setate la starea blocată, interfața de programare nu mai poate
fi accesată.
Universitatea Ioan Slavici pag. 48
Derularea procesului pentru calibrare :
1. Pornim dispozitivul.
2. Se trimite o comandă inițială (citir e registru de stare): Verificam dacă starea este
validă (Registry status = F93DH sau FB3DH
3. Setam biții de înregistrare FECoff = 1, DSPoff = 1, REFoff = 1 (permite accesul
EEPROM).
4. Citit im conținutul EEPROM într-o matrice EEP_OLD (stocam și pentru scopul de
referință și trasabilit ate) În para lel: Pregătim datele care urmează să fie programate ca un
matrice EEP_NEW.
5. Calcula m biții care trebuie șterși de la EEP_OLD la EEP_NEW ca matrice
EEP_PROG.
6. Scriem conținutul EEPROM din matricea EEP_PROG la registrele EEPROM
7. Trimitem comanda de ștergere EEPROM , aplicam un impuls de programare ștergem
pe pinul de ieșire .
8. Calculam biții care trebuie setați de la EEP_OLD la EEP_NEW ca matrice
EEP_PROG.
9. Scriem conținutul EEPROM din matricea EEP_PROG la registrele EEPROM.
10.Trimitem comanda de scriere EEPROM , Aplicam un impuls de programare de
scriere pe pinul de ieșire .
11.Trimitem comenzii de margine EEPROM . În timpul marginii căderii impulsului de
marjă pe VDD, apli cați VO, MARG pe ieșire .
12. Citi m conținutul EEPROM în m atricea EEP_PROG.
13. Verificam datele EEP_PROG împotriva EEP_NEW pentru a verifica programarea
(fără biți răsuciți) Opțional, pașii 11 până la 13 pot fi bucle pentru a găsi tensiunea exactă a
pragului de margine. Dacă tensiunea pragului de margine este p rea mică, nu continuați și
verificați defecțiunea.
14. Verificam din nou registrul de stare
Setarea registrului TEST
Următoarele etape sunt folosite pentru a s eta registrul TEST:
1. Trimitem o comandă de scriere (setul de registru TEST: Command 09H, Adresa: 21H).
2. Trimitem un nou cuvânt de date pentru registru.
Citirea conținutului EEPROM
Următorii pași sunt utilizați pentru citirea EEPROM -ului și stocarea conținutului într -o matrice:
Universitatea Ioan Slavici pag. 49 1. Trimitem o comandă de citire a blocului (citirea datelor EEPROM: Command 03H, Adresa:
10H).
2. Citim primele 8 cuvinte de date ale EEPROM -ului și păstrați -le într -o matrice.
3. Trimitem o comandă de citire (citirea datelor EEPROM: Command 01H, Adresa: 1 8H).
4. Citim cel de -al 9-lea cuvânt de date al EEPROM și păstrați -l într -o matrice.
5. Trimitem o comandă de citire (citirea datelor EEPROM: Command 01H, Adresa: 19H).
6. Citim cel de -al zecelea cuvânt de date al EEPROM și păstrați -l într -o matrice.
Setarea conținutului EEPROM
Următorii pași sunt utilizați pentru a seta conținutul EEPROM cu date dintr -o matrice:
1. Trimitem o comandă de scriere bloc (EEPROM scrieți date: Command 0BH, Adresa: 10H).
2. Trimitem primele 8 cuvinte de date din matrice p e EEPROM.
3. Trimitem o comandă de scriere (date EEPROM scrieți: Comandă 09H, Adresa: 18H).
4. Trimitem cuvântul de date nouă din matrice către EEPROM.
5. Trimitem o comandă de scriere (datele EEPROM scrieți: Command 09H, Address: 19H).
6. Trimitem cuvântul de date 10 din matrice către EEPROM
Calcularea biților de șters
EEP_PROG matricea pentru procedura de ștergere se calculează pornind de la vechiul
conținut EEPROM EEP_OLD și noul conținut EEPROM EEP_NEW în modul următor: Pentru
fiecare cuvânt de date i: EEP_PROG [i] = INVERT ((EEP_OLD [ i] XOR EEP_NEW [i]) și
EEP_OLD [i])
Exemplu:
EEP_OLD 0101010101010101
EEP_NEW 0101110001010101
EEP_PROG 1111111011111111
Calcularea biților pentru scriere
EEP_PROG pentru procedura de scriere se calculează pornind de la vechiul conținut EEPROM
EEP_OLD și noul conținut EEPROM EEP_NEW în modul următor: Pentru fiecare cuvânt de
date i: EEP_PROG [i] = (EEP_OLD [i] XOR EEP_NEW [ i]) și EEP_NEW [i].
Universitatea Ioan Slavici pag. 50
Exemplu:
EEP_OLD 0101010101010101
EEP_NEW 0101110001010101
EEP_PROG 0000100000000000
4.3 Schema electrică și descrierea funcționării
S-a plecat de la cerințele circuitului integrat TLE4997 s -a realizat schema din Fig.33
ce reprezintă un ampermetru cu monitorizare continuă într -un sistem de protecție.Se observă
în schemă microcontrolerul de tipul PIC16F887 creierul de bază pentru procesarea semnalului
analogic cât și digital. S -a ales o bază de timp externă cu tact de 20M hz folosind un cristal de
cuarț datorată unei stabilități foarte bune cu temperatura cât și execuție mai rapidă a
programului de lucru.
Observă o comunicare pe linie I2C ce deservește comunicarea cu o memorie EEPROM
de tip 24C16. Această memorie EEPROM a re un spațiu de stocare de 16kilobiti și are rolul de
a stoca valorarea de prag ale ampermetrului. Îndată ce alimentarea montajului dispare pentru
un anumit timp sau din motive tehnice memoria de tip 24C16 EEPROM cu comunicare I2C va
stoca setariile amperm etrului. La apariția alimentării primul lucru pe care îl execută
microcontrolerul este citirea de stare unor variabile din Regiștrii memoriei EEPROM și
alocarea valorilor pentru a putea lucra programul de bază la setariile inițiale.Sursa de
alimentare a ac estui montaj este una cu două tensiuni de lucru 10V și 5V ambele fiind realizate
prin stabilizare serie cu circuit integrat adecvat de tip LM7810 pentru 10V și LM7805 pentru
tensiunea de 5V. Pentru ca întreg procesul de stabilizare tensiune se recomandă al imentarea cu
aproximativ plus 3V mai mare decât tensiunea maximă pentru stabilizat. Tensiunea maximă a
montajului la intrare va fi de 13.5V pentru o stabilizare și funcționare optimă.
În schemă se observă RV2 care defapt ia locul sondei de măsură proba hal l.Acesta are
rolul de a simula o tensiune de intrare pentru microcontroler astfel încât să putem face o
simulare a funcționării realizată cu programul PROTEUS 8.
RV1 face reglajul de contrast al display -ului, iar valoarea lui este între 1Kohm -10Kohm
și nu este critică.
Universitatea Ioan Slavici pag. 51
Fig.33 Schema electrică a ampermetrului
Ledul D1 și D2 indică starea de supra curent. Acestea sunt legate la cele două ieșiri din
microcontroller pin 22 și pinul 24 ce face calea de legătură spre partea de comandă. Exemplu
de comandă poate fi un releu, un opto -triac, sau schiar un solidstate -relay pentru a întrerupe un
circuit de alimentare sau de a porni un ventilator sau climă pentru a răci sistemul.
Porturile D0 terminalul 19, D1 terminalul 20 și D2 terminalul 21 sunt legate fiecare cau câte
un rezistor de PULL -UP și sunt menținute în 1 High. Când unul din întrerupătoarele fără
reținere push -switch face trecerea prin zero și automat microcontrolerul va executa următoarele
funcții:
– K1- îndeplinește funcția de memorare a pragului și stocarea valoarei în memoria EEPROM
24c16.
– K2- execută funcția de resetare, dacă am setat un prag prea mare și vrem să revenim la o
setare nouă K3 va trece “Amp Set” pe zero, iar în meniul general Pragul va avea valoarea de
zero Amper.
Orice nouă modific are făcută, a ampermetrului se va confirma cu K1 memorarea de prag pentru
noua valoare.
Universitatea Ioan Slavici pag. 52 – K3- executa functia de iterare cu +1 din submeniu “Amp Set” acesta fiind apoi trecut ca
valoare Prag din meniul general.Aceasta are scopul de a seta nivelul exprimat in Amperi de
declansare a protectiei prin depasirea valoarei de prag setata.
Integratul U3 îndeplinește rolul de convertor de semnal logic, pentru comunicarea de
calibrare cu senzorul. Acesta este un hex -neinversor tehnologie CMOS ce face posibilă
conversi a de tensiune pentru programare. După cum cunoaștem senzorul lucrează cu 1 logic
High cu 10V și 0 logic Low cu 5V.
Rezistențele R10 și R11 cu valoarea de 330 realizează un divizor cu 2, împarte
tensiunea de 10V. Când microcontrolerul este pe 0 logic cu 0V pe terminalul 10 ,pe pinul 6
vom avea 0 Logic cu 5V datorită divizări și aproximativ 10V, iar când pe terminalul 10 al
microcontrolerului avem 1 logic 5V atunci pe ieșirea pinului 6 vom avea aproximatv 10V nivel
de 1 logic High . Această reprezintă partea de TX dinspre microcontroler spre senzor.
U3A este responsabil de transmiterea pe OBD dată,provenite de la microcontroller pri
terminalul 8. Pentru recepționarea datelor semnalul de la senzor va trece prin U3B. Ieșirea lui
U3B conține un stabilizator/limi tator de tensiune de la 10V la 5V realizat cu un rezistor cu
valoarea de 1kohm și o diodă zenner stabilizatoare de 5.1V deoarece pe ieșire aveam 10V
1logic 0 V 0 logic.
O variantă de cablaj imprimat a fost realizat folosind programul Sprint layout și este
ilustrată în Fig.34 și Fig.35.
Fig.34 Cablajul imprimat cu amplasarea componentelor
Universitatea Ioan Slavici pag. 53
Fig.35 Cablaju l vazut dinspre partea cu componente
Pentru realizarea cablajului s -a folosit tehnica press and peel toner transfer, cu ajutorul fierului
de călcat și a unei film printat la o imprimantă laser. Această s -a suprapus peste un cablaj
acoperit cu o folie de cupru și s -a depus tonerul prin transferul termin realizat cu ajutorul
fierului de călcat.Cablajul a fost apoi corodat cu clorură ferică, curățat gău rit și stanat.
4.4 Diagrama programului pentru microcontroler
În realizarea programării microcontrolerului PIC16f887 s -a utilizat programul Flow -Code v7.
După cum observăm programul principal Main Fig.36 trebuie să fie cât mai scurt și la obiect.
Pentru intiere se folosește configurația bitilor de configurare pentru microcontroler în
următoarea structură:
//Chip Configuration Settings
__PROG_CONFIG(0x1, 0x2CD1);
__PROG_CONFIG(0x2, 0x700);
Configurația aleasă este pentru clock extern cu cristal de cuarț de 20Mhz, watchdog timer
disable,iar configurația 2 0X700 reprezintă protejarea la citire ce în momentul de față este
dezactivat.
Primul lucru ce îl va rula programul este partea de Info Fig.37 , ce reprezintă un flow curgător
de caractere cu informații le gate despre dispozitiv versiune software și autor.
Universitatea Ioan Slavici pag. 54
Fig.36 Programul Main
Universitatea Ioan Slavici pag. 55
Fig.37 Info
Se executa:
Inițializare display, LCD apelare macro scroluire, și iterare cu i+1 pentru fiecare caracter pe
care îl va afișa urmat de un delay de 6ms, apoi ștergere linie de iterație.Efectul va fi un flow
curgător de caractere pe display cu un delay de 6ms pentru fiec are literă afișată și mutată. După
efectuarea comleta a iterației va ieși din buclă și se va opri 0.5s timp în care va afișa versiunea
software urmând să se întoarcă în bucla Main de unde a rămas pentru continuarea programului.
Urmează apelarea memoriei E EPROM pentru citirea valoarei de prgam memorat. Dacă nu
există nicio valoare memorată displayul va arăta implicit 255. Pentru valorile să fie redate cu
punct zecimal se execută o conversie de la Float la Strâng.
Inițializarea aparatului acum este realizată și intră în buclă principală de lucru.
Universitatea Ioan Slavici pag. 56 Se apelează un macro pentru citire senzor Fig.38 .
Fig.38 Citire senzor
Variabilă Sensor_val în care își va umple conținutul cu valoarea senzorului este resetată și
trecută pe 0, la fel și pentru variabila Sensor_avg_val ce va execută o medie aritmetică a 50 de
măsurători pentru o precizie mai bună.Urmează o buclă numărată de 50x, în care se face o
medie aritmetică a măsurătorilor.
Observăm variabila Sensor_avg_val ce este adunată cu 482, aceasta fiind o valoare de offset a
sensorului. Urmează o altă conversie a valoarei sensorului din Float în String pentru a putea
citii val orile zecimale. Avem o decizie în care elemtul negativ al sondei a fost eliminat astfel
Universitatea Ioan Slavici pag. 57 încât va face doar măsurători pozitive. Dacă senzorul nu este încastrat în miezul magnetic
valoarea va fi sub 1000 și aparatul ne va anunța să verificăm sonda, iar cicl ul se reia. Când
toate condițiile sunt îndeplinite și avem un rezultat macse va întoarce înapoi în bucla principală
Main unde va apela macro de Evenimente Fig.39 .
Aici dacă există eveniment și valoarea este mai mare decât a datei de prag setate de noi și
diferite în același timp de valoarea 0.La ieșirea porturilor D3 și C5 avem trecere prin nivel logic
0 și ledurile se vor aprinde.
Rutina se încheie aici și se reîntoarce în bucla Main unde va apela macro pentru afișare a
rezultatelor.
Fig39 Evenimente
Universitatea Ioan Slavici pag. 58
În Fig.40 este arătată afișarea pe display a rezultatelor.Se execută selecția cursorului pe care
rând să afișeze și se trece direct în string urmat de variabilă.Programul iese din această rutină
ajunge din nou în Main și va intra în rutina pentru setări
Fig.40 Afisarea rezultatelor
Universitatea Ioan Slavici pag. 59 Rutina pentru setari este ilustrata in Fig.41 .
Fig.41 Macro Setari
Universitatea Ioan Slavici pag. 60 .Rutină pentru Setări este făcută pe cazuri și urmărește trecerea prin 0 logic unuia din
cele 3 micro -intrerupatoare.
Dacă unul din contacte trece prin zero automat se execută o funcție.
Cazul 1: portul D0 trece prin 0 denumit și Switch_reset, va face resetarea unei variabile și va
afișa valoare prag 0.
Cazul 2: Portul D1 trece prin 0 denumit și Switch_set produce o incrementare cu +1 pentru
valoare afiș are prag. Dacă este ținut apăsat microcontactul bucla se reia și incrementează fără
să iasă din circuit. După întreruperea microcontactului este apelată rutina de afișare pe display
apoi se va întoarce în Main și reia bucla de la început.
Cazul 3: Portul D 2 trece prin 0 Switch_mem atunci se va apela o rutină de scriere în EEPROM
variabila Dată cu valoarea de prag seatata urmând să se facă o verificare de citire și apoi afișată
valoarea pe display.
4.5 Rezultate și concluzii
Prin realizarea acestui ampermetru am putut determina valori offset, reglaje software
cât și hardware astfel încât rezultatul să fie unul optim. Printre avantajele majore ale acestui
aparat reprezintă izolarea galvanică față de circuitul de măsurat cu o precizie foarte bună.
Există pe piață mai multe tipuri de senzori cu sunt integrat și izolare galvanică, dar
există o limitare a curentului de măsură și rata de a se defecta este foarte mare vezi Fig.42 .
Fig.42 Exemplu sensor digital cu sunt intern defect.
Senzorul de la Infin eon TLE4997 elimină acest deziderat, însă are și el un dezavantaj,
fiind dependent de miez magnetic, dimensiuni nu tocmai reduse.
Universitatea Ioan Slavici pag. 61 Pe piață a apărut acest tip de senzor prin anul 2008 pentru realizarea de noi concepte de
mașini hybride, electrice, biciclete electrice, senzori de nivel de gaz cât și pentru circuite de
protecție industriale.
Acest ampemetru realizat cu senzor Hall ratiometric este foarte util în circuitele de
măsurare, control și protecție, unde măsurarea cu alte instrumentele clasice nu permi t.
Universitatea Ioan Slavici pag. 62 Anexa cod sursa program microcontroler C++
//**************************************************************************
**********
//** Description: Circuit braker, protectie in curent continuu
//** Device: PIC.16F.16F887
#define MX_PIC
#define MX_CAL_PIC
#define MX_CLK_SPEED 20000000
#define FCP_NULL Unconnected_Port
#include <xc.h>
#include <math.h>
//Chip Configuration Settings
__PROG_CONFIG(0x1, 0x2CD1);
__PROG_CONFIG(0x2, 0x700);
/*=================================================================
=======* \
Use :Include the type definitions
\*=================================================================
=======*/
#include "C: \Program Files (x86) \Flowcode 7 \CAL \internals.c"
Universitatea Ioan Slavici pag. 63 MX_UINT8 FCLV_LOOP1;
MX_UINT8 FCLV_LOOP2;
/*=================================================================
=======* \
Use :panel
:Variable declarations
:Macro function declarations
\*=================================================================
=======*/
#define FCVsz_DATA_STRING 3
#define FCVsz_FINAL_RESULTS 6
#define FCVsz_SENSOR_DATA 20
#define FCV_FALSE (0)
#define FCV_TRUE (1)
MX_GLOBAL MX_BOOL FCV_SET = (0);
MX_GLOBAL MX_BOO L FCV_RESET = (0);
MX_GLOBAL MX_BOOL FCV_SWITCH_SET = (1);
MX_GLOBAL MX_CHAR FCV_DATA_STRING[FCVsz_DATA_STRING];
MX_GLOBAL MX_CHAR FCV_FINAL_RESULTS[FCVsz_FINAL_RESULTS];
MX_GLOBAL MX_BOOL FCV_MEM = (0);
MX_GLOBAL MX_BOOL FCV_SWITCH_MEM = (1);
MX_GLOBAL MX _BOOL FCV_SWITCH_RESET = (1);
MX_GLOBAL MX_UINT16 FCV_DATA = (0x0);
MX_GLOBAL MX_SINT16 FCV_EVENIMENT = (0);
MX_GLOBAL MX_UINT16 FCV_SENSOR_VAL = (0x0);
MX_GLOBAL MX_CHAR FCV_SENSOR_DATA[FCVsz_SENSOR_DATA];
MX_GLOBAL MX_UINT16 FCV_READ_EEPROM = (0x0);
MX_G LOBAL MX_UINT16 FCV_SENSOR_AVG_VAL = (0x0);
MX_GLOBAL MX_UINT8 FCV_I = (0x0);
Universitatea Ioan Slavici pag. 64
void FCM_Afisare_rezultate();
void FCM_Info();
void FCM_Setari();
void FCM_Sensor_Data();
void FCM_Afisare_setari();
void FCM_Evenimente();
/*=================================================================
=======* \
Use :fcdhelper
:Variable declarations
:Macro function declarations
\*=================================================================
=======*/
/*=============== ==================================================
=======* \
Use :cal_i2c1
:Variable declarations
:Macro function declarations
\*=================================================================
=======*/
#define MX_I2C_SDA_PORT_1 portc
#define MX_I2C_REF1
#define MX_I2C_1
#define MX_I2C_BMODE_1 (0)
#define MX_I2C_SDA_TRIS_1 trisc
#define MX_I2C_SCL_PIN_1 (3)
#define MX_I2C_SCL_PORT_1 portc
#define MX_I2C_STOPDEL_1 (1)
#define MX_I2C_SDA_PIN_1 (4)
Universitatea Ioan Slavici pag. 65 #define MX_I2C_SCL_TRIS_1 trisc
#define MX_ I2C_BAUD_1 (100000)
#define MX_I2C_CHANNEL_1 (1)
/*=–––––––––––––––––––––––- =*\
Use :cal_i2c1
:Supplementary defines
\*=–––––––––––––––––––––––- =*/
#define MX_MI2C
MX_GLOBAL MX_UINT32 FCV_0ae01_cal_i2c1__CONSOLE;
void FC_CAL_I2C_Slave_Uninit_1();
void FCD_0ae01_cal_i2c1__Prv_TextConsole(MX_CHAR *FCL_STR, MX_UINT16
FCLsz_STR);
void FC_CAL_I2C_Master_Stop_1();
void FC_CAL_I2C_Slave_Init_1(MX_UINT8 FCL _ADDRESS, MX_UINT8 FCL_MASK);
void FC_CAL_I2C_Master_Uninit_1();
MX_UINT8 FC_CAL_I2C_Slave_Status_1();
MX_UINT8 FC_CAL_I2C_Slave_TxByte_1(MX_UINT8 FCL_DATA);
MX_UINT8 FC_CAL_I2C_Slave_RxByte_1(MX_UINT8 FCL_LAST);
void FC_CAL_I2C_Master_Init_1();
void FC_CA L_I2C_Master_Start_1();
MX_UINT8 FC_CAL_I2C_Master_TxByte_1(MX_UINT8 FCL_DATA);
void FC_CAL_I2C_Master_Restart_1();
MX_UINT8 FC_CAL_I2C_Master_RxByte_1(MX_UINT8 FCL_LAST);
/*=================================================================
=======* \
Use :serial_24c16
Universitatea Ioan Slavici pag. 66 :Variable declarations
:Macro function declarations
\*=================================================================
=======*/
MX_UINT8 FCD_00a01_serial_24c16__Read(MX_UINT16 FCL_ADDRESS);
void FCD_00a01_serial_24c16__Write(M X_UINT16 FCL_ADDRESS, MX_UINT8
FCL_DATA);
/*=================================================================
=======* \
Use :component_label1
:Variable declarations
:Macro function declarations
\*=================================================================
=======*/
/*=================================================================
=======* \
Use :led_base
:Variable declarations
:Macro function declarations
\*================ =================================================
=======*/
void FCD_03d92_led_base__TurnOn();
void FCD_03d92_led_base__TurnOff();
/*=================================================================
=======* \
Use :component_label1
:Variable declar ations
:Macro function declarations
\*=================================================================
=======*/
Universitatea Ioan Slavici pag. 67
/*=================================================================
=======* \
Use :led_base
:Variable declarations
:Mac ro function declarations
\*=================================================================
=======*/
void FCD_03d91_led_base__TurnOn();
void FCD_03d91_led_base__TurnOff();
/*=================================================================
=======* \
Use :fcdhelper
:Variable declarations
:Macro function declarations
\*=================================================================
=======*/
/*=================================================================
=======* \
Use :cal_adc
:Variable declarations
:Macro function declarations
\*=================================================================
=======*/
#define ADC_1_MX_ADC_ACTIME 40
#define MX_ADC_REF
#define ADC_1_MX_ADC_VREFVOL 500
#define MX_ADC_CHANNEL_0
#define MX_ADC_TYPE_7
#define ADC_1_MX_ADC_VREFOP 0
Universitatea Ioan Slavici pag. 68 #define ADC_1_MX_ADC_CONVSP 3
#define MX_ADC_BITS_10
#define ADC_1_MX_ADC_CHANNEL 0
#define FCV_0aae1_cal_adc__FALSE (0)
#define FCV_0aae1_cal_adc__TRUE (1)
void FC_CAL_ADC_Disable();
void FC_CAL_ADC_Enab le(MX_UINT8 FCL_CHANNEL, MX_UINT8
FCL_CONV_SPEED, MX_UINT8 FCL_VREF, MX_UINT8 FCL_T_CHARGE);
MX_UINT16 FC_CAL_ADC_Sample(MX_UINT8 FCL_SAMPLE_MODE);
/*=================================================================
=======* \
Use :adc_base
:Variable declarations
:Macro function declarations
\*=================================================================
=======*/
MX_UINT16 FCD_08f41_adc_base__RawSampleInt();
MX_UINT8 FCD_08f41_adc_base__RawAverageByte(MX_UINT8 FCL_NUMSAMPLES ,
MX_UINT8 FCL_DELAYUS);
void FCD_08f41_adc_base__GetString(MX_CHAR *FCR_RETVAL, MX_UINT16
FCRsz_RETVAL);
MX_UINT8 FCD_08f41_adc_base__GetAverageByte(MX_UINT8 FCL_NUMSAMPLES,
MX_UINT8 FCL_DELAYUS);
MX_SINT16 FCD_08f41_adc_base__RawAverageInt(MX_UINT8 FCL_N UMSAMPLES,
MX_UINT8 FCL_DELAYUS);
MX_UINT16 FCD_08f41_adc_base__GetAverageInt(MX_UINT8 FCL_NUMSAMPLES,
MX_UINT8 FCL_DELAYUS);
MX_FLOAT FCD_08f41_adc_base__GetVoltage();
void FCD_08f41_adc_base__RawEnable();
MX_UINT8 FCD_08f41_adc_base__RawSampleByte();
Universitatea Ioan Slavici pag. 69 MX_ UINT16 FCD_08f41_adc_base__GetInt();
void FCD_08f41_adc_base__RawDisable();
MX_UINT8 FCD_08f41_adc_base__GetByte();
/*=================================================================
=======* \
Use :slider_plastic1
:Variable declarations
:Macro function declarations
\*=================================================================
=======*/
#define FCD_0d101_slider_plastic1__RawSampleInt FCD_08f41_adc_base__RawSampleInt
#define FCD_0d101_slider_plastic1__RawAverageByte
FCD_08f41_adc_base__ RawAverageByte
#define FCD_0d101_slider_plastic1__GetString FCD_08f41_adc_base__GetString
#define FCD_0d101_slider_plastic1__GetAverageByte
FCD_08f41_adc_base__GetAverageByte
#define FCD_0d101_slider_plastic1__RawAverageInt
FCD_08f41_adc_base__RawAverageIn t
#define FCD_0d101_slider_plastic1__GetAverageInt FCD_08f41_adc_base__GetAverageInt
#define FCD_0d101_slider_plastic1__GetVoltage FCD_08f41_adc_base__GetVoltage
#define FCD_0d101_slider_plastic1__RawEnable FCD_08f41_adc_base__RawEnable
#define FCD_0d101_slider_plastic1__RawSampleByte
FCD_08f41_adc_base__RawSampleByte
#define FCD_0d101_slider_plastic1__GetInt FCD_08f41_adc_base__GetInt
#define FCD_0d101_slider_plastic1__RawDisable FCD_08f41_adc_base__RawDisable
#define FCD_0d101_slider_plastic1__ GetByte FCD_08f41_adc_base__GetByte
/*=================================================================
=======* \
Use :ButtonCtrl
:Variable declarations
:Macro function declarations
Universitatea Ioan Slavici pag. 70 \*======================================================= ==========
=======*/
/*=================================================================
=======* \
Use :switch_base
:Variable declarations
:Macro function declarations
\*=================================================================
===== ==*/
MX_UINT8 FCD_05263_switch_base__ReadState();
void FCD_05263_switch_base__WaitUntilHigh();
void FCD_05263_switch_base__WaitUntilLow();
/*=================================================================
=======* \
Use :ButtonCtrl
:Variable dec larations
:Macro function declarations
\*=================================================================
=======*/
/*=================================================================
=======* \
Use :switch_base
:Variable declarations
:Macro function declarations
\*=================================================================
=======*/
MX_UINT8 FCD_05262_switch_base__ReadState();
void FCD_05262_switch_base__WaitUntilHigh();
void FCD_05262_switch_base__WaitUntilLow();
Universitatea Ioan Slavici pag. 71 /*====== ===========================================================
=======* \
Use :ButtonCtrl
:Variable declarations
:Macro function declarations
\*=================================================================
=======*/
/*====================== ===========================================
=======* \
Use :switch_base
:Variable declarations
:Macro function declarations
\*=================================================================
=======*/
MX_UINT8 FCD_05261_switch_base__ReadStat e();
void FCD_05261_switch_base__WaitUntilHigh();
void FCD_05261_switch_base__WaitUntilLow();
/*=================================================================
=======* \
Use :ctrl_lcd
:Variable declarations
:Macro function declarations
\*=================================================================
=======*/
/*=================================================================
=======* \
Use :LCD
:Variable declarations
:Macro function declarations
Universitatea Ioan Slavici pag. 72 \*=================================================================
=======*/
void FCD_04071_LCD__Clear();
void FCD_04071_LCD__PrintString(MX_CHAR *FCL_TEXT, MX_UINT16
FCLsz_TEXT);
void FCD_04071_LCD__PrintAscii(MX_UINT8 FCL_CHARACTER);
void FCD_04071_LCD__ PrintNumber(MX_SINT16 FCL_NUMBER);
void FCD_04071_LCD__RAMWrite(MX_UINT8 FCL_INDEX, MX_UINT8 FCL_D0,
MX_UINT8 FCL_D1, MX_UINT8 FCL_D2, MX_UINT8 FCL_D3, MX_UINT8 FCL_D4,
MX_UINT8 FCL_D5, MX_UINT8 FCL_D6, MX_UINT8 FCL_D7);
void FCD_04071_LCD__ClearLine(MX_UI NT8 FCL_LINE);
void FCD_04071_LCD__Cursor(MX_UINT8 FCL_X, MX_UINT8 FCL_Y);
void FCD_04071_LCD__Command(MX_UINT8 FCL_INSTRUCTION);
void FCD_04071_LCD__PrintFormattedNumber(MX_UINT32 FCL_NUMBER,
MX_BOOL FCL_FORMAT);
void FCD_04071_LCD__ScrollDisplay(MX_UINT8 FCL_POSITION, MX_UINT8
FCL_DIRECTION);
void FCD_04071_LCD__RawSend(MX_UINT8 FCL_DATA, MX_BOOL FCL_TYPE);
void FCD_04071_LCD__RemapCharacter(MX_UINT8 FCL_REMAPIDX, MX_UINT8
FCL_SEARCHCHARACTER, MX_UINT8 FCL_REPLACEMENTCHARACTER);
void FCD_04071_LCD__Start( );
/*=================================================================
=======* \
Use :lcd_eb005
:Variable declarations
:Macro function declarations
\*=================================================================
=======*/
#define FCD_0a d31_lcd_eb005__Clear FCD_04071_LCD__Clear
#define FCD_0ad31_lcd_eb005__PrintString FCD_04071_LCD__PrintString
#define FCD_0ad31_lcd_eb005__PrintAscii FCD_04071_LCD__PrintAscii
#define FCD_0ad31_lcd_eb005__PrintNumber FCD_04071_LCD__PrintNumber
#define FCD_ 0ad31_lcd_eb005__RAMWrite FCD_04071_LCD__RAMWrite
Universitatea Ioan Slavici pag. 73 #define FCD_0ad31_lcd_eb005__ClearLine FCD_04071_LCD__ClearLine
#define FCD_0ad31_lcd_eb005__Cursor FCD_04071_LCD__Cursor
#define FCD_0ad31_lcd_eb005__Command FCD_04071_LCD__Command
#define FCD_0ad31_lcd_eb005__PrintFormattedNumber
FCD_04071_LCD__PrintFormattedNumber
#define FCD_0ad31_lcd_eb005__ScrollDisplay FCD_04071_LCD__ScrollDisplay
#define FCD_0ad31_lcd_eb005__RawSend FCD_04071_LCD__RawSend
#define FCD_0ad31_lcd_eb005__RemapCharacter FC D_04071_LCD__RemapCharacter
#define FCD_0ad31_lcd_eb005__Start FCD_04071_LCD__Start
/*=================================================================
=======* \
Use :Include the chip adaption layer
\*==================================================== =============
=======*/
#include "C: \Program Files (x86) \Flowcode 7 \CAL \includes.c"
/*=================================================================
=======* \
Use :fcdhelper
:Macro implementations
\*============================================ =====================
=======*/
/*=================================================================
=======* \
Use :cal_i2c1
:Macro implementations
\*=================================================================
=======*/
/*=––––––– ––––––––––––––––– =*\
Use :Send text to the console
Universitatea Ioan Slavici pag. 74 :
:Parameters for macro Prv_TextConsole:
: str[20] : MX_CHAR (by -ref)
\*=–––––––––––––––––––––––- =*/
void FCD_0ae01_cal_i2c1__Prv_TextConsole(MX_CHAR *FCL_STR, MX_UINT16
FCLsz_STR)
{
}
/*=================================================================
=======* \
Use :serial_24c16
:Macro implementations
\*====================================== ===========================
=======*/
/*=–––––––––––––––––––––––- =*\
Use :Read and return the value of the EEPROM at the given address
:
:Parameters for macro Read:
: address : MX_UINT16
:
:Returns : MX_UINT8
\*=–––––––––––––––––––––––- =*/
MX_UINT8 FCD_00a01_serial_24c16__Read(MX_UINT16 FCL_ADDRESS)
{
//Local variable definitions
MX_UINT8 FCR_RETVAL;
Universitatea Ioan Slavici pag. 75
FC_CAL_I2C_Mast er_Init_1();
FC_CAL_I2C_Master_Start_1();
FC_CAL_I2C_Master_TxByte_1(160 + (((0 & 7) | (FCL_ADDRESS >> 8)) << 1));
FC_CAL_I2C_Master_TxByte_1(FCL_ADDRESS);
FC_CAL_I2C_Master_Restart_1();
FC_CAL_I2C_Master_TxByte_1(161 + (((0 & 7) | (FCL_ADDRESS >> 8)) << 1));
FCR_RETVAL = FC_CAL_I2C_Master_RxByte_1(1);
FC_CAL_I2C_Master_Stop_1();
FC_CAL_I2C_Master_Uninit_1();
return (FCR_RETVAL);
}
/*=–––––––––––––––––––––––- =*\
Use :Write the given data value to the EEPROM at the given address
:
:Parameters for macro Write:
: address : MX_UINT16
: data : MX_UINT8
\*=–––––––––––––––––––––––- =*/
Universitatea Ioan Slavici pag. 76 void F CD_00a01_serial_24c16__Write(MX_UINT16 FCL_ADDRESS, MX_UINT8
FCL_DATA)
{
FC_CAL_I2C_Master_Init_1();
FC_CAL_I2C_Master_Start_1();
FC_CAL_I2C_Master_TxByte_1(160 + (((0 & 7) | (FCL_ADDRESS >> 8)) << 1));
FC_CAL_I2C_Master_TxByte_1(FCL_ADDRESS);
FC_CAL_I2C_Master_TxByte_1(FCL_DATA);
FC_CAL_I2C_Master_Stop_1();
FC_CAL_I2C_Master_Uninit_1();
}
/*=================================================================
=======* \
Use :component_ label1
:Macro implementations
\*=================================================================
=======*/
/*=================================================================
=======* \
Use :led_base
:Macro implementations
Universitatea Ioan Slavici pag. 77 \*=============== ==================================================
=======*/
/*=–––––––––––––––––––––––- =*\
Use :Turn the LED off.
\*=–––––––––––––––––––––––- =*/
void FCD_03d92_l ed_base__TurnOn()
{
#if (1)
FCP_SET(B, C, 0x20, 0x5, 1);
// #else
//Code has been optimised out by the pre -processor
#endif
}
/*=–––––––––––––––––––––––- =*\
Use :Turn the LED on.
\*=–––––––––––––––––––––––- =*/
void FCD_03d92_led_base__TurnOff()
{
#if (1)
FCP_SET(B, C, 0x20, 0x5, 1 – 1);
// #else
Universitatea Ioan Slavici pag. 78 //Code has been optimised out by the pre -processor
#endif
}
/*=================================================================
=======* \
Use :component_label1
:Macro implementations
\*=================================================================
=======*/
/*=================================================================
=======* \
Use :led_base
:Macro implementations
\*=================================================================
=======*/
/*=–––––––––––––––––- –––––– =*\
Use :Turn the LED off.
\*=–––––––––––––––––––––––- =*/
void FCD_03d91_led_base__TurnOn()
{
#if (1)
FCP_SET(B, D, 0x8, 0x3, 1);
// #else
//Code has been optimised out by the pre -processor
Universitatea Ioan Slavici pag. 79 #endif
}
/*=–––––––––––––––––––––––- =*\
Use :Turn the LED on.
\*=–––––––––––––––––––––––- =*/
void FCD_03d91_led_base__TurnOff()
{
#if (1)
FCP_SET(B, D, 0x8, 0x3, 1 – 1);
// #else
//Code has been optimised out by the pre -processor
#endif
}
/*=================================================================
=======* \
Use :fcdhelper
:Macro impleme ntations
\*=================================================================
=======*/
/*=================================================================
=======* \
Universitatea Ioan Slavici pag. 80 Use :cal_adc
:Macro implementations
\*============================================ =====================
=======*/
/*=================================================================
=======* \
Use :adc_base
:Macro implementations
\*=================================================================
=======*/
/*=–––––––––––––––––––––––- =*\
Use :Background call to read the ADC at full bit depth
:Call Enable() first
:
:Returns : MX_UINT16
\*=–––––––––––––––––– –––––– =*/
MX_UINT16 FCD_08f41_adc_base__RawSampleInt()
{
//Local variable definitions
MX_UINT16 FCR_RETVAL;
FCR_RETVAL = FC_CAL_ADC_Sample(1);
return (FCR_RETVAL);
}
/*=––––––––––––––––––- ––––– =*\
Use :Background call to read the ADC as a byte average sample over time
Universitatea Ioan Slavici pag. 81 :Call Enable() before this
:
:Parameters for macro RawAverageByte:
: NumSamples : MX_UINT8
: DelayUs : Number of micro second s in between taking each sample
:
:Returns : MX_UINT8
\*=–––––––––––––––––––––––- =*/
MX_UINT8 FCD_08f41_adc_base__RawAverageByte(MX_UINT8 FCL_NUMSAMPLES,
MX_UINT8 FCL_DELAYUS)
{
//Local variable definitions
MX_UINT16 FCL_AVERAGE = (0x0);
MX_UINT8 FCL_COUNT = (0x0);
MX_UINT8 FCR_RETVAL;
if (FCL_DELAYUS > 0)
{
while (FCL_COUNT < FCL_NUMSAMPLES)
{
FC_CAL_ADC_Enable(0, 3, 0, FCL_ DELAYUS);
FCL_AVERAGE = FCL_AVERAGE + FC_CAL_ADC_Sample(0);
FCL_COUNT = FCL_COUNT + 1;
}
Universitatea Ioan Slavici pag. 82 } else {
while (FCL_COUNT < FCL_NUMSAMPLES)
{
FC_CAL_ADC_Enable(0, 3, 0, 40);
FCL_AVERAGE = FCL_AVERAGE + FC_CAL_ADC_Sample(0);
FCL_COUNT = FCL_COUNT + 1;
}
}
FCR_RETVAL = FCL_AVERAGE / FCL_COUNT;
return (FCR_RETVAL);
}
/*=–––––––––––––––––––– –––- =*\
Use :Reads the ADC as a direct voltage and returns as as tring
:
:Returns : MX_CHAR*
\*=–––––––––––––––––––––––- =*/
void FCD_08f41_adc_base__GetString(MX_CHAR *FCR_RETVAL, MX_UINT 16
FCRsz_RETVAL)
{
//Local variable definitions
MX_FLOAT FCL_SAMPLE;
Universitatea Ioan Slavici pag. 83
FCL_SAMPLE = FCD_08f41_adc_base__GetVoltage();
FCI_FLOAT_TO_STRING(FCL_SAMPLE, FCV_PRECISION, FCR_RETVAL,
FCRsz_RETVAL);
}
/*=–––––––––––––––––––––––- =*\
Use :Function call to read the ADC as a byte average sample over time
:
:Parameters for macro GetAverageByte:
: NumSamples : MX_UINT8
: DelayUs : Number of micro seconds in between taking each sample
:
:Returns : MX_UINT8
\*=–––––––––––––––––––––––- =*/
MX_UINT8 FCD_08f41_adc_base__GetAverageByte(MX_UINT8 FCL_NUMSAMPLES,
MX_UINT8 FCL_DELAYUS )
{
//Local variable definitions
MX_UINT8 FCR_RETVAL;
FCR_RETVAL = FCD_08f41_adc_base__RawAverageByte(FCL_NUMSAMPLES,
FCL_DELAYUS);
FC_CAL_ADC_Disable();
return (FCR_RETVAL);
Universitatea Ioan Slavici pag. 84
}
/*=––––––––––––––––– ––––––– =*\
Use :Background call to read the ADC as a full width average sample over time
:Call Enable() before this
:
:Parameters for macro RawAverageInt:
: NumSamples : MX_UINT8
: DelayUs : MX_UINT8
:
:Returns : MX_SINT16
\*=–––––––––––––––––––––––- =*/
MX_SINT16 FCD_08f41_adc_base__RawAverageInt(MX_UINT8 FCL_NUMSAMPLES,
MX_UINT8 FCL_DELAYUS)
{
//Local variable definitions
MX_UINT32 FC L_AVERAGE = (0x0);
MX_UINT8 FCL_COUNT = (0x0);
MX_SINT16 FCR_RETVAL;
if (FCL_DELAYUS > 0)
{
while (FCL_COUNT < FCL_NUMSAMPLES)
{
FC_CAL_ADC_Enable(0, 3, 0, FCL_DELAYUS);
FCL_AVERAGE = FCL_AVERAGE + FC_CAL_ADC_Sample(1);
Universitatea Ioan Slavici pag. 85 FCL_COUNT = FCL_COUNT + 1;
}
} else {
while (FCL_COUNT < FCL_NUMSAMPLES)
{
FC_CAL_ADC_Enable(0, 3, 0, 40);
FCL_AVERAGE = FCL_AVERAGE + FC_CAL_ADC_Sample(1);
FCL_COUNT = FCL_COUNT + 1;
}
}
FCR_RETVAL = FCL_AVERAGE / FCL_COUNT;
return (FCR_RETVAL);
}
/*=–––––––––––––––––––––––- =*\
Use :Function call to read the ADC as a full width average sample over time
:
:Parameters for macro GetAverageInt:
Universitatea Ioan Slavici pag. 86 : NumSamples : MX_UINT8
: DelayUs : Number of micro seconds in between taking each sample
:
:Returns : MX_UINT16
\*=–––––––––––––––––––––––- =*/
MX_UINT16 FCD_08f41_adc_base__GetAverageInt(MX_UINT8 FCL_NUMSAMPLES,
MX_UINT8 FCL_DELAYUS)
{
//Local variable definitions
MX_UINT16 FCR_RETVAL;
FCR_RETVAL = FCD_08f4 1_adc_base__RawAverageInt(FCL_NUMSAMPLES,
FCL_DELAYUS);
FC_CAL_ADC_Disable();
return (FCR_RETVAL);
}
/*=–––––––––––––––––––––––- =*\
Use :Reads the ADC as a direct voltage
:
:Returns : MX_FLOAT
\*=–––––––––––––––––––––––- =*/
MX_FLOAT FCD_08f41_adc_base__GetVoltage()
{
//Local variable definitions
MX_UINT16 FCL_SAMPLE;
MX_FLOAT FCR_RETVAL;
Universitatea Ioan Slavici pag. 87
FC_CAL_ADC_Enable(0, 3, 0, 40);
FCL_SAMPLE = FC_CAL_ADC_Sample(1);
FCR_RETVAL = flt_mul(flt_fromi(FCL_SAMPLE), 0.004883);
FC_CAL_ADC_Disable();
return (FCR_RETVAL);
}
/*=–––––––––––––––––––––––- =*\
Use :Enables and con figures the ADC channel to be an analogue input.
:Only one ADC channel can be enabled at a time. Any RAW functions will reference the
last enabled channel only.
\*=–––––––––––––––––––––––- =*/
void FCD_08 f41_adc_base__RawEnable()
{
FC_CAL_ADC_Enable(0, 3, 0, 40);
}
/*=–––––––––––––––––––––––- =*\
Use :Background call to read the ADC as a byte
:Call Enable() before this
:
:Returns : MX_UINT8
Universitatea Ioan Slavici pag. 88 \*=–––––––––––––––––––––––- =*/
MX_UINT8 FCD_08f41_adc_base__RawSampleByte()
{
//Local variable definitions
MX_UINT8 FCR_RETVAL;
FCR_RETVAL = FC_CAL_ADC_Sample(0);
return (FCR_RETVAL);
}
/*=–––––––––––––––––––––––- =*\
Use :Blocking call to read the ADC at full bit depth
:
:Returns : MX_UINT16
\*=–––––––––––––––––– –––––- =*/
MX_UINT16 FCD_08f41_adc_base__GetInt()
{
//Local variable definitions
MX_UINT16 FCR_RETVAL;
FC_CAL_ADC_Enable(0, 3, 0, 40);
FCR_RETVAL = FC_CAL_ADC_Sample(1);
FC_CAL_ADC_Disable();
Universitatea Ioan Slavici pag. 89 return (FCR_RETVAL);
}
/*=–––––––––––––––––––––––- =*\
Use :Disables the previously enabled ADC channel and converts back to digital mode.
\*=–––––––––––––––––––––––- =*/
void FCD_08f41_ adc_base__RawDisable()
{
FC_CAL_ADC_Disable();
}
/*=–––––––––––––––––––––––- =*\
Use :Blocking call to read the ADC as a byte
:
:Returns : MX_UINT8
\*=–––––––––––– –––––––––––- =*/
MX_UINT8 FCD_08f41_adc_base__GetByte()
{
//Local variable definitions
MX_UINT8 FCR_RETVAL;
FC_CAL_ADC_Enable(0, 3, 0, 40);
FCR_RETVAL = FC_CAL_ADC_Sample(0);
FC_CAL_ADC_Disable();
Universitatea Ioan Slavici pag. 90
return (FCR_RETVAL);
}
/*=================================================================
=======* \
Use :slider_plastic1
:Macro implementations
\*=================================================================
=======*/
/*=============== ==================================================
=======* \
Use :ButtonCtrl
:Macro implementations
\*=================================================================
=======*/
/*=================================================================
=======* \
Use :switch_base
:Macro implementations
\*=================================================================
=======*/
/*=–––––––––––––––––––––––- =*\
Use :Reads the button state as 0 for rele ased or 1 for pressed
:Performs debounce if required
:
:Returns : MX_UINT8
\*=–––––––––––––––––––––––- =*/
Universitatea Ioan Slavici pag. 91 MX_UINT8 FCD_05263_switch_base__ReadState()
{
//Local variable definitions
MX_UINT16 FCL_DEL_COUNT;
MX_UINT8 FCL_OLD_SWITCHVAL;
MX_UINT8 FCR_RETVAL;
#if (1)
if (1 != FCP_GET(B, D, 0x4, 0x2))
{
FCR_RETVAL = 1;
} else {
FCR_RETVAL = 0;
}
FCL_DEL_COUNT = 0;
FCL_OLD_SWITCHVAL = FCR_RETVAL;
#if (1) // 10 > 0
while (FCL_DEL_COUNT < 10)
{
FCI_DELAYBYTE_MS(1);
Universitatea Ioan Slavici pag. 92
if (1 != FCP_GET(B, D, 0x4, 0x2))
{
FCR_RETVAL = 1;
} else {
FCR_RETVAL = 0;
}
if (FCR_RETVAL == FCL_OLD_SWITCHVAL)
{
FCL_DEL_COUNT = FCL_DEL_COUNT + 1;
} else {
FCL_DEL_COUNT = 0;
}
FCL_OLD_SWITCHVAL = FCR_RETVAL;
}
// #else
Universitatea Ioan Slavici pag. 93 //Code has been optimised out by the pre -processor
#endif
#else
//Code has been optimised out by the pre -processor
#endif
return (FCR_RETVAL);
}
/*=–––––––––––––––––––––––- =*\
Use :Waits until the switch is in state 'high'
:The interpretation of 'hi gh' depends on the polarity
\*=–––––––––––––––––––––––- =*/
void FCD_05263_switch_base__WaitUntilHigh()
{
//Local variable definitions
MX_UINT8 FCL_SWITCHVAL = (0xff); // The state of the pin
MX_UINT 16 FCL_DEL_COUNT;
MX_UINT8 FCL_OLD_SWITCHVAL;
#if (1)
while (1)
{
FCL_SWITCHVAL = FCP_GET(B, D, 0x4, 0x2);
Universitatea Ioan Slavici pag. 94
#if (1) // 1 == 1
FCL_SWITCHVAL = !FCL_SWITCHVAL;
// #else
//Code has been optimised out by the pre -processor
#endif
FCL_DEL_COUNT = 0;
FCL_OLD_SWITCHVAL = FCL_SWITCHVAL;
#if (1) // 10 > 0
while (FCL_DEL_COUNT < 10)
{
FCI_DELAYBYTE_MS(1);
FCL_SWITCHVAL = FCP_GET(B, D, 0x4, 0x2);
#if (1) // 1 == 1
FCL_SWITCHVAL = !FCL_SWITCHVAL;
// #else
//Code has been optimised out by the pre -processor
#endif
Universitatea Ioan Slavici pag. 95
if (FCL_SWITCHVAL == FCL_OLD_SWITCHVAL)
{
FCL_DEL_COUNT = FCL_DEL_COUNT + 1;
} else {
FCL_DEL_COUNT = 0;
}
FCL_OLD_SWITCHVAL = FCL_SWITCHVAL;
}
// #else
//Code has been optimised out by the pre -processor
#endif
if ((FCL_SWITCHVAL == 1) == 0) break;
}
// #else
//Code has been optimised out by the pre -processor
#endif
Universitatea Ioan Slavici pag. 96
}
/*=–––––––––––––––––––––––- =*\
Use :Waits until the switch is in state 'low'
:The interpretation of 'high' depends on the polarity
\*=–––––––––––––––––––––––- =*/
void FCD_05263_switch_base__WaitUntilLow()
{
//Local variable def initions
MX_UINT8 FCL_SWITCHVAL; // The state of the pin
MX_UINT16 FCL_DEL_COUNT;
MX_UINT8 FCL_OLD_SWITCHVAL;
#if (1)
while (1)
{
FCL_SWITCHVAL = FCP_GET(B, D, 0x4, 0x2);
#if (1) // 1 == 1
FCL_SWITCHVAL = !FCL_SWITCHVAL;
// #else
//Code has been optimised out by the pre -processor
#endif
Universitatea Ioan Slavici pag. 97
FCL_DEL_COUNT = 0;
FCL_OLD_SWITCHVAL = FCL_SWITCHVAL;
#if (1) // 10 > 0
while (FCL_DEL_COUNT < 10)
{
FCI_DELAYBYTE_MS(1);
FCL_SWITCHVAL = FCP_GET(B, D, 0x4, 0x2);
#if (1) // 1 == 1
FCL_SWITCHVAL = !FCL_SW ITCHVAL;
// #else
//Code has been optimised out by the pre -processor
#endif
if (FCL_SWITCHVAL == FCL_OLD_SWITCHVAL)
{
FCL_DEL_CO UNT = FCL_DEL_COUNT + 1;
} else {
FCL_DEL_COUNT = 0;
Universitatea Ioan Slavici pag. 98
}
FCL_OLD_SWITCHVAL = FCL_SWITCHVAL;
}
// #else
//Code has been optimised out by the pre -processor
#endif
if ((FCL_SWITCHVAL != 1) == 0) break;
}
// #else
//Code has been optimised out by the pre -processor
#endif
}
/*======================== =========================================
=======* \
Use :ButtonCtrl
:Macro implementations
\*=================================================================
=======*/
Universitatea Ioan Slavici pag. 99
/*=================================================================
=======* \
Use :switch_base
:Macro implementations
\*=================================================================
=======*/
/*=–––––––––––––––––––––––- =*\
Use :Reads the button state as 0 for released or 1 for pressed
:Performs debounce if required
:
:Returns : MX_UINT8
\*=–––––––––––––––––––––––- =*/
MX_UINT8 FCD_05262_switch_base__ReadState()
{
//Local variable definitions
MX_UINT1 6 FCL_DEL_COUNT;
MX_UINT8 FCL_OLD_SWITCHVAL;
MX_UINT8 FCR_RETVAL;
#if (1)
if (1 != FCP_GET(B, D, 0x1, 0x0))
{
FCR_RETVAL = 1;
} else {
FCR_RETVAL = 0;
Universitatea Ioan Slavici pag. 100
}
FCL_DEL_COUNT = 0;
FCL_OLD_SWITCHVAL = FCR_RETVAL;
#if (1) // 10 > 0
while (FCL_DEL_COUNT < 10)
{
FCI_DELAYBYTE_MS(1);
if (1 != FCP_GET(B, D, 0x1, 0x0))
{
FCR_RET VAL = 1;
} else {
FCR_RETVAL = 0;
}
if (FCR_RETVAL == FCL_OLD_SWITCHVAL)
{
FCL_DEL_COUNT = FCL_DEL_COUNT + 1;
} else {
Universitatea Ioan Slavici pag. 101
FCL_DEL_COUNT = 0;
}
FCL_OLD_SWITCHVAL = FCR_RETVAL;
}
// #else
//Code has been optimised out by the pre -processor
#endif
#else
//Code has been optimise d out by the pre -processor
#endif
return (FCR_RETVAL);
}
/*=–––––––––––––––––––––––- =*\
Use :Waits until the switch is in state 'high'
:The interpretation of 'high' depends on the polarity
\*=–––––––––––––––––––––––- =*/
void FCD_05262_switch_base__WaitUntilHigh()
{
Universitatea Ioan Slavici pag. 102 //Local variable definitions
MX_UINT8 FCL_SWITCHVAL = (0xff); // The state of the pin
MX_UINT16 FCL_DEL_COUNT;
MX_UIN T8 FCL_OLD_SWITCHVAL;
#if (1)
while (1)
{
FCL_SWITCHVAL = FCP_GET(B, D, 0x1, 0x0);
#if (1) // 1 == 1
FCL_SWITCHVAL = !FCL_SWITCHVAL;
// #else
//Code has been optimi sed out by the pre -processor
#endif
FCL_DEL_COUNT = 0;
FCL_OLD_SWITCHVAL = FCL_SWITCHVAL;
#if (1) // 10 > 0
while (FCL_DEL_COUNT < 10)
{
Universitatea Ioan Slavici pag. 103 FCI_DELAYBYTE_MS(1);
FCL_SWITCHVAL = FCP_GET(B, D, 0x1, 0x0);
#if (1) // 1 == 1
FCL_SWITCHVAL = !FCL_SWITCHVAL;
// #else
//Code has been optimised out by the pre -processor
#endif
if (FCL_SWITCHVAL == FCL_OLD_SWITCHVAL)
{
FCL_DEL_COUNT = FCL_DEL_COUNT + 1;
} else {
FCL_DEL_COUNT = 0;
}
FCL_OLD_SWITCHVAL = FCL_SWITCHVAL;
}
// #else
Universitatea Ioan Slavici pag. 104
//Code has been optimised out by the pre -processor
#endif
if ((FCL_SWITCHVAL == 1) == 0) break;
}
// #else
//Code has been optimised out by the pre -processor
#endif
}
/*=–––––––––––––––––––––––- =*\
Use :Waits until the switch is in state 'low'
:The interpretation of 'high' depends on the polarity
\*=–––––––––––––––––––––––- =*/
void FCD_05262_switch_base__WaitUntilLow()
{
//Local variable definitions
MX_UINT8 FCL_SWITCHVAL; // The state of the pin
MX_UINT16 FCL_DEL_COUNT;
MX_UINT8 FCL_OLD_SWITCHVAL;
#if (1)
while (1)
Universitatea Ioan Slavici pag. 105 {
FCL_SWITCHVAL = FCP_GET(B, D, 0x1, 0x0);
#if (1) // 1 == 1
FCL_SWITCHVAL = !FCL_SWITCHVAL;
// #else
//Code has been optimised out by the pre -processor
#endif
FCL_DEL_COUNT = 0;
FCL_OLD_SWITCHVAL = FCL_SWITCHVAL;
#if (1) // 10 > 0
while (FCL_DEL_COUNT < 10)
{
FCI_DELAYBYTE_MS(1);
FCL_SWITCHVAL = FCP_GET(B, D, 0x1, 0x0);
#if (1) // 1 == 1
FCL_SWITCHVAL = !FCL_SWITCHVAL;
// #else
Universitatea Ioan Slavici pag. 106
//Code has been optimised out by the pre -processor
#endif
if (FCL_SWITCHVAL == FCL_OLD_SWITCHVAL)
{
FCL_DEL_COUNT = FCL_ DEL_COUNT + 1;
} else {
FCL_DEL_COUNT = 0;
}
FCL_OLD_SWITCHVAL = FCL_SWITCHVAL;
}
// #else
//Code has been optimised out by the pre -processor
#endif
if ((FCL_SWITCHVAL != 1) == 0) break;
}
// #else
Universitatea Ioan Slavici pag. 107
//Code has been optimised out by the pre -processor
#endif
}
/*======================== =========================================
=======* \
Use :ButtonCtrl
:Macro implementations
\*=================================================================
=======*/
/*=================================================================
=======* \
Use :switch_base
:Macro implementations
\*=================================================================
=======*/
/*=–––––––––––––––––––––––- =*\
Use :Reads the button state as 0 for released or 1 for pressed
:Performs debounce if required
:
:Returns : MX_UINT8
\*=–––––––––––––––––––––––- =*/
MX_UINT8 FCD_05261_switch_base__ReadState()
{
//Local variable definitions
MX_UINT16 FCL_DEL_COUNT;
MX_UINT8 FCL_OLD_SWITCHVAL;
MX_UINT8 FCR_RETVAL;
Universitatea Ioan Slavici pag. 108
#if (1)
if (1 != FCP_GET(B, D, 0x2, 0x1))
{
FCR_RETVAL = 1;
} else {
FCR_RETVAL = 0;
}
FCL_DEL _COUNT = 0;
FCL_OLD_SWITCHVAL = FCR_RETVAL;
#if (1) // 10 > 0
while (FCL_DEL_COUNT < 10)
{
FCI_DELAYBYTE_MS(1);
if (1 != FCP_GET(B, D, 0x2, 0x1))
{
FCR_RETVAL = 1;
Universitatea Ioan Slavici pag. 109 } else {
FCR_RETVAL = 0;
}
if (FCR_RETVAL == FCL_OLD_SWITCHVAL)
{
FCL_DEL_COUNT = FCL_DEL_COUNT + 1;
} else {
FCL_DEL_COUNT = 0;
}
FCL_OLD_SWITCHVAL = FCR_RETVAL;
}
// #else
//Code has been optimised out by the pre -processor
#endif
#else
//Code has been optimised out by the pre -processor
Universitatea Ioan Slavici pag. 110 #endif
return (FCR_RETVAL);
}
/*=–––––––––––––––––––––––- =*\
Use :Waits until the switch is in state 'high'
:The interpretation of 'hi gh' depends on the polarity
\*=–––––––––––––––––––––––- =*/
void FCD_05261_switch_base__WaitUntilHigh()
{
//Local variable definitions
MX_UINT8 FCL_SWITCHVAL = (0xff); // The state of the pin
MX_UINT 16 FCL_DEL_COUNT;
MX_UINT8 FCL_OLD_SWITCHVAL;
#if (1)
while (1)
{
FCL_SWITCHVAL = FCP_GET(B, D, 0x2, 0x1);
#if (1) // 1 == 1
FCL_SWITCHVAL = !FCL_SWITCHVAL;
// #else
Universitatea Ioan Slavici pag. 111
//Code has been optimised out by the pre -processor
#endif
FCL_DEL_COUNT = 0;
FCL_OLD_SWITCHVAL = FCL_SWITCHVAL;
#if (1) // 10 > 0
while (FCL_DEL_COUNT < 10)
{
FCI_DELAYBYTE_MS(1);
FCL_SWITCHVAL = FCP_GET(B, D, 0x2, 0x1);
#if (1) // 1 == 1
FCL_SWITCHVAL = !FCL_SWITCHVAL;
// #else
//Code has been optimised out by the pre -processor
#endif
if (FCL_SWITCHVAL == FCL_OLD_SWITCHVAL)
{
FCL_DEL_COUNT = FCL_DEL_COUNT + 1;
Universitatea Ioan Slavici pag. 112 } else {
FCL_DEL_COUNT = 0;
}
FCL_OLD_SWITCHVAL = FCL_SWITCHVAL;
}
// #else
//Code has been optimised out by the pre -processor
#endif
if ((FCL_SWITCHVAL == 1) == 0) break;
}
// #else
//Code has been optimised out by the pre -processor
#endif
}
/*=–––––––––––––––––––––––- =*\
Use :Waits until the switch is in state 'low'
:The interpretation of 'high' depends on the polarity
Universitatea Ioan Slavici pag. 113 \*=–––––––––––––––––––––––- =*/
void FCD_05261_switch_base__WaitUntilLow()
{
//Local variable def initions
MX_UINT8 FCL_SWITCHVAL; // The state of the pin
MX_UINT16 FCL_DEL_COUNT;
MX_UINT8 FCL_OLD_SWITCHVAL;
#if (1)
while (1)
{
FCL_SWITCHVAL = FCP_GET(B, D, 0x2, 0x1);
#if (1) // 1 == 1
FCL_SWITCHVAL = !FCL_SWITCHVAL;
// #else
//Code has been optimised out by the pre -processor
#endif
FCL_DEL_COUNT = 0;
FCL_OLD_SWITCHVAL = FCL_SWITCHVAL;
#if (1) // 10 > 0
Universitatea Ioan Slavici pag. 114 while (FCL_DEL_COUNT < 10)
{
FCI_DELAYBYTE_MS(1);
FCL_SWITCHVAL = FCP_GET(B, D, 0x2, 0x1);
#if (1) // 1 == 1
FCL_SWITCHVAL = !FC L_SWITCHVAL;
// #else
//Code has been optimised out by the pre -processor
#endif
if (FCL_SWITCHVAL == FCL_OLD_SWITCHVAL)
{
FCL_DEL_COUNT = FCL_DEL_COUNT + 1;
} else {
FCL_DEL_COUNT = 0;
}
FCL_OLD_SWITCHVAL = FCL_SWITCHVAL;
Universitatea Ioan Slavici pag. 115 }
// #else
//Code has been optimised out by the pre -processor
#endif
if ((FCL_SWITCHVAL != 1) == 0) break;
}
// #else
//Code has been optimised out by the pre -processor
#endif
}
/*=================================================================
=======* \
Use :ctrl_lcd
:Macro implementations
\*=================================================================
=======*/
/*==================================================== =============
=======* \
Use :LCD
:Macro implementations
\*=================================================================
=======*/
Universitatea Ioan Slavici pag. 116 /*=–––––––––––––––––––––––- =*\
Use :Clears the entire contents of the display.
\*=–––––––––––––––––––––––- =*/
void FCD_04071_LCD__Clear()
{
FCD_04071_LCD__RawSend(0x01, 0);
FCI_DELAYBYTE_MS(2);
FCD_04071_LCD__RawSend(0x02, 0);
FCI_DELAYBYTE_MS(2);
}
/*=–––––––––––––––––––––––- =*\
Use :Breaks down a string of text and sends it to the LCD via the private RawSend(byte,
mask) macro
:
:Parameters for macro PrintString:
: Text[20] : Ente r the text or variable to print to the LCD
\*=–––––––––––––––––––––––- =*/
void FCD_04071_LCD__PrintString(MX_CHAR *FCL_TEXT, MX_UINT16
FCLsz_TEXT)
{
//Local variable definitions
MX_UINT8 FCL_IDX = (0x0) ;
Universitatea Ioan Slavici pag. 117 MX_UINT8 FCL_COUNT;
FCL_COUNT = FCI_GETLENGTH(FCL_TEXT, FCLsz_TEXT);
while (FCL_IDX < FCL_COUNT)
{
#if (0) // 0 > 0
//Code has been optimised out by the pre -processor
#else
FCD_04071_LCD__RawSend(FCL_TEXT[FCL_IDX], 0x10);
#endif
FCL_IDX = FCL_IDX + 1;
}
}
/*=–––––––––––––––––––––––- =*\
Use :Takes the ascii value for a character and prints the character
:
:Parameters for macro PrintAscii:
Universitatea Ioan Slavici pag. 118 : character : Holds an ascii value.
\*=–––––––––––––––––––––––- =*/
void FCD_04071_LCD__PrintAscii(MX_UINT8 FCL_CHARACTER)
{
FCD_04071 _LCD__RawSend(FCL_CHARACTER, 0x10);
}
/*=–––––––––––––––––––––––- =*\
Use :Based on v5 macro, will allow you to print a number. This is limited to a signed -INT,
-32768 to 32767
:
:Parameters for macro PrintNumber:
: Number : Enter the number or variable to print to the LCD
\*=–––––––––––––––––––––––- =*/
void FCD_04071_LCD__PrintNumber(MX_SINT16 FCL_NUMBER)
{
//Local v ariable definitions
#define FCLsz_S 10
MX_CHAR FCL_S[FCLsz_S];
FCI_TOSTRING(FCL_NUMBER, FCL_S,10);
FCD_04071_LCD__PrintString(FCL_S, FCLsz_S);
//Local variable definitions
#undef FCLsz_S
Universitatea Ioan Slavici pag. 119 }
/*=–––––––––––– –––––––––––– =*\
Use :Modifies the internal memory of the LCD to allow for up to 8 customised characters
to be created and stored in the device memory
:
:Parameters for macro RAMWrite:
: Index : Values 0 to 7
: d0 : MX_UINT8
: d1 : MX_UINT8
: d2 : MX_UINT8
: d3 : MX_UINT8
: d4 : MX_UINT8
: d5 : MX_UINT8
: d6 : MX_UINT8
: d7 : MX_UINT8
\*=–––––––––––––––––––––––- =*/
void FCD_04071_LCD__RAMWrite(MX_UINT8 FCL_INDEX, MX_UINT8 FCL_D0,
MX_UINT8 FCL_D1, MX_UINT8 FCL_D2, MX_UINT8 FCL_D3, MX_UINT8 FCL_D4,
MX_UINT8 FCL_D5, MX_UINT8 FCL_D6, MX_UINT8 FC L_D7)
{
FCD_04071_LCD__RawSend(64 + (FCL_INDEX << 3), 0);
FCI_DELAYBYTE_MS(2);
FCD_04071_LCD__RawSend(FCL_D0, 0x10);
FCD_04071_LCD__RawSend(FCL_D1, 0x10);
FCD_04071_LCD__RawSend(FCL_D2, 0x10);
Universitatea Ioan Slavici pag. 120
FCD_04071_LCD__RawSend(FCL_D3, 0x 10);
FCD_04071_LCD__RawSend(FCL_D4, 0x10);
FCD_04071_LCD__RawSend(FCL_D5, 0x10);
FCD_04071_LCD__RawSend(FCL_D6, 0x10);
FCD_04071_LCD__RawSend(FCL_D7, 0x10);
FCD_04071_LCD__Clear();
}
/*=–––––––––––––––––––––––- =*\
Use :Clears a single line on the display and then moves the cursor to the start of the line to
allow you to start populating the line with data.
:
:Parameters for macro ClearLine:
: Line : The line to clear, zero being the first (top) line of the display
\*=–––––––––––––––––––––––- =*/
void FCD_04071_LCD__ClearLine(MX_UINT8 FCL_LINE)
{
//Local variable defini tions
MX_UINT8 FCL_X;
if (FCL_LINE < 2)
{
Universitatea Ioan Slavici pag. 121 FCD_04071_LCD__Cursor(0, FCL_LINE);
FCL_X = 0;
while (FCL_X < 16)
{
FCD_04071_LCD__RawSend(' ', 0x10);
FCL_X = FCL_X + 1;
}
FCD_04071_LCD__Cursor(0, FCL_LINE);
// } else {
}
}
/*=–––––––––––––––––––––––- =*\
Use :Moves the cursor on the LCD Display
:
:Parameters for macro Cursor:
: x : Set the cursor position in the X plane, 0 is the left most cell
: y : Set the cursor position in the Y plane, 0 is the top most cell
\*=–––––––––––––––––––––––- =*/
Universitatea Ioan Slavici pag. 122 void FCD_04071_LCD__Cursor(MX_UINT8 FCL_X , MX_UINT8 FCL_Y)
{
#if (0) // 2 == 1
//Code has been optimised out by the pre -processor
// #else
#endif
#if (1) // 2 == 2
if (FCL_Y == 0)
{
FCL_Y = 0x80;
} else {
FCL_Y = 0xC0;
}
// #else
//Code has been optimised out by the pre -processor
#endif
Universitatea Ioan Slavici pag. 123 #if (0) // 2 == 4
//Code has been optimised out by the pre -processor
// #else
#endif
FCD_04071_LCD__RawSend(FCL_Y + FCL_X, 0);
FCI_DELA YBYTE_MS(2);
}
/*=–––––––––––––––––––––––- =*\
Use :Use this method/macro to send a specific command to the LCD. Refer to the Matrix
Multimedia EB006 datasheet for a list of supported instructions. For Non -Matrix LCD's refer
to the manufacturers datasheet.
:
:Parameters for macro Comma nd:
: instruction : Send a defined command to the LCD Screen. See datasheet for supported
commands.
\*=–––––––––––––––––––––––- =*/
void FCD_04071_LCD__Command(MX_UINT8 FCL_INSTRUCTION)
{
FCD_04071_ LCD__RawSend(FCL_INSTRUCTION, 0);
FCI_DELAYBYTE_MS(2);
}
Universitatea Ioan Slavici pag. 124 /*=–––––––––––––––––––––––- =*\
Use :Will allow you to print a number up to 32 -bits with signed or unsigned formatting.
:Signed = -214748 3648 to 2147483647
:Unsigned = 0 to 4294967295
:
:Parameters for macro PrintFormattedNumber:
: Number : Enter the number or variable to print to the LCD
: Format : 0=Signed, 1=Unsigned
\*=––––––––––- ––––––––––––– =*/
void FCD_04071_LCD__PrintFormattedNumber(MX_UINT32 FCL_NUMBER,
MX_BOOL FCL_FORMAT)
{
//Local variable definitions
#define FCLsz_S 15
MX_CHAR FCL_S[FCLsz_S];
if (FCL_FORMAT == 1)
{
FCI_UTOS32(FCL_NUMBER, FCL_S,15);
} else {
FCI_ITOS32((MX_SINT32)(FCL_NUMBER), FCL_S,15);
}
FCD_04071_LCD__PrintString(FCL_S, FCLsz_S);
//Local variable definitions
Universitatea Ioan Slavici pag. 125 #undef FCLsz_S
}
/*=–––––––––– –––––––––––––– =*\
Use :Scrolls the display left or right by a number of given positions.
:
:Parameters for macro ScrollDisplay:
: Position : Holds the number of positions to shift the display
: Direction : 0 = left, 1 = right
\*=–––––––––––––––––––––––- =*/
void FCD_04071_LCD__ScrollDisplay(MX_UINT8 FCL_POSITION, MX_UINT8
FCL_DIRECTION)
{
//Local variable definitions
MX_UINT8 FCL_CMD = (0x0);
FCL_CMD = 0;
if (FCL_DIRECTION == 0)
{
FCL_CMD = 0x18;
} else {
FCL_CMD = 0x1C;
}
Universitatea Ioan Slavici pag. 126
if (FCL_CMD != 0 && FCL_POSITION != 0)
{
while (FCL_POSITION != 0)
{
FCD_04071_LCD__RawSend( FCL_CMD, 0);
FCL_POSITION = FCL_POSITION – 1;
}
// } else {
}
}
/*=–––––––––––––––––––––––- =*\
Use :Sends data to the LCD display
:
:Parameters for macro RawSend:
: data : The data byte to send to the LCD
: type : A boolean to indicate command type: true to write data, false to write a
command
\*=––––––––––––––––––––––- –=*/
void FCD_04071_LCD__RawSend(MX_UINT8 FCL_DATA, MX_BOOL FCL_TYPE)
{
//Local variable definitions
Universitatea Ioan Slavici pag. 127 MX_UINT8 FCL_NIBBLE;
//Comment:
//Output upper nibble of the byte
#if (1) // 0 == 0
FCP_SET(B, B, 0x10, 0x4, 0);
FCP_SET(B, B, 0x8, 0x3, 0);
FCP_SET(B, B, 0x4, 0x2, 0);
FCP_SET(B, B, 0x2, 0x1, 0);
FCP_SET(B, B, 0x40, 0x6, 0);
FCP_SET(B, B, 0x20, 0x5, 0);
#if (0)
//Code has been optimised out by the pre -process or
// #else
#endif
FCL_NIBBLE = (FCL_DATA >> 4);
FCP_SET(B, B, 0x10, 0x4, (FCL_NIBBLE & 0x01));
FCL_NIBBLE = FCL_NIBBLE >> 1;
FCP_SET(B, B, 0x8, 0x3, (FCL_NIBBLE & 0x01));
FCL_NIBBLE = FCL_NIBBLE >> 1;
FCP_SET(B, B, 0x4, 0x2, (FCL_NIBBLE & 0x01));
FCL_NIBBLE = FCL_NIBBLE >> 1;
FCP_SET(B, B, 0x2, 0x1, (FCL_NIBBLE & 0x01));
Universitatea Ioan Slavici pag. 128
// #else
//Code has been optimised out by the pre -processor
#endif
//Comment:
//Output byte to pins
#if (0) // 0 == 1
//Code has been optimised out by the pre -processor
// #else
#endif
//Comment:
//Output byte to port
#if (0) // 0 == 2
//Code has been optimised out by the pre -processor
// #else
#endif
if (FCL_TYPE)
{
FCP_SET(B, B, 0x40, 0x6, 1);
Universitatea Ioan Slavici pag. 129
// } else {
}
FCI_DELAYBYTE_US(100);
//Comment:
//Set Enable high, pause then set low
//to acknowledge the data has been
//submitted.
FCP_SET(B, B, 0x20, 0x5, 1);
FCI_DELAYBYTE_US(100);
FCP_SET(B, B, 0x20, 0x5, 0);
FCI_DELAYBYTE_US(100);
#if (1) // 0 == 0
FCP_SET(B, B, 0x10, 0x4, 0);
FCP_SET(B, B, 0x8, 0x3, 0);
FCP_SET(B, B, 0x4, 0x2, 0);
FCP_SET(B, B, 0x2, 0x1, 0);
FCP_SET(B, B, 0x40, 0x6, 0);
FCL_NIBBLE = (FCL_DATA & 0xf);
FCP_SET(B, B, 0x10, 0x4, (FCL_NIBBLE & 0x01));
Universitatea Ioan Slavici pag. 130 FCL_NIBBLE = FCL_NIBBLE >> 1;
FCP_SET(B, B, 0x8, 0x3, (FCL_NIBBLE & 0x01 ));
FCL_NIBBLE = FCL_NIBBLE >> 1;
FCP_SET(B, B, 0x4, 0x2, (FCL_NIBBLE & 0x01));
FCL_NIBBLE = FCL_NIBBLE >> 1;
FCP_SET(B, B, 0x2, 0x1, (FCL_NIBBLE & 0x01));
if (FCL_TYPE)
{
FCP_SET(B, B, 0x40, 0x6, 1);
// } else {
}
FCI_DELAYBYTE_US(100);
FCP_SET(B, B, 0x20, 0x5, 1);
FCI_DELAYBYTE_US(100);
FCP_SET(B, B, 0x20, 0x5, 0);
FCI_DELAYBYTE_US(100);
// #el se
//Code has been optimised out by the pre -processor
#endif
Universitatea Ioan Slavici pag. 131
}
/*=–––––––––––––––––––––––- =*\
Use :Assigns a remap character allowing the PrintString function to automatically swap
between pre -defined characters.
:The characters can be custom (in the range 0 -9) or can point to an existing character in
the LCD character map.
:
:Parameters for macro RemapCharacter:
: RemapIdx : Remap Index, Range: 0 to (Remap Characters – 1)
: SearchCharacter : Character to look for a replace
: ReplacementCharacter : New character value to use in place of the search cha racter.
\*=–––––––––––––––––––––––- =*/
void FCD_04071_LCD__RemapCharacter(MX_UINT8 FCL_REMAPIDX, MX_UINT8
FCL_SEARCHCHARACTER, MX_UINT8 FCL_REPLACEMENTCHARACTER)
{
#if (0) // 0 > 0
//Code has been opt imised out by the pre -processor
// #else
#endif
}
/*=–––––––––––––––––––––––- =*\
Use :Startup routine required by the hardware device.
:Automatically clears the display after initialising.
\*=–––––––––––––––––––––––- =*/
Universitatea Ioan Slavici pag. 132 void FCD_04071_LCD__Start()
{
#if (1) // 0 == 0
FCP_SET(B, B, 0x10, 0x4, 0);
FCP_SET(B, B, 0x8, 0x3, 0);
FCP_SET(B, B, 0x4, 0x2, 0);
FCP_SET(B, B, 0x2, 0x1, 0);
FCP_SET(B, B, 0x40, 0x6, 0);
FCP_SET(B, B, 0x20, 0x5, 0);
// #else
//Code has been optimised out by the pre -processor
#endif
#if (0) // 0 == 1
//Code has been optimised out by the pre-processor
// #else
#endif
#if (0) // 0 == 2
//Code has been optimised out by the pre -processor
Universitatea Ioan Slavici pag. 133 // #else
#endif
#if (0)
//Code has been optimised out by the pre -processor
// #else
#endif
FCI_DELAYBYTE_MS(12);
FCD_04071_LCD__RawSend(0x33, 0);
FCI_DELAYBYTE_MS(2);
FCD_04071_LCD__RawSend(0x33, 0);
FCI_DELAYBYTE_MS(2);
#if (0) // 0 > 0
//Code has been optimised out by the pre -processor
#else
FCD_0 4071_LCD__RawSend(0x32, 0);
FCI_DELAYBYTE_MS(2);
Universitatea Ioan Slavici pag. 134 FCD_04071_LCD__RawSend(0x2c, 0);
#endif
FCI_DELAYBYTE_MS(2);
FCD_04071_LCD__RawSend(0x06, 0);
FCI_DELAYBYTE_MS(2);
FCD_04071_LCD__RawSend(0x0c, 0);
FCI_DELAYBYTE_MS(2);
FCD_04071_LCD__RawSend(0x01, 0);
FCI_DELAYBYTE_MS(2);
FCD_04071_LCD__RawSend(0x02, 0);
FCI_DELAYBYTE_MS(2);
FCD_04071_LCD__Clear();
#if (0) // 0 > 0
//Code has been optimised out by the pre -proces sor
// #else
#endif
Universitatea Ioan Slavici pag. 135
}
/*=================================================================
=======* \
Use :lcd_eb005
:Macro implementations
\*=================================================================
=======*/
/*=================================================================
=======* \
Use :panel
:Macro implementations
\*=================================================================
=======*/
/*=––––––––––––––––––- ––––– =*\
Use :
\*=–––––––––––––––––––––––- =*/
void FCM_Afisare_rezultate()
{
// Call Component Macro
// Call Component Macro: lcd_eb005::Cursor(0, 0)
FCD_0ad31_lcd_eb005__Cursor(0, 0);
// Call Component Macro
// Call Component Macro: lcd_eb005::PrintString("DC Amper:")
FCD_0ad31_lcd_eb005__PrintString("DC Amper:", 10);
// Call Component Macro
Universitatea Ioan Slavici pag. 136 // Call Component Macro: lcd_eb005::PrintString(Sensor_data)
FCD_0ad3 1_lcd_eb005__PrintString(FCV_SENSOR_DATA, FCVsz_SENSOR_DATA);
// Call Component Macro
// Call Component Macro: lcd_eb005::PrintString("A")
FCD_0ad31_lcd_eb005__PrintString("A", 2);
// Call Component Macro
// Call Component Macro: lcd_eb005::Cursor(0, 1)
FCD_0ad31_lcd_eb005__Cursor(0, 1);
// Call Component Macro
// Call Component Macro: lcd_eb005::PrintString("Prag: ")
FCD_0ad31_lcd_eb005__PrintString("Prag: ", 7);
// Call Component Macro
// Call Component Macro: lcd_eb005::PrintString(Data_string)
FCD_0ad31_lcd_eb005__PrintString(FCV_DATA_STRING, FCVsz_DATA_STRING);
// Call Component Macro
// Call Component Macro: lcd_eb005::PrintString("A")
FCD_0ad31_lcd_eb005_ _PrintString("A", 2);
}
/*=–––––––––––––––––––––––- =*\
Use :About Software on Start -up
\*=–––––––––––––––––––––––- =*/
void FCM_Info()
{
Universitatea Ioan Slavici pag. 137
// Call Component Macro
// Call Component Macro: lcd_eb005::Start()
FCD_0ad31_lcd_eb005__Start();
// Loop
// Loop: Loop 20 times
for (FCLV_LOOP1=0; (FCLV_LOOP1)<(20); (FCLV_LOOP1)++)
{
// Call Component Macro
// Call Component Macro: lcd_eb005::ScrollDisplay(i+1, 0)
FCD_0ad31_lcd_eb005__ScrollDisplay(FCV_I + 1, 0);
// Call Component Macro
// Call Component Macro: lcd_eb005::PrintString(" DC -Ampermeter by Francisc
Szabo")
FCD_0ad31_lcd_eb005__PrintString(" DC -Ampermeter by Francisc Szabo", 36);
// Call Component Macro
// Call Component Macro: lcd_eb005::Cursor(0, 1)
FCD_0ad31_lcd_eb005__Cursor(0, 1);
// Call Component Macro
// Call Component Macro: lcd_eb005::PrintString(" with Hall Effect SW:01A")
FCD_0ad31_lcd_eb005__PrintString(" with Hall Effect SW:01A", 32);
// Delay
// Delay: 6 ms
FCI_DELAYBYTE_MS(6);
Universitatea Ioan Slavici pag. 138 // Call Compon ent Macro
// Call Component Macro: lcd_eb005::ClearLine(i)
FCD_0ad31_lcd_eb005__ClearLine(FCV_I);
}
// Delay
// Delay: 500 ms
FCI_DELAYINT_MS(500);
// Call Component Macro
// Call Component Macro: lcd_eb005::Clear()
FCD_0ad31_lcd_eb005__Clear();
}
/*=–––––––––––––––––––––––- =*\
Use :
\*=–––––––––––––––––––––––- =*/
void FC M_Setari()
{
// Loop
// Loop: Loop i: 4 times
for (FCV_I=0; (FCV_I)<(4); (FCV_I)++)
{
// Switch
// Switch: i?
Universitatea Ioan Slavici pag. 139 switch (FCV_I)
{
case 1:
{
// Input
// Input: D0 -> Switch_Reset
FCV_SWITCH_RESET = FCP_GET(B, D, 0x01, 0);
// Delay
// Delay: 10 ms
FCI_DELAYBYTE_MS(10);
// Decision
// Decision: Switch_Reset = 0?
if (FCV_SWITCH_RESET == 0)
{
// Output
// Output: 0 -> D3
FCP_SET(B, D, 0x08, 3, (0));
// Output
// Outp ut: 0 -> C5
FCP_SET(B, C, 0x20, 5, (0));
// Calculation
// Calculation:
// Data = 0
// Reset = 1
// Data_string = FloatToString$ (Dat a)
FCV_DATA = 0;
FCV_RESET = 1;
FCI_FLOAT_TO_STRING(flt_fromi(FCV_DATA), FCV_PRECISION,
FCV_DATA_STRING, FCVsz_DATA_STRING);
Universitatea Ioan Slavici pag. 140
// Call Macro
// Call Macro: Afisare_setari()
FCM_Afisare_setari();
} else {
// Calculation
// Calculation:
// Reset = 0
FCV_RESET = 0;
}
break;
}
case 2:
{
// Connection Point
// Connection Point: [A]: A
FCC_Setari_A:
;
// Input
// Input: D1 -> Switch _Set
FCV_SWITCH_SET = FCP_GET(B, D, 0x02, 1);
// Delay
// Delay: 10 ms
FCI_DELAYBYTE_MS(10);
Universitatea Ioan Slavici pag. 141 // Decision
// Decision: Switch_Set = 0?
if (FCV_SWITCH_SET == 0)
{
// Parser int to string
// Calculation:
// Set = 1
// Data = Data + 1
// Data_string = FloatT oString$ (Data * 0.1)
FCV_SET = 1;
FCV_DATA = FCV_DATA + 1;
FCI_FLOAT_TO_STRING(flt_mul(flt_fromi(FCV_DATA), 0.1),
FCV_PRECISION, FCV_DATA_STRING, FCVsz_DATA_STRING);
// Decis ion
// Decision: Data >= 101?
if (FCV_DATA >= 101)
{
// Calculation
// Calculation:
// Data = 0
FCV_DATA = 0;
// } else {
}
// Call Macro
// Call Macro: Afisare_setari()
Universitatea Ioan Slavici pag. 142 FCM_Afisare_setari();
// Decision
// Decision: Set = 1?
if (FCV_SET == 1)
{
// Goto Connection Point
// Goto Connection Point: [A]: A
goto FCC_Setari_A;
// } else {
}
} else {
// Decision
// Decision: Set = 1 & Switch_Set = 1?
if (FCV_SET == 1 & FCV_SWITCH_SET == 1)
{
// Calculation
// Calculation:
// Set = 0
FCV_SET = 0;
// Call Component Macro
// Call Component Macro: lcd_eb005::Clear()
FCD_0ad31_lcd_eb005__Clear();
Universitatea Ioan Slavici pag. 143
// } else {
}
}
break;
}
case 3:
{
// Input
// Input: D2 -> Switch_Mem
FCV_SWITCH_MEM = FCP_GET(B, D, 0x04, 2);
// Delay
// Delay: 10 ms
FCI_DELAYBYTE_MS(10);
// Dec ision
// Decision: Switch_Mem = 0?
if (FCV_SWITCH_MEM == 0)
{
// Calculation
// Calculation:
// Mem = 1
FCV_MEM = 1;
// Call Component Macro
// Call Component Macro: serial_24c16::Write(Data, Data)
Universitatea Ioan Slavici pag. 144 FCD_00a01_serial_24c16__Write(FCV_DATA, FCV_DATA);
// Call Macro
// Call M acro: Afisare_setari()
FCM_Afisare_setari();
} else {
// Calculation
// Calculation:
// Mem = 0
FCV_MEM = 0;
}
break;
}
// default:
}
}
}
/*=–––––––––––––––––––––––- =*\
Use :
\*=–––––––––––––––––––––––- =*/
void FCM_Sensor_Data()
Universitatea Ioan Slavici pag. 145 {
// Connection Point
// Connection Point: [A]: A
FCC_Sensor_Data_A:
;
// Calculation
// Calculation:
// Sensor_val = 0
// Sensor_avg_val = 0
FCV_SENSOR_VAL = 0;
FCV_SENSOR_AVG_VAL = 0;
// Loop
// Loop: Loop 50 times
for (FCLV_LOOP2=0; (FCLV_LOOP2)<(50); (FCLV_LOOP2)++)
{
// Call Component Macro
// Call Component Macro: Sensor_val=slider_plastic1::GetInt()
FCV_SENSOR_VAL = FCD_0d101_slider_plastic1__GetInt();
// Calculation
// Calculation:
// Sensor_avg_val = Sensor_val + Sensor_avg_val
FCV_SENSOR_AVG_VAL = FCV_SENSOR_VAL + FCV_SENSOR_AVG_VAL;
}
Universitatea Ioan Slavici pag. 146
// Parser int to string ! 512 offset valoarea de zero
// Calculation :
// Sensor_avg_val = Sensor_avg_val / 50
// //Sensor_avg_val = Sensor_avg_val + 482
// Sensor_avg_val = Sensor_avg_val + 482
FCV_SENSOR_AVG_VAL = FCV_SENSOR_AVG_VAL / 50;
FCV_SENSOR_AVG_VAL = FCV_SENSOR_AVG_VAL + 482;
// Calcul ation
// Calculation:
// Final_results = FloatToString$ (Sensor_avg_val)
FCI_FLOAT_TO_STRING(flt_fromi(FCV_SENSOR_AVG_VAL), FCV_PRECISION,
FCV_FINAL_RESULTS, FCVsz_FINAL_RESULTS);
//Comment:
//>=1000
// Decision
// Decision: Sensor_avg_val >= 1000?
if (FCV_SENSOR_AVG_VAL >= 1000)
{
// Calculation
// Calculation:
// Sensor_data[0] = Final_results[2]
// Sensor_data[1] = '.'
// Sensor_data[2] = Final_results[3]
FCV_SENSOR_DATA[0] = FCV_FINAL_RESULTS[2];
FCV_SENSOR_DATA[1] = '.';
FCV_SENSOR_DATA[2] = FCV_FINAL_RESULTS[3];
Universitatea Ioan Slavici pag. 147
} else {
// Call Component Macro
// Call Component Macro: lcd_eb005::ClearLine(0)
FCD_0ad3 1_lcd_eb005__ClearLine(0);
// Call Component Macro
// Call Component Macro: lcd_eb005::PrintString("Verificati sonda!!")
FCD_0ad31_lcd_eb005__PrintString("Verificati sonda!!", 19);
// Delay
// Delay: 50 ms
FCI_DELAYBYTE_MS(50);
// Call Component Macro
// Call Component Macro: lcd_eb005::ClearLine(0)
FCD_0ad31_lcd_eb005__ClearLine(0);
// Goto Connection Point
// Goto Connection Point: [A]: A
goto FCC_Sensor_Data_A;
}
}
/*=–––––––––––––––––––––––- =*\
Use :
\*=–––––––––––––––––––––––- =*/
Universitatea Ioan Slavici pag. 148 void FCM_Afisare_setari()
{
// Decision
// Decision: Reset = 1?
if (FCV_RESET == 1)
{
// Call Component Macro
// Call Component Macro: lcd_eb005::ClearLine(0)
FCD_0ad31_lcd_eb005__ClearLine(0);
// Call Component Macro
// Call Component Macro: lcd_ eb005::Cursor(1, 0)
FCD_0ad31_lcd_eb005__Cursor(1, 0);
// Call Component Macro
// Call Component Macro: lcd_eb005::PrintString("Amp Reset: ")
FCD_0ad31_lcd_eb005__PrintString("Amp Reset: ", 12);
// Call Component Macro
// Call Component Macro: lcd_eb005::PrintString(Data_string)
FCD_0ad31_lcd_eb005__PrintString(FCV_DATA_STRING,
FCVsz_DATA_STRING);
// Call Component Macro
// Call Component Macro: lcd_eb005:: Cursor(0, 1)
FCD_0ad31_lcd_eb005__Cursor(0, 1);
// Call Component Macro
// Call Component Macro: lcd_eb005::PrintString("SET RESET MEM")
Universitatea Ioan Slavici pag. 149 FCD_0ad31_lcd_eb005__PrintString("SET RESET MEM", 16);
// Delay
// Delay: 500 ms
FCI_DELAYINT_MS(500);
// Call Component Macro
// Call Component Macro: lcd_eb005::Clear()
FCD_0ad31_lcd_eb005__Clear();
// } else {
}
// Decision
// Decision: Set = 1?
if (FCV_SET == 1 )
{
// Call Component Macro
// Call Component Macro: lcd_eb005::ClearLine(0)
FCD_0ad31_lcd_eb005__ClearLine(0);
// Call Component Macro
// Call Component Macro: lcd_eb005::Cursor(1, 0)
FCD_0ad31_lcd_eb005__Cursor(1, 0);
// Call Component Macro
// Call Component Macro: lcd_eb005::PrintString("Amp Set: ")
FCD_0ad31_lcd_eb005__PrintString("Amp Set: ", 11);
Universitatea Ioan Slavici pag. 150
// Call Component Macro
// Call C omponent Macro: lcd_eb005::PrintString(Data_string)
FCD_0ad31_lcd_eb005__PrintString(FCV_DATA_STRING,
FCVsz_DATA_STRING);
// Call Component Macro
// Call Component Macro: lcd_eb005::Cursor(0, 1)
FCD_0ad31_lcd_eb005__Cursor( 0, 1);
// Call Component Macro
// Call Component Macro: lcd_eb005::PrintString("SET RESET MEM")
FCD_0ad31_lcd_eb005__PrintString("SET RESET MEM", 16);
// Delay
// Delay: 40 ms
FCI_DELAYBYTE_MS(40);
// } else {
}
// Decision
// Decision: Mem = 1?
if (FCV_MEM == 1)
{
// Call Component Macro
// Call Component Macro: Read_Eeprom=serial_24c16::Read(Data)
FCV_READ_EEPROM = FCD_00a01_serial_24c16__Read(FCV_DATA);
Universitatea Ioan Slavici pag. 151 // Call Component Macro
// Call Component Macro: lcd_eb005::Clear()
FCD_0ad31_lcd_eb005__Clear();
// Call Component Macro
// Call Component Macro: l cd_eb005::PrintString("Prag memorat")
FCD_0ad31_lcd_eb005__PrintString("Prag memorat", 13);
// Call Component Macro
// Call Component Macro: lcd_eb005::Cursor(0, 1)
FCD_0ad31_lcd_eb005__Cursor(0, 1);
// Call Compon ent Macro
// Call Component Macro: lcd_eb005::PrintString("Eeprom -val: ")
FCD_0ad31_lcd_eb005__PrintString("Eeprom -val: ", 13);
// Call Component Macro
// Call Component Macro: lcd_eb005::PrintNumber(Read_Eeprom)
FCD_0ad31_lcd_eb005__PrintNumber(FCV_READ_EEPROM);
// Delay
// Delay: 800 ms
FCI_DELAYINT_MS(800);
// Call Component Macro
// Call Component Macro: lcd_eb005::Clear()
FCD_0ad31_lcd_eb005__Clear();
// } else {
Universitatea Ioan Slavici pag. 152 }
}
/*=–––––––––––––––––––––––- =*\
Use :
\*=–––––––––––––––––––––––- =*/
void FCM_Evenimente()
{
// Offset pentru 0
// Calculation :
// Eveniment = Sensor_avg_val – 999
FCV_EVENIMENT = FCV_SENSOR_AVG_VAL – 999;
// Decision
// Decision: Eveniment > Data & Sensor_avg_val <> 0?
if (FCV_EVENIMENT > FCV_DATA & FCV_SENSOR_AVG_VAL != 0)
{
//Comment:
//Porturi de iesire comanda/interfatare
// Output
// Output: 0 -> D3
FCP_SET(B, D, 0x08, 3, (0));
// Output
// Output: 0 -> C5
FCP_SET(B, C, 0x20, 5, (0));
} else {
Universitatea Ioan Slavici pag. 153
// Output
// Output: 1 -> C5
FCP_SET(B, C, 0x20, 5, (1));
// Output
// Output: 1 -> D3
FCP_SET(B, D, 0x08, 3, (1));
}
}
/*=================================================================
=======* \
Use :Main
\*=================================================================
=======*/
void main()
{
ANSEL = 0;
ANSELH = 0;
OPTION_REG = 0xC0;
// Call Macro
// Call Macro: Info()
FCM_Info();
// Call Component Macro
Universitatea Ioan Slavici pag. 154 // Call Component Macro: Re ad_Eeprom=serial_24c16::Read(Data)
FCV_READ_EEPROM = FCD_00a01_serial_24c16__Read(FCV_DATA);
// Calculation
// Calculation:
// Data = Read_Eeprom
// Data_string = FloatToString$ (Data)
FCV_DATA = FCV_READ_EEPROM;
FCI_FLOAT_TO _STRING(flt_fromi(FCV_DATA), FCV_PRECISION,
FCV_DATA_STRING, FCVsz_DATA_STRING);
// Loop
// Loop: While 1
while (1)
{
// Call Macro
// Call Macro: Sensor_Data()
FCM_Sensor_Data();
// Call Macro
// Call Macro: Evenimente()
FCM_Evenimente();
// Call Macro
// Call Macro: Afisare_rezultate()
FCM_Afisare_rezultate();
// Call Macro
// Call Macro: Setari()
FCM_Setari();
Universitatea Ioan Slavici pag. 155
}
maine ndloop: goto mainendloop;
}
/*=================================================================
=======* \
Use :Interrupt
\*=================================================================
=======*/
void MX_INTERRUPT_MACRO(void)
{
}
Universitatea Ioan Slavici pag. 156
BIBLIOGRAFIE
1. Masurari electrice si electronice; Masurarea marimilor electrice . Autor(i): Emil Vremera,
Editura: Matrixrom. 6.
2. Masurari electrice si el ectronice. Autor(i): Silviu Cristian Mirescu, Editura: Economica,
An aparitie: 2003, Colectia: Manuale – Scoala de ar te si meserii
3. Molnar -Matei, F., Sisteme încorporate, notițe de curs, 2013
4. Stanciu, I.R., Molnar -Matei, F., Sisteme de monitorizare și control î n timp real, Editura
Eurostampa, Timișoara 2013, ISBN 978 -606-569-542-9
5. Sistem de programare vizuala pentru microcontrolere:
https://www.matrixtsl.com/flowcode/
6. Proteus 8 simulator:
https://www.labcenter.com/
7. Sprynt layou prgram cad de executie circuite imprimate:
https://www.electronic -software -shop.com/lng/en/electronic -software/sprint -layout –
60.html?language=en
8. Date de catalog PIC16F887 cu link la adresa:
http://ww1.microchip.com/downloads/en/devicedoc/41291d.pdf
9. Date de catalog memorie cu comunicare I2C 24C16:
https://www.st.com/resource/en/datasheet/dm00061111.pdf
10. Date de catalog afisaj LCD cu controller HD44780 :
https://www.sparkfun.com/datasheets/LCD/HD44780.pdf
11. Date de catalog TLE4997 Infineon Technology:
https://www.infineo n.com/dgdl/TLE4997_Data_Sheet_v2.08.pdf
12. Manual de utilizare TLE4997 Infineon Technology:
https://www.infineon.com/dgdl/Infineon -TLE4997 -UM-v01_00 -EN.pdf
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… … …pag.2 [629838] (ID: 629838)
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.
