Conferențiar Dr.Ing. Dan Marius Dobrea Absolvent : Timofte Alexandru – Iulian Iași, 2014 Universitatea “Gheorghe Asachi” din Ia și Facultatea de… [602071]
Universitatea “Gheorghe Asachi” din Ia și
Facultatea de Electronică,Telecomunicații și Tehnologia
Informației
PROIECT DE DIPLOM Ă
Coordonator :
Conferențiar Dr.Ing. Dan Marius Dobrea
Absolvent: [anonimizat] – Iulian
Iași, 2014
Universitatea “Gheorghe Asachi” din Ia și
Facultatea de Electronică,Telecomunicații și Tehnologia
Informației
PROIECT DE DIPLOM Ă
Platform ă robotic ă comandată și semicomandată
Coordonator :
Conferențiar Dr.Ing. Dan Marius Dobrea
Absolvent: [anonimizat] – Iulian
Iași, 2014
Cuprins
Capitolul 1. Introducere ……………………………………………………………………… ………………………….1
1.1 Memoriu justificativ…….. ………………………… ………………… …………………………………………… 1
1.2 Structura lucr ării……………. …………………………. …….. ………… ………………………………………… 2
Capitolul 2. Fundamentare teoretică …………………………………………………………………………… ….3
2.1 Motoare de curent continuu fără perii ……………… ……………………………………………. …………3
2.2 Comanda motoarelor de curent continuu fără perii……………………………………. ……………….5
2.3 Invertor trifazat……………………………………. …………………………………………………………… …11
2.3.1Tranzistorul MOSFET…………………………………………………………………………………..1 5
2.3.2Circuitul driver IR2101…………………………. ……………………………………………………… 16
2.4 Microcontrolere……………………………………………………………………………………………. ………17
2.4.1 Microcontroler PIC16F887…….. ………………………………………………………………. ……18
2.4.1 Microcontroler PIC18F4431……………………………………………………………………… ….25
2.5 Senzori……………………….. ……………………………………………………………………………………… 27
2.5.1 Senzor de distanță cu ultrasunete HC -SR04……………………………………………….. ….27
2.5.2 Senzor de curent …………………………………………………………………………………….. ……29
2.5.3 Senzor inductiv pentru detecția metalelor…………………………………………………….. …31
2.6 Comunicare serială…………………………………………………………………………………………. …….32
2.6.1 Modulul bluetooth HC -06…………………………………………………………………. …………. 33
2.7 Interfața grafică………………………………………………………………………………………….. ……….. 34
Capitolul 3. Realizarea practică a proiectului ………………………………………………………………… 35
3.1 Partea mecanică……………………………………………………………………………………………. …….. 35
3.2 Implementare Hardware……. ………………………………………………………………………………….. 38
3.2.1 Realizarea cablajelor……………………………………………………………………………………. 38
3.2.2 Placa de alimentare…. ………………………………………………………………………………….. 40
3.2.3 Senzorul de curent……………………………………………………………………………………….. 41
3.2.4 Detector de metale…. …………………………………………………………………………………… 43
3.2.5 Invertor………………………………………………………………………………………………… …….45
3.2.6 Placă PIC16F88 7………………………………………………………………………………………… 48
3.2.7 Placă PIC18F4431………………………………………………………………………………………. 50
3.3 Implementare So ftware…………………………………………………………………………………………. 51
3.3.1 Software microcontroler PIC16F887……………………………………………………………… 51
3.3.2 Software microcontrole r PIC18F4431……………………………………………………………. 59
3.3.3 Software interfață……………………………………………………………………………………….. .64
Capitolul 4. Rez umat .Concluzii …………………………………………………………………………………….. 68
4.1 Rezumat…………………………………………………………………………………………………… …..68
4.2 Concluzii………. ……………………………………………………………………………………………… 69
Capitolul 5. Anexe ………………………………………………………………………………………………………. ..70
5.1 Anexa 1 – Cod PIC16F887………………………………………………………………………………7 0
5.2 Anexa 2 – Cod PIC18F4431…………………………………………………. …………………………76
5.3 Anexa 3 – Cod interfață grafică……………………………………………. …………………………. 82
5.4 Anexa 4 – Schema invertorului…………………………………………….. …………………………. 90
5.5 Anexa 5 – Schemă placă PIC16F887…………………………………….. …………………………. 91
5.6 Anexa 6 – Schemă placă PIC18F4431…………………………………… …………………………. 92
5.7 Anexa 7 – Layout invertoare………………………………………………… …………………………93
5.8 Anexa 8 – Layout placă PIC16F887 ………………………………………… ……… ………………94
5.9 Anexa 9 – Layout placă PIC18F4431 ……………………………………. …………………………95
Capitolul 6. Bibliografie ……………………………………………………………………. ……….. ………………..96
1
Capitolul 1. Introducere
1.1 Memoriu justificativ
În ultimul secol domeniul roboticii a cunoscut o mare și foarte importantă dezvoltare în
activitățile umane, ca rezultat a dorinței omului de a progresa, de a crea lucruri noi care să -i ofere
precizie, siguranță, rapiditate și randament ridicat în activitate. Astfel calitatea muncii este mult
îmbunătățită, cu un număr de greșeli semnificativ mai mic, decât în cazul executării aceleiași
munci de un om.
Roboții reușesc să ofere avantaje în multe domenii precum: domeniul medical
(telemanipulatoare pentru chirurgie laporoscopică, sisteme robotizate pentru diagnoză prin
ecografie, sisteme robotizate pentr u intervenții neurochirurgicale), domeniul militar (ajutând la
explorarea locațiilor greu accesibile și periculoase , teleghidați sau parțial autonom) , în construcț ii
(excavatoare autonome, robot mobil pentru cofraje glisante, sistem robotizat pentru stropirea
betonului în construcția tunelurilor ), în agricultură (sistem robotizat de culegere a florilor si
fructelor, sistem robotizat de plantare a răsadurilor), toate ramurile industriei și multe alte
domenii.
Lucrarea de față își propune studierea unei platforme robotice care poate funcționa atât în
mod autonom cât și controlată de la distanță, îmbinând două domenii: interfațare om -mașină și
robotică.
Robotica este un domeniu științific care urmărește tehnologia, dezvoltare, proiectarea și
construcția sistemelor cu funcții diversificate în scopul realizării sarcinilor umanoide . Un astfel
de sistem poartă numele de robot. Prin robot percepem un ansamblu de mai multe elemente:
mecanice, module electronice, motoare, senzori care dau operatorului uman posibilitatea de a
interacționa cu acesta și de a -l controla.
Interacțiunea dintre om și mașină în scopul manipulării eficiente și a evidenței anumitor
informații necesare în luarea deciziilor operaționale se realizează la nivelul interfaței om -mașină.
Platforma robotică prezentată în lucrarea de față implică următoarele componente:
● șasiu realizat din plexiglas datorită ușurinței cu care se poate prelucra;
● două motoare fără perii cărora li s -au atașat reductor astfel obținându -se un cuplu
destul de ridicat;
● două invertoare pentru controlul motoarelor;
● senzori pentru a prelua date din mediu;
● două microcontrolere pentru a facilita controlul platformei și manipularea datelor
preluate de la senzori;
● interfața grafică pentru a dispune operatorului toate informațiile necesare și pentru a-i
oferi u n control eficient al platformei de la distanță.
2
Platforma poate fi încadrată în rândul roboților exploratori, care au o mare aplicabilitate
în domeniul militar, în rândul geniștilor. De asemenea poate fi folosită și în scop didactic pentru
evidențierea funcționalității sistemelor inteligente și datorită construcției permițând dezvoltarea
ulterioară.
1.2 Structura lucrării
Lucrarea este structurată în șase capitole, după cum urmează:
Capitolul 1 – Introducere : cuprinde memoriul justificativ al lucrării, în car e este
prezentată tema lucrării, justificarea alegerii făcute și descrierea structurii lucrării;
Capitolul 2 – Fundamente teoretice : în acest capitol sunt prezentate noțiunile teoretice
necesare p entru realizarea aplicației;
Capitolul 3 – Realizarea practică a proiectului : cuprinde o descriere a etapelor de
proiectare și implementare a aplicației;
Capitolul 4 – Rezu mat.Concluzii : cuprinde o serie de idei ce surprind punctele esenț iale
alea lucră rii;
Capitolul 5 – Anexe : în acest capitol au fost atașate codurile sursă ale programelor
platformei ,schemele și layout -urile circuitelor electronice.
Capitolul 6 – Bilbiografie ;
3
Capitolul 2. Fundamentare teoretică
2.1 Motoare de curent continuu fără perii
Dispozitivul electromecanic cu rolul de a transforma energia electrică în magnetic ă și din
magnetică în mișcare de rotație mecanică poartă denumirea de motor electric. Motoarele
electrice pot fi de mai multe tipuri, diferența constând în maniera în ca re câmpul magnetic este
generat pentru a obține cuplul, forța de rotație, însă ele pot fi clasificate în două mari categorii,
funcție de alimentare, și anume: motoare de curent continuu și motoare de curent alternativ.
Motorul de curent continuu a fost d escoperit în mod accidental în 1873 de inginerul
belgian Zénobe Théophile Gramme și inginerul francez Hippolyte Fontaine . Prin conectarea a
două generato are de curent continuu între ele au putut observa conversia energiei electrice
absorbite de la generator. Au constatat faptul că generatorul era o mașină electrică reversibilă, el
putând funcționa ca un convertizor de energie bidirecțional.
În funcție de construcție și sistemul de control, motoarele de curent continuu se împart în
motoare cu perii colectoare și motoare fără perii colectoare.
Motoarele de curent continuu fără perii (Figura 2.1.1), cunoscute și sub denumirea de
motore brushless, prescurtat BLDC, sunt motoare electrice sincron e cu magneți permanenți și
înfășurări concentrate alimentate de la o sursă de curent continuu cu ajutorul unui sistem de
comutație controlat electronic spre deosebire de cele cu perii care au sistemul de comutație
mecanic bazat pe perii colectoare.
Figura 2.1.1 Secțiunea unui motor brushless
4
Motoarele brushless, au câștigat rapid popularitate fiind foarte utilizate în procese
industriale (automatizări), tracțiuni electrice, sistemele de centrifugare, ventilatoare, pompe,
servosisteme și mai recent în periferice de calculator și aparatură medicală.
Făcând o comparație între motoarele de curent continuu cu perii și cele fără perii putem
observa următoarele avantaje în cazul celor din urmă: necesită întreținere minimă, nu produc
scântei ionizante ( interferen țele electromagneti ce fiind reduse total) , au un zgomot redus,
densitate de putere mare, dimensiuni reduse, control complex al vitezei (lipsa periilor înlătură
limitarea vitezei maxime datorate încălzi i periilor colectoare ), o buna disipare a călduri i, pierderi
rotorice minime.
În domeniul 1 -10kW performanțele motoarelor fără perii de curent continuu sunt
asemănătoare cu cele ale motoarelor asincrone, sub acest domeniu au un randament și factor de
putere mult mai ridicat.
Rotorul motorului brushless este format dintr -un ax pe care sunt dispuși magneți
permanenți cu un n umăr de perechi de poli variabil , putând avea între 2 și 8 poli. Magneții pot fi
construi ți din ferite sau aliaje magnetice din pământuri rare (magneț ii neodim fier bor sau ne o
magneț i), cele din urmă având o densitate de flux mult mai bună. În figura 2.1.2 sunt prezentate
câteva dintre formele constructive ale rotorului.
Statorul motorului brushless este fabricat din lamele (tole) de oțel stivuite cu înfășurări
plasate în fantele care sunt tăiate axial de -a lungul periferiei interioare . Statorul se aseamană
foarte mult cu cel al motorului asincron, diferind doar modul de distribuire a înfășurărilor. Cele
mai multe motoare brushless au trei înfășurări statorice legate în mod stea, acestea fiind
distribuite la periferia statorului pentru a forma un număr par de poli .
Din punct de vedere al configurației înfășurărilor, motoarele fără perii sunt întâlnite în
două variante constructive: motoare cu excitație sinusoidală ( tensiunea electromotoare indusă și
curentul variază sinusoidal ) și motoare cu excitație dreptunghiulară ( tensiunea electromotoare
indusă și curentul variază trapezoidal ) . În cazul motoarelor cu unde sinusoidale cuplul variaz ă
mai lin.
Figura 2.1.2 Exemple de ro tor brushless
În funcție de dispunerea magneților rotorului față de stator întâlnim motoare brushless cu
magneții situați în exteriorul statorului (Figura 2.1. 3 a) sau cu magneții situați în int eriorul
statorului (Figura 2.1.3 b).
5
Figura 2.1.3 Tipuri de motoare brushless
Pentru a avea un control cât mai bun al motorului este necesară cunoașterea poziției
rotorului la un moment dat, cea mai simpla modalitate este folosirea senzorilor de poziție hall,
sau ceva mai complicată metoda back -EMF (back electrom otive force ). Detaliile privind modul
de realizare a comutației folosind senzorii hall sau metoda back -emf și determinarea vitezei pe
baza informației de poziție, vor fi precizate în subcapitol ul următor.
2.2 Comanda motoarelor de curent continuu fără perii
Simpla aplicare a tensiunii la bornele unui motor de curent continuu fără perii, cu trei
înfășurări conectate în mod stea, nu este translată în mișcare de rotație, așa cum este posibil în
cazul motoarelor cu perii, unde comutația este realizată pri n intermediul periilor colectoare
(autocomutație).
Prin urmare este necesar dezvoltarea unui sistem electronic (schema bloc echivalentă
fiind prezentată în figura 2.2.1) și a unui algoritm de comutație bazat pe șase sectoare. Fiecărui
sector îi corespunde o translare cu un unghi α de 60° electrice, o secvență completă de comutație
fiind de 360° electrice și corespunde unei rotați electrice complete.
Figura 2.2.1 . Schema bloc a unui sistem electronic de control a motorului brushless
O secvență de comutare presupune ca una din înfășurări să fie conectată la borna
pozitivă, o a doua înfășurare să fie conectată la borna negativă, iar cea de -a treia înfășurare
6
rămânând în stare de înaltă impedanță (nu este conectată la nici o bornă). În figura 2.2.2 găsim
cele șase secvențe de comandă.
Rotația este rezultatul interacțiunii câmpului magnetic produs de înfășurările statorice și
câmpul ma gnetic rotoric, cuplul maxim obț inându -se când aceste două câmpuri sunt
perpendiculare unul față de celăl alt.
Figura 2.2.2 . Secven țe de comand ă
În continuare pentru a înțelege mai bine funcționarea motoarelor brushless se va analiza
pe scurt modelul matematic al acestora.
Reprezentând fieca re fază a motorului printr -o rezistență, inductivitate și o tensiune
electromotoare (simetrice și echilibrate așa cum se poate observa în figura 2.2.3) și ținând seama
că în timpul funcționării sunt conectate două câte două fazele înfășurării statorice, se poate
analiza modelul matematic în co ordonatele fazelor cu parametri concentrați , ecuațiile care
descriu acest model fiind:
vAB=2Ri A+2LdiA
dt+(eA−eB)
vBC=2Ri B+2LdiB
dt+(eB−eC) (2.2.1)
vCA=2Ri C+2LdiC
dt+(eC−eA)
iA(t)=vAB−eA
2R
Valorile instantanee ale curenților: iB(t)=vBC−eC
2R (2.2.2)
iC(t)=vCA−eC
2R
Ecuația de cuplu : Te=Kfωm+jdωm
dt+TL (2.2.3)
7
Figura 2.2.3. Reprezentarea înfășurărilor statorice ale motorului brushless printr -o rezistență,
inductivitate și o tensiune electromotoare
– iA, iB, iC –curen ții prin înfășurările statorice ;
– eA, eB, eC – tensiunile electromotoare corespunzătoare celor trei înfășurările statorice;
– Te –cuplul electric;
– TL –cuplul de sarcină;
– ωm -viteza unghiulara a rotorului;
– Kf -constanta de frecare;
– j – momentul de inerție al motorului;
Modelul matematic al motorului poate fi analizat și din punct de vedere bidimensional
(reprezentare vectorială, în coordonate d -q) :
Figura 2.2.4. Orientarea fluxului rotoric
Ecua țiile de tensiune: { ud=RSid+dΨd
dt−ωΨq
uq=RSiq+dΨq
dt+ωΨd (2.2.4)
Expresiile fluxului: { Ψd=Ldid+ΨE
Ψq=Lqiq (2.2.5)
Fluxul de magnetizare: { Ψdm=Mdid+ΨE
Ψqm=Mqiq (2.2.6)
8
Induct ivitățile sincrone: {
Ld=LSσ+Md
Lq=LSσ+Mq (2.2.7)
Ld –inductanța sincronă l ongitudinală ;
Lq –inductanța sincronă transversală ;
LSσ –inductivitatea de dispersie a fazei statorice ;
Md –inductivitatea de magnetizare longitudinală ;
Mq –inductivitatea de magnetizare transversală ;
ω – viteza unghiulara a rotorului ;
– cu indicele E au fost notate mărimile infășurărilor statorice .
Cuplul motorului poate fi dedus dintr -un bilanț energetic obținându -se expresia:
T=piqΨE+p(Md−Mq)iqid (2.2.8)
unde piqΨE reprezintă cuplul electromagnetic.
În regim staționa r (ω=ωs) dacă inductivitățile sincrone Ld,Lq nu depind de curent și
fluxurile sunt constante ,din ecuațiile de tensiune:
{ ud=RSid−Xqiq
uq=RSiq+Xdid+ωsΨE (2.2.9)
și folosind notațiile: { Xd=ωsLd
Xq=ωsLq
ΨS=Ψd+jΨq (2.2.10)
rezultă:
Ecuația de tensiune: us=Rsis+jXdid−Xqiq+jωsΨE (2.2.11)
Expresia fluxului statoric: Ψs=Ldid+ΨE+jLqiq (2.2.12)
Cea mai comodă strategie de comandă a motoarelor brushless este orientarea după fluxul
rotoric.Această modalitate necesită realizarea ortogonalității dintre fluxul de excitație și curentul
statoric. Î n cazul în care cele două componente nu sunt perpendiculare, răspunsul sistemului este
lent iar cuplul el ectromagnetic se reduce . Deci curentul de cuplu din stator trebuie să fie pe
direcția axei q și în consecință id = 0. Dacă se neglijează și rezistența fazei statorice relațiile 2.11
și 2.12 devin:
Ecua ția de tensiune : us=jωsΨE−Xqiq (2.13)
Expresia fluxului stator ic: Ψs=ΨE+jLqiq (2.14)
9
Figura 2.2.5 . Diagrama vectorială în regim staționar
Factorul de putere : cosφ=ΨE
√ΨE2+Lq2iq2 (2.2.15)
Pulsația statorică (viteza unghiulară a rotorului la sincronism ):
ωs=us
√ΨE2+Lq2iq2 (2.2.16)
Poziția rotorului este dif icil de determinat datorită lip sei autocomutației. Există câteva
metode de determinare a poziției, dintre care cele mai utilizate fiind metoda de detecție cu
senzori hall și metoda nesenzorială back -EMF.
Metoda nesenzorială este bazată pe măsurarea tensiunii electromotoare induse în
înfășurările statorului și ține de implementare hardware și software așa cum se poate deduce din
schema echivalentă a unui sistem electronic prezentată în f igura 2.2.6.a. Măsurarea tensiunii
electromotoare induse este posibilă deoarece una dintre înfășură ri este lăsată în gol la un moment
dat.
Tensiunea electromotoare fiind proporțională cu viteza de rotație, la viteze mici,
amplitudinea tensiunii induse este de valoare foarte mică, citirea semnalului fiind foarte dificilă
pentru determinarea trecerilor prin zero, prin urmare este necesar ca rotorul s ă ajungă la o
anumită tu rație, de aceea, inițial, pornirea acestui tip de motoare se face fără control ul poziției
(orbește).
Metoda este convenabil ă în condi ții nefavorabile metodei senzoriale , precum spații greu
accesibile , încăperi cu mult praf sau agenți dăună tori componentelo r electronice. Însă în cazul în
care motorul trebuie să efectu eze opriri sau porniri repetate, această metodă prezintă dezavantaje .
10
a)Schema bloc a circuitului electronic b)Schema bloc a circuitului electronic
de control folosind metoda back -EMF de control folosind senzori hall
Figura 2.2.6.
În ultima vreme folosirea senzorilor hall a devenit cea mai răspândită metodă de detecție
a poziției rotorului, cele mai multe motoare brushless având câte trei senzori hall montați la
capătul statorului. Acești senzori, care funcționeaza pe baza efectului hall, furnizează un semnal
digital cu nivel 1 logic pe o perioadă π iar pentru cea de a doua perioadă π un semnal digital cu
nivel 0 logic. Semnalele furnizate de cei trei senzori sunt defazate între ele cu 60° astfel fiecare
senzor este aliniat cu unul dintre circuitele electromagnetice.
Efectul hall apare când un conductor sau un semiconductor, parcurs de un curent electric,
este supus acțiunii unui cîmp magnetic perpendicular pe direcția curentului și se manifestă prin
apariția unei tensiuni, denumită tensiune hall.
Num ărul de cicluri electrice care trebuie s ă se repete pentru a obț ine o rota ție completă
este determinat de numă rul de poli rotorici. Formele de unde generate de senzori sunt prezentate
în figura 2.2.7 , de remarcat faptul că perioada semnalului furnizat de un senzor hall este identică
cu perioada unui ciclu electric, iar în figura 2.2.6.b se poate observa o schemă bloc echivalentă
unui sistem electronic de control ce utilizează senzori hall, de asemenea se poate observa și
modul de amplasare a senzorilor hall în interiorul statorului.
Figura 2.2.7. Formele de unde generate de senzori Hall
11
2.3 Invertor trifazat
Invertoarele sunt convertoare statice de putere continuu -alternativ. Ele transformă o sursă
de tensiune (sau curent) continuu într -o sursă de tensiune (sau curent) alternativă, de amplitudine
și/sau frecvență variabilă.
Invertoarele cu comutație comandată se pot clasi fica după mai multe criterii, în funcție de
numărul de faze ale semnalului de ieșire putem întâlni invertoare monofazate și invertoare
trifazate. Având în vedere natura circuitului de alimentare și mărimea comutată în circuit,
întâlnim invertoare de tensiu ne (alimentate de la o sursa de tensiune continuă, mărimea de ieșire
fiind tensiune iar forma curentului este impusă de sarcină) și invertoare de curent (alimentate de
la o sursa de curent continuă, mărimea de ieșire fiind curent iar forma tensiunii este i mpusă de
sarcină). La ieșirea invertorului forma de undă poate căpăta: forma unui semnal dreptunghiular,
forma unui semnal dreptunghiular modulat în durată sau forma unui semnal sinusoidal.
După modul de comandă regăsim invertoare comandate cu undă plină ș i invertoare comandate pe
principiul modulării în durată a impulsurilor de comandă (PWM –Pulse Width Modulation ).
Majoritatea invertoarelor atât monofazate cât și trifazate sunt construite avînd la bază
brațul de semipunte monofazată. Puntea monofazată con ține două brațe, iar cea trifazată trei.
Fiecare braț conține două comutatoare care funcționează în contra -timp, fiecare din ele fiind
basculate între două stări stabile: starea de conducție totală și starea de blocare totală. Aceste
comutatoare pot fi tir istoare (GTO, normale), tranzistoare (MOS FET, IGBT, TBJ) sau relee (în
cazul frecvențelor mici de comutare).
În continuare este prezentat invertorul trifazat de tensiune comandat cu undă plină în
condiții ideale. Sursa care furnizează m ărimea de intrare co ntiunuă este considerată perfectă (cu
impedanța internă neglijabilă) iar comutatoarele sunt ideale ( cădere de tensiune în direct nula,
curent de scurgere invers nul, comutații instantanee). La ieșirea invertorului este conectată o
sarcină trifazată simetri că în configurație stea, de tipul R -L-E, echivalentă cu înfășurările unui
motor brushless. Cele trei brațe de ieșire ale invertorului au fost notate uzual cu A,B,C, cu N s -a
notat bara negativă (masa) a sursei de tensiune continuă V d iar cu n nulul izola t al sarcinei
trifazate.
Alte notații:
-vAN,vBN,vCN –tensiunile de ieșire ale brațelor luate față de bara negativă a sursei V d;
-vAB,vBC,vCA –tensiunile de linie la ieșirea invertorului;
-vAn,vBn,vCn –tensiunile de ieșire ale brațelor luate față de nulul stelei (izolat);
-iA , iB, i C –curenții de fază de la ieșirea invertorului;
-eA,eB,eC – tensiunile electromotoare induse;
-vnN –tensiunea dintre nulul stelei si bara negativa a sursei;
Pe fiecare interval de timp se află în conducție doar două comutatoare. Comutatoarele din
partea superioară a punților invertorului față de comutatoarele din partea inferioară sunt
comandate decalat cu 60° electrice.
12
Figura 2.3.1. Topologia invertorului trifazat cu sarcină echilibrată conectată în stea
Comutatoarele unei singure punți sunt comandate în contratimp și decalat cu 120°
electrice, fiecare comutator găsindu -se în conducție pe un interval de timp echivalent cu 120°
electrice. Tensiunile de li nie la ieșirea invertorului sunt defazate între ele cu 120° electrice.
Ecuațiile volt -amper scrise ținând seama că în timpul funcționării sunt conectate două
faze ale sarcinei (conectată în stea) sunt :
vAB=2Ri A+2LdiA
dt+(eA−eB)
vBC=2Ri B+2LdiB
dt+(eB−eC) (2.3.1)
vCA=2Ri C+2LdiC
dt+(eC−eA)
Tensiunile de linie la ieșirea invertorului pot fi exprimate în funcție de tensiunile de ie șire
ale bra țelor luate fa ță de nulul stelei (n) sau în funcție de tensiunile de ieșire ale brațelor luate
față de bara negativă a sursei (N):
vAB=vAN−vBN=vAn−vBn
vBC=vBN−vCN=vBn−vCn (2.3.2)
vCA=vCN−vAN=vCn−vAn
Deoarece sarcina la ieșire este în configurație stea având nulul izolat se poate scrie:
iA+iB+iC=0 (2.3.3)
13
Și întrucât este simetrică și echlibrată în orice moment este valabilă relația:
eA+eB+eC=0 (2.3.4)
Suma tensiunilor de ie șire ale bra țelor luate fa ță de nulul stelei (n) este nulă:
vAn+vBn+vCn=0 (2.3.5)
Tensiunile de ieșire ale brațelor luate față de bara negativă a sursei (N) pot fi exprimate
după cum urmează:
vAN=vAn+vnN
vBN=vBn+vnN (2.3.6)
vCN=vCn+vnN
Din relația 2.3.5 și 2.3.6 putem deduce expresia tensiunii dintre nulul fazei și bara
negativă a sursei de alimentare:
vnN=1
3[ vAN+vBN+vCN] (2.3.7)
Din expresiile 2.3.6 și 2.3.7 ecuațiile de tensiune ale invertorului trifazat capătă forma :
vAn=2
3 vAN−1
3vBN−1
3vCN
vBn=2
3 vBN−1
3vAN−1
3vCN (2.3.8)
vCn=2
3 vCN−1
3vBN−1
3vAN
Figura 2.3.2. Formele de undă corespunzătoare invertorului trifazat comandat cu undă plină
14
Din figura prezentată anterior putem observa că formele de undă ale tensiunilor de linie la
ieșirea invertorului vAB,vBC,vCA, tind spre o formă de undă trapezoidală. În funcție de poziția
comutatoarelor, tensiunile de ie șire ale bra țelor luate fa ță de nulul stelei v An,vBn,vCn vor avea
valoarea +Vd
2 sau −Vd
2 .
Analizând primult interval 0° – 60° pentru tensiunile de linie rezultă următoarele valori :
vAB=vAn−vBn=Vd
2−(−Vd
2)= Vd
vBC=vBn−vCn=(−Vd
2)−0=−Vd
2 (2.3.9)
vCA=vCn−vAn=0−Vd
2=−Vd
2
Cel mai utilizat mod de comandă a invertoarelor trifazate este cel bazat pe principiul
modulării în durată a impulsurilor (PWM).
Modulația pulsurilor în durată folosește un semnal dreptunghiular a cărui lățime este
modulată ca rezultat al variației valo rii medii a undei.
Considerând o form ă de undă f(t) cu periada T , valoare minimă vmin , valoare
maximă vmax și un ciclu activ D, valoarea medie a undei va fi:
v̅=1
𝑇∫𝑓(𝑡)𝑑𝑡𝑇
0 (2.3.10)
Figura 2.3.3. PWM
Forma de undă f(t) este un semnal dreptunghiular periodic, valoarea lui este vmax pentru
intervalul 0 < t < DT și respectiv vmin pentru intervalul DT < t < T . Ținând cont și de aceste
considerente, formula (2,9) va deveni :
v̅=1
𝑇(∫ v𝑚𝑎𝑥𝑑𝑡𝐷𝑇
0+∫v𝑚𝑖𝑛𝑑𝑡𝑇
𝐷𝑇)=𝐷v𝑚𝑎𝑥 +(1−𝐷)v𝑚𝑖𝑛 (2.3.11)
În majoritatea cazurilor vmin = 0 , prin urmare valoarea medie a semnalului va fi egală cu
𝐷v𝑚𝑎𝑥 . Din acestea putem observa că valoarea medie a semnalului este direct proporțională cu
cilul activ.
15
2.3.1 Tranzistorul MOSFET
Tranzistorul cu efect de câmp (FET) este un dispozitiv electronic semiconductor folosit
pentru a comanda intensitatea curentului electric dintr -un circuit. Asemenea dispozitive sunt
întâlnite și sub denumirea de tranzistoare unipolare deoarece c onducția electrică este asigurată de
un singur tip de purtători electronici de sarcină, electroni sau goluri, după cum canalul este de tip
n, respectiv p . Funcționarea se bazează pe variația conductibilității unui canal , accesibil prin
terminalele numite sursă și drenă , ce se realizează prin aplicarea unei tensiuni între grila (poarta)
și substratul dispozitivului, astfel obținându -se, modificarea dimensiunii transversale a canalului
semiconductor sau a concentrației de purtători electronici din acesta.
În funcție de modul de realizare a grilei c ele mai frecvente configurații de tranzistoare cu
efect de camp întâlnite sunt tranzistoare cu grilă izolată de semiconductor prin intermediul unui
strat de oxid de siliciu foarte subțire (MOSFET) și tranzistoare cu o joncțiune invers polarizată
(JFET).
Pentru a proteja tranzistorul, uneori, în procesul de fabricație, sunt introduse diode zener
între grilă și substrat. Diodele dintre grilă și substrat protejează tranzistorul însă reduc rezi stența
de intrare. Datorită rezistențelor mari și capacităților mici ale structurii grilă -canal din
tranzistorul MOS, pot apărea tensiuni mari de străpungere datorate acumulării de sarcină
electrostatic. Aceste tensiuni străpung oxidul stratului izolator, de grosime foarte mică și distrug
tranzistorul. Acumularea de sarcini electrostatice poate apărea de exemplu datorită containerelor
de plastic utilizate la transportul materialelor semiconductoare sau datorită tensiunii
electrostatice cu care este încărca tă o persoană ce ține în mână asemenea tranzistoare .Tot prin
procesul de fabricație po ate fi introdusă și o diodă de descărcare conectată antiparalel, între drenă
și sursă, acestea protejând tranzistorul în cazul sarcinilor inductive și returnând în circ uit energia
înmagazinată în bobină.
Tranzistorul MOSFET spre deosebire de tranzistor bipolar are avantajul unei impedanțe
de intrare mari, curentul de comandă pe grilă fiind semnificativ mai mic ( de ordinul zecilor de
picoamperi ).
16
2.3.2 Circuitu l driver IR2101
Circuitul integrat IR2101 este un circuit de comandă (driver) a tranzistoare lor
MOSFET/IGBT dintr -un braț de punte. Este de tip HVIC cu dispozitiv de blocare CMOS, cu o
construcție monolitică ridigizată, care nu necesită elemente de separare galvanică pe traseele de
comunicație. Diagrama bloc a circuitului este prezentată în figura 2.3.2.1 . Acesta folosește
tehnica de bootst rap pentru a obține tensiunea pozitivă de grilă .
Figura 2.3.2.1 Diagrama bloc IR2101
Condesatorul CA2 conectat între pini V B și V S asigură o tensiune pozitivă suplimentară
pe grila tranzistorului din partea superioară a brațului de punte . De fiecare d ată când tranzitorul
din partea inferioară este adus în conducție se crează condiția de încărcare a condesatorul de
bootstrap CA2, de la sursa de alimentare prin intermediul diodei DA1, diodă ce protejează atât
sursa cât și integratul împotriva tensiunilor ridicate ale circuitului de forță. În momentul aducerii
în conducție a tranzistorului din partea superioară, tensiunea flotantă va fi asigurată de
condesator pentru o perioad ă de câteva microsecunde sau milisecunde.
Figura 2.3.2.2 Schema cu IR2101
17
2.4 Microcontrolere
Un microcontroler este un sistem electronic miniaturizat destinat controlului unui proces
sau al unei interacțiuni cu mediul exterior, intervenția operatorului uman nefiind necesară. Inițial
controlerele erau realizate folosind component e electromecanice și componente electronice
discrete. Construcția lui era foarte robustă având un consum mare de energie și fiabilitate lasând
de dorit. Cu timpul acesta a început să capete forme din ce în ce mai mici, toate componentele
necesare au fost i ntegrate pe același chip.
Datorită prețului scăzut, în prezent microcontrolerele se regăsesc în aproape toate
dispozitivile electrocasnice (televizoroare, mașini de spălat, imprimante, frigidere,cuptor cu
microunde etc.). De asemenea microcontrolerele sunt folosite pe scară largă și în industrie. În
industria automobilelor de exemplu este integrat în unitatea de control (ECU) și poate realiza
controlul frân ări și al direcției(ABS), controlul injecției carburantului, controlul dispozitivelor de
siguranță(Air bag), reglarea scaunelor și oglinzilor, climatizarea, diagnoza.
La ora actuală există un număr foarte mare de tipuri constructive de microcontrolere.
Printre cei mai cunoscuți producători de microcontrolere sunt: Motorola, Intel, Microchip,
Freescale, Texa s Instruments, Atmel, Zilog. Acești producători scot pe piață chip -uri tot mai
performante, dedicate anumitor aplicații specifice. Toate acestea sunt realizate în tehnologia
CMOS ( Complementary metal –oxide –semiconductor ), tehnologie care permite obținerea celor
mai mari viteze de operare la o putere consumată foarte redusă, realizarea structurilor cu
densitate foarte mare de integrare și o imunitate ridicată la perturbații.
Microcontrolerul în structura sa internă poate include o unitatea centrală (micropro cesor),
un temporizatoar/numărător, un generator de tact (de obicei un circuit RC), o memorie volatilă
(RAM) și o memorie nevolatilă (ROM/EPROM/EEPROM/FLASH), un sistem de întreruperi
(ISR), un dispozitiv I/O intrări/ieșiri atât seriale cât și paralele, un covertoar A/D și D/A, un
comparator analogic , un generator de PWM, periferice și alte resurse. Dimensiunea cuvântului
de date reprezintă un prim criteriu de clasificare, astfel funcție de acesta și de puterea de calcul
dorită întâlnim microcontrolere cu o lungime a cuvântului de date cuprinsă între 4 și 64 de biți
Cel mai important aspect în ceea ce privește analiza oricărui sistem de calcul se referă la
arhitectura sa internă. Dintre cele mai întâlnite arhitecturi amintim: arhitecturi de tip " Von
Neuman n " și arhitecturi de tip " Harvard ".
Fiindcă dezvoltarea aplicațiilor presupune pe lângă proiectarea circuitelor electronice
aferente și specificarea prin instrucțiuni a sarcinilor pe care sistemul trebuie să le îndeplinească,
microcontrolerele dispun și de un circuit microprogramabil.
Limbajul mașină este singurul mod prin care microcontrolerul poate interpreta
informația. Însă acest limbaj nu este deloc la îndemâna unui programator. Acesta va utiliza un
limbaj de programare (ASM, C/C++) în care o instr ucțiune are corespondent o instrucțiune în
limbajul mașină. Conversia instrucțiunilor din limbajul de programare în limbaj mașină va fi
realizată de un compilator.
18
2.4.1 Microcontroler PIC16F887
Produs de firma Microchip Technology Inc, PIC16F887 este un microcontroler pe 8 biți
construit pe o arhitectură de tip Harvard (figura 2.4.1.1) . Arhitectura Harvard permite executarea
instrucțiunilor microcontrolerului (majoritatea) într -un singur ciclu. S pațiile de memorie sunt
separate pentru memoria program și memoria de date. Lățimea magistralelor variază în funcție
de mărimea memoriei.
Figura 2.4.1.1 Arhitectura Harvard
Unitatea centrală de programare de înaltă performanță este bazată pe o arhitectură RISC
(Reduced Instruction Set Computer ) având numa i 35 de instrucțiuni.
Oscilatorul intern este de 8Mhz, frecvența acestuia poate fi divizată pentru a obține
frecvențe de oscilație de 4 MHz, 2MHz, 1MHz, 500KHz, 250 KHz, 125 Khz și respectiv 31KHz,
prin intermediul registrului OSCCON (biții IRCF<2:0>). Fre cvența maximă de operare este de
20 MHz, în acest caz este necasar atașarea unui cuarț extern.
Microcontrolerului are o memorie program FLASH de 8192 cuvinte. Această memorie
poate fi ștearsă și repro gramată electric. În cazul ștergerii este permisă doar ștergera întregului
conținut.
Memoria de date este formată din 368 bytes (octeți) SRAM și 256 bytes EEPROM, fiind
împărțită în patru bancuri care conțin registri de uz general (GPR) și registri de fu ncții speciale
(SFR). Memoria SRAM (Static Random Access Memory ) folosește circuite logice
combinaționale pentru a memora fiecare bit și nu necesită un ciclu periodic de reîmprospătare.
Aceast ă memorie conține registri de uz general, unde sunt memorate date aflate în continuă
schimbare. Memoria EEPROM (Electrically Erasable Programmable Read Only Memory) este
un tip de memorie nevolatilă în care sunt stocate date pe termen lung. Ștergerea este selectivă, iar
pentru rescriere trebuie parcurși mai mulți pași. Memoria este lentă și are un număr de rescriere
limitat (aproximativ 10 000).
Capsula microcontrolerului este de tip PDIP având 40 de pini dintre care 4 de alimentare
(VDD, VSS). Pentru alimentare este recomandată o tensiune stabilizată cu o valoare cuprinsă
între 3.7V și 5V. Pini microcontrolerului sunt grupați în patru porturi (PORTA, PORTB,
PORTC, PORTD) a câte 8 pini fiecare și un port de 4 pini ( PORTE). Prin intermediul rigiștrilor
19
TRISA/TRISB/TRISC/TRISD/TRISE pinii acestor porturi pot fi seta ți fie de intrare fie de ieșire,
funcție de cerințele aplicației.
În figura 2. 4.1.2 se poate observa o diagramă pinilor microcontrolerului .
Figura 2.4.1.2 Diagrama pinilor PIC16F887
Microcontrolerul PIC16F887 are 3 module de timere respectiv TMR0, TMR1, TMR2 .
Mod ulul TMR0 poate lucra pe 8 biți , putând fi folosit atât ca timer cât și ca numărător de
evenimente. Acesta are un prescaler de 8 biti care poate fi asignat cu TMR0 sau WDT. Prescaler –
ul are rolul de a diviza frecvența oscilatorului intern sau extern . În modul de lucru timer va
incrementa la fiecare ciclu instruțiune până va atinge valoarea maximă de 255, după care o va lua
de la capăt. Incrementarea va porni de la o valoare prescrisă de programator. Orice m odificare a
TMR0 va inițializa și prescalerul. Prescalerul va memora de cate ori TMR0 a incrementat până la
depășirea valorii maxime. Un ciclu instrucțiune se desfășoară pe durata a 4 perioade de ceas. La
depășirea valorii de 255 (0xff) TMR0 poate genera o î ntrerupere.
Ecuația funcționă rii TMR0 este:
TMR 0=256 −t x Fosc
4 x Prescaler (2.4.1.1)
t – timpul dorit (în milisecunde);
Fosc –frecvența oscilatorului intern/extern.
Registrul OPTION_REG conține biții de control pentru a configura prescaler ul, întreruperea
INT externă, TMR0, și pull-up-uri de pe PORTB:
20
RBPU – bit de setare al „pull -up” PORTB:
1 = pull -up PORTB este dezactivat;
0 = pull -up PORTB este activat de valorile individuale ale latch -urilor;
INTEDG – bit de selecție al frontului întreruperii RB0/INT:
1 = întrerupere pe front crescător RB0/INT;
0 = întrerupere pe front descrescător RB0/INT;
T0CS –bit de selecție a tactului pentru TMR0:
1 = TMR0 incrementează prin impulsurile experne primite pe pinul RA4/T0CKI;
0 = TMR0 incrementeaza de la oscilatorul intern(F osc/4);
T0SE –bit de selecție a polarității semnalului de tact extern:
1 = incrementare pe tranziția low -high a RA4/T0CKI;
0 = incrementare pe tranziția high -low a RA4/T0CKI;
PSA –bit de asignare a prescalerului:
1 = prescalerul este asignat la WDT;
0 = prescalerul este asignat la TMR0;
PS<2:0> – biții de selecție a ratei prescalorului:
PS2 PS1 PS0 TMR0 WDT
0 0 0 1:2 1:1
0 0 1 1:4 1:2
0 1 0 1:8 1:4
0 1 1 1:16 1:8
1 0 0 1:32 1:16
1 0 1 1:64 1:32
1 1 0 1:128 1:64
1 1 1 1:256 1:128
Modulul TMR1 are o funcționare asemănătoare cu TMR0. Este un timer și numărător pe
16 biți care poate fi incrementat și în starea de hibernare (sleep) a microcontrolerului. Poate fi
configurat prin intermediul registrului T1CON. Activarea timerului se face prin setarea bitului
TMR1ON. TMR1 are doi regiștri paraleli TMR1H și TMR1L care se vor incrementa la fiecare
tact de ceas dacă timerul este pornit și bitul T1OSCEN setat. Prescalerul este complet separat și
poate fi setat la 1:1 , 1:2, 1:4, 1:8.
Modulul TMR2 este un timer și numărător de 8 biți cu registru de perioadă de 8 biți.
Configurare acestuia se face prin intermediul registrului T2CON. Acest timer are inclus atât
prescaler cât și postscaler. Prescalerul este controlat de b iți T2CKPS , iar postscalerul este
controlată de biți TOUTPS ai registrului. Poate fi deservit ca bază de timp pentru modulul CCP.
Microcontrolerul PIC16F887 permite lucrul în întreruperi, punând la dispoziție multiple
surse de întrerupere.
21
Prin întrerupe re înțelegem suspendarea procesului de execuție a programului pentru a
deservi o problemă prioritară, după finalizare reluându -se execuția procesului oprit anterior din
punctul unde s -a produs întreruperea. Întreruperea în mod general este determinată de r ăspunsul
la un efect fizic extern sau intern, care necesită o tratare imediată. Tratarea situației presupune
existența unei subrutine definite în acest scop.
Întreruperile sunt controlate prin 3 biți, dintre care unul stabilește nivelul de prioritate al
întreruperii (ridicat/scăzut), unul activeză întreruperea și al treilea marchează când s -a produs
întreruperea. Întreruperile pot fi controlate prin intermediul regiștrilor INTCON, PIE1, PIE2,
PIR1, PIR2, IOCB.
În registrele INTCON se pot face anumite confi gurații ale întreruperilor:
GIE –bit de permisie a întreruperilor globale:
1 = permite toate întreruperile nemascate;
0 = dezactivează toate întreruperile;
PEIE –bit de permisie a întreruperilor periferice:
1 = permite toate întreruperile periferice nemascate;
0 = dezactivează toate întreruperile periferice;
T0IE –bit de permisie a întrerulerilor generate de depășirea contorului TMR0:
1 = întrerupere permisă;
0 = întrerupere nepermisă;
INTE –bit de permisie a întreruperilor externe de la RB0/INT:
1 = întrerupere externă permisă;
0 = întrerupere externă nepermisă;
RBIE –bitul de permisie a întreruperilor generate de schimbarea stări pinilor portului B:
1 = întrerupere generate de schimbarea stări pinilor portului B permisă;
0 = întrerupere generate de s chimbarea stări pinilor portului B nepermisă;
În cazul în care se utilizează întreruperea generată de schimbarea stării pinilor portului B
(RBIE=1) este necesar și setarea biților corespunzători din registrul IOCB.
T0IF –flag de detecție a depășiri contor ului TMR0 (trebuie șters prin program) :
1 = depășirea s -a produs;
0 = nu s -a produs depășirea;
INTF –flag de detecție a întreruperilor externe (trebuie șters prin program) :
1 = întreruperea externă a avut loc;
0 = nu a avut loc întreruperea externă;
RBIF –flag de detecție a întreruperilor genereate de schimbarea stări pinilor portului B (trebuie
șters prin program) :
22
1 = întreruperea avut loc;
0 = nu a avut loc întreruperea ;
Registrele PIE (Peripheral Interrupt Enable) conțin biți individuali de activare pentru
fiecare per iferic ce poate lucra în întrerupere.
PIE1:
PIE2:
Registrele PIR (Peripheral Interrupt Request) conțin informații care ne spun daca s -a
produs sau nu o întrerupere.
PIR1:
PIR2:
ADIE –bit pentru setarea întreruperii convertorului AD;
ADIF –flag de întreruperi al convertorului AD;
RCIE –bit pentru setarea întreruperii pentru recepția USART;
RCIF –flag de întrerupere pentru recepția USART;
TXIE –bit pentru setarea întreruperii pent ru transmisie USART;
TXIF –flag de întrerupere pentru transmisia USART;
TMR2IE –bit pentru setarea întreruperii la coincidență TMR2/PR2;
TMR2IF –flag de întrerupere la coincidență TMR2/PR2;
TMR1IE –bit pentru setarea întreruperii la depășirea valorii maxime a TMR1;
TMR1IF –flag de întrerupere la depășirea valorii maxime a TMR1;
Modulul utilizat pentru conversia mărimilor analogice în mărimi digitale, converotorul
analog numeric sau prescurtat A DC, pe care acest microcontroler îl pune la dispoziție are o
rezoluție de 10 biți. Modulul ADC poate fi folosit prin intermediul a 14 canale analogice.
23
Dacă avem o mărime analogică care variază între 0 și 5V rezultatul conversiei va fi un
număr cu valoare a cuprinsă între 0 și 1023. Pinii responsabili pentru preluarea semnalelor
analogice sunt distribuiți în portul A (RA0/AN0, RA1/AN1, RA2/AN2, RA3/AN3, RA5/AN4),
portul B (RB0/AN12, RB1/AN10, RB2/AN8, RB3/AN9, RB4/AN11, RB5/AN13), și portul E
(RE0/AN5, RE1/ AN1, RE2/AN2).
Când se dorește conversia de semnale analogice, acești pini de intrare/ieșire ar trebui să
fie configurați pentru modul analogic. Pentru a seta pin ii utilizați pentru citirea sem nalelor
analogice se vor utiliza regiștri TRIS, ANSEL, ANSELH, ADCON0, ADCON1. ANSEL și
ANSELH sunt regiștri de setare a modului an alogic sau digital pentru pinii destinați acestui mod
de lucru.
Registrul ADCON0:
ADCS<1:0> –biți de selecție a ceasului pentru conversia A/D:
00 = FOSC/2;
01 = FOSC/8;
10 = FOSC/32;
11 = FRC;
CHS <3:0> –biți de selecție a canalului analogic;
GO/DONE –bit status al conversiei A/D;
ADON –bit de activare a conversiei A/D;
Registrul ADCON1:
ADFM –bit de selecție al formatului rezultatului;
VCFG<1:0> –biți de selecție a tensiunii de r eferință:
00 = V DD,VSS;
01 = V DD, -Vref;
10 = +V ref, VSS;
11 = +V ref, -Vref;
Microcontrolerul PIC16F887 dispune de două module de comunicație serială: EUSART
(Enhanced Universal Syncronous Asyncronous Receiver Transmitter) și MSSP (Master
Syncronus Serial Port).
24
EUSART este un port periferic bidirecțional destinat implementării unui protocol clasic
de comunicație serială atât asincronă cât și sincronă. Comunicare se poate realiza cu un alt
microcontroler, calculator sau dispozitiv periferic (modul bluetooth, modul wireless, modul
GSM ). Transmisia datelor fiind bidirec țională aceasta se realizează prin intermediul a doi pini,
RX/RC7 (recepție) și TX/RC6 (transmisie). La comunicarea sincronă pe lângă legăturile de
transmisie a datelor mai existenț ă și o leg ătură prin care se stabilește același semnal de tact între
dispozitive. EUSART se poate folosi în configurații standard RS -232, RS -422 sau RS -485.
Regiștrii de interes pentru a configura modulul de comunicare serială sunt: registrul de
control a ra tei de transfer a datelor (BAUDCTL), registrul de setare a parametrilor transmisiei
(TXSTA), registrul de setare a parametrilor recepției (RCSTA), registrul generator al vitezei de
comunicație (SPBRG,SPBRGH), regis trul de transmisie a caracterului (TXREG) și registrul de
recepție a caracterului (RXREG). Registrul TXSTA permite selecția numărului de biți (8 sau 9
prin bitul TX9), modul de comunicație (sincron sau asincron prin bitul SYNC), selecția vitezei
ridicate de comunicație (BRGH) și începerea transmis iei (TXEN). Registrul de recepție RCSTA
permite activarea sau inhibarea recepției (SPEN), selectarea numărului de biți recepționați ( 8 sau
9 RX9), activarea recepției în mod continuu (CREN) și detecția a două tipuri de erori: frame
error (FERR) respectiv overrun error (OERR).
Formula ce stabilește viteză de transfer a datelor este:
BRGH = 0, BRG16=0, SYNC=0: [𝑆𝑃𝐵𝑅𝐺 :𝑆𝑃𝐵𝑅𝐺𝐻 ]=𝐹𝑜𝑠𝑐
64∗𝐵𝑎𝑢𝑑 _𝑟𝑎𝑡𝑒−1;
BRGH ={0,1}, BRG16={0,1}, SYNC=0: [𝑆𝑃𝐵𝑅𝐺 :𝑆𝑃𝐵𝑅𝐺𝐻 ]=𝐹𝑜𝑠𝑐
16∗𝐵𝑎𝑢𝑑 _𝑟𝑎𝑡𝑒−1; (2.4.1.2)
BRGH = 1, BRG16={0,1}, SYNC={0,1}: [𝑆𝑃𝐵𝑅𝐺 :𝑆𝑃𝐵𝑅𝐺𝐻 ]=𝐹𝑜𝑠𝑐
4∗𝐵𝑎𝑢𝑑 _𝑟𝑎𝑡𝑒−1;
Microcontrolerul mai are încorporat și module de captură, comparare , PWM ( Puls Width
Modulation). Captura este realizată pe 16 biți cu rezoluția maximă de 12.5nS, compararea pe 16
biți cu rezoluția maximă de 200nS, iar rezoluția maximă a PWM – ului este de 10 biți . PWM -ul
dispune de 1,2 sau 4 canale de ieșire având o frecvență maximă de 20kHz. Regiștrii asociați
modulului comparare/captură/pwm sunt CCPR1L, CCPR1H, CCP1CON, CCPR2L, CCPR2H,
CCP2CON.
Dacă se utilizează modulul PWM următoarele relații sunt importante de cunoscut:
PR2 =Fosc
Prescaler _TMR 2∗4∗FPWM−1 (2.4.1.3)
PWM _Duty _cycle =[CCPR1L :CCP1CON <5,4>]∗Tosc∗Prescaler _TMR 2 (2.4.1.4)
CCPR1L =PWM _Duty _cycle ∗(PR2 +1)
4 (2.4.1.5)
25
2.4.2 Microcontroler PIC18F4431
Microcontrolerul PIC18F4431 are aceași arhitectură internă ca și PIC16F887. C apsulă
este tot de tip PDIP cu 40 de pini I/O grupați în mod identic dar care au funcții diferite.
Figura 2.4.2.1 Diagrama pinilor PIC18F4431
Spre deosebire de PIC16F887, acest microcontroler prezintă unele avantaje pe care cel
din urmă nu le poate oferi. În primul rând este un microcontroler dedicat aplicațiilor care necesită
multiple intrări PWM.
Dispune de o memorie program Flash , mai mare, de 16384 bytes. De asemenea și
memoria de date este mai mare, 768 bytes SRAM și 256 bytes EEPROM.
Oscilatorul intern ca și la PIC16F887 este de 8MHz . Microcontrolerul poate funcționa
însă la o frecvență maximă de 40MHz datorită buclei PLL(Phase Lock Loop) interne. Această
bulcă are capacitatea de a multiplica de patru ori frecvența de oscilație, cu condiția ca frecvența
oscilatorul extern să nu fie mai mare de 10 MHz.
Întreruperile microcontrolerului pot fi controlate prin intermediul a 10 regiștri: RCON,
INTCON, INTCON2, INTCON3, PIE1, PIE2,PIE3, PIR1, PIR2, PIR3, IPR1, IPR2, IPR3.
Regiștri IPR (Interrupt Priority Regis ter) permit setarea priorității întreruperilor generate
de un anumit periferic printr -un bit specific. Registrul RCON conține bitul IPEN (Interrupt
Priority Enable Bit) prin intermediul căruia se stabilește dacă intreruperile vor lucra sau nu pe
nivele de prioritate.
PIC18F2431 are 4 module timer: TMR0, TMR1, TMR2 și TMR5. Modulul TMR0 poate
lucra pe 8 biți sau pe 16 biți, TMR1 și TMR5 pe 16 biți iar TMR2 pe 8 biți. Regiștri de
configurare specifici acestor module sunt: T0CON,T1CON,T2CON,T5CON. TMR2 poate f i
deservit ca bază de timp pentru modulul CCP. TMR5 este deservit ca bază de timp de modulul
26
PCPWM. De asemenea mai are câteva caracteristici noi față de celelalte module timer,
deservește modulul MFM (Motion Feedback Module), modul care poate fi utilizat atunci când se
dorește cunoașterea anumitor informații despre o mișcare.
Convertorul analog numeric A/D pe 10 biți are doar 9 canale, și realizează o conversie cu
o viteză mult mai mare față de PIC16F887. Convertorul este configurat cu ajutorul regiștrilo r:
ADCON0, ADCON1, ADCON2, ADCON3, ADCHS, ANSEL0, ADRESH, ADRESL.
Microcontrolerul PIC18F4431 dispune de 8 canale PWM care pot fi folosite atât în mod
independent cât și în mod complementar cu posibilitatea inserției de timpi morți. Canalele sunt
accesibil e prin intermediul pinilor portului B (RB0/PWM0, RB1/PWM1, RB2/PWM2,
RB3/PWM3, RB4/PWM5, RB5/PWM4) și portului D (RD5/PWM4, RD6/PWM6, RD7/PWM7).
Funcționarea modulului PWM este controlată de un total de 22 de registre. Opt dintre
aceșt ia sunt folosiți pent ru a configura caracteristicile modulului: PTCON0, PTCON1,
PWMCON0, PWMCON1, OVDCOND, OVDCONS, DTCON, FLTCONFIG. Ceilalți 14
regiștri sunt configura ți ca șapte regiștri de 16 biți.Aceștea sunt regiștri de control a factorului de
umplere: PDC0 (PDC0L,PDC0H ), PDC1 (PDC1L, PDC1H), PDC2 (PDC2L, PDC2H), PDC3
(PDC3L, PDC3H), regiștri de timp (PTMRH, PTMRL), (PTPERH, PTPERL) și registrul de
trigger special (SEVTCMPH, SEVTCMPL).
Registrul PTCON0 conține biți de configurare a timpul de bază pentru modulul PWM:
PTOPS <3:0> –biți de selecție a postscalerului;
PTCKPS<1:0> –biți de selectie a prescalerului;
PTMOD<1:0> –biți de selecție a modului timp de bază PWM:
11 = mod continuu cu întreruperi pentru actualizări duble PWM;
10 = mod continuu ;
01 = mod Single -Shot;
00 = mod Free -Running (mod liber de funcționare);
În registrul PTCON1 găsim bitul de activare a timpului de bază (PTEN) și bitul de
selecție a modului de incrementare al timerului, crescător sau descrescător (PTDIR).
Registrul PWMCON0 conțin e biții de selecție a canalului pe care se va genera PWM
(PWMEN<2:0>) și biții de selecție a modului de ieșire PWM ,independent sau complementar,
(PMOD<3:0>).
Registrul OVDCOND permite sau nu ca ieșirea PWM să fie controlată de valoarea din
registrul Duty Cycle și baza de timp PWM.
În aplicațiile cu invertoare de putere, în cazul în care PWM -urile utilizate sunt în mod
complementar, pentru a avea un control superior este utilă inserția de timpi morți( figura 4.2.2).
Acest lucru se realizează configurând r egistrul DTCON.
27
Figura 2.4.2.2 Exemplu de timpi morți
2.5 Senzori
Denumirea de senzor provine din cuvântul latin „sensus” –simț și este un dispozitiv
sensibil capabil să detecteze sau să masoare unii parametrii din mediu înconjurător sau unele
condiții, care sunt aplicate la intrare și să furnizeze un răspuns de aceași natură sau de natură
diferită. Astfel senzorii au și funcția de a converti stimulul într -un semnal măsurabil. Cuprinde
atât traductorul care transformă mărimea de intrare în semnal electric util cât și circuite aferente
pentru adaptarea și conversia semnalelor și eventual prelucrarea și evaluarea informațiilor.
Stimulii de la intrare pot fi de natură mecanică, termică, electromagnetică, acustici sau chimici.
2.5.1 Senzor de distanță cu ultrasunete HC -SR04
Senzorul HC -SR04 este un senzor cu ultrasunete destinat măsurării distanțelor.
Funcționarea sa se bazează pe principiul ecolocației, oferind o mare precizie a distanței măsurate:
de la 2 cm până la 400 cm, cu precizie de până la 3 mm.
Figura 2.5.1.1
Modulul este prevăzut cu patru pini dintre care 2 pentru alimentare, unul pentru a trimite
semnal (Trigg er) și unul pentru a recepționa ecoul (Echo). Alimentarea se va face de la o sursa
de 5 V modulul avand un consum destul de redus ,15mA.
28
Ultrasunetele generate au o frecvență ridicată, 40kHz. La început este trimis un semnal de
10μs (microsecunde), apoi se nzorul va genera intern o serie de 8 impulsuri de 40 kHz.
Receptorul așteaptă ecoul de 60 ms (milisecunde). Dacă răspunsul este între 150μs -25ms se
detectează un obstacol, dacă timpul este peste 38ms nu se detectează nimic.
Figura 2.5.1.2
Distanța este calculată folosind formula:
D=∆T(s)
2∗344 (m/s) (2.5.1.1)
D-distanța de măsurat;
T-diferența de timp de la trasmiterea impulsului trigger până la recepționarea ecoului.
Viteza ultrasunetului în aer este de 344 m/s la o temperatură de 20°C. Trebuie ținut cont
că aceasta este afectată de densitatea aerului (iar densitatea este afectată în principal de
temperatură și altitudine). Timpul este înjumătățit deoarece distanța este parcursă în ambele
sensuri. Trebuie avut în vedere și unghiul de mă surare a modulului, acesta fiind de doar 15°.
29
2.5.2 Senzor de curent
În multe aplicații este utilă cunoașterea curentului absorbit de circuit. Cea mai simplă
modalitate de a afla curentul este sesizarea rezistivă. Metoda presupune montarea unei rezistențe
în serie cu circuitul în cauză. Pe această rezistenșă se va măsura căderea de tensiunea. Valoarea
curentului va fi determinată apoi ușor cu ajutorul legii lui Ohm U=R*I.
Curentul poate fi sesizat fie în configurație flotantă (cape tele rezistorului sunt conectate la
tensiuni diferite de zero) fie față de masă. În figura 2.5.2.1 este prezentat modul de conectare a
rezistentei în cazul configurației flotante.
Figura 2.5.2.1 Sesizare rezistivă în configurație flotantă
Pentru a măsur a căderea de tensiune pe rezistenta de sesizare în cazul configurației
flotante se poate folosi un amplificator operational conectat in modul diferential. Acesta va
măsura diferența de potențial dintre capetele rezistenței și va furniza la ieșire o tensiun e față de
masa, amplificată si direct proporțională cu valoarea curentului.
Figura 2.5.2.2 Schema de principiu a senzorului de curent cu sesizare rezistivă în configurație
flotantă cu amplificator diferențial
30
Dacă aplicăm teorema lui Millman pe schema din figura 2.5.2.2 se poate scrie expresia
potențialului față de masă al intrării inversoare:
vi−=R4
R3+R4Vi1+R3
R3+R4Vo (2.5.2.1)
Pentru a obține expresia potențialului intrării neinversoare observăm că avem un divizor
de tensiune și putem scrie:
vi+=R2
R1+R2Vi2 (2.5.2.2)
Aplicând condiția de egalitate a potențialelor celor două intrări ale amplificatorului
operați onal tensiunea de la ieșirea amplificatorului va fi:
Vo=R3+R4
R3R2
R1+R2Vi1−R2
R1Vi2 (2.5.2.3)
Dacă presupunem că R 1 = R 3 și R 2 = R 4 tensiunea la ieșirea amplificatorului va fi:
Vo=R2
R1(Vi2−Vi1) (2.5.2.4)
Expresia factorulu i de amplificare pentru amplificatorul diferențial are forma:
A=Vo
Vi2−Vi1=R2
R1 (2.5.2.5)
Prin urmare valoarea curentului măsurat va fi:
I=Vo
A∗RM (2.5.2.6)
Căderea de tensiune pe rezistorul de sesizare influențează funcționarea circuitului. De
aceea se face un compromis între tensiunea necesară pentru o măsurare precisă și căderea de
tensiune tolerată de aplicație.
Curentul ce trece prin rezistor va genera pe lângă căderea de tensiune și căldură. Dacă
puterea ce treb uie disipată se apropie de puterea maximă recomandată pentru rezistor, este
necesară montarea rezistorul pe radiator de caldură, altfel temperatura ridicată îi va scurta timpul
de viață.
31
2.5.3 Senzor inductiv pentru detecția metalelor
Detectoarele de metale sunt dispozitive electronice cu rolul de a detecta și semnaliza
obiectele metalice atât feroase (fier, oțel, oțel inoxidabil) cât și neferoase (cupru, staniu, aur,
plumb, argint, aluminiu) . Funcționarea se bazează pe modificarea inducției unei bobine .
Din punct de vedere al principiului de funcționare, detectoarele de metale se împart în
trei categorii: VLF (Very Low Frequency), PI (Pulse Induction), BFO (Beat Frequency
Oscillator) .
Detectorul VLF folosește 2 bobine concentrice și oferă avantajele unei detecți i foarte
bune a obiectelor de mici dimensiuni, posibilitatea de a face discriminare reală pe diverse tipuri
de metale, consum redus de energie, preț de achiziție accesibil. Distanța de detecție maximă este
de 70 cm. Poate fi influenț at de mineralizarea solului.
Detectorul PI în funcție de modul de construcție folosește una sau două bobine pentru
detectare. Avantajele detectoarelor PI sunt stabilitatea în funcționare, imunitate la mineralizarea
solului și distanțe foarte mari de detecț ie în adâncime, până la 5m , însă consumul de energie este
foarte ridicat .
Detectorul BFO este cel mai ușor de realizat. Folosește o bobină de detecție ce oscilează
sincron cu aceeași frecvență cu un oscilator de precizie , consumul este foarte redus iar detecția
în comparație cu celelalte detectoare este mai mică, maxim 40 cm.
Figura 2.5.3.1 Diagramă detector de metale
Un exemplu de detector BFO este în figura 2.5.3.1, folosește 2 bobine dispuse pe o bară
de ferită. Atunci când un obiect metalic este plasat în preajma bobinei de căutare , o parte din
fluxul magnetic trece prin obiect și creează un curent numit curent turbionar. Acest lucru va
determina amorsarea oscilații lor prin bobina detectoare. Scăderea a mplitudinii semnalului va fi
semnalizată de etajut de ieșire.
32
2.6 Comunicare serială
Comunicarea serială este definită ca fiind transferul secvențial de informații între 2
puncte de comunicare. Transmisia informaț iilor se realizeaz ă bit cu bit pe un numă r redus de linii
de trans fer. Acest tip de comunicare, deși mai î nceat ă decât comunicarea paralel ă, oferă
posibilita tea de transmitere pe o distanță mare a informaț iei.
După modul în care se face comunicarea serială avem comunicare serială sincronă și
comunicare serială asincronă. Comunicarea serială sincronă folosește un semnal de ceas care
indică când o anumită dată este validă. Comunicarea serială asincronă se folosește de structura
informației transmise pentru a realiza sincronizarea între emitor și receptor.Cele mai cunoscute
standarde de comunicare serială, pentru a realiza compatibilitatea între echipamente le furnizate
de diverși producători, sunt RS 232 și RS 485.
Pentru ca transferul să poate avea loc este n ecesar un protocol de comunicaț ie.
Echipamentele care comunică prin intermediul magistra lei seriale trebuie s ă respecte acel ași
protocol și ace iași parametri de transmisie (mod de sincronizare, lungimea setului de date, viteza
de transfer ).
Viteza de trans misie a datelor reprezintă numărul de biți transmiși într -o secundă și se
măsoară în bps ( biți pe secondă ) sau baud. Ratele standardizate de transmisie a datelor pentru
RS232 sunt: 110, 300, 1200, 2400, 4800, 9600, 19200, (28800, 33600), 38400, 57600, 7680 0,
115200, 230400, 460800, 921600 bps.
Cel mai utilizat standard RS -232, este un standard de comunicare serială asincronă,
bidirecțional, folosit pentru transmiterea caracterelor codului ASCII.
Figura 2.6.1 Structura informației transmis e conform standardului RS232
În cazul microcontrolerelor cel mai comun standard de comunicare serială cu
dispozitivele periferice utilizat este modulului USART .
Figura 2.6.2. Schema de comunicare serială
33
Cuvândut care este trimis are aceeași structur ă ca cea prezentată în figura 2.6.1, fiind
format dintr -un bit de start, întotdeauna 0 logic, 8 – 9 biți de date, un bit de paritate, necesar
pentru detecția erorilor și 1 -2 biți de stop, întotdeauna 1 logic. Erorile pot apărea atunci cînd
configurarea într e dispozitive nu este corect facută. Erori le pot fi generate și pe lini ile de
transmisie, ele putând fi detectate prin bitul de paritate sau biții de stop. La transmiterea sau
recepția mai multor cuvinte consecutive trebuie verificat dacă modulul a realiz at operația
completă de trimitere sau citire altfel poate apărea o altă eroare.
Sincronizarea, în cazul transmisiei seriale asincrone, se face prin intermediul bitului de
start, la începutul fiecărui caracter transmis. Datele sunt citite secvențial la jumă tatea intervalelor
de bit ce urmează bitului de start. Protocolul reușește să asigure citirea corectă a datelor chiar
dacă între frecvența de emisie și cea de citire a datelor există mici diferențe.
2.6.1 Modulul bluetooth HC -06
Modulul HC -06 este un modul bluetooth de comunicare serială la distanță. Bluetooth este
un set de specificații (un standard) pentru o rețea personală fără fir ( wireless ), bazată pe
unde radio. Modul are integrat protocolul standard bluetooth V2.0. Versiunea este caracterizată
de viteze mari de transmisie (3.2mbps , Enhanced Data Rate ), consum de energie mai mic și o
rată a erorilor de transmisie mai scăzută (BER – bit error rate ). Lățimea benzii modulului HC -06
este de 2.4MHz, puterea de emisie fiind de 3 dBm. Acest modul poate emite la o distanță de
aproximativ 10 metri. R ata de transfer poate fi setată la o valoare de 1200, 2400, 4800, 9600,
19200, 384 00 bps. Este recomandat ca alimentarea să fie între 3.3 și 5 V, modulul necesitând un
curent de lucru cuprins între 8 și 40 mA.
Figura 2.6.1.1 Modulul bluetooth HC -06
Inițial modulul este setat la o rată de transfer de 9600 bps. Pentru a modifica rată de
transfer se utilizează comenzi de tip AT (AT / AT+BAUD).
34
2.7 Interfața grafică
Interfața grafică cu utilizatorul (GUI Graphical User Interface ) este o interfață bazată pe
un sistem de afișaj ce utilizează elemente grafice. Sistemul de afișaj grafic -vizual este situat
funcțional între utilizator si un dispozitiv electronic (calculator, telefon). Interfața oferă
pictograme și indicatori vizuali pentru a prezenta toate informațile și acțiunile disponibile. În
spatele acestora se află un program care va executa div erse operații.
Lab Windows CVI este un mediu de programare ANSI C pentru testare și măsurare
dezvoltat de National Instruments. Aceste mediu permite dezvoltarea interfețelor si produselor
software punând la dispoziția programatorului un set de biblioteci. Fiecare dintre aceste
biblioteci au o interfață specializată (function panel) care permit mediului să fie foarte flexibil,
putând realiza o execuție interactivă , identificarea automată a variabilelor și constantelor
existente, generare automată de cod și multe alte funcți. Dintre bibliotecile specializate puse la
dispoziție fac parte: biblioteca pentru achiziția de date, biblioteca pentru portul serial RS232,
biblioteca pentru operații I/O în cazul achiziției de date.
35
Capitolul 3. Realizarea practică a proiectului
3.1 Partea mecanică
Proiectul din lucrarea de față este o platformă robotică care poate funcționa atât în mod
autonom cât și controlată de la distanță. Șasiul platformei este realizat din plexiglas, un material
foarte ușor de prelucrat. Pe acesta, în partea frontală, sunt montate cele două motoare brushless.
Deoarece acest tip de motoare au cuplu scăzut și turație prea ridicată a fost necesar ă
atașarea unui reductor fiecărui motor. Reductoarele au fost procurate de la două autofiletante, ele
potrivindu -se perfect la sistemul de prindere al motoarelor. Angrenajele reductoarelor sunt
montate în sistem planetar după cum se poate vedea în figura 3.1.1. Acestea oferă o reducție de 1
la 40 și un cuplu mai mare. Practic dacă t urația la axul motorului este de 3600 rot/min la axul
reductorului turația va fi de 40 de ori mai mică, 90 rot/min.
Figura 3.1.1 Reductor cu angrenaje planetare
Motoarele sunt montate în paralel pentru a putea reduce dimensiunile platformei, acestea
împreuna cu reductorarele fiind destul de voluminoase. Fixarea de platformă s -a realizat cu
ajutorul unor tablițe. Axul roților este prins și el prin intermediul tablițelor ce țin reductoarele.
Transmisia de la reductoare la roți după cum se poate vedea în figura 3.1.2 este facută prin
intermediul a câte două angrenaje.
Figura 3.1.2 Dispunerea motoarelor pe platformă
36
În partea din spate a platformei sunt montate două roți pivot, astfel platforma poate fi
controlată doar prin intermediul roților din față . Tot în partea din spate au fost montate
invertoarele împreună cu placa lor de comandă și cei doi acumulatori Li -Ion de 11.2 V împreună
cu placa de alimentare și senzorul de curent, după cum se poate observa și în diagrama din
figura 3.2.2.
Figura 3.1.3 Diagrama părții din spate a platformei
Celor două invertoare, montate în lateral li s -au atașat câte o carcasă confecționată din
plexiglas. Aceste carcase au câte un ventilator și permit o răcire mai bună a radiatoarelor
invertoarelor, în cazul în c are acestea se vor încălzi datorită sarcin ii prea mari.
Figura 3.1.4
37
Deasupra motoarelor s -a montat o placă tot din plexiglas,drept suport pentru placa de
bază, pentru detectorul de metale și pentru suportul de senzori.
Senzori cu ultrasunet sunt plasaț i mai în interior, cu 4 cm, față de capătul platformei,
deoarece distanța minimă de măsurare permisă a senzorilor este de 4 cm, astfel în cazul
funcționării în mod autonom dacă platforma se apropie prea mult de un obstacol, datorită inerției,
acesta va pu tea detecta în continuare obstacolul, și prin urmare să ia decizia corect ă.
Bobina detectorului de metale este plasată, cu ajutorul unui prelungitor mai în față, astfel
încăt să nu poată detecta câmpul electromagnetic generat de motoare în timpul funcționă rii.
Prelungitorul este flexibil, astfel la urcarea unei pante neincomodând platforma în nici un fel.
Toate plăcile cu circuite electronice au fost fixate de platformă cu ajutorul unor șuruburi
mici, pentru o bună stabilitate și rezistență la bruscări, ast fel conexiunile între plăcuțe nu vor
suferi nici o avarie astfel. În figura 3.1.5 este prezentat modul de comunicare a l informațiilor
între toate plăcuțele și dispozitivele de pe platformă.
Figura 3.1.5 Schema bloc a platformei
38
3.2 Implementare Hardware
3.2.1 Realizarea cablajelor
Structurile electronice din cadrul proiectului au fost realizate prin montarea pieselor pe un
cablaj imprimat.
Cablajul imprimat ( PCB Printed Circuit Board ) este o placă cu rolul de a susține
mecanic și de a conecta componente electrice și electronice între ele. Placa este formată dintr -un
strat non -conductiv electric (izolator FR4 -Flame Retardant 4) și un strat conductiv sau două
straturi conductive, din cupru.
Componentele sunt conectate prin intermediul unor trasee realizate în substratul
conductiv. Traseele pot fi obținute prin mai multe metode, prin frezare mecanică, prin depunere
sau prin corodare.
Metoda corodării poate fi aplicată pentru obținerea cablajelor cu cel mult două straturi de
trasee. Aceasta metodă oferă rezultate destul de bune la un preț redus.
Primul pas în realizarea cablajelor constă în realizarea layout -ului (traseelor) circuitului.
Acesta se poate proiecta utilizând un program de specialitate cum ar fi Proteus , Eagle ,Cadence.
După proiectarea layout -ului următorul pas este imprimarea acestuia pe placa de cablaj.
Imprimarea se poate realiza și ea prin mai multe metode: prin metoda press and peel (transferul
termic) și prin metoda fotografică.
În proiectul de față toate cablajele au fost realizate prin metoda fotografică. Pentru
această metodă este necesar ca stratul de cupru al plăcii să fie acoperit de un strat de vopsea
fotosensibilă.
O soloție comodă a fost achiziționarea unor cablaje care au deja stratul fotosensibil
pozitiv aplicat. În cazul utilizării unei plăci obișnuite este necesară o bună degresare a plăcii apoi
aplicarea stratului fotosensibil (utilizand un spray positiv) căt mai uniform pe suprafața acesteia,
necesită a proximativ 30 de minute pentru a se usca.
Se tipărește layout -ul pe o folie transparentă. Imaginea imprimată trebuie să fie în raport
de unu la unu ( dimensiunea reală a traseelor și footprinturilor componentelor ).
Folia transparentă cu imaginea imprimat ă este suprapusă peste placa cu fotosensibil, în
așa fel încât traseele să nu fie oglindite. În următoarea etapă placa este expusă la radiații
ultraviolete. Drept sursă de radiație s -a utilizat o cutie cu LED -uri ultraviolete, cu circuit de
temporizare și avertizare vizual/sonoră. Timpul de expunere a fost determinat pe cale
experimental, o expunere de 7 minute fiind suficientă.
După procesul de expunere plăcuța este developată într -o soluție de sodă caustică
(NAOH) de concentrație mică. Pentru a obține soluția, într -un litru de apă se diluează 3 lingurițe
de sodă caustică. Developarea a fost determinată și ea tot experimental , necesitând aproxomativ
2-3 minute . La contactul cu soluția, stratul fotosensibil de pe placă, care a fost expusă la
39
ultravioletă se dizolvă și se îndepărtează. Placa expusă nu trebuie ținută mai mult timp în soluția,
deoarece există riscul ca porțiun ile neexpuse să fie indepărtate .
Următorul pas este cel de corodare a plăcii. Placa este introdusă într -o soluție de clorură
ferică. Timpul de corodare este proporțional cu suprafața de cupru necesară a fi corodată, în
cazul plăcilor din proiectul de față proc esul de corodare necesitând aproximativ 20 -30 de minute.
Ultimul pas este indepărtarea stratului fotosensibil rămas. Acest lucru este posibil prin
ștergerea placii cu acetonă.
În figura 3.2.1.1 sunt prezentate imagini cu referire la etapele de creare a PC B-ului prin
metoda fotografică, descrisă anterior.
Figura 3.2.1.1 Etapele metodei fotografice
Placa astfel obținută poate fi utilizată drept suport pentru componentele electronice. În funcție de
tehnologia folosită, Trough Hole sau Surface Mounted Devi ce, componentele vor fi montate prin
implantare sau lipire.
În proiectul de față tehnologia folosită este Trough -Hole.Această tehnologie presupune
inserarea componentelor în găurile de pe placa cu circuit imprimat (PCB) și lipirea acestora pe
partea opusă , partea cu stratul cu stratul de cupru, pentru lipirea componentelor utilizându -se
fludor și pastă decapantă sau sacâz.
40
3.2.2 Placa de alimentare
Multe circuite de pe platformă necesită alimentare stabilizată la 5 V, pe când invertoarele
trebuie alimentate la 12V. În figura 3.2.2.1 este prezentată schema plăcii de alimentare. Aceasta
este prevăzută cu două borne de intrare la care se vor conecta acumulatorii, patru borne pentru
tensiune de ieșire stabilizată la 5v și două borne pentru tensiunea de ieșire de 12v necesară
alimentării invertoarelor. Tensiunea stabilizată de 5V es te obținută cu ajutorul circuit ului
integrat stabilizator UA7805, acesta putând furniza un curent maxim de ieșire de 1.5A.
Figura 3.2.2.1
Pe fiecare din cele două intrări este montată câte o diodă cu rol de protecție în caz de
alimentare inversă a circuitului. Tot cu rol de protecție hardware au fost introduse și siguranțele
fuzibile. Condensatorii C1 si C2 de 1000uF au rolul de a menține o valoare a tensiunii de ieșire
cât mai constantă și de a elimina pulsațiile. Circuitul este prevăzut și cu buton de conectare
deconectare la alimentare. Traseele layout -ului sunt de 2.54 mm grosime pentru tensiunile de
12V iar pentru tensiunea stabilizată de 5 V, 1.7 mm.
Figura 3.2.2.1 Layout placă de alimentare
41
3.2.3 Senzorul de curent
Cu scopul de a ține evidența curentului total absorbit de circuitele electronice și de
motarele platformei am realizat un senzor de curent cu sesizare rezistivă. Senzorul este montat
între bornele pozitive ale acumulatorilor și intrarea pozitivă a plăcii de alimentare.
Figura 3.2.3.1 Schema senzorului de curent
Senzorul este format dintr -o rezistență și un circuit de măsurare și amplificare a căderii de
tensiune pe rezistență.
Rezistența de măsurare este reprezentată de rezistențele R 1 și R 2 (de 0.15 Ω și 5W
putere). Acestea sunt montate în paralel pentru a se obține o valoare cât mai mica și o putere mai
mare a rezistenței de măsurare (0.075 Ω, 10W ).
Circuitul de măsurare și amplificare este defapt un amplificator operațional conectat î n
modul diferen țial. Amplificator ul operațional utilizat este LM2904N, de putere mică. Acesta va
măsura diferența de potențial dintre capetele rezistenței și va furniza la ieșire o tensiune față de
masa.
Rezistențele R A1 , RA2 , RB1 , RB2, au fost alese astfel incât amplificarea la ieșirea
amplificatorului să fie de 5.6.
42
A=RA2
RA1=RB2
RB1=56
10=5.6 (3.2.3.1)
Tensiunea furnizat ă la ieșirea amplificatorului este , direct proporțională cu valoarea
curentului prin rezistența de măsurare (R 1||R2).
I=Vadc
A∗(R1||R2)=Vadc
1.78 (3.2.3.2)
La ie șirea amplificatorului, deoarece curentul absorbit poate varia foarte brusc în unitatea
de timp, a fost conectat un conde nsator care va netezi tensiunea m ăsurat ă și amplificat ă.
Dioda DZ este o diodă Zenner de 5. 3 V stabilizatoare. Pinul ADC fiind conectat direct la
portul analogic al microcontrolerului, dioda va reprezinta un mod de protecție împotriva unei
eventuale tensiuni mai mar i de 5V la ieșirea amplificatorului.
Rezistențele R 4 , R5 formează un divizor rezi stiv calculat astfel încât tensiunea maximă
VSS să fie 5V pentru tensiunea acumulatorilor complet încărcați V dd= 12.55 V. Această tensiune
va fi citită pe un pin analogic al microcontrolerului și apoi interpretată. Formula care
caracterizează divizorul r ezistiv este:
Vss=R5
R5+R4Vdd (3.2.3.3)
Figura 3.2.3.2 Layout senzor de curent
43
3.2.4 Detector de metale
Detectorul de metale montat pe platformă este format din 2 bobine dispuse pe o bară de
ferită și un circuit electronic . Circuitul conține un bloc oscilator, un bloc detector și un etaj final
cu led indicator și pin de măsurare a mărimii analogice furnizate la ieșire. Întregul circuit este
alimentat la o tensiune stabilizată de 5V furnizată de placa de alimentare.
În figur a 3.2.4.1 este prezentat circuitul detectorului de metale .
Figura 3.2.4.1 Schema detectorului de metale
Oscilatorul este de tip LC. Frecvența de oscilație a fost aleasă 1 5kHz. Pentru a
dimensiona componentele s -a utilizat formula acestui tip de oscilator:
f0=ω0
2π=1
2π√LC (3.2.4.1)
Am ales capacitatea C3 de 330 n F astfel a rezultat valoarea bobinei B :
LB=1
4π2f02C=1
4∙9.85∙150002∙330 ∙10−9=341 ,4 uH (3.2.4.2)
Cea de a doua bobin ă, bobina de detecție A, a fost aleasă de trei ori mai mică. Astfel
valorile bobinelor determinate, următorul pas a fost crearea fizică a bobinelor. În acest sens s -au
44
înfășurat pe aceași bucată de ferită un număr de 140 spire din cupru de 0.3mm grosime pentru
bobina B, și 45 de spire pentru bobina A.
Bobina A va prelua oscilația produsă prin bobina B. Prin intermediul tranzistorului Q1
oscilația bobinei A va intreține oscilația bobinei B.
Atunci când un obiect metal ic este plasat în preajma bobinelor, o parte din fluxul
magnetic trece prin obiect și creează un curent numit curent turbionar care va produce o scădere
a amplitudinii oscilațiilor prin cele două bobin e.
Scădere amplitudin ii în bobina A va determina ieșirea tranzistorul Q1 și a tranzistorului
Q2 din regimul activ normal de funcționare, astfel nu va mai putea fi intrețin ută oscilația prin
bobina B (va fi amortizată). T ranzistorul Q3 va intra în regimul de funcționare activ normal,
LED-ul aprinzându -se iar tensiunea de pe pinul de citire scăzând.
Cele două potențiometre semireglabile RV1 și RV2 au rolul de a regla amplitudinea
oscilațiilor prin bobina B , practic și distanța de detecție a obiectelor metalice . Datorită diodei D1 ,
în baza celor două tranzis toare , Q1 și Q2 , va intra doar alternan ța pozitiv ă a oscila țiilor din
bobina A. În figura 3.2. 4.2 se pot observa formele de undă ale semnalelor prin cele două bobine,
obținute prin simularea circuitului în Proteus.
Figura 3.2.4. 2 Formele de undă ale Figura 3.2.4.3 Layout -ul
bobinelor detectorului de metale detectorului de metale
Avantajele acestui tip de detector sunt simplitatea construcției, costul redus al pieselor și
consumul redus de energie. Dezavantajul major este acela ca nu po ate detecta obiectele metalice
aflate la o distanță mai mare de 5 cm față de bobine .
45
3.2.5 Invertor
Invertorul din lucrarea de față a fost realizat cu șase tranzistoare MOSFET ( Metal Oxide
Semiconductor Field Effect Transistor ), IRF3205Pbf, comandate pe principiul modulării în
durată a impulsurilor de comandă , prin intermediul circuitului driver IR2101 de un
microcontroler.
Modelul IRF3205Pbf este un tranzistor cu canal de tip N ce prezintă următoarele
caracteristici: 200W puterea maximă disipată la o temperatură de 25°C, 55V tensiunea maximă
drenă -sursă, 110A curentul maxim de drenă suportat, 8mΩ rezistența drenă -sursă în conducție,
1MHz frecvența maximă de lucru, plaja temperaturilor de funcționare este cuprinsă în intervalul
-55°C ,175 °C. Acest tranzistor are încorporată o diodă zener de protecție între drenă și sursă.
Invertorul este format din trei brațe de punte identice cu cel prezentat în figura 3.2.5 .1
Știind faptul că pentru a intra în conducție tranzistoarele MOSFET au nevoie de o tensiune
pozitivă aplicată între grilă și sursă, observăm faptul că tranzistorul din partea superioară a
brațului de punte are nevoie de un potențial flotant pentru a putea fi comandat.
Comanda acestora este posibilă prin intermediul circuitului drivier integrat IR2101.
Principiul de funcționare al acestui integrat a fost descris în subcapitolul 2.3.2.
Figura 3.2 .5.1 Schema brațului de punte
Condesatorul CA2 este un co ndesator de bootstrat care va asigura o tensiune pozitivă
suplimentară pe grila tranzistorului Q1. De fiecare dată când tranzitorul Q2 este adus în
conducție se cre ează condiția de încărcare a condesatorul de bootstrap CA2, de la sursa de
aliment are prin intermediul diodei DA1.
46
Figura 3.2.5 .2
Deoarece sarcina este foarte instabi lă, atât tensiunea cât și curentul v or varia brusc în
unitatea de timp , pentru a îmbun ătăți alimentarea invertorului au fost conectate o bobin ă și un
set de condesatoare , pe intrare , după cum se poate observa în figura 3.2.5.2.
Figura 3.2.5.3 Circuit de citire a curentului
Și invertorul est e prevăzut cu un circuit de citi re a curentului (Figura 3.2.5.3).
Amplificatorul este montat tot în conexiune diferențială numai că de data aceasta citirea nu se
mai face pe o rezistență flotantă ci pe o rezistență conectată între masa circuitului și sursa
tranzistoarelor. Rezistențele au fost calculate astfel încât amplificarea să fie de 5.1.
Cele șase tranzistoa re sunt montate pe un radiator, izolate unul față de celălalt (folosind
pad izolator mica și nippel) pentru a nu risca s ă se distrugă . În figura 3.2.5.4 este prezentată
imaginea invertorului av ând tranzistoarele montate pe radiator. Radiatoru l va oferi o d isipare mai
bună a căldurii în timpul funcționării.
Figura 3.2.5. 4 Placa invertorului trifazat
47
Valoarea m edie a tensiunii (și curentului ) debitată pe sarcină este controlată prin
comanda cu impuls PWM a tranzistorilor din partea superioară a brațelor de punte, tranzistoarele
din partea inferioară fiind comandate cu undă plină. Frecvența impulsurilor PWM a fost setată la
aproximativ 19.5 kHz, mult mai mare decât cea a semnalelor de fază . În figura 3.2.5.5 se pot
observa formele de undă la ieșirea invertor ului, opținute prin simularea circuitului în Proteus.
Figura 3. 2.5.5 Formele de und ă
Pentru un factor de umplere de 20% a PWM-ului și o frecvență a semnalelor de fază de
61 Hz, la func ționarea în gol motorul consum ă 1.3A pe câ nd în sarcină totală aproximativ 4 A.
Alimentarea platformei este asigurată de dou ă acumulatoare de 11.1 V cu o capacitate de 1800
mAh .
48
3.2.6 Placă PIC16F887
Circuitul cu PIC16F887 reprezintă placa de bază a platformei. Acest circuit execut ă
majoritatea proceselor de control al e platformei . El ține evidența tuturor informațiilor preluate de
la senzori și comunic ă prin intermediul portului serial atât cu interfața grafică cât și cu cel de -al
doilea microcontroler PIC18F4431.
Figura 3.2.6.1
Microcontrolerul are 4 pini de alimetare (doi pentru borna poziti vă și doi pentru cea
negativă). Condesatorul C4 conectat cât mai aproape de pinii de alimentare ai microcontrolerului,
reprezentă o rezervă de sarcină care menține variația tensiunii de alimentare într -un interval
restrâns. Gruparea R1 -C1 conectată la pinul MCLR al microcontrolerului este un circu it de
întârziere c are va ține microcontrolerul sub reset până când condesatorul se va încărca (cîteva
milisecunde). Pinul MCLR va trebui configur at în soft pentru acest mod de lucru.
Figura 3.2.6.2
49
Placa este prevăzută cu un quartz de 10MHz conectat între pini RA6 și RA7, astfel
microcontrolerul va funcționa la o frecvență precisă care nu va fi afectată de temperatură sau de
tensiunea de alimentare.
Pinii Vpp-Vcc-Vss-Pgd-Pgc au fost conectați pe plac ă pentru o programare mai comodă a
microcontrolerului . Cu ajutorul programatorului Pickit 2(clonă) , programul specific aplicației va
putea fi încărcat în microcontroler prin intermediul acestor pini.
Toți pin ii au fost amplasați strategic astfel înc ât conexiunile cu senzorii, cu bluetooth -ul
și cu celelalte pl ăcuțe să fie făcute î ntr-un mod cât mai av antajos și cât mai ușor posibil .Acest
lucru se poate observa în figura 3.2.6.3
Figura 3.2.6.3 Privere de ansamplu a conexiunilor placii cu PIC16F887
50
3.2.7 Placă PIC18F4431
Circuitul cu PIC1 8F4431 reprezintă placa de comandă a celor două invertoare. Circuitul
va prelua informațiile furnizate de microcontrolerul PIC16F887 prin intermediul conexiunii
seriale (pinii RX,TX) , o va interpreta urmând apoi să execute comenzile impuse. Acest circuit va
furniza în funcție de comanda primită impulsuri de comanda invertoarelor dupa algoritmul deja
studiat.
La fel ca și circuitul descris anterior și a cesta este prev ăzut cu o grupare R -C la intrarea
pinului MCLR și un quartz extern de 10MHz .
Figura 3.2.7.1
Placa este prevăzută și cu pini de conectare a senzorilor hall dacă este cazul.
Figura 3.2.7. 2
51
3.3 Implementare Software
Software -ul celor dou ă microcontrolere a fost dezvoltat cu ajutorul mediului MPLAB
8.92 și a compilatorului Hi – Tech ANSI C Compiler pentru microcontrolere din familiile
PIC16F și PIC18F . Programul obținut în urma compilării a fost încărcat în microcontroler e
prin intermediul programatorului Pick it 2.
Programul fiecărui microcontroler este realizat dup ă o programare modulară, practic
programul este împărțit în mai multe subprograme . Acest mod de programare oferă următoarele
avantaje: subprogramul poate fi reutiliz at și în alte aplicații, ceea ce reduce efortul de programare
în cazul unei noi aplicații, subprogramul poate fi scris și verificat separat de restul aplicației. Prin
urmare întreținerea aplicației este simplificatã, modificãrile facându -se numai în anumit e
subprograme și nu afecteazã alte subprograme .
Programul include atât fișiere .c cât și fișiere .h (header). Fișierele .c conțin definițiile
funcțiilor iar fișierele .h declarațiile acestora.
Atât interfața grafică cât și software -ul pentru interfață a u fost realizate în mediul Lab
Windows CVI dezvoltat de National Instruments.
3.3.1 Software microcontroler PIC16F887
Primul pas în dezvoltarea unui soft pentru un microcontroler îl reprezintă introducerea
unei linii de configurare. Configurarea microcontrolerului se realizează prin intermediul opțiunii
Configuration Bits din meniul Configure existent î n mediul MPLAB. În figura 3.3.1.1 este
prezentată imaginea ferestrei de configurare precum și opțiunile setate în aceasta.
Figura 3. 3.1.1 Configurare PIC16F887
52
Principalele configurări făcute sunt selectarea unui oscilator extern cu frecvență mare de
oscilație (HS) , dezactivarea Watchdog Timerului (WDTE), setarea pinului MCLR ca pin de
intrare digital utilizat pentru programare și reset, dezacvtivarea Power -up Timer ului (PWRTE) și
dezacvtivarea Brown Out Reset (BOREN). Opțiunile selectate vor fi introduse direct de
programator în microcontroler.
Watchdog timer -ul (câine de pază ) este un timer care detectează durata anormală a
instrucțiunilor. Power -up timer este un cronometru special care întârzie începerea execuției
programului după ce microcontrolerul a fost resetat. Această întârziere oferă timp oscilatorului să
se stabilizez e.
Fișierul menu.c conține rutina principală de program, rutina de întrerupere și rutina de
ințializarea a microcontrolerului. La începutul programului sunt declarate variabilele globale care
vor fi utilizate în rutinele fișierului principal :
#include "include.h"
unsigned int st_ant_RB0;
unsigned int st_ant_RB1;
unsigned int st_ant_RB2;
unsigned long dis_senzor1;
unsigned long dis_senzor2;
unsigned long dis_senzor3;
unsigned long v_AN7;
unsigned long v_AN4_det;
unsigned long v_AN5_vbat;
unsigned long v_AN6_ibat;
unsigned char i,data,buf,mnm;
În fișierul header „include.h” sunt introduse toate librăriile utilizate în aplicație și de
asemenea tot aici sunt etichetați unii pini și definite câteva constante cu ajutorul macro –
urilor(#define) . Aceste etiche te și constante pot fi apelate de un numar oarecare de ori și oferă o
claritate în plus program ului. În cazul constantelor , valoarea acestora se poate modifica cu
ușurință doar din fișierul header „include.h”.
#ifndef _INCLUDE_H_
#define _INCLUDE_H_
#include <htc.h>
#include <string.h>
#include "uart.h"
#include "adc.h"
#define _XTAL_FREQ 10000000
#define Echo1 RB0
#define Echo2 RB1
#define Echo3 RB2
#define Trig_senzor1 RA0
#define Trig_senzor2 RA1
#define Trig_senzor3 RA2
#define Led_s_dreapta RD2 #define Led_s_stanga RD7
#define Led_far RD6
#define Dist 32 //[cm]
#define L_dist 5 //[cm]
#define AN7 7
#define AN4_det 4
#define AN5_vbat 5
#define AN6_ibat 6
#define Lim_AN4_det 4930
#define Lim_AN5_vbat 4000
#define Lim_AN6_ibat 3200
unsigned char val_citita;
#endif
53
În funcția Init_PIC() sunt configurarete porturil e și perifericel e cu care se lucrează.
Pentru controlul porturilor C, D și E este necesară utilizarea a 2 regiștrii PORT și TRIS iar pentru
porturile A și B pe lângă cei doi regiștri mai este necesară utilizarea a 2 regiștri: ANSEL și
ANSELH . Registrul TRIS este folosit pentru a seta tipul portului , de intrare sau de ieșire, iar
PORT setează valoarea care se poate citi la pinii por tului. Regiștri ANSEL și ANSELH dictează
pinilor porturilor A și B dacă să funcționeze ca pini de intrare /ieșire digitali sau ca pini analogici .
void Init_PIC()
{ ANSEL = 0b11111000 ;
ANSELH= 0b00000000 ;
TRISA = 0b00111000 ;
TRISB = 0b00000111 ;
TRISC = 0b11000000 ;
TRISD = 0b00000000 ;
TRISE = 0b00000111 ;
PORTA = 0b00000000 ;
PORTB = 0b00000000 ;
PORTC = 0b00000000 ;
PORTD = 0b00000000 ;
PORTE = 0b00000000 ;
T1CON = 0b00100000 ;
OPTION = 0b00000000 ;
INTCON = 0b11001000 ;
IOCB0 = 1;
IOCB1 = 1;
IOCB2 = 1;
WPUB0 = 1;
WPUB1 = 1;
WPUB2 = 1;
Init_ADC();
Init_uart();
RBIE = 0; }
După configurarea pinilor a urmat setarea timerului 1 și activarea bitul întreruperilor
generate de schi mbarea stări pinilor portului B precum și activarea întreruperilor globale și
periferice . Timerul 1 are rolul de a măsura durata impulsul ui Echo primit de la senzor, necesară
apoi calculării distanței până la obstacol . Semnalul ecou va fi recepționat de la senzori prin
intermediul piniilor RB0,RB1,RB2 ai portului B.
Registrul specific timerului 1 este T1CON . În acest registru întâlnim biții de setare a
prescalorului (T1CKPS1, T1CKPS0),acesta fiind setat la 1:4 și bitul de activare/dezactivare a
timerului(TMR1ON):
Activarea întreruperilor globale și periferice este realizată prin setarea biților GIE și PEIE
din registrul INTCON, iar activarea /dezactivarea întreruperilor generate de schi mbarea stări i
pinilor portului B prin setarea bitului RBIE din același registru.
Pentru a putea citi întreruperile apărute pe pinii RB0,RB1,RB2 este necesar ă și setarea
biților corespunzători din registrul IOC B (IOCB0, IOCB1, IOCB2) .
Prin apelarea funcțiilor Init_ADC() și Init_uart() se va realiza configurarea modulului
ADC de cit ire analogică și configurarea modulului de comunicare serială EUSART.
Bucla programului principal se va ocupa de transmiterea în mod secvențial către interfața
grafică a informațiilo r preluate de la senzori și tot odată de furnizarea unui impuls de 10
microsecunde senzorilor cu ultrasunete.
54
void main(void)
{
Init_PIC(); //inițializarea
microcontrolerului
__delay_ms( 50); __delay_ms( 50);
while(1)
{
// detector metale
v_AN4_det = Citeste_ADC(AN4_det);
v_AN4_det = (v_AN4_det* 5000)>>10;
//tensiunea acumulatorilor
v_AN5_vbat = Citeste_ADC(AN5_vbat);
v_AN5_vbat = (v_AN5_vbat* 5000)>>10;
//senzor curent
v_AN6_ibat = Citeste_ADC(AN6_ibat);
v_AN6_ibat = (v_AN6_ibat *5000>>10;
//șirul de caractere
uart_send( 'b');send_nr(v_AN5_vbat);
uart_send( 'c');send_nr(dis_senzor1);
uart_send( 'f');send_nr(dis_senzor2);
uart_send( 'g');send_nr(dis_senzor3);
uart_send( 'h');send_nr(v_AN4_det);
uart_send( 'i');send_nr(v_AN6_ibat);
uart_send(i); uart_send( '\r');
//semnal trigerr senzori
Trig_senzor1 = 1; __delay_us( 10);
Trig_senzor1 = 0; __delay_ms( 15);
Trig_senzor2 = 1; __delay_us( 10);
Trig_senzor2 = 0; __delay_ms( 15);
Trig_senzor3 = 1; __delay_us( 10);
Trig_senzor3 = 0; __delay_ms( 15);
} }
Setul de informații trimis este un șir de 31 de caractere de forma:
b 0000 c 0000 f 0000 g 0000 h 0000 i 0000 x
unde caracterele b c f g h i sunt caractere de recunoaștere iar caracterele situate între acestea sunt
valorile de interes. Ultimul caracter x reprezintă caracterul de stare al platformei. Acest șir de
caractere este trimis, cu valorile actualizate, aproximativ din 65 in 65 de milisecunde către
interfa ța grafică și cel de -al doilea microcontroler.
În rutina de întrerupere sunt executate mai multe operații. În primul rând aici se
realizează citirea portului UART și comunicarea cu cel de -al doilea microcontroler, în al doilea
rând se ține evidența tuturor senzorilor și se respectă condițiilor impuse în funcție de modul de
operare selectat de pe interfața grafică (autonom sau manual).
Producerea întreruperii, la recepționarea unui cuvânt de informație, este s esizată prin
bitul RCIF din regi strul PIR1. După fiecare întrerupere, bitul RCIF trebuie sterș manual,
prin4asignarea valorii de 0 logic. Dacă nu se face acest lucru, nu se mai cunoaște cu certitudine
momentul producerii unei noi întreruperi. Rutina de întrerupere este următoarea:
if(RCIF==1&&RCIE==1 ) //verificare producere întrerupere
{ RCIF=0; //se șterge flagul de detecție a întreruperilor
if(OERR==1) //testarea existenței unei erori la recepț ionare
{CREN=0; //dezactivare receptor
CREN=1; } //reactivare receptor pentru înlăturarea erorii
data = uart_rec(); // data= informa ția recep ționată
if(data=='e') RBIE = 1; //selecție mod autonom
if(data=='q') //stop
{ RBIE = 0;
i = 'q';
Led_s_dreapta = 0; RD0 = 0;
Led_s_stanga = 0; Led_far = 0; }
if(data=='m') //selecție mod manual
{ buf = 2;
RBIE= 0;
i = 'm'; }
}
55
După cum se poate observa, în secvența de recepționare se regăsesc și condițiile de
testare a modului de lucru selectat de pe interfața grafică. Caracterul 'e' recepționat corespunde
modului autonom , astfel activându -se citirea senzorilor, determinarea distanței precum și
executarea condițiile de evitare a coliziuni, în funcție de valorile determinate .
Citirea unui senzor cu ultrasunete și determinarea distan ței se realizează în urm ătoarea
secven ță de cod :
if(RBIE)
{
if(RBIF&&(Echo1== 1) && (st_ant_RB0== 0))
{ TMR1H = 0;
TMR1L = 0;
TMR1ON = 1; //pornire incrementare TMR1
st_ant_RB0= 1; // starea anterioară devine 1
}
if(RBIF&&(Echo1== 0) && (st_ant_RB0== 1))
{ TMR1ON = 0; // oprire incrementare TMR1
st_ant_RB0= 0; // starea anterioară devine 0
TMR = (unsigned int ) TMR1H << 8; // variabila TMR=0x TMR1H 00 (hexa)
TMR = TMR + TMR1L; // TMR=0x TMR1H TMR1L(hexa)
durata = (TMR) * 2; // durata=TMR*0.5us(Clock speed)*4( Prescale r)
dis_senzor1 = durata / 58 ; // Refer HC -SR04 Datasheet (în cm)
}
………………….. // secvențe de cod
RBIF=0; //flagul de detecție a întreruperilor este șters
}
Dacă se schimbă starea pinului RB0 (Echo) din 0 în 1 și starea anterioară a pinului era 0
regiștri paraleli TMR1H -TMR1L vor fi resetați și incrementarea TMR1 va fi pornită. TMR1
fiind pe 16 biți poate incrementa de la 0 până la 65535 ,acest interval corespu nzând unei secunde.
TMR1 va incrementa până la următoarea schimbare a stării pinului RB0. Valoarea TMR1
se află în regiștri paraleli. În variabila de tip long TMR va fi salvată valoarea din TMR1H rotită
cu 8 poziții la stânga și adunată cu valoarea d in TMR1L. De exemplu dacă valoarea incrementată
de TMR1 este 1235, în TMR1L vom găsi valoarea 211 iar în TMR1H valoarea 4.
TMR =TMR 1H≪8+TMR 1L
TMR =4≪8+211 =1024 +211 =1235 (3.3.1.1)
dist =TMR ∗2/58=42.58 cm
După ce au fost calculate cele trei distanțe urmează executarea algoritmului de evitare a
coliziunii:
if((dis_senzor1 > Dist )&&(dis_senzor3 > Dist )&& (dis_senzor2 > 20))
{ i='w'; //inainte
Led_s_dreapta = 0; Led_s_stanga = 0; Led_far = 1; RD0 = 0; }
else
{
if((dis_senzor1 < Dist)&& (dis_senzor1 > 7)&&(dis_senzor3 > Dist ))
{ i='d'; //dreapta
56
Led_s_dreapta = 1; Led_s_stanga = 0; Led_far = 1; RD0 = 1; }
if((dis_senzor1 <= 7)&&(dis_senzor3 > Dist ))
{ i='s'; //înapoi
Led_s_dreapta = 0; Led_s_stanga = 1; Led_far = 0; RD0 = 1; }
if((dis_senzor3 < Dist )&&(dis_senzor3 > 7)&&(dis_senzor1 > Dist))
{ i='a'; //stanga
Led_s_dreapta = 0; Led_s_stanga = 1; Led_far = 1; RD0 = 1; }
if((dis_senzor3 <= 7)&&(dis_senzor1 > Dist ))
{ i='s'; //înapoi
Led_s_dreapta = 0; Led_s_stanga = 1; Led_far = 0; RD0 = 1; }
if(dis_senzor2 < 20)
{ i='s'; //înapoi
Led_s_dreapta = 0; Led_s_stanga = 0; Led_far = 1; RD0 = 0; }
}
În tabelul 3.3.1.1 este prezentată logica de evitare a coliziunilor funcție de distanțele citite
de la senzori.
Dis_senzor1
Senzorul din stânga Dis_senzor2
Senzorul din față Dis_senzor3
Senzorul din dreapta Stare
> Dist > 20 > Dist Înainte
∈(7,Dist) > 20 > Dist Dreapta
<= 7 > 20 > Dist Înapoi
> Dist > 20 ∈(7,Dist) Stânga
> Dist > 20 <= 7 Înapoi
∀ <= 20 ∀ Înapoi
Tabel 3.3.1.1 Logica de evitare a coliziunii
Microcontrolerul va ține sub observație în mod continuu valorile furnizate de senzorul
detector de metale, senzorul de curent și valoarea tensiunii de pe acumulatori . Dacă una din
aceste valori nu v a respecta condiția impusă microcontrolerul va ieși forțat din întrerupere
imediat dup ă ce va comanda celui de -al doilea oprirea func ționării invertoarelor . Prin acest mod
se realizează o protecție software atât a circuitelor invertoarelor cât și a motoarelor.
if(v_AN4_det <Lim_AN4_det|| v_AN6_ibat<=Lim_AN6_ibat|| v_AN5_vbat<= Lim_AN5_vbat)
{ buf = 0;
GIE = 0; //dezactivare întreruperi globale
RBIE= 0; //dezactivare intreruperi la schimbarea st ării portului B
__delay_ms( 50);__delay_ms( 50);
i = 'q';
Led_s_dreapta = 0; Led_s_stanga = 0; Led_far = 0; RD0 = 1;
}
În modul manual microcontrolerul va furniza c ătre cel de -al doilea microcontroler
caracterul primit de pe interfața grafică , acesta fiind specific unei anumite comenzi :
if(buf==2){
if(data=='w'){i='w'; Led_s_dreapta =0; Led_s_stanga =0; Led_far =1;} //înainte
if(data=='s'){i='s'; Led_s_dreapta =0; Led_s_stanga =0; Led_far =1;} //înapoi
if(data=='a'){i='a'; Led_s_dreapta =0; Led_s_stanga =1; Led_far =1;} //stânga
if(data=='d'){i='d'; Led_s_dreapta =1; Led_s_stanga =0; Led_far =1;} //dreapta
if(data=='q'){i='q'; Led_s_dreapta =0; Led_s_stanga =0; Led_far =0;} //stop
}
57
În fișierul adc.c sunt funcțiile destinate modulului ADC. F uncția Init_ADC () realizează
configurarea modulului. Drept referință modulul are sursa de alimentare a pinilor
microcontrolerului . Secvența de cod specifică este următoarea:
void Init_ADC( void)
{
ADIE = 0; //A/D dezactivare mod de lucru cu întrerupere
ADIF = 0; //A/D fl ag șters
VCFG0 = 0; //VREF+=VDD
VCFG1 = 0; //VREF-=VSS
ADCS1 = 0; //A/D biți de selecție a clock -ului
ADCS0 = 0; // 32*Tosc= 4us
ADFM = 1; //rezultatul conversiei
ADON = 1; //activa rea conv A/D
}
Citirea canalelor analogic e este posibil ă apelând func ția Citeste_ADC(canal) .Această
funcție pe lângă selectarea canalului realizează și conversia m ărimii analogice de la intrare.
unsigned int Citeste_ADC( unsigned int z)
{
switch(z)
{
case 3: CHS3=0; CHS2=0; CHS1=1; CHS0=1; break; //select AN3
case 4: CHS3=0; CHS2=1; CHS1=0; CHS0=0; break; //select AN4
case 5: CHS3=0; CHS2=1; CHS1=0; CHS0=1; break; //select AN5
case 6: CHS3=0; CHS2=1; CHS1=1; CHS0=0; break; //select AN6
case 7: CHS3=0; CHS2=1; CHS1=1; CHS0=1; break; //select AN7
}
GODONE = 1; // Activare GO/DONE
while(GODONE); // Așteptăm până când conversia este complet ă
return ((ADRESH<< 8)+ADRESL); // Returnare a valoarii ADC pe zece bi ți
}
Fișierul uart.c conține funcțiile specifice modulului de comunicare serială, modulul
UART. În funcția Init_uart() se setează o transmisie de tip asincron, pe 8 biți de date, un bit de
start, un bit de stop și fără bit de paritate. Rata de transfer este stabilită în funcție de frecvența de
oscilație a microcontrolerui prin intermediul biților SYNC, BRGH, BR G16 și a valorii încărcate
în registrul SPBRG.
void Init_uart( void)
{ SPBRG = ((_XTAL_FREQ/ 16)/9600) – 1;
BRGH = 1;
TX9 = 0; //transmisie pe 8 biți
RX9 = 0; //recepție pe 8 biți
TXEN = 1; //activare transmisie
CREN = 1; //activare recepție
SPEN = 1; //port serial activat
SYNC = 0;
BRG16 = 0;
TXIE = 0; //intreruperi tx dezactivate
RCIE = 1; //intreruperi rx activate
}
58
Funcția de receptionare a datelor este următoarea:
unsigned char uart_rec( void)
{
unsigned char rec;
while(RCIF==0);
rec = RCREG;
return rec;
}
Variabila rec în momentul detecției întreruperii de către flagul RCIF va fi încărcat ă cu
valoarea din registrul RCREG. Registrul RCREG conține cei opt biți ai informației proa spăt
recepționate.
Funcția de transmisie a datelor este următoarea:
void uart_send( unsigned char d)
{
while(TXIF== 0);
TXREG=d;
}
Pentru a putea trimite valorile preluate de modulul ADC și valorile distan țelor calculate
în întrerupere , au fost create dou ă funcții ajut ătoare. Func ția send_nr() va descompune valoarea
în așa fel încât să o poată trimite caracter cu caracter ajut ându-se de func ția nr().
void send_nr( unsigned int numar)
// trimit numerele
{
unsigned int a,b,c,d;
d = (numar/ 1000);
nr(d);
c = (numar/ 100)%10;
nr(c);
b = (numar/ 10)%10;
nr(b);
a = numar% 10;
nr(a);
}
void nr(unsigned int nr)
{ switch(nr){
case 0:uart_send( '0');break;
case 1:uart_send( '1');break;
case 2:uart_send( '2');break;
case 3:uart_send( '3');break;
case 4:uart_send( '4');break;
case 5:uart_send( '5');break;
case 6:uart_send( '6');break;
case 7:uart_send( '7');break;
case 8:uart_send( '8');break;
case 9:uart_send( '9');break;
}}
59
3.3.2 Software microcontroler PIC18F4431
Microcontrolerul PIC18F4431 fiind special conceput pentru generarea pe 8 canale a
impuls urilor PWM este utilizat în cazut acestui proiect drept driver pentru invertoare. Acesta va
prelua informația de la primul microcontroler prin intermediul portului serial urmând apoi să
execute cerințele impuse.
Principalele configurări făcute în cazul acestui microcontroler sunt selectarea unui
oscilator extern cu frecvență mare de oscilație (HS) având bucla PLL activată , dez activarea
Watchdog Timerului (WDTE), setarea pinului MCLR ca pin de intrare digital utilizat pentru
programare și reset, dezacvtivarea Power -up Timerului (PWRTE) , dezacvtivarea Brown Out
Reset (BOREN) , dezacvtivarea canalelor PWM din modulul PCPWM la reset area
microcontrolerului și setarea modului în care sunt active canalele PWM. Prin activarea buclei
PLL frecvența oscilatorului extern, un quart de 10 MHz, va fi multiplicată de 4 ori astfel
rezultând o frecvență de 40MHz.
Figura 3.3.2.1
În fișierul header „include.h” la fel ca și în cazul primului microcontroler sunt introduse
toate librăriile utilizate în aplicație și de asemenea sunt defini te unele constante care vor oferi
claritate programului .
Microcontrolerul va folosi din cele 8 ca nale doar 6 canale, comanda invertoarelor fiind
făcută orbește cu imp uls PWM doar pentru tranzistorii din partea superioară a brațelor de punte,
60
tranzistoarele din partea inferioară fiind comandate cu undă plină. Pentru a putea genera
impulsurile PWM necesare, în fisierul pwm.c este configurat modulul PWM.
void Init_PWM( void)
{ PTCON0 = 0b00000011 ; //PTCON0 1:1 postscale,Fosc/4 1:1 prescale
PTCON1 = 0b10000000 ; //PWM timer control register
PTPERL = 0; //
PTPERH = 1; //PTPER = $0100 or 256d for ~19.45kHz
PWMCON0= 0b01001111 ; //PWM Module Enable bits
PWMCON1= 0b00000001 ; //PWM control register
}
Regiștrii PTCON sunt regiștrii folosiți pentru controlul bazei de timp .Din registrul
PTCON0 se configur ează postcalarea bazei de timp 1:1, prescalarea semnalului de clock pentru
baza de timp 1:1 și se setează modul de lucru al bazei de timp. Din registrul PTCON1 se
pornește baza de timp și se setează modul de numărare (crescător) .
Cu ajutorul registrului P WMCON0 se selectează primele 6 canalele de PWM active și
modul de lucru independent al acestora.
Regiștrii PTPERL și PTPERH sunt folosiți pentru a seta perioada semnalului PWM.
Rezoluția semnalului PWM are 12 biți și este obținută prin alăturarea informa ției conținute de
regiștrii PTPERH, prin primii 4 cei mai nesimnificativi biți ai acestuia, dar primii 4 cei mai
semnificativi ai PTPER, și PTPERL prin întregul octet, care reprezintă cei mai nesemnificativi 8
biți din PTPER. Valoarea maximă ce se poate încărca în registrul PTPER este :
39PTPER =212−1=4095 (3.3.2.1)
Perioada semnalului PWM, se poate determina cu relația:
TPWM =(PTPER +1)∗PTMRPS
Fosc/4 (3.3.2. 2)
PTRMPS reprezintă o valoare de prescalare, setată pentru baza de timp folosită la
generarea semnalului PWM.
În cazul proiectului de față frecvența PWM -ului este setată la aproximativ 19.5kHz.
9PTPER =(PTPERH ≪8 +PTPERL )−1=1∗28+0−1=511
TPWM =(511 +1)∗1
40MHz /4=512
107=51.2us (3.3.2. 3)
FPWM =1
TPWM=19531 .25Hz
61
Componenta continuă a semnalului PWM generat se controlează prin intermediul
regiș trilor PDC . Controlul componentei continue se poate realiza cu o rezoluție de maxim 16 biți.
Această rezoluția variază în funcție de perioada setată prin intermediul PTPER.
rezolu ția=log(Fosc
FPWM)
log(2) (3.3.2. 4)
Funcția prin care factorul de umplere al semnalului PWM este reglat este următoarea:
void PWM_Duty_Cicle( unsigned int w)
{ PDC0H = w >> 6; //Duty Cycle high PWM0,PWM1
PDC0L = w << 2; //Duty Cycle low PWM0,PWM1
PDC1H = w >> 6; //Duty Cycle high PWM2,PWM3
PDC1L = w << 2; //Duty Cycle low PWM2,PWM3
PDC2H = w >> 6; //Duty Cycle high PWM4,PWM5
PDC2L = w << 2; //Duty Cycle low PWM4,PWM5
PDC3H = w >> 6; //Duty Cycle high PWM6,PWM7
PDC3L = w << 2; //Duty Cycle low PWM6,PWM7
}
Funcțiile destinate comunicării seriale sunt asemă nătoare cu cele de la PIC16F887 .
Comunicarea este setată pe același mod de transmisie: transmisie de tip asincron, cu 8 biți de
date, un bit de start, un bit de stop, fără bit de paritate.
Recepționarea cuvântului de date are loc tot în rutina de întrerupere . În funcție de
informația primită microcontro lerul va realiza comanda invertoarele . Următoarea secvență de
cod testează dacă mesajul recepționat este unul din mesajele de comandă:
unsigned int Check_receive( void)
{unsigned int check;
unsigned char data= val_citita;
if(data=='w')check=Inainte;
if(data=='s')check=Inapoi;
if(data=='a')check=Stanga;
if(data=='d')check=Dreapta;
if(data=='q')check=Stop;
return check;}
În funcție de acest mesaj , comanda transmisă de microcontroler invertoarelo r se
modifică. Secvența de cod din rutina de întrerupere pentru comand a orbește a invertoarelor este
următoarea :
void interrupt ISR()
{
if (TMR0IF == 1)
{ TMR0 = x1;
TMR0IF = 0;
if(dir==1) switch(sens)
{ case 1:PORTD = 0b01001000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00001001 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0)sens = 2;
else sens = 6;
break;
case 2:PORTD = 0b01001000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00010100 ; // 0/0/z1/y1/x1/c1/b1/a1
62
if(stare == 0)sens = 3;
else sens = 1;
break;
case 3:PORTD = 0b00100100 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND= 0b00010100 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0)sens = 4;
else sens = 2;
break;
case 4:PORTD = 0b00100100 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00100010 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0)sens = 5;
else sens = 3;
break;
case 5:PORTD = 0b10010000; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00100010 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0)sens = 6;
else sens = 4;
break;
case 6:PORTD = 0b10010000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00001001 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0)sens = 1;
else sens = 5;
break; }
…..//secvențe de cod
}
Timerului TMR0 este setat pe 8 biți și incrementează de la valoarea încărcată x1. Acesta
va produce o întrerupere la o perioadă de timp T :
T=4∗Prescaler ∗(256 −x1)
Fosc (3.3.2. 5)
Setarea prescalerului și activarea timerului au fost realizate în funcția Init_Timer0().
void Init_Timer0( void)
{T0CON = 0b11000110 ; // TMR0 activat pe 8 biți cu 1:128 prescaler
TMR0 = x1; //TMR0 este încărcat cu valoarea lui x1. TMR0IE = 1;
//activare întrerupere generată de TMR0
}
Dacă x1=45 → T=4∗128 ∗(256 −45)
40000000=0.0027 s (3.3.2. 5)
Această perioadă reprezintă cât timp va fi activă fiecare din cele șase secvențe din logica
de comandă a inverto arelor . Perioada de execuție a celor șase secvențe de comandă va fi de șase
ori perioada T, 0.0162 secunde. La ieșirea invertorului o fază va avea frecvența de 61.7 Hz.
Registrul OVDCOND permite sau nu celor 6 canale PWM să fie controlată de valoarea
din registrul Duty Cycle și baza de timp PWM. Acestea sunt controlate în mod independent.
Logica de comandă a celor două invertoare pentru direcția înainte este prezentată în tabelul
3.3.2.1.
63
Invertor 1 Invertor 2
Case 1 PWM 0 (Q1) RD6 (Q5) PWM 3 (Q1) RD3 (Q5)
Case 2 PWM 2 (Q3) RD6 (Q5) PWM 4 (Q3) RD3 (Q5)
Case 3 PWM 2 (Q3) RD5 (Q4) PWM 4 (Q3) RD2 (Q4)
Case 4 PWM 1 (Q2) RD5 (Q4) PWM 5 (Q2) RD2 (Q4)
Case 5 PWM 1 (Q2) RD7 (Q6) PWM 5 (Q2) RD4 (Q6)
Case 6 PWM 0 (Q1) RD7 (Q6) PWM 3 (Q1) RD4 (Q6)
Tabel 3.3.2.1 Logica de comandă a celor două invertoare pentru direcția înainte
În funcția principală de program , void main(), sunt apelate funcțiile de inițializare
prezentate anterior, configurați a pinilor porturilor și de asemnenea activarea întreruperilor.
Funcția principală de program este următoarea:
void main(void)
{ TRISA = 0b00000000 ;
TRISE = 0b00000000 ;
ANSEL0 = 0b00000000 ;
ANSEL1 = 0b00000000 ;
TRISB = 0b00000000 ;
PORTB = 0b00000000 ;
TRISD = 0b00000000 ;
PORTD = 0b00000000 ;
Init_Timer0();
Init_uart();
GIE = 1;
PEIE = 1;
Init_PWM();
while(1)
{ m=Check_receive();
if(m!=n) for(i=30;i<=x1;i++)
{ Directie(m);
x2=i+plus_p;
PWM_Duty_Cicle( x2 );
__delay_ms( 10);
}
else{ Directie(m);
x2=x1+plus_p;
PWM_Duty_Cicle( x2 ); }
n=m;
m=0;
} }
În bucla infinită while(1) este d ezvoltat un algoritm de incrementare a factorului de
umplere de la o valoare inferioară până la valoarea normală în momentul schimbării direcției de
mers a platformei, astfel motoarele nu se vor bloca la schimbarea sensului de rotație.
64
3.3.3 Software interfață grafic ă
Interfa ța grafică comunică de la distanță în mod continuu cu platforma prin intermediul
unui modul bluetooth conectat la portul USB . În figura 3.3.3.1 este prezentată fereastra interf eței
prin care utilizatorul va interacționa cu platforma.
.
Figura 3.3.3.1 Interfata grafica
Primul pas în realizarea interfeței în mediul Lab Windows CVI a fost lansarea în
execu ție a editorul pentru interfețe grafice cu utilizatorul (User Interface) care are deja în mod
implicit un panou creat (File -New – User Interface) . Apoi în acest panou au fost adăugate diverse
controale ( butoane ,numeric,ring ) ,indicatori(text, string,meter)ș i un timer.
Următorul pas a fost generarea automata a scheletului de cod (Code -Generate -All Code).
Acesta corespunde descrierii grafice . Pe acest schele t a fost apoi dezvoltat software -ul pentru
interfață.
Înainte de toate pentru a putea interacționa cu platforma este nevoie de conectarea
interfeței la aceasta. Acest lucru este posibil prin selectarea portului și apăsarea butonului
conect are.
65
Codul care va prelua starea butonului și a portul selectat din ring și realiza conectarea
este:
int CVICALLBACK f_conectare ( int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{int b;
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal (panelHandle, PANEL_LED_3, &b);
GetCtrlVal (panelHandle, PANEL_RING, &com);
if(b==0)
{SetCtrlVal (panelHandle, PANEL_LED_3, 1);
OpenComConfig (com, 0, 9600, 1, 8, 1, 512, 512);
SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENA BLED, 1); }
else
{SetCtrlVal (panelHandle, PANEL_LED_3, 0);
SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, 0);
CloseCom (com); }
break;
}
return 0;
}
Funcția GetCtrlVal este folosită pentru a interoga starea obiectelor ( LED, buton,ring) iar
funcția SetCtrlVal este folosită pentru modificarea valorilor numerice ale obiectelor.
După interogarea panoului ring urmează deschiderea și configurarea portului de
comunicare serială dacă butonul returnează valoarea 0 sau contrar închiderea portului de
comunicare.
Comunicarea serială cu modulul bluetooth are loc prin interfațare RS -232. În acest scop
se va utiliza libr ăria <rs232.h> specifică acestui mod de interfațare. Comunicarea este activată și
setată cu ajutorul funcției OpenC omConfig pe o transmisie de tip asincron, cu 8 biți de date, un
bit de start, un bit de stop, fără bit de paritate și o viteză de transfer a datelor de 9600
biți/secundă.
Imediat după conectare, cu ajutorul timerului, interfața va scana din 30 în 30 mili secunde
portul serial pentru a verifica recepționarea pachetul de date furnizat de microcontrolerul de pe
platformă.
O secvență din codul funcției timer este prezentată mai jos:
int CVICALLBACK f_timer1 ( int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{ char bx[50]="";
int i,j,k,oo=3614;
int I_lim;
char qw,ew;
double u,pp;
switch (event)
{ case EVENT_TIMER_TICK:
ComRdTerm (com, buffer, 32, ' \r') ;
SetCtrlVal (panelHandle, PANEL_STRING, buffer);
GetCtrlVal (panelHandle, PANEL_NUMERIC_5, &I_lim);
66
if(buffer[0]=='b') {
bx[0]= buffer[1];
bx[1]= buffer[2];
bx[2]= buffer[3];
bx[3]= buffer[4];
u=(int)((bx[0] -'0')*1000+(bx[1] -'0')*100+(bx[2] -'0')*10+(bx[3] -'0'));
u=(u*25)/10000;
SetCtrlVal (panelHandle, PANEL_NUMERIC,u);
SetCtrlVal (panelHandle, PANEL_NUMERICMETER,u);
if(u<11)SetCtrlVal (panelHandle, PANEL_LED_22,1);
else SetCtrlVal (panelHandle, PANEL_LED_22,0);
u=0; }
…..
}
Funcția ComRdTerm(com,buffer ,32, ' \r') este responsabil ă de scanarea portului serial și
salva rea fiecă rui octet al pachetul de date în buffer până c ând va sesiza rând nou '\r'. Pachetul de
date are o mărime de 31 octeți (248 biți de date ) fiind de forma :
b 0000 c 0000 f 0000 g 0000 h 0000 i 0000 x
b –caracter identificator pentru tensiunea acumulatorilor;
c –caracter identificator pentru distanța citită de senzorul din stânga;
f –caracter identificator pentru distanța citită de senzorul din față;
g–caracter identificator pentru distanța citită de senzorul din dreapta;
h –caracter identificator pentru valoarea detectorului de metale;
i –caracter identificator pentru curentul absorbit;
x –caracter identificator pentru starea platformei;
x={q, w, e, a, s, d, m}
e m q w s d a
mod autonom mod manual stop înainte înapoi dreapta stânga
Tabel 3.3.3.1 Legenda caracterelor de stare
Bufferul este apoi afișat într -un panou string urmând a se extrage și partaja informațiile
conținute. În funcția timer se vor căuta caracterele identificatoare.
De exemplu caracterul identificator 'b' va indica pentru valoarea tensiunii acumulatorilor
citite de microcontroler . Știind faptul că după fiecare caracter identificator se află câte patru
caractere ce c onțin informația de interes (numerice) , acestea vor fi salvate separat î ntr-un alt
vector ,”bx”. Deoarece bx este un vector de caractere este necesară o conversie la întreg pentru a
putea fi reprezentată informația în panoul meter sau numeric. Fiecare caracter este reprezentat de
un cod ASCII. Următoarea linie de cod realizează un cast de la tipul char la tipul int folosindu -se
de valorile ASCII ale caracterelor :
u=(int)((bx[0] -'0')*1000+(bx[1] -'0')*100+(bx[2] -'0')*10+(bx[3] -'0'));
67
Deoarece valoarea primită este valoarea citită pe un divizor de tensiune, în milivolți ca
unitate de măsură, pentru a afișa valoarea reală, trebuie realizată o altă conversie. Divizorul
rezistiv realizează o divizare cu 2.5 a tensiunii de pe acumulator, pr in urmare valoarea citită
trebuie înmulțită cu 2.5 și împărțită la 1000 pentru a obține valoarea reală a tensiunii , în volți.
Astfel valoarea tensiunii determinată va fi afișată pe interfața grafică prin intermediul panoului
numeric și al panoului numericmeter.
În mod similar și celelalte valori vor fi prelucrare și afișate pe interfața grafică funcție de
caracterul identificator.
La selectarea modului manual, cele patru butoane pentru direcție setate inițial să fie
invizibile cu ajutorul funcției SetCtrlAttribute, vor deveni vizibile și totodată se va activa și
citirea tastelor Up, Down, Left, Right și 0 ale tastaturii calculatorului. Astfel platforma poate fi
controlată prin intermediul acestor taste și/sau butoane. Funcția GetKeyPressEventVirtua lKey
din funcția panoului principal este cea care va scana tastatura .Prin intermediul funcției ComWrt
interfa ța va transmite caracter ul impus către platformă.
int CVICALLBACK fpanel ( int panel, int event, void *callbackData,
int eventData1, int eventData2)
{ switch (event)
{ case EVENT_GOT_FOCUS:
break;
case EVENT_LOST_FOCUS:
break;
case EVENT_KEYPRESS:
if(st==1)
{ caracter = GetKeyPressEventVirtualKey(eventData2);
if(caracter==(0x0600))
{ ComWrt (com, "w", 1);
SetCtrlVal (panelHandle, PANEL_LED_4, 1);
SetCtrlVal(panelHandle,PANEL_STRING_2,"inainte");
}
…..
}
68
Capitolul 4. Rezumat .Concluzii
4.1 Rezumat
Proiectul prezentat în lucrarea de față este o platformă robotică controlată în raza de
acțiune a unui modul bluethoot, de operatorul uman, prin intermediul interfeței grafice.
Obiectivul propus este studiul c onceptului de interfațare om -calculator și respectiv
utilizarea sistemelor embedded.
Toate funcțiile specifice ș i necesare atingerii obiectivelor acestui robot sunt module de
sine stătătoare. Această modularitate se manifestă atât la nivelul software ( programul este
împărțit în mai multe subprograme ) cât și la nivelul aplicației hardware unde vor fi realizate
difer itele blocuri( plăcuțe electronice), interconectate ulterior între ele. Fiecare dintre aceste
blocuri poate fi testat și utilizat în mod independent.
Programarea modulară oferă avantajul de a putea reutiliza subprogramele și în alte
aplicații, ceea ce red uce efortul de programare în cazul unei noi aplicații, de asemenea fiecare
subprogram putând fi scris și verificat separat de restul aplicației.
Pentru abordarea proiectului s -a optat utilizarea a două microcontrolere. Unul dintre
acestea este destinat preluării tuturor informațiilor din mediu și luării deciziilor conforme cu
evenimentele mediului de lucru al platformei. Cel de -al doilea microcontroler este destinat
controlului celor două motoare ale platformei funcție de comanda furnizată de primul
microcontroler. Comunicarea între cele două microcontrolere și modulul bluethoot este realizată
prin intermediul porturilor seriale ale acestora.
Pașii urmați pentru a construi platforma robotică sunt prezentați pe larg în 2 dintre
capitolele lucrării . În prima parte (Capitolul 2) sunt prezentate noțiunile teoretice necesare
pentru implementarea proiectului. În partea a doua (Capitolul 3) este prezentat modul prin care
noțiunile teoretice au fost transpuse în practică.
În prima parte sunt prezentate noțiuni despre motoarele de curent continuu fără perii
colectoare (brushless) și modul de comandă al acestora, noțiuni despre blocurile funcționale ale
platformei, noțiuni despre microcontrolere utilizate precum și noțiuni des pre interfațare om –
calculator.
Partea a doua , partea de prezentare a modului în care proiectul a fost implementat,
expune inițial descrierea impl ementării mecanice a platformei , iar ulterior descrierea metodei
prin care au fost realizate cablajele imprim ate pentru circuitele platformei. Tot în această parte au
fost descrise programele realizate pentru cele două microcontrolere precum și programul pentru
interfața grafică.
Prin îmbinarea noțiunilor teoretice cu abilitățile practice s -a implementat cu succes
platforma robotic ă.
69
4.2 Concluzii
Dezvoltarea a cestui proiect a început în toamna anului 2013 în urma înscrierii la
concursul ElectroMobility3 propus de firma Contine ntal și a f ost finalizat cu succes în primă vara
anului 2014, în luna mai .
Dacă la prima vedere realizarea platformei robotice nu părea să prezinte un nivel ridicat
de dificultate și complexitate, pe parcusul implementării practice au apăr ut diverse probleme,
atât din punct de vedere mecanic cât și din punct de vedere hardware și software.
În ceea ce privește partea mecanică, cuplul motoarelor nefiind suficient de ridicat pentru
a deplasa platforma, a fost necesară atașarea reductoarelor. Inițial reductoarele au fost realizate
cu angrenaje de plastic, această soluție nu a fost una destul de avantajoasă, reducția obținută fiind
prea mică, iar frecările între angren aje, destul de mari , au favorizat uzura imediată. Astfel o
soluție mult mai avant ajoasă a fost achiziționarea acestora de la două autofiletante, ele
potrivindu -se perfect la sistemul de prindere al motoarelor. O altă problemă apărută a fost
prinderea motoarelor de șasiul platformei, acestea împreună cu reductorarele fiind destul de
voluminoase precum și realizarea transmisie la roți. Pentru prindere au fost create special niște
suporturi din tablă . Motoarele au fost montate în paralel pentru a putea reduce dimensiunile
platformei , iar transmisia la roț i a fost fă cută prin intermediul a câte două angrenaje, axul roților
fiind montat între motoare.
Din punct de vedere hardware problemele apărute au fost minore, acestea rezolvându -se
relativ repede. În cazul f uncționării în mod autonom a platformei, deoarece se apropi a prea mult
de un obstacol, datorită inerției, a fost necesară plasarea s enzori lor cu ultrasunet mai în interior,
cu 4 cm, față de capătul platformei .
În cazul dezvoltării interfeței grafice au aparut dificultăți la preluarea și prelucrarea
datelor transmi se de pe platforma robotică. Rezolvarea acestei probleme a constat î n scanarea
portul de intrare din 30 în 30 milisecunde și salvarea întregului șir de date într -un vector de
caractere, urmând descompunerea acestuia pentru extragerea datelor de interes . Pentru a dezvolta
programelor încărcate în cele două microcontroler e a fost necesară stu dierea cu atenție a
documentați ilor acestora .
Prin realizarea acestui proiect am reușit să consolide z o bună parte din noțiunile teoretice
învățate în cei patru ani de facultate și să imi dezvolt aptitudinile tehnice.
70
Capitolul 5. Anexe
Anexa 1. Cod PIC16F887
Fișierul main.c
#include "include.h"
unsigned int st_ant_RB0;
unsigned int st_ant_RB1;
unsigned int st_ant_RB2;
unsigned long dis_senzor1;
unsigned long dis_senzor2;
unsigned long dis_senzor3;
unsigned long v_AN7;
unsigned long v_AN4_det;
unsigned long v_AN5_vbat;
unsigned long v_AN6_ibat;
unsigned char i,data,buf,mnm;
void Init_PIC()
{
ANSEL = 0b11111000 ; // Set PORTA as Digital I/O
ANSELH = 0b00000000 ; // Set PORTB as Digital I/O
TRISA = 0b00111000 ; // Set PORTA
TRISB = 0b00000111 ; // Set PORTB
TRISC = 0b11000000 ; // Set PORTC
TRISD = 0b00000000 ; // Set PORTD
TRISE = 0b00000111 ; // Set PORTE
PORTA = 0b00000000 ; // Clear PORTA
PORTB = 0b00000000 ; // Clear PORTB
PORTC = 0b00000000 ; // Clear PORTC
PORTD = 0b00000000 ; // Clear PORTD
PORTE = 0b00000000 ; // Clear PORTE
T1CON = 0b00100000 ;
OPTION = 0b00000000 ; //RBPU/INTEDG/T0CS/T0SE/PSA/PS2/PS1/PS0
INTCON = 0b11001000 ; //GIE/PEIE/T0IE/INTE/RBIE/T0IF/INTF/RBIF
IOCB0 = 1;
IOCB1 = 1;
IOCB2 = 1;
WPUB0 = 1;
WPUB1 = 1;
WPUB2 = 1;
Init_ADC();
Init_uart();
RBIE = 0;
}
void interrupt ISR( void)
{
unsigned long durata = 0;
unsigned long TMR = 0;
if(RBIE)
{
if(RBIF&&(Echo1== 1) && (st_ant_RB0== 0))
{
TMR1H = 0;
TMR1L = 0;
TMR1ON = 1; // ON Counter
st_ant_RB0= 1;
71
}
if(RBIF&&(Echo1== 0) && (st_ant_RB0== 1))
{
TMR1ON = 0;
st_ant_RB0= 0;
TMR = (unsigned int) TMR1H << 8;
TMR = TMR + TMR1L;
durata = (TMR) * 2;
dis_senzor1 = durata / 58 ;
}
if(RBIF&&(Echo2== 1) && (st_ant_RB1== 0))
{
TMR1H = 0;
TMR1L = 0;
TMR1ON = 1;
st_ant_RB1= 1;
}
if(RBIF&&(Echo2== 0) && (st_ant_RB1== 1))
{
TMR1ON = 0;
st_ant_RB1= 0;
TMR = (unsigned int) TMR1H << 8;
TMR = TMR + TMR1L;
durata = (TMR) * 2;
dis_senzor2 = durata / 58 ;
}
if(RBIF&&(Echo3== 1) && (st_ant_RB2== 0))
{
TMR1H = 0;
TMR1L = 0;
TMR1ON = 1;
st_ant_RB2= 1;
}
if(RBIF&&(Echo3== 0) && (st_ant_RB2== 1))
{
TMR1ON = 0;
st_ant_RB2= 0;
TMR = (unsigned int) TMR1H << 8;
TMR = TMR + TMR1L;
durata = (TMR) * 2;
dis_senzor3 = durata / 58 ;
}
if((dis_senzor1 > D ist )&&(dis_senzor3 > Dist )&& (dis_senzor2 > 20))
{
i='w';//inainte
Led_s_dreapta = 0; Led_s_stanga = 0; Led_far = 1; RD0 = 0;
}
else
{
if((dis_senzor1 < Dist)&&(dis_senzor1 > 7)&&(dis_senzor3 > Dist ))
{
i='d';//dreapta
Led_s_dreapta = 1; Led_s_stanga = 0; Led_far = 1; RD0 = 1;
}
if((dis_senzor1 <= 7)&&(dis_senzor3 > Dist ))
{
i='s';//inapoi
Led_s_dreapta = 0; Led_s_stanga = 1; Led_far = 0; RD0 = 1;
}
72
if((dis_senzor3 < Dist )&&(dis_senzor3 > 7)&&(dis_senzor1 > Dist))
{
i='a';//stanga
Led_s_dreapta = 0; Led_s_stanga = 1; Led_far = 1; RD0 = 1;
}
if((dis_senzor3 <= 7)&&(dis_senzor1 > Dist ))
{
i='s';
Led_s_dreapta = 0; Led_s_stanga = 1; Led_far = 0; RD0 = 1;
}
if(dis_senzor2 < 20)
{
i='s';
Led_s_dreapta = 0; Led_s_stanga = 0; Led_far = 1; RD0 = 0;
}
}
RBIF = 0;
}
if(v_AN4_det <= Lim_AN4_det || v_AN5_vbat <= Lim_AN5_vbat)
{
buf = 0;
GIE = 0;
RBIE= 0;
__delay_ms( 50);__delay_ms( 50);
i = 'q';
Led_s_dreapta = 0; Led_s_stanga = 0; Led_far = 0; RD0 = 1;
}
if(RCIF)
{ RCIF=0;
data = uart_rec();
if(data=='e') RBIE = 1;
if(data=='q')
{ RBIE = 0;
i = 'q';
Led_s_dreapta = 0; Led_s_stanga = 0; Led_far = 0; RD0 = 0;
}
if(data=='m')
{
buf = 2;
RBIE= 0;
i = 'm';
}
}
if(buf==2)
{
RD0 = 0;
if(data=='w'){i = 'w'; Led_s_dreapta = 0; Led_s_stanga = 0; Led_far = 1;}
if(data=='s'){i = 's'; Led_s_dreapta = 0; Led_s_stanga = 0; Led_far = 1;}
if(data=='a'){i = 'a'; Led_s_dreapta = 0; Led_s_stanga = 1; Led_far = 1;}
if(data=='d'){i = 'd'; Led_s_dreapta = 1; Led_s_stanga = 0; Led_far = 1;}
if(data=='q'){i = 'q'; Led_s_dreapta = 0; Led_s_stanga = 0; Led_far = 0;}
}
}
void main(void)
{
Init_PIC();
__delay_ms( 20);
73
while(1)
{
v_AN4_det = Citeste_ADC(AN4_det);
v_AN4_det = (v_AN4_det * 5000) >> 10;
v_AN5_vbat = Citeste_ADC(AN5_vbat);
v_AN5_vbat = (v_AN5_vbat * 5000) >> 10;
v_AN6_ibat = Citeste_ADC(AN6_ibat);
v_AN6_ibat = (v_AN6_ibat * 5000) >> 10;
uart_send( 'b');send_nr(v_AN5_vbat);
uart_send( 'c');send_nr(dis_senzor1);
uart_send( 'f');send_nr(dis_senzor2);
uart_send( 'g');send_nr(dis_senzor3);
uart_send( 'h');send_nr(v_AN4_det);
uart_send( 'i');send_nr(v_AN6_ibat);
uart_send(i); uart_send( '\r');
Trig_senzor1 = 1;
__delay_us( 10);
Trig_senzor1 = 0;
__delay_ms( 15);
Trig_senzor2 = 1;
__delay_us( 10);
Trig_senzor2 = 0;
__delay_ms( 15);
Trig_senzor3 = 1;
__delay_us( 10);
Trig_senzor3 = 0;
__delay_ms( 15);
}
}
Fișierul adc.c
#include "include.h"
void Init_ADC( void)
{
TRISA = 0b00111000 ; //
TRISE = 0b00000111 ; //
ANSEL = 0b11111000 ; //
ANSELH= 0b00000000 ; //
ADIE = 0; //A/D interrupt disabled
ADIF = 0; //A/D flag reset
VCFG0 = 0; //VREF+=VDD
VCFG1 = 0; //VREF-=VSS
ADCS1 = 0; //A/D Conversion Clock Select bits
ADCS0 = 0; // 32*Tosc= 4us
ADFM = 1; //rezultatul conversiei
ADON = 1; //activam conv A/D
}
unsigned int Citeste_ADC( unsigned int z)
{
switch(z)
{
case 0: CHS3=0; CHS2=0; CHS1=0; CHS0=0; break; //select AN0
case 1: CHS3=0; CHS2=0; CHS1=0; CHS0=1; break; //select AN1
case 2: CHS3=0; CHS2=0; CHS1=1; CHS0=0; break; //select AN2
case 3: CHS3=0; CHS2=0; CHS1=1; CHS0=1; break; //select AN3
case 4: CHS3=0; CHS2=1; CHS1=0; CHS0=0; break; //select AN4
case 5: CHS3=0; CHS2=1; CHS1=0; CHS0=1; break; //select AN5
74
case 6: CHS3=0; CHS2=1; CHS1=1; CHS0=0; break; //select AN6
case 7: CHS3=0; CHS2=1; CHS1=1; CHS0=1; break; //select AN7
}
GODONE = 1; // Activare GO/DONE
while(GODONE); // Asteptam pana cand conversia este completa
return ((ADRESH<< 8)+ADRESL); // Returnare valoare ADC pe zece biti
}
Fișierul uart.c
#include "include.h"
void Init_uart( void)
{
TRISC6= 1;
TRISC7= 1;
SPBRG = ((_XTAL_FREQ/ 16)/9600) – 1;
BRGH = 1; //baud rate high speed option
TXEN = 1; //enable transmission
TX9 = 0; //8-bit transmission
RX9 = 0; //8-bit reception
CREN = 1; //enable reception
SPEN = 1; //enable serial port
SYNC = 0; //
BRG16 = 0; //
TXIE = 0; //disable tx interrupt
RCIE = 1; //enable rx interrupt
}
unsigned char uart_rec( void)
{ unsigned char rec;
if(OERR){CREN= 0;CREN=1;}
while(RCIF==0);
rec = RCREG;
return rec;
}
void uart_send( unsigned char d)
{ while(TXIF==0);
TXREG=d;
}
void uart_str( const unsigned char *s)
{ while(*s)uart_send(*s++);
}
void send_nr( unsigned int numar) // trimit numerele
{unsigned int a,b,c,d;
d = (numar/ 1000); nr(d);
c = (numar/ 100)%10; nr(c);
b = (numar/ 10)%10; nr(b);
a = numar% 10; nr(a);
}
void nr(unsigned int nr)
{switch(nr)
{
case 0:uart_send( '0');break;
case 1:uart_send( '1');break;
case 2:uart_send( '2');break;
case 3:uart_send( '3');break;
case 4:uart_send( '4');break;
case 5:uart_send( '5');break;
case 6:uart_send( '6');break;
75
case 7:uart_send( '7');break;
case 8:uart_send( '8');break;
case 9:uart_send( '9');break;
} }
Fișierul include .h
#ifndef _INCLUDE_H_
#define _INCLUDE_H_
#include <htc.h>
#include <string.h>
#include "uart.h"
#include "adc.h"
#define _XTAL_FREQ 10000000
#define Echo1 RB0
#define Echo2 RB1
#define Echo3 RB2
#define Trig_senzor1 RA0
#define Trig_senzor2 RA1
#define Trig_senzor3 RA2
#define Led_s_dreapta RD2
#define Led_s_stanga RD7
#define Led_far RD6
#define Dist 32 // [cm]
#define L_dist 5 // [cm]
#define AN7 7
#define AN4_det 4
#define AN5_vbat 5
#define AN6_ibat 6
#define Lim_AN4_det 4930 // Tensiun ea limita de detectie a metalelor
#define Lim_AN5_vbat 4000 // Tensiunea minima pe baterie
//4080[mV]*2.5(divizorul rezistiv)=10.2 [V]
#define Lim_AN6_ibat 3200 // Tensiunea limita pe rezistenta de sarcina pt
//a calcula curentul(Rs=0.075 ohmi)
// Ilim=(Lim_AN6_ibat/Rs)/amplif amplif=5.6
unsigned char val_citita;
#endif
Fișierul adc.h
#ifndef _ADC_H_
#define _ADC_H_
void Init_ADC( void);
unsigned int Citeste_ADC( unsigned int z);
#endif
Fișierul uart.h
#ifndef _UART_H_
#define _UART_ H_
void Init_uart( void);
unsigned char uart_rec( void);
void uart_send( unsigned char d);
void uart_str( const unsigned char *s);
void send_nr( unsigned int numar);
void nr(unsigned int nr);
#endif
76
Anexa 2. Cod PIC18F4431
Fișierul main.c
#include "include.h"
unsigned int x2=0;
unsigned int m=0,n=0,i;
unsigned long rez_adc0,a,b;
unsigned long rez_adc1;
unsigned char z;
void main(void)
{
TRISA = 0b00000000 ;
TRISE = 0b00000000 ;
ANSEL0 = 0b00000000 ;
ANSEL1 = 0b00000000 ;
TRISB = 0b00000000 ;
PORTB = 0b00000000 ;
TRISD = 0b00000000 ;
PORTD = 0b00000000 ;
Init_Timer0();
Init_uart();
GIE = 1;
PEIE = 1;
TMR1ON = 1;
Init_PWM();
while(1)
{ m=Check_receive();
if(m!=n)
for(i=30;i<=x1;i++)
{Directie(m);
x2=i+plus_p;
PWM_Duty_Cicle( x2 );
__delay_ms( 10); }
else
{Directie(m);
x2=x1+plus_p;
PWM_Duty_Cicle( x2 ); }
n=m;
m=0;
}
}
Fișierul isr.c
#include "include.h"
unsigned char sens = 1;
unsigned char stare;
unsigned char dir;
int Directie( unsigned char d)
{ switch(d)
{ case 1: dir = 1;stare = 0; break;
case 2: dir = 1; stare = 1; break;
case 3: dir = 2; stare = 0; break;
case 4: dir = 3; stare = 1; break;
case 5: dir = 4; break; }
return stare; }
77
void interrupt ISR()
{
if (TMR0IF == 1)
{ TMR0 = x1;
TMR0IF = 0;
TMR0IE = 1;
if(dir==1)
switch(sens)
{ case 1:
PORTD = 0b01001000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00001001 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0) sens = 2;
else sens = 6;
break;
case 2:
PORTD = 0b01001000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00010100 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0) sens = 3;
else sens = 1;
break;
case 3:
PORTD = 0b00100100 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00010100 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0) sens = 4;
else sens = 2;
break;
case 4:
PORTD = 0b00100100 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00100010 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0) sens = 5;
else sens = 3;
break;
case 5:
PORTD = 0b10010000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00100010 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0) sens = 6;
else sens = 4;
break;
case 6:
PORTD = 0b10010000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00001001 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0) sens = 1;
else sens = 5;
break;
}
if(dir==2)
switch(sens)
{ case 1:
PORTD = 0b01000000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00000001 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0) sens = 2;
else sens = 6;
break;
case 2:
PORTD = 0b01000000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00000100 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0) sens = 3;
else sens = 1;
break;
78
case 3:
PORTD = 0b00100000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00000100 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0) sens = 4;
else sens = 2;
break;
case 4:
PORTD = 0b00100000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00000010 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0) sens = 5;
else sens = 3;
break;
case 5:
PORTD = 0b10000000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00000010 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0) sens = 6;
else sens = 4;
break;
case 6:
PORTD = 0b10000000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00000001 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0) sens = 1;
else sens = 5;
break; }
if(dir==3)
switch(sens)
{case 1:
PORTD = 0b00010000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00001000 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0) sens = 2;
else sens = 6;
break;
case 2:
PORTD = 0b00010000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00100000 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0) sens = 3;
else sens = 1;
break;
case 3:
PORTD = 0b00000100 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00100000 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0) sens = 4;
else sens = 2;
break;
case 4:
PORTD = 0b00000100 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00010000 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0) sens = 5;
else sens = 3;
break;
case 5:
PORTD = 0b00001000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00010000 ; // 0/0/z1/y1/x1/c1/b1/a1
if(stare == 0) sens = 6;
else sens = 4;
break;
case 6:
PORTD = 0b00001000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00001000 ; // 0/0/z1/y1/x1/c1/b1/a1
79
if(stare == 0) sens = 1;
else sens = 5;
break; }
if(dir==4) {
PORTD = 0b00000000 ; // c2/b2/a2/z2/y2/x2/0/0
OVDCOND = 0b00000000 ; // 0/0/z1/y1/x1/c1/b1/a1
}
}
if(RCIF){if(OERR){CREN= 0;CREN=1;}
val_citita=Uart_rec();
RCIF=0; }
}
Fisierul pwm.c
#include "include.h"
void Init_PWM(v oid)
{
PTCON0 = 0b00000011 ; //PTCON0 1:1 postscale,Fosc/4 1:1
prescale, free running mode
PTCON1 = 0b10000000 ; //PWM timer control register
PTPERL = 0; //
PTPERH = 1; //PTPER = $0100 or 256d for ~19.45kHz
PWMCON0 = 0b01001111 ; //PWM Module Enable bits
PWMCON1 = 0b00000001 ; //PWM control register
}
void PWM_Duty_Cicle( unsigned int w)
{
PDC0H = w>> 6; //Duty Cycle high PWM0,PWM1
PDC0L = w << 2; //Duty Cycle low PWM0,PWM1
PDC1H = w>> 6; //Duty Cycle high PWM2,PWM3
PDC1L = w << 2; //Duty Cycle low PWM2,PWM3
PDC2H = w>> 6; //Duty Cycle high PWM4,PWM5
PDC2L = w << 2; //Duty Cycle low PWM4,PWM5
PDC3H = w>> 6; //Duty Cycle high PWM6,PWM7
PDC3L = w << 2; //Duty Cycle low PWM6,PWM7
}
Fisierul timer .c
#include "include.h"
void Init_Timer0( void)
{
T0CON = 0b11000110 ; // activat si setat pe 8 biticu 1:128 prescaler
TMR0 = x1; //TMR0 este incarcat cu valoarea lui x1.
TMR0IE = 1;
}
void Init_Timer1( void)
{
T1CON = 0b11110100 ; //TMR1 1:8 prescaler
TMR1 = 0;
}
Fisierul uart.c
#include "include.h"
void Init_uart( void)
{ TRISC6=1;
80
TRISC7=1;
SPBRG = 255; //((_XTAL_FREQ/16)/9600) – 1;
BRGH=1; //baud rate high speed option
TXEN=1; //enable transmission
TX9 =0; //8-bit transmission
RX9 =0; //8-bit reception
CREN=1; //enable reception
SPEN=1; //enable serial port
SYNC = 0;
BRG16 = 0;
TXIE=0;
RCIE=1; }
unsigned char Uart_rec( void)
{
unsigned char rec;
if(OERR){CREN= 0;CREN=1;}
while(RCIF==0);
rec = RCREG;
return rec;
}
void Uart_send( unsigned char d)
{
while(TXIF==0);
TXREG=d;
}
void Uart_str( const char *s)
{
while(*s)Uart_send(*s++);
}
unsigned int Check_receive( void)
{
unsigned int check;
unsigned char data;
data = val_citita;
if(data=='w'){check=Inainte;}
if(data=='s'){check=Inapoi; }
if(data=='a'){check=Stanga; }
if(data=='d'){check=Dreapta;}
if(data=='q'){check=Stop; }
return check;
}
Fisierul include .h
#ifndef _INCLUDE_H_
#define _INCLUDE_H_
#define Inainte 1
#define Inapoi 2
#define Stanga 3
#define Dreapta 4
#define Stop 5
#define x1 45
#define plus_p 200
#include <htc.h>
#include <string.h>
#include "pwm.h"
#include "timer.h"
#include "isr.h"
81
#include "uart.h"
#define _XTAL_FREQ 10000000
unsigned char val_citita;
#endif
Fisierul isr.h
#ifndef _ISR_H_
#define _ISR_H_
void interrupt ISR();
int Directie( unsigned char x);
#endif
Fisierul pwm .h
#ifndef _PWM_H_
#define _PWM_H_
void Init_PWM( void);
void PWM_Duty_Cicle( unsigned int w);
#endif
Fisierul timer .h
#ifndef _TIMER_H_
#define _TIMER_H_
void Init_Timer0( void);
void Init_Timer1( void);
#endif
Fisierul uart.h
#ifndef _UART_H_
#define _UART_H_
void Init_uart(v oid);
unsigned char Uart_rec( void);
void Uart_send( unsigned char d);
void Uart_str( const char *s);
unsigned int Check_receive( void);
#endif
82
Anexa 3. Cod interfață grafică
#include <ansi_c.h>
#include <rs232.h>
#include <cvirte.h>
#include <userint.h>
#include "aaaa.h"
static int panelHandle;
char buffer[50];
int com,caracter,st;
int buf_led[6] = {PANEL_LED_9, PANEL_LED_10, PANEL_LED_11, PANEL_LED_12,
PANEL_LED_13, PANEL_LED_14};
int buf_led2[6] = {PANEL_LED_20, PANEL_LED_19, PANEL_LED_18, PANEL_LED_17,
PANEL_LED_16, PANEL_LED_15};
int buf_led3[6] = {PANEL_LED_29, PANEL_LED_28, PANEL_LED_27, PANEL_LED_26,
PANEL_LED_25, PANEL_LED_24};
int main (int argc, char *argv[])
{ if (InitCVIRTE (0, argv, 0) == 0) return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "aaaa.uir", PANEL)) < 0) return -1;
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0; }
int CVICALLBACK fpanel ( int panel, int event, void *callbackData,
int eventData1, int eventData2)
{ switch (event)
{
case EVENT_GOT_FOCUS:
break;
case EVENT_LOST_FOCUS:
break;
case EVENT_KEYPRESS:
if(st==1)
{
caracter = GetKeyPressEventVirtualKey(eventData2);
if(caracter==(0x0600))
{
ComWrt (com, "w", 1);
SetCtrlVal (panelHandle, PANEL_LED_4, 1);
SetCtrlVal(panelHandle,PANEL_STRING_2,"inainte");
}
else SetCtrlVal (panelHandle, PANEL_LED_4, 0);
if(caracter==(0x0700))
{
ComWrt (com, "s", 1);
SetCtrlVal (panelHandle, PANEL_LED_7, 1);
SetCtrlVal(panelHandle,PANEL_STRING_2,"inapoi");
}
else SetCtrlVal (panelHandle, PANEL_LED_7, 0);
if(caracter==(0x0800))
{
ComWrt (com, "a", 1);
SetCtrlVal (panelHandle, PANEL_LED_5, 1);
SetCtrlVal(panelHandle,PANEL_STRING_2,"stanga");
}
else SetCtrlVal (panelHandle, PANEL_LED_5, 0);
if(caracter==(0x0900))
83
{
ComWrt (com, "d", 1);
SetCtrlVal (panelHandle, PANEL_LED_6, 1);
SetCtrlVal(panelHandle,PANEL_STRI NG_2,"dreapta");
}
else SetCtrlVal (panelHandle, PANEL_LED_6, 0);
if(caracter==( 0x00 ))
{
ComWrt (com, "q", 1);
SetCtrlVal (panelHandle, PANEL_LED_4, 0);
SetCtrlVal (panelHandle, PANEL_LED_5, 0);
SetCtrlVal (panelHandle, PANEL_LED_6, 0);
SetCtrlVal (panelHandle, PANEL_LED_7, 0);
SetCtrlVal(panelHandle,PANEL_STRING_2,"stop");
}
}
break;
case EVENT_CLOSE:
QuitUserInterface (0);
break;
}
return 0;
}
int CVICALLBACK f_m od_autonom ( int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
st=0;
ComWrt (com, "e", 1);
SetCtrlVal (panelHandle, PANEL_LED, 1);
SetCtrlVal (panelHandle, PANEL_LED_2,0);
SetCtrlVal (panelHandle, PANEL_LED_8,0);
SetCtrlAttribute (panelHandle,PANEL_COMMANDBUTTON, ATTR_VISIBLE, 0);
SetCtrlAttribute (panelHandle,PANEL_COMMANDBUTTON_2, ATTR_VISIBLE, 0);
SetCtrlAttribute (panelHandle,PANEL_COMMANDBUTTON_3, ATTR_VISIBLE, 0);
SetCtrlAttribute (panelHandle,PANEL_COMMANDBUTTON_4, ATTR_VISIBLE, 0);
SetCtrlAttribute (panelHandle,PANEL_LED_4, ATTR_VISIBLE, 0);
SetCtrlAttribute (panelHandle,P ANEL_LED_5, ATTR_VISIBLE, 0);
SetCtrlAttribute (panelHandle,PANEL_LED_6, ATTR_VISIBLE, 0);
SetCtrlAttribute (panelHandle,PANEL_LED_7, ATTR_VISIBLE, 0);
SetCtrlVal(panelHandle,PANEL_STRING_2,"mod autonom");
break;
}
return 0;
}
int CVICALLBACK f_mod_manual ( int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
st=1;
ComWrt (com, "m", 1);
SetCtrlVal (panelHandle, PANEL_LED, 0);
SetCtrlVal ( panelHandle, PANEL_LED_2,1);
SetCtrlVal (panelHandle, PANEL_LED_8,0);
SetCtrlAttribute (panelHandle,PANEL_COMMANDBUTTON, ATTR_VISIBLE, 1);
84
SetCtrlAttribute (panelHandle,PANEL_COMMANDBUTTON_2, ATTR_VISIBLE, 1);
SetCtrlAttribute (panelHandle,PANE L_COMMANDBUTTON_3, ATTR_VISIBLE, 1);
SetCtrlAttribute (panelHandle,PANEL_COMMANDBUTTON_4, ATTR_VISIBLE, 1);
SetCtrlAttribute (panelHandle,PANEL_LED_4, ATTR_VISIBLE, 1);
SetCtrlAttribute (panelHandle,PANEL_LED_5, ATTR_VISIBLE, 1);
SetCtrlAttribute (panelHandle,PANEL_LED_6, ATTR_VISIBLE, 1);
SetCtrlAttribute (panelHandle,PANEL_LED_7, ATTR_VISIBLE, 1);
break;
}
return 0;
}
int CVICALLBACK f_stop ( int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
ComWrt (com, "q", 1);
st=0;
SetCtrlVal (panelHandle, PANEL_LED, 0);
SetCtrlVal (panelHandle, PANEL_LED_2,0);
SetCtrlVal (panelHandle, PANEL_LED_4, 0);
SetCtrlVal (panelHandle, PAN EL_LED_5, 0);
SetCtrlVal (panelHandle, PANEL_LED_6, 0);
SetCtrlVal (panelHandle, PANEL_LED_7, 0);
SetCtrlVal (panelHandle, PANEL_LED_8,1);
SetCtrlVal(panelHandle,PANEL_STRING_2,"stop");
SetCtrlAttribute (panelHandle,PANEL_COMMANDBUTTON, ATT R_VISIBLE, 0);
SetCtrlAttribute (panelHandle,PANEL_COMMANDBUTTON_2, ATTR_VISIBLE, 0);
SetCtrlAttribute (panelHandle,PANEL_COMMANDBUTTON_3, ATTR_VISIBLE, 0);
SetCtrlAttribute (panelHandle,PANEL_COMMANDBUTTON_4, ATTR_VISIBLE, 0);
SetCtrlAttr ibute (panelHandle,PANEL_LED_4, ATTR_VISIBLE, 0);
SetCtrlAttribute (panelHandle,PANEL_LED_5, ATTR_VISIBLE, 0);
SetCtrlAttribute (panelHandle,PANEL_LED_6, ATTR_VISIBLE, 0);
SetCtrlAttribute (panelHandle,PANEL_LED_7, ATTR_VISIBLE, 0);
break;
}
return 0;
}
int CVICALLBACK f_conectare ( int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int b;
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal (panelHandle, PANEL_LED_3, &b);
GetCtrlVal (panelHandle, PANEL_RING, &com);
if(b==0)
{
SetCtrlVal (panelHandle, PANEL_LED_3, 1);
OpenComConfig (com, 0, 9600, 1, 8, 1, 512, 512);
SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, 1);
}
else
{
SetCtrlVal (panelHandle, PANEL_LED_3, 0);
SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, 0);
CloseCom (com);
85
}
break;
}
return 0;
}
int CVICALLBACK f_inainte ( int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
ComWrt (com, "w", 1);
SetCtrlVal (panelHandle, PANEL_LED_4, 1);
SetCtrlVal (panelHandle, PANEL_LED_5, 0);
SetCtrlVal (panelHandle, PANEL_LED_6, 0);
SetCtrlVal (panelHandle, PANEL_LED_7, 0);
SetCtrlVal(panelHandle,PANEL_STRING_2,"inainte");
break;
}
return 0;
}
int CVICALLBACK f_dreapta ( int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{ ;
switch (event)
{
case EVENT_COMMIT:
ComWrt (com, "d", 1);
SetCtrlVal (panelHandle, PANEL_LED_4, 0);
SetCtrlVal (panelHandle, PANEL_LED_5, 0);
SetCtrlVal (panelHandle, PANEL_LED_6, 1);
SetCtrlVal (panelHandle, PANEL_LED_7, 0);
SetCtrlVal( panelHandle,PANEL_STRING_2,"dreapta");
break;
}
return 0;
}
int CVICALLBACK f_inapoi ( int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
ComWrt (com, "s", 1);
SetCtrlVal (panelHandle, PANEL_LED_4, 0);
SetCtrlVal (panelHandle, PANEL_LED_5, 0);
SetCtrlVal (panelHandle, PANEL_LED_6, 0);
SetCtrlVal (panelHandle, PANEL_LED_7, 1);
SetCtrlVal(panelHandle,PANEL_STRING_2,"inapoi");
break;
}
return 0;
}
int CVICALLBACK f_stanga ( int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{ ;
switch (event)
{
case EVENT_COMMIT:
86
ComWrt (com, "a", 1);
SetCtrlVal (panelHandle, PANEL_LED_4, 0);
SetCtrlVal (panelHandle, PANEL_LED_5, 1);
SetCtrlVal (panelHandle, PANEL_LED_6, 0);
SetCtrlVal (panelHandle, PANEL_LED_7, 0);
SetCtrlVal(panelHandle,PANEL_STRING_2,"stanga");
break;
}
return 0;
}
int CVICALLBACK f_timer1 ( int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{ char bx[50]="";
int i,j,k,oo=3614;
int I_lim;
char qw,ew;
double u,pp;
switch (event)
{
case EVENT_TIMER_TICK:
ComRdTerm (com, buffer, 32, ' \r') ;
SetCtrlVa l (panelHandle, PANEL_STRING, buffer);
GetCtrlVal (panelHandle, PANEL_NUMERIC_5, &I_lim);
if(buffer[0]=='b')
{
bx[0]= buffer[1];
bx[1]= buffer[2];
bx[2]= buffer[3];
bx[3]= buffer[4];
u=(int)((bx[0] -'0')*1000+(bx[1] -'0')*100+(bx[2] -'0')*10+(bx[3] -'0'));
u=(u*25)/10000;
SetCtrlVal (panelHandle, PANEL_NUMERIC,u);
SetCtrlVal (panelHandle, PANEL_NUMERICMETER,u);
if(u<11)SetCtrlVal (panelHandle, PANEL_LED_22,1);
else SetCtrlVal (panelHandle, PANEL_LED_22,0);
u=0;
}
if(buffer[5]=='c')
{
bx[0]= buffer[6];
bx[1]= buffer[7];
bx[2]= buffer[8];
bx[3]= buffer[9];
SetCtrlVal (panelHandle, PANEL_STRING_4,bx);
i=(int)((bx[0] -'0')*1000+(bx[1] -'0')*100+(bx[2] -'0')*10+(bx[3] -'0'));
if(i>=50) qw=5;
else if(i<50&&i>=40) qw=4;
else if(i<40&&i>=30) qw=3;
else if(i<30&&i>=20) qw=2;
else if(i<20&&i>=10) qw=1;
else qw=0;
for(j=0;j<=qw;j++)
{SetCtrlVal (panelHandle, buf_led[j], 0); }
for(j=qw;j<=5;j++)
{SetCtrlVal (panel Handle, buf_led[j], 1); }
i=0; qw=0;
}
if(buffer[10]=='f')
87
{
bx[0]= buffer[11];
bx[1]= buffer[12];
bx[2]= buffer[13];
bx[3]= buffer[14];
SetCtrlVal (panelHandle, PANEL_STRING_5,bx);
i=(int)((bx[0] -'0')*1000+(bx[1] -'0')*100+(bx[2] -'0')*10+(bx[3] -'0'));
if(i>=50) qw=5;
else if(i<50&&i>=40) qw=4;
else if(i<40&&i>=30) qw=3;
else if(i<30&&i>=20) qw=2;
else if(i<20&&i>=10) qw=1;
else qw=0;
for(j=0;j<=qw;j++)
{SetCtrlVal (panelHandle, buf_led3[j], 0); }
for(j=qw;j<=5;j++)
{SetCtrlVal (panelHandle, buf_led3[j], 1); }
i=0; qw=0;
}
if(buffer[15]=='g')
{
bx[0]= buffer[16];
bx[1]= buffer[17];
bx[2]= buffer[18];
bx[3]= buffer[19];
SetCtrlVal (panelHandle, PANEL_STRING_6,bx);
i=(int)((bx[0] -'0')*1000+(bx[1] -'0')*100+(bx[2] -'0')*10+(bx[3] -'0'));
if(i>=50) ew=5;
else if(i<50&&i>=40) ew=4;
else if(i<40&&i>=30) ew=3;
else if(i<30&&i>=20) ew=2;
else if(i<20&&i>=10) ew=1;
else ew=0;
for(k=0;k<=ew;k++)
{SetCtrlVal (panelHandle, buf_led2[k], 0);}
for(k=ew;k<=5;k++)
{SetCtrlVal (panelHandle, buf_led2[k], 1);}
i=0;ew=0;
}
if(buffer[20]=='h')
{
bx[0]= buffer[21];
bx[1]= buffer[22];
bx[2]= buffer[23];
bx[3]= buffer[24];
SetCtrlVal (panelHandle, PANEL_STRING_7,bx);
i=(int)((bx[0] -'0')*1000+(bx[1] -'0')*100+(bx[2] -'0')*10+(bx[3] -'0'));
SetCtrlVal (panelHandle, PANEL_NUMERICMETER_2,i);
if (i<4978) SetCtrlVal (panelHandle, PANEL_LE D_21,1);
else SetCtrlVal (panelHandle, PANEL_LED_21,0);
}
if(buffer[25]=='i')
{
bx[0]= buffer[26];
bx[1]= buffer[27];
bx[2]= buffer[28];
bx[3]= buffer[29];
u=(int)((bx[0] -'0')*1000+(bx[1] -'0')*100+(bx[2] -'0')*10+(bx[3] -'0'));
if(u<=630)
88
{
SetCtrlVal (panelHandle, PANEL_STRING_8,"sub 1500 mA");
u=((u/20)*1000)/75;
SetCtrlVal (panelHandle, PANEL_NUMERIC_2,u);
}
else
{
SetCtrlVal (panelHandle, PANEL_STRING_8,"OK");
u=(((u*10)/56)*1000)/75;
SetCtrlVal (panelHandle, PANEL_NUMERIC_2,u);
}
if(u>I_lim)
{
SetCtrlVal (panelHandle, PANEL_STRING_8,"Is>Limita");
SetCtrlVal (panelHandle, PANEL_LED_23,1);
ComWrt (com, "q", 1);
}
else SetCtrlVal (panelHandle, PANEL_LED_23,0);
u=0;
}
if(buffer[30]=='w')
{
pp=30;
SetCtrlVal (panelHandle, PANEL_STRING_9,"Inainte");
SetCtrlAttribute (panelHandle,PANEL_PICTURE_3, ATTR_VISIBLE, 1);
SetCtrlVal (panelHandle, PANEL_RINGGAUGE,pp);
SetCtrlVal (panelHandle, PANEL_ NUMERIC_3,oo);
SetCtrlVal (panelHandle, PANEL_NUMERIC_4,oo);
}
else SetCtrlAttribute (panelHandle,PANEL_PICTURE_3, ATTR_VISIBLE, 0);
if(buffer[30]=='s')
{
pp=30;
SetCtrlVal (panelHandle, PANEL_STRING_9,"Inapoi");
SetCtrlAttribute (panelHandle,PANEL_PICTURE_4, ATTR_VISIBLE, 1);
SetCtrlVal (panelHandle, PANEL_RINGGAUGE,pp);
SetCtrlVal (panelHandle, PANEL_NUMERIC_3,oo);
SetCtrlVal (panelHandle, PANEL_NUMERIC_4,oo);
}
else SetCtrlAttribute (panelHa ndle,PANEL_PICTURE_4, ATTR_VISIBLE, 0);
if(buffer[30]=='a')
{
pp=0;
SetCtrlVal (panelHandle, PANEL_STRING_9,"Stanga");
SetCtrlAttribute (panelHandle,PANEL_PICTURE_2, ATTR_VISIBLE, 1);
SetCtrlVal (panelHandle, PANEL_RINGGAUGE,pp);
SetCtrlVal (panelHandle, PANEL_NUMERIC_3,oo);
SetCtrlVal (panelHandle, PANEL_NUMERIC_4,0);
}
else SetCtrlAttribute (panelHandle,PANEL_PICTURE_2, ATTR_VISIBLE, 0);
if(buffer[30]=='d')
{
pp=0;
SetCtrlVal (panelHandle, PANEL_STRING_9,"Dreap ta");
SetCtrlAttribute (panelHandle,PANEL_PICTURE, ATTR_VISIBLE, 1);
SetCtrlVal (panelHandle, PANEL_RINGGAUGE,pp);
SetCtrlVal (panelHandle, PANEL_NUMERIC_3,0);
SetCtrlVal (panelHandle, PANEL_NUMERIC_4,oo);
}
89
else SetCtrlAttribute (panelHandle,PANEL_PICTURE, ATTR_VISIBLE, 0);
if(buffer[30]=='q')
{
pp=0;
SetCtrlVal (panelHandle, PANEL_STRING_9,"Stop");
SetCtrlVal (panelHandle, PANEL_RINGGAUGE,pp);
SetCtrlVal (panelHandle, PANEL_NUMERIC_3,0);
SetCtrlVal (panelHand le, PANEL_NUMERIC_4,0);
}
break;
}
return 0;
}
int CVICALLBACK f_iesire ( int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
QuitUserInterface (0);
break;
}
return 0;
}
90
Anexa 4 . Schema invertorului
91
Anexa 5. Schemă PIC16f887
92
Anexa 6. Placă PIC18F4431
93
Anexa 7.Layout invertoare
94
Anexa 8.Layout placă PIC16F887
95
Anexa 9.Layout placă PIC18F4431
96
Capitolul 6. Bibliografie
[BLDC,2014 ]
[1] http://www.rasfoiesc.com/inginerie/electronica/MODELUL -DINAMIC -AL-MOTORULUI –
D52.php , (24 mai 2014);
[2] Controlul unui motor BLDC – Modoranu Alexandru,
http://81.180.214.82/aE/Stud2011/SCI_spatiu_de_lucru.html , (24 mai 2014);
[3] Brushless DC (BLDC) Motor Fundamentals – Microchip Application Note , (24 mai 2014);
[4] http://en.wikipedia.org/wiki/Brushless_DC_electric_motor , (24 mai 2014);
[5] Mașini sincrone speciale (cu magneți permanenți), curs MS, Universitatea tehnică din Cluj,
http://users.utcluj.ro/~birok/MS/4 -Masini_cu_MP.pdf , (26 mai 2014);
[6] Vas P. –Sensorless Vector and Direct To rque Control ( Vector and direct torque control of
synchronous machines, p.87), (26 mai 2014);
[7] Jacek F. Gieras and Mitchell Wing –Permanent magnet motor technology ,United Technologies
Research Center (p.227), (27 mai 2014);
[Invertor,2014 ]
[1] Dr. Ing. Mihai Albu –Invertorul PWM trifazat de tensiune, laborator electronică de putere
Facultatea IEEI,(14 iunie 2014);
[2] Florin Ionesc, Dan Floricău, Smaranda Nitu, Jean -Paul Six, Philippe Delarue, Cristian Bogu –
Electronică de putere (p.322), (14 iunie 2014);
[3] http://en.wikipedia.org/wiki/Pulse -width_modulation , (15 iunie 2014);
[4] Datasheet IRF3205Pbf, (15 iunie 2014);
[5] http://ro.wikipedia.org/wiki/Tranzistor_unipolar , (15 iunie 2014);
[6] Datasheet IR2101,( 15 iunie 2014);
[Microcontrolere ,2014 ]
[1] http://ro.wikipedia.org/wiki/Microcontroler , ( 20 iunie 2014);
[2] Datasheet PIC16F887, ( 20 iunie 2014);
[3] Datasheet PIC18F4431,(20 iunie 2014);
[4] Nebojsa Matic –PIC microcontrollers for beginners,too!, (20 iunie 2014);
[5] http://www.scritub.com/stiinta/informatica/Notiunea -de-microcontroller -De95575.php , (21 iunie
2014);
[6] http://www.mcu -labs.com/2012/11/intre ruperi -programe -cu-intreruperi.html , (21 iunie 2014);
[7] Vasile Surducan, Wouter van Ooijen –Microcontrolere pentru toți, (21 iunie 2014);
[Senzori,2014 ]
[1] http://www.teguna.ro/wiki/Senzor_de_distan%C5%A3%C4%83_cu_ultrasunete_HC -SR04 , (22
iunie 2014 );
[2] HC-SR04 datasheet, (22 iunie 2014 );
[3] http://users.utcluj.ro/~mbirlea/a/06a.htm , (22 iunie 2014 );
[4] http://ro.wikipedia.org/wiki/Detector_de_metale, (22 iunie 2014 );
[5] http://www.talkingelectronics.com/projects/200TrCcts/MetalD etectors/MetalDetectors -1.html,
(22 iunie 2014 );
[Comunicare,2014 ]
[1] http://invataelectronica.blogspot.ro/2011/08/usart.html , (22 iunie 2014 );
[2] Bluetooth HC -06 datasheet, (22 iu nie 2014 );
[Interfa ță,2014]
[1] Conferențiar Dr.Ing . Dan Marius Dobrea –Laborator EPIOC, (22 iunie 2014 );
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: Conferențiar Dr.Ing. Dan Marius Dobrea Absolvent : Timofte Alexandru – Iulian Iași, 2014 Universitatea “Gheorghe Asachi” din Ia și Facultatea de… [602071] (ID: 602071)
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.
