Controlul unei instalații Quanser folosind microcontrollerul PIC 18F8722 [302923]

Lista Figurilor

Figură 1:Structura generală a unui sistem de conducere 9

Figură 2:Caracteristica static Y=F(U) 12

Figură 3:Funcția de transfer ce variază față de un regim staționar remarcat la un moment t0 13

Figură 4:[anonimizat], în regim staționar, a mărimilor relative 15

Figură 5:Răspunsul la intrare treaptă al unui element de tip I 16

Figură 6:Răspunsul la intrări constante pe porțiuni al unui element I 17

Figură 7:Ecuația de stare 17

Figură 8:Răspunsul la intrare treaptă al unui element D-real 18

Figură 9:Caracteristicile Bode 18

Figură10:Reprezentarea caracteristicilor Bode la scară logaritmică a unui element PI 19

Figură 11:Reprezentarea Simulink a unui element PI 19

Figură 12:Răspunsul la intrare treaptă pentru un element PI 20

Figură 13:Răspunsul unui element PI la intrări constante pe porțiuni 20

Figură 14:Structura conexiunii pentru realizarea elementului D-real cu ajutorul unui element I 21

Figură 15:[anonimizat] 21

Figură 16:Răspunsul la intrare rampă a [anonimizat]-[anonimizat] 22

Figură 17:[anonimizat]-[anonimizat] 22

Figură 18:Răspunsul la intrare rampă a [anonimizat]-[anonimizat] 23

Figură 19:[anonimizat]-[anonimizat] 23

Figură 20:[anonimizat] I [anonimizat] 24

Figură 21:Răspunsul la intrare treaptă pentru Td < Tγ 25

Figură 22:Răspunsul la intrare treaptă pentru Td > Tγ. 25

Figură 23:Răspunsul dintre componenta I [anonimizat] > Tγ 26

Figură 24:[anonimizat] D-real 27

Figură 25:Structura unui element D-real realizat cu ajutorul unui element I 27

Figură 26:Schema bloc generală a Algoritmului Numeric de Reglare Automată 28

Figură 27:Diagrama logică a unui Algorit Numeric de Reglare Automată 29

Figură 28:Diagrama logică a unui Algorit Numeric de Reglare Automată 31

Figură 29:Un model simplificat de unitate de memorie 32

Figură 30:Unitate simplificată de procesare centrală cu trei regiștri 33

Figură 31:Conectarea memoriei și a [anonimizat] 34

Figură 32:[anonimizat] 34

Figură 33:Comunicație serială 35

Figură 34:Placa de dezvoltare PICDEM™ PIC18 Explorer 37

Figură 35:Bloc pentru convertirea unui semnal analogic într-o dimensiune digitală 38

Figură 36:Secțiunea centrală a microcontroller-ului 38

Figură 37:Principiul conversiei analog numerice 42

Figură 38:Modulul PWM 45

Figură 39:Unitatea timer 51

Figură 40:LCD-ul existent pe placă de dezvoltare PIC18 Explorer Demonstration Board 54

Figură 41:Conexiunea PIC18F8722 – LCD 56

Figură 42:Programatorul/debugger-ul PICkit 3 58

Figură 43:Interfața grafică a programului MPLAB IDE 59

Figură 44:Fișierele unui proiect embedded 60

Figură 45:Compilatorul 61

Figură 46:Sistemul SRV02 61

Figură 47:Vedere din față a componentelor platformei Quanser SRV02 63

Figură 48:Vedere asupra conectorilor platformei Quanser SRV02 63

Figură 49:Vedere de sus a componentelor platformei Quanser SRV02 în configurația „low-gear” 63

Figură 50:Vedere de sus asupra componentelor platformei Quanser SRV02 în configurația „high-gear” 63

Figură 51:Încarcatură inertială furnizată împreună cu sistemul SRV02 64

Figură 52:Cablajul tahometrului SRV02 64

Figură 53:Cablajul encoderului SRV02 65

Figură 54:Configurația low-gear 67

Figură 55:Configurația high-gear 67

Figură 56:Schema electrică a servo-instalației 68

Figură 57:Circuitul electric al motorului în domeniul complex 68

Figură 58:Circuitul electric analogic pentru partea mecanică 69

Figură 59:Programul Simulink al modeluli matematic pentru partea mecanică 70

Figură 60:Circuitul electric echivalent al sistemului pentru partea mecanică 71

Figură 61:Rezultate experimentale 72

Figură 62: PID TUNER 74

Figură 63:Schema bloc a sistemului de reglare convențional 75

Figură 64:Procesul de integrare 76

Figură 65: Fereastra de lucru MPLAB 79

Figură 66:Crearea unui proiect nou 80

Figură 67:Fișierele conținute de proiect 80

Figură 68:Selectarea microcontroller-ului PIC18F8722 81

Figură 69:Selectarea compilatorului 81

Figură 70:Selectarea fișierului sursă licenta.c creat din directorul salvat anterior 82

Figură 71:Punte H 82

Figură 72:Divizor de tensiune 83

Figură 73:PicoScope 2105 84

Figură 74:Răspunsul regulatorului de tip P la semnalul de intrare treaptă 91

Figură 75:Figură 74:Răspunsul regulatorului de tip PI la semnalul de intrare treaptă 91

Figură 76:Răspunsul regulatorului de tip PID la semnalul de intrare treaptă 92

Figură 77:Răspunsul regulatorului obținut prin metoda Dead Beat la semnalul de intrare treaptă 92

Lista Tabelelor

Tabel 1:Registrul ADCON0 39

Tabel 2:Registul ADCON1 40

Tabel 3:Configurarea biților de voltaj 40

Tabel 4:Configurarea biților pentru controlul A/D 40

Tabel 5:Registrul ADCON2 41

Tabel 6:Registrul CCPxCON 43

Tabel 7:Structura regiștrilor 46

Tabel 8:Registrul RCON: Reset Control Register 47

Tabel 9:Registrul INTCON:INTERRUPT CONTROL REGISTER 47

Tabel 10:Registrul INTCON2:INTERRUPT CONTROL REGISTER 2 49

Tabel 11:Registrul INTCON3:INTERRUPT CONTROL REGISTER 3 49

Tabel 12:Registrul T0CON: TIMER0 CONTROL REGISTER 51

Tabel 13:Limitări ale tensiunii de intrare 54

Tabel 14:Setarea pinului RS 55

Tabel 15:Maparea pinilor între dispozitive 56

Tabel 16:Sistemul SRV02 62

Tabel 17:Componentele platformei Quanser SRV02 62

Tabel 18:Specificațiile sistemului SRV02 65

Introducere

Automatizările industriale din zilele noastre au suferit remarcabile îmbunătățiri, asta datorită evoluției tehnologiei care a explodat în ultimii 10 ani. Puterea de calcul, posibilitatea stocării unei cantități mari de informație și flexibilitatea PC-urilor a ajutat la demonstrarea și validarea unor fenomene teoretice care înainte nu era posibile. Utilizarea mediilor de programare impreună cu microcontrollerele, cu placile de achiziție, de procesare și cu echipamente de test au oferit o soluție optimă in industria automatizată.

Modernizarea proceselor industriale s-a accentuat puternic în condițiile dezvoltării teoriei identificării experimentale a sistemelor și a tehnologiei calculatoarelor de proces. Dezvoltarea extraordinară a microprocesoarelor a provocat schimbări importante în proiectarea sistemelor de comandă și reglare. Puterea lor de calcul și costul scăzut le fac să preia integral sarcina comenzii și reglării cu performanțe net superioare față de cazul în care s-ar utiliza regulatoare analogice.

Procesul industrial va avea performanțele dorite de proiectant, performanțe care sunt determinate prin simularea funcționării sistemului pe un anumit interval de timp în prezența diferitelor semnale de test aplicate de obicei pe referință.

Prin performanțe bune înțelegem un anumit comportament la semnalele de referință și la semnalele perturbatoare. Un sistem de reglare trebuie, în general, să conducă la urmărirea cât mai precisă și mai rapidă a mărimii de referință de către mărimea de ieșire precum și la o cât mai bună rejectare a influențelor mărimilor perturbatoare.

Această lucrare prezintă o reglare automată la o scară mică care poate fi implementată la scară largă, adică în marea industrie. În realizarea acestui proiect se folosesc urmatoarele elemente esențiale:

-mediul de dezvoltare Matlab

-mediul de programare MPLAB IDE v8.91 alături de compilatorul XC8

-microcontroller-ul PIC18F8722

-instalația Quanser

-puntea H

-divizorul de tensiune

-sondă USB PicoScope

Matlab ne-a oferit o revoluție în domeniu industrial deoarece este un mediu de dezvoltare folosit pentru calcul numeric și analiză statistică, iar aceste lucruri le face foarte rapid. El este creat de cei de la MathWorks care constant au lucrat la dezvoltarea lui cu scopul de aducerea a noi tool-uri care ajută industria inginerească în dezvoltare. Din punct de vedere al structurii sale, Matlab este construit dintr-un nucleu de bază în jurul căreia sunt adunate TOOLBOX-urile care comunică între ele. Permite manipularea matricilor, vizualizarea funcțiilor, implementarea algoritmilor, creearea interfețelor, programarea grafică și mai presus de toate el poate comunica cu alte medii de dezvoltare. Poate realiza grafice 2D și 3D pentru vizualizarea analizelor de semnal efectuate de noi. Pentru implementarea legilor de reglare și aflarea parametrilor acestora se poate folosi PID Tuner/ SISOtool, iar pentru implementarea regulatoarelor se poate face cu mediul Matlab prin programare efectiv sau prin Simulink care reprezintă o programare grafică cu blocuri de calcul.

Mediul de programare MPLAB este un program software care rulează pe PC, iar el este folosit pentru dezvoltare de aplicații pentru microprocesoarele de la Microchip. MPLAB suportă editarea, programare și depanarea proiectelor facute pe microprocesoarele din familia PIC pe 8, 16,sau 32 de biți. Folosim compilatorul XC8 deoarece utilizăm in cadrul acestei lucrări de licență un microprocesor din gama PIC pe 8 biți. În acest mediu de dezvoltare de aplicații software am reușit controlul motorului de curent continuu QUANSER SRV02.

Într-un calculator, procesorul și memoria centrală constituie părțile principale, și prin urmare transmiterea informațiilor se realizează cu precădere între aceste două unități. Cu toate acestea, pentru realizarea eficientă a sarcinilor sale, procesorul trebuie să primească din exterior programe, iar rezultatele prelucrărilor trebuie să fie returnate către utilizator. Perifericele care lucrează cu calculatorul sunt deci foarte diverse, în special din punct de vedere al vitezei, care este de regulă inferioară vitezei microprocesorului. De aici rezultă necesitatea unei adaptări a semnalelor, a interfațării perifericului cu calculatorul.

Microcontroller-ul PIC18F8722 este un dispozitiv pe 8 biți în care sunt încorporate foarte multe dispozitive de intrare-ieșire care realizează buna transmitere a datelor catre elementele controlate. El reprezintă o unealtă didactică foarte avansată. Studenții se folosesc de această unealtă pentru a-și dezvolta abilitățile de programator și acumulează informații pentru a deveni viitori ingineri în domeniul IT.

Prelucrarea semnalelor are un rol important în comunicații, automatică, înregistarea electronică a imaginilor și sunetului, prelucrarea imaginii și vorbirii, explorări seismice, diagnoză medicală, analiză economică.

În practică pentru vizualizarea de semnal al unor procese, elemente electrice și electronice se folosește Osciloscopul, Voltmetrul, Ampermetrul etc. , dar pentru această aplicație se va folosi o sondă USB care vine la pachet cu un Soft, ea poate ține locul tuturor aparatelor de masură enumerate mai sus. Această sondă PicoScope 2105 este pusă la dispoziția studenților pentru analiza diferitlor semnale în cadrul laboratoarelor și este mult mai practică dar nu mai eficientă decât un aparat de masură fizic.

Prelucrarea modernă a semnalelor se face cu ajutorul procesoarelor numerice de semnal: avantajul lor constă în flexibilitatea structurii de prelucrare (realizată prin programare) și precizia (controlată prin lungimea cuvântului). Pe de altă parte prelucrarea numerică impune o întârziere inerentă care poate fi dezavantajoasă la prelucrări în timp real.

La fel ca și microcontrollerul PIC18F8722, instalația Quanser este și ea o unealtă pusă la dispoziția studenților. Ea este compusă dintr-un motor de curent continuu Quanser SRV02 și de un amplificator UPM( Universal Power Module) 1503, aceste 2 componente permit realizarea multor experimente în cadrul Facultății de Automatică, Calculatoare și Electronică. Toate aplicațiile realizate cu această instalație pot fi puse în practică la nivel de industrie.

Puntea H și divizorul de tensiune se vor folosi în această aplicație pentru a duce la bun sfârșit proiectul propus spre realizare. Puntea H este folosită pentru a da sensul de rotație al motorului, iar divizorul de tensiune este folosit de obicei pentru a înjumătății tensiunea primită de la instalația Quanser. Un alt exemplu de folosință al divizorului de tensiune este potențiometrul.

În această lucrare se caută să se prezinte și utilizeze un cadru de noțiuni presupuse cunoscute și dobândite în urma anilor de studiu.

1.Noțiuni generale de reglare automată

1.1.Structura generală a unui sistem de conducere

În orice sistem de conducere, în particular, de conducere automată, se deosebesc următoarele patru elemente interconectate ca în Figura 1 :

Obiectul condus (instalația automatizată)

Obiectul conducător (dispozitivul de conducere)

Sistemul de transmitere și aplicare a comenzilor (deciziilor)

Sistemul informatic (de culegere si transmitere a informațiilor privind obiectul condus).

Figură 1:Structura generală a unui sistem de conducere

Obiectul conducător (dispozitivul de conducere) elaborează decizii (comenzi) care se aplică obiectului condus, prin intermediul elementelor de execuție, pe baza informațiilor obținute despre starea obiectului condus prin intermediul mărimilor măsurate.

Deciziile de conducere au ca scop îndeplinirea de către mărimea condusă a unui program în condițiile îndeplinirii (exterminării) unor criterii de calitate, a satisfacerii unor restricții, când asupra obiectului condus acționează o serie de perturbații.

Structura de mai sus este o structură de conducere (sau în circuit închis) deoarece deciziile (comenzile) aplicate la un moment dat sunt dependente și de efectul deciziilor anterioare. Aceasta exprimă circuitul închis al informațiilor prin mărimile de reacție: fenomenul de reacție sau feedback.

Dacă lipsește legătura de reacție sistemul este în circuit deschis și se numește sistem de comandă (în particular, de comandă automată).

O astfel de structură se întâlnește în cele mai diverse domenii de activitate: tehnic, biologic, social, militar etc., în cele ce urmează referindu-ne însă numai la cele tehnice.

Un sistem de conducere în structura de mai sus se poate numit sistem de conducere automată deoarece este capabil să elaboreze decizii de conducere folosind mijloace proprii de informare.

Un caz particular de sisteme de conducere automată îl constituie sistemele de reglare automată (SRA).

Prin sistem de reglare automată se înțelege un sistem de conducere automată la care scopul conducerii este exprimat prin anularea diferenței dintre mărimea condusă (reglată) și mărimea impusă (programul impus), diferență care se mai numește abatere sau eroarea sistemului.

La cele mai multe sisteme de reglare automată mărimea reglată este chiar mărimea măsurată.

Procesul de anulare a erorii într-un SRA se efectuează folosind două principii:

1. Principiul acțiunii prin discordanță (PAD) – în acest caz, acțiunea de reglare apare numai după ce abaterea sistemului s-a modificat datorită variației mărimii impuse sau a variației mărimii de ieșire provocată de variația unei perturbații.

2. Principiul compensației (PC) – una sau mai multe mărimi perturbatoare sunt măsurate și se aplică la elementele de execuție, comenzi care trebuie să compenseze pe această cale efectul acestor perturbații asupra mărimii de ieșire transmis pe cale naturală. Are avantajul că poate realiza, în cazul ideal, compensarea perfectă a anumitor perturbații fără ca mărimea de ieșire să se abată de la programul impus. Are dezavantajul compensării numai a anumitor perturbații, nu a oricăror perturbații.

În cazul PAD, acțiunea de reglare apare numai după ce abaterea sistemului s-a modificat datorită variației mărimii impuse sau a variației mărimii de ieșire provocată de variația unei perturbații.

Deci, întâi sistemul se abate de la program ("greșește") și apoi se corectează. Este realizat prin circuitul de reacție inversă. Are avantajul compensării efectului oricăror perturbații.

În cazul PC, una sau mai multe mărimi perturbatoare sunt măsurate și se aplică la elementele de execuție, comenzi care să compenseze pe această cale efectul acestor perturbații asupra mărimii de ieșire transmis pe cale naturală.

Are avantajul că poate realiza, în cazul ideal, compensarea perfectă a anumitor perturbații fără ca mărimea de ieșire să se abată de la programul impus. Are dezavantajul compensării numai a anumitor perturbații, nu a oricăror perturbații.

Un sistem de reglare care îmbină cele doua principii se numește sistem de reglare combinată.

1.2.Legi tipizate de reglare

1.2.1.Prezentare generală

În practica industrială a reglării automate s-au impus așa numitele legi de reglare de tip PID (Proporțional-Integrator-Derivator) sau elemente de tip PID, care satisfac în majoritatea situațiilor cerințele tehnice impuse sistemelor de reglare convențională. Se pot utiliza diversele combinații ale celor trei componente: P = proporțional; I = integrator; PI = proporțional-integrator; D = derivator, ideal și real, PD = proporțional-derivator ideal și real, PID = Proporțional-integrator-derivator, ideal și real în diferite variante.

Prin utilizarea acestor legi tipizate în cadrul unor regulatoare tipizate, proiectarea dimensional-valorică a legii de reglare se reduce la alegerea tipului de lege și poziționarea unor butoane prin care se prescriu valorile parametrilor acestor legi rezultate în urma proiectării analitice a sistemului.

Nu se poate stabili precis efectul fiecărei componente a unei legi de tip PID asupra calității unui SRA, deoarece acestea depind de structura sistemului, de dinamica instalației automatizate.

Totuși se pot face următoarele precizări:

Componenta proporțională, (exprimată prin factorul de proporționalitate KR), determină o comandă proporțională cu eroarea sistemului. Cu cât factorul de proporționalitate este mai mare cu atât precizia sistemului în regim staționar este mai bună dar se reduce rezerva de stabilitate putând conduce în anumite cazuri la pierderea stabilității sistemului.

Componenta integrală, exprimată prin constanta de timp de integrare Ti determină o comandă proporțională cu integrala erorii sistemului din care cauză, un regim staționar este posibil numai dacă această eroare este nulă. Existenta unei componente I într-o lege de reglare este un indiciu clar că precizia sistemului în regim staționar (dacă se poate obține un astfel de regim) este infinită. În regim staționar, de cele mai multe ori componenta I determină creșterea oscilabilității răspunsului adică reducerea rezervei de stabilitate.

Componenta derivativă, exprimată prin constanta de timp de derivare Td determină o comandă proporțională cu derivata erorii sistemului. Din această cauză, componenta D realizează o anticipare a evoluției erorii permițând realizarea unor corecții care reduc oscilabilitatea răspunsului. Nu are nici-un efect în regim staționar.

Deoarece aceste tipuri de comportări se întâlnesc și la alte sisteme nu numai în cazul regulatoarelor, în cele ce urmează se vor considera intrarea uR = u ieșirea yR = y iar funcția de transfer HR(s)=H(s).

1.2.2.Legea de tip P (Proporțional)

Printr-o lege de tip proporțional, se descrie comportarea intrare-ieșire a unui element nedinamic (de tip scalar) sau comportarea în regim staționar a unui element dinamic, eventual descris printr-o funcție de transfer H(s), considerând această comportare liniară într-un domeniu.

Pentru o caracteristică statică Y=F(U), ca în Figura 2 , se poate aproxima o comportare liniara pentru u ϵ [Umin, Umax] și y ϵ[Ymin,Ymax] cu Ymin ϵ F(Umin), putând avea Ymax ϵ F(Umax).

Figură 2:Caracteristica static Y=F(U)

În afara limitelor min și max pentru intrare sau ieșire, comportarea fie nu este posibilă tehnologic fie nu este de dorit.

De exemplu, în cazul elementelor de automatizare o anumită comportare declarată de constructor este garantată numai în domeniul de variație al semnalului unificat: [0,10]V, [4,20]mA, [0.2 ,1]bar etc.

Pentru un sistem dinamic, dependența intrare-ieșire în regim staționar este aproximată în aceste domenii printr-o relație liniară de forma

Y = Ymin + Kp (U – Umin), U = u(∞), Y = y(∞) , (1.1)

unde Kp reprezintă factorul de proporționalitate sau factorul de amplificare de poziție.

El se poate determina experimental prin raportul dintre variația mărimii de ieșire în regim staționar și variația mărimii de intrare în regim staționar care a produs acea ieșire.

Dacă o anumită valoare staționară este apreciată (aproximată la un moment finit de timp t0) atunci se utilizează relația

ust (t0) = u(∞) = U , yst (t0) = y(∞) = Y, (1.2)

înțelegând că la momentul t = t0 este atins un regim staționar.

Dacă în domeniul de liniaritate, obiectul este descris printr-o funcție de transfer H(s) atunci,

Kp = (1.3)

Dacă H(s) nu are caracter integrator,

Kp = H(0) (1.4)

Factorul de proporționalitate este o mărime dimensională, [Kp] = [Y] /[U] .

Reamintim că atunci când se utilizează funcția de transfer pentru descrierea comportării intrare-ieșire (evident valabilă numai în domeniul de liniaritate) aceasta descrie variația față de un regim staționar remarcat la un moment t0, considerat t0 = 0, așa cum este ilustrat în Figura 3.

Y(s) = H(s)U(s) , U(s) = L{u(t) – ust (t)} (1.5)

(1.6)

În particular, regimul staționar poate fi reprezentat prin valorile minime

ust (t0) = Umin, yst (t0) = Ymin

Figură 3:Funcția de transfer ce variază față de un regim staționar remarcat la un moment t0

Un element de tip P propriu-zis, este un element nedinamic, caracterizat prin funcția de transfer

H(s) = KR , deci Kp = KR

y(t) = Ymin + KR [u(t) – Umin] (1.7)

De foarte multe ori în practică, informația transmisă sau prelucrată este exprimată prin variația procentuală a semnalului purtător de informație față de domeniul său de variație, astfel că valoarea minimă a semnalului exprimă mai clar informația zero (0%) iar valoarea maximă exprimă informația totală (100%).

O valoare procentuală în afara domeniului [0,100]% înseamnă un semnal în afara domeniului [min, max].

Notând prin Du domeniul de variație al intrării, de fapt lungimea intervalului de variație, iar prin Dy domeniul de variație al ieșirii,

Du = Umax – Umin, Dy = Ymax – Ymin (1.8)

se utilizează următoarele relații de reprezentare procentuală:

(1.9)

În domeniul complex, dacă Y(s)=H(s)U(s), se definește funcția de transfer relativă Hrel(s) ca fiind raportul dintre transformata Laplace a ieșirii exprimată procentual și transformata Laplace a intrării exprimată procentual .

(1.10)

Se poate defini factorul de proporționalitate relativ sau procentual ca fiind raportul dintre variația procentuală a ieșirii în regim staționar și variația procentuală în regim staționar a intrării care a produs acea ieșire.

(1.11)

Evident, Kp% este o mărime adimensională.

În cazul unei legi de reglare de tip P, evident .

Factorul de amplificare de poziție (factorul de proporționalitate) nu dă informații privind rezerva de liniaritate în raport cu mărimea de intrare.

Prin banda de proporționalitate, notată BP%, se înțelege o măsura a amplificării unui sistem, exprimata prin procentul din domeniul mărimii de intrare care determina la ieșire o valoare de 100% din domeniul acesteia.

În general se poate spune ca daca intrarea are o variație procentuala, între doua regimuri staționare consecutive, egala cu BP%, ieșirea suferă o variație procentuala, între aceste regimuri staționare, egala cu 100%.

În această situație amplificarea de poziție este exprimata prin numărul BP%.

Dependența intrare-ieșire, în regim staționar, a mărimilor relative este reprezentata în Figura 4.

Figură 4:Dependența intrare-ieșire, în regim staționar, a mărimilor relative

Panta acestor caracteristici este factorul de proporționalitate relative , astfel că,

(1.12)

Banda de proporționalitate este un număr adimensional. Factor de proporționalitate mare înseamnă banda de proporționalitate mica si invers.

1.2.3.Legea de tip I (Integrator)

Relația intrare-ieșire în domeniul timp este dată de ecuația diferențială

(1.13)

sau prin soluția

(1.14)

Funcția de transfer este:

(1.15)

unde:

este factorul de proporționalitate,

este constanta de timp de integrare [] = sec

Funcția de transfer exprimată prin ecuația (1.15) se poate exprima printr-un singur parametru, constanta de timp echivalentă ,

, (1.16)

În această expresie, numărul 1 de la numărător este un factor dimensional, înțelegând că ar fi un factor de proporționalitate .

Deoarece , unde înseamnă valoarea mărimii fizice ,

(1.17)

Răspunsul la intrare treaptă , reprezentat în Figura 5, este

(1.18)

Figură 5:Răspunsul la intrare treaptă al unui element de tip I

Se observă că panta la intrare constantă este

(1.19)

De notat că panta unui element integrator depinde de valoarea totală a intrării, nu de variația acesteia.

Constanta de timp de integrare echivalentă reprezintă intervalul de timp in care mărimea de ieșire creste cu o valoare egală cu valoarea intrării constantă aplicată.

Această definiție permite determinarea rapidă a constantei pe graficul răspunsului la intrare treaptă dedus expermental. În Figura 6 este prezentată evoluția răspunsului unui element I la intrări constante pe porțiuni.

Figură 6:Răspunsul la intrări constante pe porțiuni al unui element I

1.2.4.Legea de tip D-real (Derivator-real)

Relația intrare-ieșire este:

(1.20)

Funcția de transfer este:

(1.21)

= factorul de proporționalitate

= constanta de timp de integrare

= constanta de timp parazită

Ecuația de stare se obține exprimând funcția de transfer proprie într-o sumă dintre un element scalar și un element strict propriu ca în Figura 7.

(1.22)

Figură 7:Ecuația de stare

Din figura de mai sus, se obține:

(1.23)

(1.24)

Răspunsul la intrare treaptă este

(1.25)

și prezentat în Figura 8 .

Figură 8:Răspunsul la intrare treaptă al unui element D-real

Se observă că ieșirea în regim staționar a unui element D este nulă. Elementul D acționează numai în regim tranzitoriu. El se mai numește și ”element forțator”.

Caracteristicile Bode sunt prezentate în Figura 9, de unde se observă că elementul D-real apare ca un filtru trece-sus.

Figură 9:Caracteristicile Bode

1.2.5.Legea de tip PI (Proporțional-Integrator)

Relația intrare-ieșire în domeniul timp este exprimată prin ecuația diferențială

(1.26)

sau prin soluția

(1.27)

Funcția de transfer este

(1.28)

unde: este factorul de proporționalitate;

este constanta de timp de integrare.

Se observă că un element PI are un pol în originea planului complex s=0 și un zerou s=-1/, așa cum se poate vedea în Figura 10.

Caracteristicile Bode:

Caracteristicile amplitudine-pulsație A(ω) și fază-pulsație φ(ω) sunt reprezentate la scară logaritmică în Figura 10.

Figură10:Reprezentarea caracteristicilor Bode la scară logaritmică a unui element PI

(1.29)

Structura in care se evidențiază cele două componente P și I este dată în Figura 11.

Figură 11:Reprezentarea Simulink a unui element PI

Ecuația de stare este

(1.30)

În expresia (1.27) starea inițială este exprimată prin .

Răspunsul la intrare treaptă, prezentat în Figura 12, este

(1.31)

În Figura 13 este prezentat răspunsul unui element PI la intrări constante pe porțiuni, evidențiind modul de determinare al parametrilor KR,Ti pe diferitele porțiuni ale acestui răspuns.

Figură 13:Răspunsul unui element PI la intrări constante pe porțiuni

Raportul KR/Ti se poate calcula cunoscând doua puncte ale unei porțiuni a raspunsului, y(t1)și y(t2) și valoarea constantă U a intrării care a determinat acel răspuns liniar.

1.2.6.Legea de tip PD-real (Proporțional –Derivator-real)

Relația intrare-ieșire:

(1.32)

Funcția de transfer:

(1.33)

KR = factor de proporționalitate

Td = constanta de timp de derivare

Tγ = constanta de timp parazită

Elementul D-real se poate realiza și cu ajutorul unui element I. Funcția de transfer echivalentă structurii conexiunii din Figura 14 este:

(1.34)

unde constantele de timp echivalente obținute sunt: Td = Ti și Tγ = Ti/a.

Figură 14:Structura conexiunii pentru realizarea elementului D-real cu ajutorul unui element I

Figură 15:Structura conexiunii pentru realizarea elementului PD-real

(1.35)

Ecuația de stare se obține exprimând H(s) ca în Figura 14 și Figura 15.

(1.36)

(1.37)

Răspunsul la intrare treaptă în condiții inițiale nule și caracteristicile Bode se prezintă pentru trei situații:

. Este predominant caracterul derivator. Se comportă ca un filtru trece – sus cu avans de fază, ca în Figura 16 și Figura 17 .

Figură 16:Răspunsul la intrare rampă a unui sistem de reglare cu lege PD-real comportându-se ca un filtru trece – sus

Figură 17:Caracteristicile Bode ale unui sistem de reglare cu lege PD-real comportându-se ca un filtru trece – sus

. Este predominant caracterul integrator. Se comportă ca un filtru trece – jos cu întârziere de fază, ca în Figura 18 și Figura 19 .

Figură 18:Răspunsul la intrare rampă a unui sistem de reglare cu lege PD-real comportându-se ca un filtru trece – jos

Figură 19:Caracteristicile Bode ale unui sistem de reglare cu lege PD-real comportându-se ca un filtru trece – jos

. Comportarea intrare-ieșire este de tip scalar, însă răspunsul liber este de ordinul întâi deoarece sistemul este necontrolabil.

Evoluțiile stării și ieșirii sunt:

(1.38)

1.2.7.Legea de tip PID-real (Proporțional-Integrator-Derivator-real)

1.2.7.1.Conexiune paralel dintre un element I și un element PD real

Structura este ilustrată în Figura 20.

[ PID-real = I + PD-real = (Aperiodic) ● (PID-ideal) ]

Figură 20:Structura unui PID-real realizat prin conexiune paralel dintre un element I și un element PD-real

Funcția de transfer

Funcția de transfer realizată:

(1.39)

poate fi echivalată printr-o conexiune serie dintre un element aperiodic de ordinul I și un element PID-ideal.

(1.40)

unde:

(1.41)

Ecuațiile de stare

Ecuațiile de stare ale acestui element se obțin prin concatenarea ecuațiilor elementului I și PD-real:

(1.42)

Sub forma matriceal-vectorială acestea se rescriu:

(1.43)

unde,

(1.44)

Răspunsul la intrare treaptă

Răspunsul la intrare treaptă pe care se ilustrează modul de determinare a parametrilot funcției de transfer este reprezentat în Figura 21 pentru Td < Tγ și Figura 22 pentru Td > Tγ.

Figură 21:Răspunsul la intrare treaptă pentru Td < Tγ

Figură 22:Răspunsul la intrare treaptă pentru Td > Tγ.

Pentru determinarea valorilor parametrilor KR, Ti, Td, Tγ pe răspunsul la o variație treaptă Δu aplicată la un moment t0, pornind dintr-un regim staționar, u(t) = 0, y(t) = yst(t0) pentru t < t0, se evidențiază faptul că răspunsul este suma dintre componenta I și componenta PD-real

yPID-r = yI (t) + yPD-r (t) (1.45)

procedând astfel:

În punctul inițial (A) al evoluției se duce o paralelă la porțiunea rectilinie a răspunsului. Aceasta reprezintă componenta yI(t);

Se prelungește porțiunea rectilinie a răspunsului până taie în punctul C abscisa momentului inițial;

Se determină componenta yPD-r a răspunsului efectuând punct cu punct scăderea

yPD-r(t)=yPID-r(t)-yI(t) (1.46)

Din vârful B al răspunsului se duce o tangentă la componenta yPD-r(t) rezultând pe ordonata punctului C segmentul CD;

Se determină panta răspunsului determinând în zona rectilinie valorile răspunsului în două momente t1, t2, y1=yPID-r(t1), y2=yPID-r(t2);

Cunoscând valorile în unități ale mărimii y corespunzătoare segmentelor AB, AC, ți în timp pentru CD se calculează parametrii cu relațiile:

(aici U =) (1.47)

Răspunsul unui astfel de element (Td > Tγ) la intrări constante pe porțiuni este prezentat în Figura 23.

Figură 23:Răspunsul dintre componenta I și componenta PD-real pentru Td > Tγ

1.2.7.2.Conexiune paralel dintre un element PI și un element D-real

PID-real

Structura acestei conexiuni paralel și formele ei echivalente sunt indicate în Figura 24 .

Figură 24:Structura unui PID-real cu conexiune paralel dintre un element PI și un element D-real

Funcția de transfer realizată este:

(1.48)

(1.49)

unde:

(1.50)

Sctructurile 1.2.5.2.1 și 1.2.5.2.2 sunt echivalente,

, (1.51)

Astfel că toate tehnicile de determinare a parametrilor funcției de transfer pentru determinarea unui element D-real realizat cu ajutorul unui element I rămân valabile, însă în urma aplicării acestor tehnici se obțin din care mărimile: și = .

Elementele de tip D-real se realizează folosind elemente de tip integrator. Structura conexiunii este regăsită mai jos în Figura 25.

Figură 25:Structura unui element D-real realizat cu ajutorul unui element I

(1.52)

unde constantele de timp echivalente obținute sunt și

1.3.Algoritmi numerice de reglare automată (ANRA)

1.3.1.Structura generală a ANRA

Algoritmul Numeric de Reglare Automată (ANRA) este o componentă a unei structuri mai generală reprezentată prin Algoritmul Numeric de Conducere Automată (ANCA).

Prin ANRA se asigură numai procesul de reglare automată, efectuat la fiecare pas.

În cadrul ANCA se asigură, pe lângă reglarea automată, toate operațiile specifice conducerii automate a unei instalații:

reglare automată

monitorizare

alarmare

schimbarea regimurilor de funcționare

pornire-oprire

interfața operator.

De asemenea ANCA asigură o serie de facilități pentru ANRA:

autoacordare

optimizare.

Figură 26:Schema bloc generală a Algoritmului Numeric de Reglare Automată

În figura de mai sus, s-au notat cu litere mari variabilele numerice din programul de conducere care exprimă diferitele entități, iar alăturat sunt exprimate echivalențele lor prin marimile corespunzătoare în care se evidențiază variabila timp, reprezentată prin pasul k.

Aceste mărimi sunt:

Mărimea prescrisă (referința):

Mărimea reglată:

Mărimea de comandă:

Starea sistemului dinamic care realizează legea de reglare (starea legii de reglare) la pasul curent:

sau la pasul anterior:

Statutul ANRA la pasul curent:

respectiv la pasul anterior:

Parametrii legii de reglare la pasul curent:

Starea legii de reglare xk intră în operațiile algebrice din R pe când statutul ANRA, sk, exprimă o serie de variabile logice prelucrate (manipulate) prin operatori specifici.

Prin utilizarea variabilelor sk se pot implementa legi de reglare cu structură variabilă, se pot realiza anumite operații și proceduri suplimentare în anumite momente de timp, dependente de factori interni ANRA sau externi (de exemplu asigurarea echilibrării automat-manual).

Toate operațiile specifice unui ANRA pot fi înglobate într-o subrutină de reglare automată care este manipulată de sistemul de operare ca un task așa cum este reprezentată în figura următoare:

Figură 27:Diagrama logică a unui Algorit Numeric de Reglare Automată

Există o largă varietate de moduri de organizare a unui ANRA, de implementare și manipulare a sa în cadrul unei aplicații în timp real.

1.3.2.Operații de bază în ANRA

În general resursele unui ANRA se referă la task-uri, subrutine, macroinstrucțiuni, biblioteci aritmetice (specifice și generale) care permit:

1. Citirea unor variabile numerice din memoria echipamentului sau din exterior.

În ultimul caz comanda de citire din exterior presupune și declanșarea procedurii de conversie analog-numerică sub controlul ANRA prin macroinstrucțiuni recunoscute de sistemul de operare.

În primul caz, citirea din memoria echipamentului, se poate presupune că procesul de conversie analog-numeric este efectuat ín mod independent de către un sistem de achiziții specializat.

Stările inițiale X0, S0 și parametrii PLR pot fi citiți sub controlul ANRA sau livrați de sistemul de operare de fiecare dată (la fiecare pas) cînd este lansat în execuție ANRA.

2. Scrierea unor variabile numerice, în memoria echipamentului (așa cum sunt X și S) sau spre un convertor numeric-analogic așa cum este W.

Uneori comanda de conversie numeric-analogică este sub controlul direct al ANRA prin macroinstrucțiuni recunoscute de sistemul de operare.

3. Efectuarea sau recunoașterea unor operații de condiționare a variabilelor: normalizare, denormalizare, limitare, cuantificare, scalare, liniarizare, filtrare.

Este posibil ca aceste operații să fie realizate în interiorul ANRA sau să fie efectuate în exterior, prin proceduri separate sau încorporate ín sistemele de decizii și de comandă analogice.

4. Efectuarea unor operații de calcul cu variabile numerice sau logice folosind biblioteci aritmetice generale sau specifice.

Problematica implementării unor algoritmi în timp real este o sarcină complexă pentru care există o bogată literatură specializată.

Scopul analizei de față îl constituie în principal reprezentarea sistemică a acțiunilor de implementare a unor algoritmi de timp real, prin care să se realizeze o legătură clară, între reprezentările specifice domeniului software de timp real și al reprezentărilor matematice specifice diferitelor capitole ale teoriei sistemelor.

Se poate arăta că același software poate determina comportări diferite ale unui sistem de reglare dacă se implementează în medii reale diferite.

Invers, se urmărește prin aceste analize, să se precizeze software-ul de conducere care să asigure efectiv doleanțele de comportament exprimate în limbajul teoriei sistemelor.

Un ANRA poate fi grupat în trei mari blocuri funcționale:

BR : blocul de citire

BNC : blocul numeric de calcul

BW : blocul de scriere,

așa cum este reprezentat în Figura 28.

Operațiile de condiționare a variabilelor se pot reprezenta prin blocuri funcționale specifice sau încadrate în cele trei blocuri de mai sus.

Dacă referința este internă atunci ea apare ca fiind citită din mediul intern.

Figură 28:Diagrama logică a unui Algorit Numeric de Reglare Automată

Blocul numeric de calcul poate fi exprimat printr-o procedură de forma,

[W, X, S ] = BNC(V, Y, X0, S0, PLR]

(1.53)

după a cărei execuție sunt necesare actualizările

X0 = X, S0 = S.

Procedura (1.53) este alcátuită de fapt din 3 subproceduri care exprimă:

Ecuația de evoluție a stării ANRA:

X = Ψ(V, Y, X0, S0, PLR ) xk=Φ()

(1.54)

Ecuația de evoluție a statutului ANRA:

S = Θ(V, Y, X, S0, PLR ) sk= Θ ()

(1.55)

Ecuația de ieșire ANRA:

W = Ψ (V, Y, X, S, PLR) wk= Ψ ()

(1.56)

Starea X reprezintă un vector de nX numere reale, iar ecuația (1.54) este o ecuație recursivă în RnX .

Statutul S reprezintă un vector de nS variabile logice, iar ecuația (1.55) este o ecuație recursivă în BnS , unde B este o algebră Booleană.

Ecuația (1.56) este o ecuație algebrică, exprimată eventual prin restricții definite în funcție de valorile de adevăr ale variabilelor logice S, prin care se generează variabila W ce se transmite CNA-ului pentru conversie în semnal continuu.

Parametrii ANRA sunt cuprinși în aria de celule PLR care pot îngloba arii de numere reale (vectori sau matrici) sau arii de caractere ce compun variabilele logice.

2.Prezentarea microcontreller-ului PIC 18F8722

2.1.Prezentarea generală a microcontrollere-lor PIC18F

2.1.1.Unitatea de memorie

Memoria este o parte a microcontrolerului a cărei funcție este de a înmagazina date. Cel mai ușor mod de a explica este de a-l descrie ca un dulap mare cu multe sertare. Dacă presupunem că am marcat sertarele într-un asemenea fel încât să nu fie confundate, oricare din conținutul lor va fi atunci ușor accesibil. Este suficient să se știe desemnarea sertarului și astfel conținutul lui ne va fi cunoscut în mod sigur.

Figură 29:Un model simplificat de unitate de memorie

Componentele de memorie sunt exact așa. Pentru o anumită intrare obținem conținutul unei anumite locații de memorie adresate și aceasta este totul. Două noi concepte ne sunt aduse: adresarea și locația de memorie. Memoria constă din toate locațiile de memorie, și adresarea nu este altceva decât selectarea uneia din ele. Aceasta înseamnă că noi trebuie să selectăm locația de memorie la un capăt, și la celălalt capăt trebui sa așteptăm conținutul acelei locații. În afară de citirea dintr-o locație de memorie, memoria trebuie de asemenea să permită scrierea în ea. Aceasta se face prin asigurarea unei linii adiționale numite linie de control. Vom desemna această linie ca R/W (citește /scrie). Linia de control este folosită în felul următor: dacă r/w=1, se face citirea, dacă r/w=0 se face scrierea în locația de memorie. Memoria este primul element, dar avem nevoie și de altele pentru ca microcontrolerul nostru să funcționeze.

2.1.2.Unitatea de procesare centrală

Să adăugăm alte 3 locații de memorie pentru un bloc specific ce va avea o capabilitate incorporată de înmulțire, împărțire, scădere și să-i mutăm conținutul dintr-o locație de memorie în alta. Partea pe care tocmai am adăugat-o este numită "unitatea de procesare centrala" (CPU). Locațiile ei de memorie sunt numite regiștri.

Figură 30:Unitate simplificată de procesare centrală cu trei regiștri

Regiștrii sunt deci locații de memorie al căror rol este de a ajuta prin executarea a variate operații matematice sau a altor operații cu date oriunde se vor fi găsit datele. Să privim la situația curentă. Avem două entități independente (memoria și CPU) ce sunt interconectate, și astfel orice schimb de informații este ascuns, ca și funcționalitatea sa. Dacă, de exemplu, dorim să adăugăm conținutul a două locații de memorie și întoarcem rezultatul înapoi în memorie, vom avea nevoie de o conexiune între memorie și CPU. Mai simplu formulat, trebuie să avem o anumită "cale" prin care datele circulă de la un bloc la altul.

2.1.3.Bus-ul

Calea este numită "bus"- magistrală. Fizic, el reprezintă un grup de 8, 16, sau mai multe fire. Sunt două tipuri de bus-uri: bus de adresă și bus de date. Primul constă din atâtea linii cât este cantitatea de memorie ce dorim să o adresăm, iar celălalt este atât de lat cât sunt datele, în cazul nostru 8 biți sau linia de conectare. Primul servește la transmiterea adreselor de la CPU la memorie, iar cel de al doilea la conectarea tuturor blocurilor din interiorul microcontrolerului.

Figură 31:Conectarea memoriei și a unității centrale folosind bus-uri

Electronica digitala are la baza un sistem de numeratie diferit de cel zecimal(care ulilizeaza o numeratie cu 10 cifre) utilizat in mod obișnuit, sistemul binar(care utilizeaza doar doua cifre-0 si 1-). În toate sistemele de numerație poziția cifrelor în scrierea numerelor are o mare importanta Astfel, cu cat pozitia cifrei este mai la stânga intr-un număr, cu atat importanta acesteia este mai mare(are rang mai mare).

În ceea ce privește funcționalitatea, situația s-a îmbunătățit, dar a apărut o nouă problemă: avem o unitate ce este capabilă să lucreze singură, dar care nu are nici un contact cu lumea de afară, sau cu noi! Pentru a înlătura această deficiență, vom adăuga un bloc ce conține câteva locații de memorie al căror singur capăt este conectat la bus-ul de date, iar celălalt are conexiune cu liniile de ieșire la microcontroler ce pot fi văzute cu ochiul liber ca pini la componenta electronică.

2.1.4.Unitatea intrare –ieșire

Aceste locații ce tocmai le-am adăugat sunt numite „porturi”. Sunt diferite tipuri de porturi: intrare, ieșire sau porturi pe două-căi. Când se lucrează cu porturi, mai întâi de toate este necesar să se aleagă cu ce port urmează să se lucreze, și apoi să se trimită date la, sau să se ia date de la port.

Figură 32:Unități simplificate intrare-ieșire ce permite comunicarea cu lumea externă

Când se lucrează cu el portul se comportă ca o locație de memorie. Ceva este pur și simplu scris în sau citit din el, și este posibil de a remarca ușor aceasta la pinii microcontrolerului.

2.1.5.Comunicația serială

Cu aceasta am adăugat la unitatea deja existentă posibilitatea comunicării cu lumea de afară. Totuși, acest mod de comunicare are neajunsurile lui. Unul din neajunsurile de bază este numărul de linii ce trebuie să fie folosite pentru a transfera datele. Ce s-ar întâmpla dacă acestea ar trebui transferate la distanță de câțiva kilometri? Numărul de linii înmulțit cu numărul de kilometri nu promite costuri eficiente pentru proiect. Nu ne rămâne decât să reducem numărul de linii într-un așa fel încât să nu scădem funcționalitatea. Să presupunem că lucrăm doar cu 3 linii, și că o linie este folosită pentru trimiterea de date, alta pentru recepție și a treia este folosită ca o linie de referință atât pentru partea de intrare cât și pentru partea de ieșire. Pentru ca aceasta să funcționeze, trebuie să stabilim regulile de schimb ale datelor. Aceste reguli sunt numite protocol. Protocolul este de aceea definit în avans ca să nu fie nici o neînțelegere între părțile ce comunică una cu alta. De exemplu, dacă un om vorbește în franceză, și altul vorbește în engleză, este puțin probabil că ei se vor înțelege repede și eficient unul cu altul. Să presupunem că avem următorul protocol. Unitatea logică "1" este setată pe linia de transmisie până ce începe transferul. Odată ce începe transferul, coborâm linia de transmisie la "0" logic pentru o perioadă de timp (pe care o vom desemna ca T), așa că partea receptoare va ști că sunt date de primit, așa că va activa mecanismul ei de recepție. Să ne întoarcem acum la partea de transmisie și să începem să punem zero-uri și unu- uri pe linia de transmisie în ordinea de la un bit a celei mai de jos valori la un bit a celei mai de sus valori. Să lăsăm ca fiecare bit să rămână pe linie pentru o perioadă de timp egală cu T, și la sfârșit, sau după al 8-lea bit, să aducem unitatea logică "1" înapoi pe linie ce va marca sfârșitul transmisiei unei date. Protocolul ce tocmai l-am descris este numit în literatura profesională NRZ (Non-Return to Zero).

Figură 33:Comunicație serială

Pentru că avem linii separate de recepție și de transmitere, este posibil să recepționăm și să transmitem date (informații) în același timp. Blocul așa numit full-duplex mode ce permite acest mod de comunicare este numit blocul de comunicare serială. Spre deosebire de transmisia paralelă, datele sunt mutate aici bit cu bit, sau într-o serie de biți, de unde vine și numele de comunicație serială. După recepția de date trebuie să le citim din locația de transmisie și să le înmagazinăm în memorie în mod opus transmiterii unde procesul este invers. Datele circulă din memorie prin bus către locația de trimitere, și de acolo către unitatea de recepție conform protocolului.

2.2.Utilizarea plăcii de dezvoltare „PICDEMTM PIC18 Explorer”

PICDEM™ PIC18 Explorer Demonstration Board este o placă de dezvolatre pentru evaluarea dispozitivelor din familiile PIC18FXXXX și PIC18FXXJXX. Placa poate fi utilizată ca un dispozitiv stand-alone (independent) sau cu un in-circuit debugger (ICD). Pentru utilizarea acestei plăci sunt disponibile o serie de programe free ce pot fi folosite pentru dezvoltarea de aplicații și pentru depanare.

PICDEM™ PIC18 Explorer Demonstration Board conține următoarele echipamente hardware (prezentate în Figura 34):

1. PIC18F8722 microcontroller – microcontroller principal montat pe placă.

2. Pini pentru conectarea unui Modul de tip Plug-In (PIM). Un PIM permite folosirea unui alt microcontroller din familia PIC18 ca microcontroller principal.

3. Connector In-Circuit Debugger (ICD).

4. Connector cu șase pini pentru PICkit™ 2 și PICkit™ 3.

5. Potențiometru de 10 kΩ pentru intrări analogice.

6. Comutator Push button – pentru RESET extern.

7. Connector USB – pentru comunicație RS-232.

8. Microcontroller PIC18LF2450 – pentru conversia comunicației RS-232 în protocol USB pentru atașarea la un PC gazdă.

9. Cristal de 12 MHz – pentru microcontrollerul PIC18LF2450.

10. RS-232 DB9 socket și hardware asociat – pentru conectarea directă la interfața RS-232.

11. Jumper J13 pentru rutarea comunicației RS-232 fie prin portul USB fie prin portul RS-232.

12. Jumper J4 – pentru selectarea fie a dispozitivului PIC principal fie a PIC18LF2450, folosit pentru comunicația de la USB la RS-232.

13. Switch S4 – pentru selectarea microcontrollerului principal: fie a celui montat pe placă (PIC18F8722) fie a celui

montat pe PIM (PIC18F87J11).

14. LED – pentru indicarea power-on.

15. JP1 – pentru deconectarea celor 8 LED-uri

16. Opt LED-uri.

17. Cristal de 32.768 kHz – pentru operarea ceasului Timer1.

18. Două comutatoare de tip push button – pentru simularea unor intrări externe.

19. Senzor de temperatură analogic, MPC9701A.

20. 25LC256 SPI EEPROM.

21. JP2 – enable/disable EEPROM.

22. JP3 – enable/disable LCD.

23. Cristal de 10 MHz – pentru microcontroller-ul principal.

24. PICtail™ placă de conexiuni.

25. SPI I/O expander – pentru LCD display, MCP23S17.

26. Zonă Prototype – pentru utilizarea de dispozitive hardware.

27. LCD display.

28. J2 – pentru selectarea între valorile de tensiune de 3.3V și 5V.

29. J14 – Pentru utilizarea PIM, pentru conecatarea la 3.3V sau 5V, VIN și ICE MCLR.

Figură 34:Placa de dezvoltare PICDEM™ PIC18 Explorer

Placa PICDEM PIC18 Explorer Demonstration Board cuprinde două microcontrollere ce pot fi utilizate alternativ ca microcontroller principal:

• Un microcontroller PIC cu 18-pini ce lucrează la 5V (PIC18F8722) montat pe placă.

• Un microcontroller PIC cu 18-pini ce lucrează la 3.3V (PIC18F87J11) montat pe PIM.

Pentru a selecta microcontrollerul montat pe PIM ca dispozitiv principal trebuie setat comutatorulS4 la ICE.

2.2.1.Convertorul Analog-Digital

Pentru că semnalele de la periferice sunt substanțial diferite de cele pe care le poate înțelege microcontrolerul (zero și unu), ele trebuie convertite într-un mod care să fie înțeles de microcontroler. Această sarcină este îndeplinită de un bloc pentru conversia analog-digitală sau de un convertor AD. Acest bloc este responsabil pentru convertirea unei informații despre o anumită valoare analogică într-un număr binar și pentru a o urmări pe tot parcursul la un bloc CPU așa ca blocul CPU să o poată procesa.

Figură 35:Bloc pentru convertirea unui semnal analogic într-o dimensiune digitală

Figură 36:Secțiunea centrală a microcontroller-ului

Pentru o aplicație reală, un microcontroler singur nu este de ajuns. În afară de microcontroler, avem nevoie de un program pe care să-l execute, și alte câteva elemente ce constituie o interfață logică către elementele de stabilizare.

2.2.1.1.Modulul ANALOG TO DIGITAL CONVERTER (A/D)

Acest modul permite conversia unui semnal de intrare analogic într-un număr pe 10 biți. Modulul este controlat prin intermediul a 5 regiștrii:

• Registrul rezultat conversie A/D (ADRESH)

• Registrul rezultat conversie A/D (ADRESL)

• Registrul de control 0 (ADCON0)

• Registrul de control 1 (ADCON1)

• Registrul de control 2 (ADCON2)

Registrul ADCON0 controlează modul de operare al modulului.

Tabel 1:Registrul ADCON0

bit 7-6 Neimplementat: Citi ca ‘0’

bit 5-2 CHS<3:0> bitul de selecție al canalului analogic

0000 = Channel 0 (AN0)

0001 = Channel 1 (AN1)

0010 = Channel 2 (AN2)

0011 = Channel 3 (AN3)

0100 = Channel 4 (AN4)

0101 = Channel 5 (AN5)

0110 = Channel 6 (AN6)

0111 = Channel 7 (AN7)

1000 = Channel 8 (AN8)

1001 = Channel 9 (AN9)

1010 = Channel 10 (AN10)

1011 = Channel 11 (AN11)

1100 = Channel 12 (AN12))

1101 = Channel 13 (AN13)

1110 = Channel 14 (AN14)

1111 = Channel 15 (AN15)

bit 1 GO/DONE: bit de conversie A/D a stării

Când ADON = 1:

1 = conversia A/D în proces

0 = A/D în așteptare

bit 0 ADON: A/D On bit

1 = modulul de conversie A/D este activ

0 = modulul de conversie A/D este dezactivat

Registrul ADCON1 configurează pinii porturilor utilizate pentru conversia A/D.

Tabel 2:Registul ADCON1

bit 7-6 Neimplementat : Citit ca ‘0’

bit 5-4 VCFG<1:0>: bit de configurare a referinței voltajului

Tabel 3:Configurarea biților de voltaj

bit 3-0 PCFG<3:0>: bit de configurare pentru portul de control A/D:

Tabel 4:Configurarea biților pentru controlul A/D

A = Analog input D = Digital I/O

Tabel 5:Registrul ADCON2

bit 7 ADFM: bit pentru selectarea formatul rezultatului A/D

1 = Aliniere la dreapta

0 = Aliniere la stânga

bit 6 Neimplementat: Citit ca ‘0’

bit 5-3 ACQT<2:0>: biți de selecție a timpului de activare A/D

111 = 20 TAD

110 = 16 TAD

101 = 12 TAD

100 = 8 TAD

011 = 6 TAD

010 = 4 TAD

001 = 2 TAD

000 = 0 TAD(1)

bit 2-0 ADCS<2:0>: biți de selectare a ceasului de conversie A/D

111 = FRC (clock derived from A/D RC oscillator)(1)

110 = FOSC/64

101 = FOSC/16

100 = FOSC/4

011 = FRC (clock derived from A/D RC oscillator)(1)

010 = FOSC/32

001 = FOSC/8

000 = FOSC/2

Tensiunea de referință poate fi aleasă prin program și poate fi diferența de tensiune între sursă (VDD ) și masă (VSS ) sau diferența de tensiune între pinii RA3/AN3/VREF+ și RA2/AN2/VREF- pins.

Pentru realizarea unei conversii analog numerice trebuie urmați pașii următori:

1. Configurarea modului A/D:

– Se configurează pinii analogici și tensiunea de referință (folosnd registrul ADCON1);

– Se selectează canalul de intrare (ADCON0);

– Se selectează timpul necesar pentru achiziție (ADCON2)

– Se selectează ceasul ce controlează conversia (ADCON2)

– Se activează modulul A/D (ADCON0)

2. Configurarea întreruperii A/D (dacă se dorește):

– Se resetează bitul ADIF;

– Se setează bitul ADIE;

– Se setează bitul GIE;

3. Se așteaptă timpul necesar pentru achiziție;

4. Se startează conversia:

– Se setează bitul GO/DONE (din registrul ADCON0);

5. Se așteaptă terminarea conversiei:

– Se verifică dacă bitul GO/DONE a fost resetat sau

– Se așteaptă întreruperea A/D;

6. Se citește rezultatul conversiei din registrul ADRESH:ADRESL;

7. Pentru următoarea conversie se merge la pasul 1 sau la pasul 2. Se definește timpul T AD ca timpul de conversie pe bit. Pentru startarea următoarei achiziții trebuie așteptat minim 2TAD .

Principiul conversiei analog numerice este prezentat în figura următoare (pentru cazul unui convertor pe 3 biți).

Figură 37:Principiul conversiei analog numerice

În acest caz ave, 8 =23 nivelele de tensiune sunt reprezentate prin 8 valori (000, 001,…,111).

Pentru o tensiune de referință de 5V și o rezoluție de 10 biți a convertorului, calculul valorii care va fi memorată în regiștrii ADRESH:ADRESL se realizează cu regula de trei simplă. Pentru o tensiune de 3.65 Volți avem următorul număr:

Deci o tensiune de intrare de 3.65 V va fi reprezentată prin numărul zecimal 748 sau prin numărul binar 1011101100. În mod asemănător se poate determina orice nivel de tensiune. Numărul memorat în regiștrii ADRESH:ADRESL poate fi plasat de la dreapta la stânga (cei mai semnificativi 6 biți din ADRESH nu sunt luați în considerare) sau de la stânga la dreapta (cei mai puțin semnificativi 6 biți din ADRESL nu sunt luați în considerare).

2.2.2.Modulul COMPARE/CAPTURE/PWM (CCP)

Microcontrollerul PIC18F8722 are 5 module CCP – Capture/ Compare/ Pulse Width Modulation (Captură/ Comparare/ Modulare în durată de impulsuri). Toate cele cinci module pot fi configurate pentru modul Capture, Compare sau PWM simplu (cu ieșire pe un singur canal) în timp ce primele trei module (notate ECCP1, ECCP2, ECCP3) pot fi configurate pentru aplicații avansate ale modulului PWM, și anume 2 sau 4 canale de ieșire, polaritate selectabilă de către utilizator, zonă de insensibilitate controlabilă și oprire sau pornire automată.

Fiecare modul CCP este asociat cu un registru de control (notat generic CCPxCON, x=1:5) și un registru de date (CCPRx) compus din două registre pe 8 biți: CCPRxL și CCPRxH. Toți acești regiștrii pot fi citiți sau scriși.

Pentru lucrul cu modulele CCP se utilizează și modulele Timer. Astfel, modulele Timer1 și Timer3 sunt utilizate pentru lucrul în modurile Capture și Compare în timp ce pentru lucrul în modul PWM se utilizează modulele Timer2 și Timer4. Asocierea timerelor la modulele CCP se realizează prin intermediul celor doi biți T3CCP din registrul T3CON:

bit 6, 3 T3CCP<2:1>: Timer3 and Timer1 to CCPx Enable bits

11 = Timer3 and Timer4 are the clock sources for ECCP1, ECCP2, ECCP3, CCP4 and CCP5

10 = Timer3 and Timer4 are the clock sources for ECCP3, CCP4 and CCP5; Timer1 and Timer2 are the clock sources for ECCP1 and ECCP2

01 = Timer3 and Timer4 are the clock sources for ECCP2, ECCP3, CCP4 and CCP5; Timer1 and Timer2 are the clock sources for ECCP1

00 = Timer1 and Timer2 are the clock sources for ECCP1, ECCP2, ECCP3, CCP4 and CCP5

Tabel 6:Registrul CCPxCON

bit 7-6 PxM1:PxM0: Enhanced PWM Output Configuration bits

If CCPxM<3:2> = 00, 01, 10:

xx = PxA assigned as Capture/Compare input/output; PxB, PxC, PxD assigned as port pins

If CCPxM<3:2> = 11:

00 = Single output: PxA modulated; PxB, PxC, PxD assigned as port pins

01 = Full-bridge output forward: P1D modulated; P1A active; P1B, P1C inactive

10 = Half-bridge output: P1A, P1B modulated with dead-band control; P1C, P1D assigned as port pins

11 = Full-bridge output reverse: P1B modulated; P1C active; P1A, P1D inactive

bit 5-4 DCxB<1:0>: PWM Duty Cycle bit 1 and bit 0

Capture mode: Unused. Compare mode: Unused.

PWM mode:

These bits are the two LSbs of the 10-bit PWM duty cycle. The eight MSbs of the duty cycle are found in CCPRxL.

bit 3-0 CCPxM3:CCPxM0: Enhanced CCP Mode Select bits

0000 = Capture/Compare/PWM off (resets ECCPx module)

0001 = Reserved

0010 = Compare mode: toggle output on match

0011 = Capture mode

0100 = Capture mode: every falling edge

0101 = Capture mode: every rising edge

0110 = Capture mode: every 4th rising edge

0111 = Capture mode: every 16th rising edge

1000 = Compare mode: initialize ECCPx pin low; set output on compare match (set CCPxIF)

1001 = Compare mode: initialize ECCPx pin high; clear output on compare match (set CCPxIF)

1010 = Compare mode: generate software interrupt only; ECCPx pin reverts to I/O state

1011= Compare mode: trigger special event (ECCP resets TMR1 or TMR3, sets CCPxIF bit; ECCP2 trigger starts A/D conversion if A/D module is enabled)

1100 = PWM mode: PxA, PxC active-high; PxB, PxD active-high

1101 = PWM mode: PxA, PxC active-high; PxB, PxD active-low

1110 = PWM mode: PxA, PxC active-low; PxB, PxD active-high

1111 = PWM mode: PxA, PxC active-low; PxB, PxD active-low

Modul Capture

În modul Capture, în pereche de regiștrii CCPRxH : CCPRxL este memorată valoarea registrului TMR1 sau a registrului TMR3 (în funcție de Timerul utilizat) la apariția unui eveniment pe pinul CCPx corespunzător. Un eveniment este definit ca unul din următoarele:

– fiecare front descrescător;

– fiecare front crescător;

– fiecare al 4-lea front crescător;

– fiecare al 16-lea front crescător.

Alegerea evenimentului se realizează cu ajutorul biților CCPxM din registrul CCPxCON. Pinul CCPx trebuie configurat ca intrare prin setarea corespunzătoare a registrul TRIS.

Modul Compare

În modul Compare, valoarea registrului pe 16 biți CCPRX este comparată cu valoarea registrului TMR1 sau a registrului TMR3 (în funcție de Timer-ul utilizat). Atunci când cele două valori sunt egale, pinul CCPx poate fi trecut în starea high, în starea low, mutat din high în low sau din low în high sau poate fi lăsat nemodificat. Acțiunea este realizată în funcție de starea biților CCPxM din registrul CCPxCON. În același timp este setat bitul flag CCPxIF. Utilizatorul trebuie să configureze pinul CCPx ca ieșire prin resetarea corespunzătoare în registrul TRIS.

Modul PWM

În modul PWM, pe pinul CCPx este generată o ieșire PWM cu o rezoluție de 10 biți. O ieșire de tip PWM are o bază de timp (perioadă) și un interval de timp în care ieșirea stă la valoarea high (factorul de umplere sau ”duty cycle” în limba engleză). Evident, frecvența PWM-ului este inversul perioadei.

Figură 38:Modulul PWM

Perioada PWM-ului este specificată prin scrierea registrului PR2 (sau PR4) al modulului Timer2 (respectiv Timer4). Această perioadă poate fi calculată folosind următoarea formulă:

unde:

– perioada PWM;

– perioada de oscilație a tactului de ceas;

– valoarea de prescalare.

Atunci când TMR2 este egal cu PR2, au loc următoarele acțiuni:

– TMR2 este resetat;

– Pinul CCPx este setat (cu excepția cazului în care ”duty cycle” este 0);

– Valoarea registrului CCPRxL este transferată în registrul CCPRxH.

Factorul de umplere (duty cycle) este setat prin scrierea registrului CCPR1L și a biților 5 și 4 din registrul CCPxCON. Factorul de umplere se calculează cu relația:

2.2.3.Utilizarea întreruperilor

Microcontrollere-le din familia PIC18F8722 pot trata numeroase surse de întreruperi și pot stabili o ordine de priorități a acestora. Vectrul de întreruperi cu prioritatea cea mai mare se află la adresa 0008h iar vectorul prioritatea cea mai mică se află la adresa 0018h. O întrerupere de nivel înalt va opri execuția oricărei întreruperi nivel mai mic. Microcontroller-ul are 13 regiștrii ce controlează operațiile cu întreruperi. Acești regiștrii sunt următorii:

RCON

INTCON

INTCON2

INTCON3

PIR1, PIR2, PIR3

PIE1, PIE2, PIE3

IPR1, IPR2, IPR3

Tabel 7:Structura regiștrilor

În acest tabel o parte din biții de culoare albastră reprezintă biți ce nu influențează lucru cu întreruperi. Spre exemplu bitul RBPU permite activarea rezistențelor pull-up pe portul B.

În general, sursele de întrerupere sunt controlate prin intermediul a trei tipuri de biți:

– Flag bit car e semnalează apariția unui eveniment ce trebuie tratat prin intermediul unei întreruperi (conțin particula IF în denumire);

– Enable bit ce permite tratarea unei întreruperi prin saltul programului la adresa unde este vectorul de întreruperi corespunzător (conțin particula IE în denumire);

– Priority bit (bitul de prioritate) ce stabilește nivelul întreruperii (conțin particula IP în denumire).

Stabilirea unor nivele de întreruperi diferite pentru diverse întreruperi se realizează prin setarea bitului IPE =1 Dacă nivelele de întreruperi sunt activate, există doi biți ce activează întreruperile: prin setarea bitului(RCON<7>). GIEH (INTCON<7>) se activează toate întreruperile ce au setat bitul de prioritate (prioritate mare) iar prin setarea bitului GIEL (INTCON<6 >) se activează toate întreruperile ce au bitul de prioritate la valoare’0’ (prioritate mică). Întreruperile individuale pot fi dezactivate prin biții IE corespunzători. La punerea sub tensiune a microcontroller-ului bitul IPEN din registrul RCON are valoarea ’0’ ceea ce însemn că toate întreruperile au aceeași prioritate.

Tabel 8:Registrul RCON: Reset Control Register

Pentru activarea întreruperilor trebuie setat bitul GIE (General Interrut Enable) din registrul INTCON. De asemenea trebuie validată o întrerupere (altfel această operație nu are sens).

Microcontrollere-le din familia PIC18F8722 pot primi întreruperi externe pe pinii RB0/INT0, RB1/INT1, R2/INT2 și RB3/INT3. Aceste între ruperi sunt generate pe front crescător sau descrescător în funcție de bitul corespunzător INTEDGx din registrul INTCON2. Dacă acest bit este setat la valoarea ’1’, întreruperea se declanșează pe front crescător, altfel se declanșează pe front descrescător al semnalului pe pin l respectiv. La apariția unei modificări a frontului semnalului pe pinul respectiv, bitul flag corespunzător INTxIF (din registrul INTCON sau INTCON3) este setat. Acest bit trebuie resetat de rutina de tratare a în treruperii pentru a reactiva întreruperea corespunzătoare.

Cei trei regiștri ce controlează aceste întreruperi externe sunt următorii:

Tabel 9:Registrul INTCON:INTERRUPT CONTROL REGISTER

bit 7 GIE/GIEH: Global Interrupt Enable bit

When IPEN = 0:

1 = Enables all unmasked interrupts

0=Disables all interrupts

When IPEN = 1:

1= Enables all high- priority interrupts

0= Disables all interrupts

bit 6 PEIE/GIEL Peripheral Interrupt Enable bit

When IPEN = 0:

1= Enables all unmasked peripheral interrupts

0= Disables all peripheral interrupts

When IPEN = 1:

1= Enables all low-priority peripheral interrupts

0= Disables all low-priority peripheral interrupts

bit 5 TMR0IE: TMR0 Overflow Interrupt Enable bit

1= Enables the TMR0 overflow interrupt

0= Disables the TMR0 overflow interrupt

bit 4 INT0IE: INT0 External Interrupt Enable bit

1= Enables the INT0 external interrupt

0= Disables the INT0 external interrupt

bit 3 RBIE: RBP ort Change Interrupt Enable bit

1= Enables the RB port change interrupt

0= Disables the RB port change interrupt

bit 2 TMR0IF: TMR0 Overflow Interrupt Flag bit

1= TMR0 register has overflowed (must be cleared in software)

0= TMR0 register did not overflow

bit 1 INT0IF: INT0 External Interrupt Flag bit

1= The INT0 external interrupt occurred (must be cleared in software)

0= The INT0 external interrupt did not occur

bit 0 RBIF: RBP ort Change Interrupt Flag bit(1)

1= At least one of the RB7:RB4 pins changed state (must be cleared in software)

0= None of the RB7:RB4 pins have changed state

Setarea nivelului de întrerupere pentru un anumit eveniment se realizează prin setarea corespunzătoare a biților de tip IP (interrupt priority): valoarea ’1 ’= întrerupere mare (high), valoarea ’0’= întrerupere mică (low). Spre exemplu pentru a seta un eveniment de la modulul Timer 0 pe nivel high se setează bitul TMR0IP = 1, iar pentu a seta un eveniment de la același modul la nivel low se setează bitul TMR0IP = 0.

bit 2 TMR0IP: TMR0 OverflowInterrupt Priority bit

1 = High priority

Tabel 10:Registrul INTCON2:INTERRUPT CONTROL REGISTER 2

bit 7 RBPU: PORTB Pull-up Enable bit

1 = All PORTB pull-ups are disabled

0 = PORTB pull-ups are enabled by individual port latch values

bit 6 INTEDG0: External Interrupt 0 Edge Select bit

1 = Interrupt on rising edge

0 = Interrupt on falling edge

bit 5 INTEDG1: External Interrupt 1 Edge Select bit

1 = Interrupt on rising edge

0 = Interrupt on falling edge

bit 4 INTEDG2: External Interrupt 2 Edge Select bit

1 = Interrupt on rising edge

0 = Interrupt on falling edge

bit 3 INTEDG3: External Interrupt 3 Edge Select bit

1 = Interrupt on rising edge

0 = Interrupt on falling edge

bit 2 TMR0IP: TMR0 Overflow Interrupt Priority bit

1 = High priority

0 = Low priority

bit 1 INT3IP: INT3 External Interrupt Priority bit

1 = High priority

0 = Low priority

bit 0 RBIP: RB Port Change Interrupt Priority bit

1 = High priority

0 = Low priority

Tabel 11:Registrul INTCON3:INTERRUPT CONTROL REGISTER 3

bit 7 INT2IP: INT2 External Interrupt Priority bit

1 = High priority

0 = Low priority

bit 6 INT1IP: INT1 External Interrupt Priority bit

1 = High priority

0 = Low priority

bit 5 INT3IE: INT3 External Interrupt Enable bit

1= Enables the INT3 external interrupt

0= Disables the INT3 external interrupt

bit 4 INT2IE: INT2 External Interrupt Enable bit

1= Enables the INT2 external interrupt

0= Disables the INT2 external interrupt

bit 3 INT1IE: INT1 External Interrupt Enable bit

1= Enables the INT1 external interrupt

0= Disables the INT1 external interrupt

bit 2 INT3IF: INT3 External Interrupt Flag bit

1= The INT3 external interrupt occurred (must be cleared in software)

0= The INT3 external interrupt did not occur

bit 1 INT2IF: INT2 External Interrupt Flag bit

1= The INT2 external interrupt occurred (must be cleared in software)

0= The INT2 external interrupt did not occur

bit 0 INT1IF: INT1 External Interrupt Flag bit

1= The INT1 external interrupt occurred (must be cleared in software)

0= The INT1 external interrupt did not occur

Observație: Biții de tip flag din aceste registre sunt setați ori de câte ori apare o întrerupere corespunzătoare indiferent de starea bitului de activare (INTxIE ) corespunzător sau de starea bitului general de control a întreruperilor (GIE). Programatorul trebuie să pună acești biți (INTxIF) la valoarea ’0’ înainte de activarea întreruperilor.

2.2.4.Unitatea timer

Acum că avem comunicația serială, putem recepționa, trimite și procesa date. Totuși, pentru noi ca să putem să îl folosim în industrie mai avem nevoie de câteva blocuri. Unul din acestea este blocul timer care este important pentru noi pentru că ne dă informația de timp, durată, protocol etc. Unitatea de bază a timer-ului este un contor liber (free-run) care este de fapt un registru a cărui valoare numerică crește cu unu la intervale egale, așa încât luându-i valoarea după intervalele T1 și T2 și pe baza diferenței lor să putem determina cât timp a trecut. Acesta este o parte foarte importantă a microcontrolerului al cărui control cere cea mai mare parte a timpului nostru.

Figură 39:Unitatea timer

2.2.4.1.Modulul Timer0

Modulul Timer0 are următoarele caracteristici:

– Operarea ca temporizator (timer) sau numărător (counter) pe 8 sau 16 biți;

– Sursa de ceas selectabilă (externă sau internă);

– Prescalor programabil pe 8 biți;

– Selectarea frontului pentru ceasul extern;

– Generarea de întrerupere la overflow.

Registrul T0CON controlează toate aspectele privind funcționarea modulului, inclusiv funcția de prescalare. Acest registru este disponibil atât pentru citire cât și pentru scriere.

Tabel 12:Registrul T0CON: TIMER0 CONTROL REGISTER

bit 7 TMR0ON: Timer0 On/Off Control bit

1 = Enables Timer0

0 = Stops Timer0

bit 6 T08BIT: Timer0 8-Bit/16-Bit Control bit

1 = Timer0 is configured as an 8-bit timer/counter

0 = Timer0 is configured as a 16-bit timer/counter

bit 5 T0CS: Timer0 Clock Source Select bit

1 = Transition on T0CKI pin

0 = Internal instruction cycle clock (CLKO)

bit 4 T0SE: Timer0 Source Edge Select bit

1 = Increment on high-to-low transition on T0CKI pin

0 = Increment on low-to-high transition on T0CKI pin

bit 3 PSA: Timer0 Prescaler Assignment bit

1 = Timer0 prescaler is not assigned. Timer0 clock input bypasses prescaler.

0 = Timer0 prescaler is assigned. Timer0 clock input comes from prescaler output.

bit 2-0 T0PS2:T0PS0: Timer0 Prescaler Select bits

111 = 1:256 Prescale value

110 = 1:128 Prescale value

101 = 1:64 Prescale value

100 = 1:32 Prescale value

011 = 1:16 Prescale value

010 = 1:8 Prescale value

001 = 1:4 Prescale value

000 = 1:2 Prescale value

Timer0 poate opera atât ca temporizator (timer) cât și ca numărător (counter). Alegerea între cele două moduri se face prin setarea bitului T0CS (T0CON<5>) astfel: mod Timer dacă T0CS=0 și mod Counter dacă T0CS=1.

În modul Timer implicit modulul se incrementează la fiecare ciclu de instrucțiune (bitul PSA=1). Dacă bitul PSA=0 modulul se incrementează la valori multiplu valoarea de prescalare. Valoarea de prescalare este o putere a lui 2: 2, 4, 8, …, 256 (setate de biții T0PS2:T0PS0).

Modul Counter se poate selecta prin setarea bitului T0CS=1. În acest mod, Timer0 este incrementat fie pe front crescător fie pe front descrescător al semnalului de pe pinul RA4/T0CKI. Setarea tipului de front pe care se face incrementarea se realizează prin intermediul bitului T0SE din registrul T0CON, astfel: T0SE=0 incrementarea se face pe frontul crescător al semnalului iar T0SE=1

incrementarea se face pe frontul descrescător al semnalului.

O întrerupere TMR0 este generată când registrul TMR0 la overflow: trecerea de la FFh la 00h dacă se lucrează în modul de 8 biți sau trecerea de la FFFFh la 0000h dacă se lucrează în modul de 16 biți.

Această întrerupere setează bitul TMR0IF. Înainte de a reactiva această întrerupere, bitul TMR0IF trebuie pus la ’0’.

2.2.5. Porturile de I/O

Pinii sunt multiplexați astfel încât este posibil ca un pin să aibă mai multe funcții. Doar o singură funcție poate fi activă la un moment dat.

Pentru fiecare pin sunt specificate:

1. Pin Name, Function – funcțiile posibile ale pinului;

2.TRIS Setting – setarea necesară a bitului din registrul TRISx pentru a obtine acea funcționalitate;

3. I/O – direcția pinului;

4. I/O Type – tipul semnalului sau tipul bufferu-lui de intrare;

5. Description – o scurtă descriere a funcționalității; este posibil să se specifice și funcționalitatea activă la aprinderea plăcii sau după un reset.

Tipurile de semnale și de buffer de intrare posibile sunt urmatoarele:

– DIG – Semnal digital

– ANA – Semnal analogic

– ST – Buffer de intrare Schmitt

– TTL – Buffer de intrare TTL

Porturile de I/O sunt mapate la magistrala de memorie, astfel accesarea portului se poate face prin scrierea sau citirea la adresa corespunzătoare.

Fiecare port are câte 3 registrii de control (R/W):

– TRISx – registru pentru setarea direcției

– PORTx – folosit pentru setarea valorii de iesire sau pentru citirea valorii de intrare

– LATx – registru folosit pentru setarea valorii de iesire

Registrul LATx este important în operațiile de citire-modificare-scriere asupra valorii pinului. În cazul operațiilor de citire-modificare-scriere (orice instrucțiune care presupune modificarea unor biți dintr-un byte) registrul LATx este citit și apoi scris.

Din cauza utilizării registrului LATx în acest tip de instrucțiuni este recomandat ca setarea nivelului pinului să se faca prin registrul LATx, iar citirea nivelului pinului prin registrul PORTx.

Prin scrierea în registrul LATx și registrul PORTx va avea aceeași valoare, în timp ce la citire valorile posibile conținute de cei doi registrii poate să difere. Prin citirea registrului PORTx se citește de fapt nivelul curent al pinului, in timp ce citind registrul LATx se citeste de fapt ultima valoare scrisa pe pin.

Setarea direcției pinului se face prin registrul TRISx cu valoarea 1 (intrare) sau 0 (iesire).

Citirea valorii de intrare sau ieșire se poate face prin registrul PORT.

Toți cei trei registrii pot fi citiți:

– La citirea registrului LAT sau TRIS bufferul tri-state este activat, iar datele de ieșire al blocurilor de memorie vor fi trimise pe magistrala de date;

– La citirea registrului PORT bufferul tri-state este activat și pe magistrala de date va fi trimisă valoarea ținută de blocul de memorie.

Din punct de vedere al tensiunii de intrare acceptată, pinii care au mapată o funcție de canal de conversie A/D vor accepta o tensiune de intrare maximă Vdd (tensiunea de alimentare), în timp ce pinii care nu au această funcție pot să accepte o tensiune maximă de 5.5V.

Tabel 13:Limitări ale tensiunii de intrare

2.2.6. LCD-ul (Liquid Crystal Display)

LCD-ul este un dispozitiv de afișare cu cristale lichide folosit pentru a reda litere, cifre, grafică și imagini. Acesta conține o matrice de celule lichide care devin opace sau își schimbă culoarea în funcție de impulsurile electrice aplicate.

LCD-ul existent pe placă de dezvoltare PIC18 Explorer Demonstration Board este un model cu 2 linii a câte 16 caractere.

Figură 40:LCD-ul existent pe placă de dezvoltare PIC18 Explorer Demonstration Board

Tipul de comunicare folosită de către LCD este cea paralelă, care față de comunicarea serială, transferul de biți se face în pachete de câte n biți/ciclu.

Dacă este să analizăm din punct de vedere al vitezei o interfață serială față de una paralelă, ambele operând cu aceeași viteză, în acest caz interfața paralelă ar fi de n ori mai rapidă decât cea serială.

Afișajul grafic are un set de instrucțiuni specifice care sunt selectate prin setarea pinului RS în funcție de tipul de instrucțiune dorită:

Tabel 14:Setarea pinului RS

În cazul primelor 7 instrucțiuni pinul RS va trebui să aibă valoarea 0, iar pe liniile de date se vor comunica setările LCD-ului dorite, cum ar fi în ce direcție să se mute cursorul, dacă se dorește cursorul să fie vizibil, numărul de linii de afișare, dimensiunea afisajului, setarea cursorului la o anumită adresă, etc.

Dacă se dorește să se trimită date, cum este specificat de către ultima instrucțiune, atunci pinul RS va trebui să abia valoarea 1.

Este important să se aibă în vedere timpul de așteptare specificat pentru a fi executată instrucțiunea dorită.

Transmiterea datelor între microcontroller și LCD se realizează folosind un dispozitiv (MCP23S17) care va utiliza comunicația SPI pentru a prelua datele de la microcontroller și pentru transmiterea datelor primite către LCD va utiliza comunicarea paralelă.

Figură 41:Conexiunea PIC18F8722 – LCD

Tabel 15:Maparea pinilor între dispozitive

2.3.Programarea microcontroller-ului utilizând mediul de programare MPLAB

2.3.1.Programul

Scrierea programului este un domeniu special de lucru al microcontolerului și este denumit "programare". Să încercăm să scriem un mic program ce îl vom crea singuri și pe care oricine va fi în stare să-l înțeleagă.

START

REGISTER1=MEMORY

LOCATION_A REGISTER2=MEMORY

LOCATION_B PORTA=REGISTER1 + REGISTER2

END

Programul adună conținutul a două locații de memorie, și vede suma lor la portul A. Prima linie a programului este pentru mutarea conținutul locației de memorie "A" într-unul din regiștri unității de procesare centrale. Pentru că avem nevoie și de celelalte date de asemenea, le vom muta de asemenea în celălalt registru al unității de procesare centrale. Următoarea instrucțiune instruiește unitatea de procesare centrală să adune conținutul celor doi regiștri să trimită rezultatul obținut la portul A, încât suma acestei adunări să fie vizibilă pentru toată lumea de afară. Pentru o problemă mai complexă, programul care să lucreze la rezolvarea ei va fi mai mare. Programarea poate fi făcută în câteva limbaje ca Assembler, C și Basic care sunt cele mai folosite limbaje. Assembler aparține limbajelor de nivel scăzut ce sunt programate lent, dar folosesc cel mai mic spațiu în memorie și dă cele mai bune rezultate când se are în vedere viteza de execuție a programului. Pentru că este cel mai folosit limbaj în programarea microcontrolerelor va fi discutat într-un capitol ulterior. Programele în limbajul C sunt mai ușor de scris, mai ușor de înțeles, dar sunt mai lente în executare decât programele în Assembler. Basic este cel mai ușor de învățat, și instrucțiunile sale sunt cele mai aproape de modul de gândire a omului, dar ca și limbajul de programare C este de asemenea mai lent decât Assembler-ul. În orice caz, înainte de a vă hotărî în privința unuia din aceste limbaje trebuie să studiați cu atenție cerințele privind viteza de execuție, mărimea memoriei și timpul disponibil pentru asamblarea sa.

După ce este scris programul, trebuie să instalăm microcontrolerul într-un aparat și să-l lăsăm să lucreze. Pentru a face aceasta trebuie să adăugăm câteva componente externe necesare pentru funcționarea sa. Mai întâi trebuie să dăm viață microcontrolerului prin conectarea sa la o sursă (tensiune necesară pentru operarea tuturor instrumentelor electronice) și oscilatorului al cărui rol este similar inimii din corpul uman. Bazat pe ceasul său microcontrolerul execută instrucțiunile programului. Îndată ce este alimentat microcontrolerul va executa un scurt control asupra sa, se va uita la începutul programului și va începe să-l execute. Cum va lucra aparatul depinde de mulți parametri, cel mai important fiind priceperea dezvoltatorului de hardware, și de experiența programatorului în obținerea maximului din aparat cu programul său.

2.3.2.Dispozitivul programator/debugger„PICkitTM 3”

Programatorul PICkit 3 este un dispozitiv simplu controlat de calculator pe care rulează programul MPLAB IDE (versiuni mai mari de 8.20). Acesta este un dispozitiv folosit pentru dezvoltarea de aplicații pentru Microcontrollere PIC și dsPIC bazate pe In-Circuit Serial Programming™ (ICSP™) și Enhanced In-Circuit Serial Programming cu interfețe pe 2 fire. Acest dispozitiv poate fi utilizat ca depanator sau ca programator de microcontrollere PIC. Depanatorul execută codul program ca un dispozitiv real deoarece are implementat un circuit emulator. Toate caracteristicile unui dispozitiv sunt accesibile în mod interactiv și pot fi setate sau modificate de o interfață MPLAB IDE.

Caracteristicile PICkit 3 sunt următoarele:

• Suport USB la viteză maximă folosind driverele Windows standard

• Execuție în timp real

• Procesoare ce rulează la viteză maximă

• Monitor Built-in pentru supra-tensiune/scurt circuit

• Tensiune joasă până la (domeniul 1.8-5 V)

• LED-uri de semnalizare (power, active, status)

• Citire/scriere program și date în memoria microcontroller-ului

• Ștergere orice tip de memorie (EEPROM, ID, configurare și program) cu verificare

Figură 42:Programatorul/debugger-ul PICkit 3

2.3.3.Mediul de programare MPLAB IDE

MPLAB este un pachet de programe Windows ce face scrierea și dezvoltarea unui program mai ușoară. Poate fi descris cel mai bine ca un mediu de dezvoltare pentru un limbaj de programare standard ce este folosit pentru programarea unui computer PC. Unele operații ce erau făcute din linia de instrucțiuni cu un număr mare de parametri până la descoperirea IDE-ului, "Integrated Development Environment", sunt acum făcute mai ușoare prin folosirea MPLAB.

Figură 43:Interfața grafică a programului MPLAB IDE

MPLAB constă din câteva părți: – Gruparea fișierelor aceluiași proiect într-un singur proiect (Project Manager) – Generarea și procesarea unui program (Text Editor) – Simulator de program scris folosit pentru simularea funcționării programului în microcontroler. În afară de acestea, sunt sisteme de susținere pentru produsele Microchip ca PICStart Plus și ICD (In Circuit Debugger).

Un sistem de dezvoltare pentru controllere embedded este un sistem de programe ce rulează pe un calculator ce ajută la scrierea, editarea, depanarea și programarea codului într-un microcontroller. MPLAB IDE rulează pe un PC și conține toate componentele necesare pentru proiectarea aplicațiilor embedded. Task-urile specifice pentru dezvoltarea unei aplicații embedded sunt următoarele:

1. Din caracteristicile și performanțele ce se doresc a se obține se decide tipul de microcontroller și dispozitivele periferice ce vor fi utilizate.

2. Următoarea etapă este scrierea programului ce va controla dispozitivele hardware. Pentru aceasta se poate utiliza un limbaj de asamblare, care este direct translatabil în cod mașină, sau un compilator ce permite utilizarea unui limbaj mai natural pentru crearea programului.

3. Se compilează, asamblează și se fac legăturile software folosind un asamblor și/sau un compilator și un editor de legături pentru convertirea codului în cod mașină (format din 1 și 0) pentru microcontroller.

4. Se testează codul. De obicei un program complex nu va lucra de prima dată cum ne dorim noi, iar erorile de programare (așa numitele „bug-uri”) trebuie eliminate. Depanatoruln(debugger-ul) permite analiza funcționării programului. Depanatorul permite vizualizarea anumitor variabile din program în anumite puncte ale rulării acestuia.

5. Se scrie programul în memoria microcontroller-ului și se verifică dacă aplicația funcționează corect.

MPLAB IDE poate fi utilizat în pașii 2 -5. Editorul MPLAB poate ajuta la scrierea corectă a codului. Editorul folosește fonturi colorate pentru a sublinia cuvintele cheie. Managerul de Proiecte ajută la organizarea diverselor fișiere utilizate de o aplicație: fișiere sursă, biblioteci și header. Erorile de programare sunt semnalate prin mesaje de eroare și locul în care apare eroare poate fi găsit prin dublu click. După ce codul sursă nu mai are erori, acesta trebuie testat. MPLAB are componenete numite „debugger” și simulatoare free ce ajută la testarea codului. Simulatorul acceptă intrări de stimul pentru a vedea cum răspunde programul la intrări externe. Simulatorul poate măsura timpul de execuție, execuția pas cu pas a codului pentru a analiza variabilele și perifericele. După ce aplicația funcționează corect, poate fi programat microcontroller-ul cu ajutorul unui programator cum ar fi PICSTART® Plus, MPLAB PM3 sau PICkit 3.

Organizarea fișierelor într-un proiect este prezentată în figura următoare:

Figură 44:Fișierele unui proiect embedded

Linker-ul are sarcina de a plasa fragmentele de cod de la asamblor, compilator și bibliotecile de funcții in zonele de memorie corespunzătoare ale micreocontrollerului și că modulele separate funcționează unele cu altele (sau sunt „linked”). Această întreagă operație de la asamblare sau compilare prin procesul de link-editare se numește „build”. Compilatorul convertește codul sursă în cod mașină (instrucțiuni ce pot fi executate de către micocontroller).

Figură 45:Compilatorul

Instrumentele de programare a sistemelor embedded diferă de compilatoarele ce rulează pe un PC deoarece acestea trebuie să țină seama de dimensiunea redusă de memorie pe care o are la dispoziție un microcontroller. Cu cât codul produs este mai mic cu atât mai bine. Aceasta înseamnă că trebuie utilizate tehnici de optimizare a codului ce țin cont de specificul hardware-ului. În cazul unui PC un program mediu are dimensiunea de câțiva Megabytes. Un program embedded simplu are câteva mii de bytes sau chiar mai puțin. Un program mediu poate avea nevoie de 32K sa 64K pentru funcții relativ complexe.

3.Modelarea matematică a motorului de cc Quanser SRV02

3.1.Prezentarea motorului

Servomotorul Quanser SRV02, prezentat în Figura 46, constă într-un motor de curent continuu, ce este încapsulat într-un cadru solid de aluminiu și este echipat cu o cutie de viteze orbitală. Motorul are propriul său angrenaj intern care conduce angrenajul extern. Varianta de bază SRV02 vine cu un senzor potențiometric ce poate fi utilizat pentru a măsura poziția unghiulară a angrenajului. Aparatul SRV02 poate fi de asemenea echipat cu un encoder ce poate masura digital poziția și un tahometru pentru a măsura viteza de rotație a angrenajului.

3.1.1.Opțiunile SRV02

După cum se prezintă în Tabelul 16, există șase optiuni disponibile pentru SRV02. În oricare dintre opțiuni, SRV02 include mereu motorul și angrenajul, dispozitivul de comanda și un potențiometru. Celelalte opțiuni caracteristice pentru SRV02, senzori adiționali, cum ar fi tahometrul pentru sistemul SRV02-T sau encoderul pentru modelul SRV02-E. Diferitele opțiuni permit utilizatorilor să lucreze atât cu măsurători digitale cât și analogice la fel de bine ca și cu măsurarea vitezei unghiulare utilizând un tahometru.

Tabel 16:Sistemul SRV02

3.1.2.Componentele platformei experimentale Quanser SRV02

Componentele platformei experimentale Quanser SRV02 sunt prezentate în Tabelul 17, mai jos prezentat, și indicate în Figurile 47, 48, 49, 50 și 51. De menționat ca Figura 49 prezinta platforma SRV02 în configurație “low-gear” iar în Figura 50 este prezentată configurația “high-gear”.

Tabel 17:Componentele platformei Quanser SRV02

3.1.2.1.Descrierea componentelor

Motorul de curent continuu (componenta #9)

SRV02 încorporează un motor de curent continuu Faulhaber Coreless, model 2338S006 prezentat în Figura 48 cu ID#9. Acesta este de înaltă eficiență, motor cu o inductanță scăzută și o inductanță mică la rotor. Prin urmare, se poate obține un răspuns mult mai rapid decât un motor de curent continuu convențional.

Atentie: Semnalele de inalta frecvență aplicate motorului, vor deteliora in cele din urmă cutia de viteze. Cea mai probabilă sursă pentru zgomotul de înaltă frecvență este feedback-ul derivativ. În cazul în care câștigul derivativ este prea mare, o tensiune de zgomot va fi indusă în motor. Pentru a proteja motorul, ar trebui să limităm întotdeauna semnalul la o valoare de 50 Hz.

Atenție: Intrare: ± 15V, 3A la vârf, 1A continuu.

Atenție: Componente în mișcare expuse.

Tahometrul (Componenta #13)

Modulele SRV02-T și SRV02-ET vin echipate cu un tahometru ce este direct atșat motorului de curent continuu și este identificat cu numărul #13 în Figura 48. Acesta previne orice latență în timpul de raspuns și asigura acuratețea măsurătorii vitezei motorului.

În Figura 48 este prezentată diagrama de cablare a motorului și a tahometrului. Conectorul motorului cu 4 pini DIN, componenta #19, conectează stația de amplificare la bornele pozitive si negative ale motorului. Acesta este semnalul de intrare care conduce motorul. Cei 6 pini DIN ai conectorului tahometrului, componenta #18, sunt conectați direct la terminalele pozitive și negative ale tahometrului. Acesta furnizează o tensiune care este proporțională cu viteza de rotație a motorului. Conectorul tahometrului este conectat la conectorul analogic de intrare S3 al stației Universal Power Module.

Encoderul (Componenta #12)

Opțiunile SRV02-E și SRV02-EHR au un encoder instalat care măsoară poziția unghiulară a arborelui de sarcină. Acesta este prezentat cu numărul #12 în Figura 47. În sistemul SRV02-E, encoderul este folosit este US Digital S1 care oferă o înaltă rezolutie de 4096 de numărări pe rotatie în modul de quadratură (1024 linii pe rotație). Varianta SRV02-EHR are o rezoluție de 8192 de numărări pe rotație in modul de quadratură (2042 linii pe rotație). De remarcat faptul ca encoderul incremental masoară unghiul relativ al arborelui, spre deosebire de potențiometru care măsoară unghiul absolut.

Tabel 18:Specificațiile sistemului SRV02

3.1.3.Configurația angrenajului

Sistemul SRV02 poate fi organizat în două configurații: configurația low-gear și configurația high-gear, după cum este prezentat in Figura 54 respectiv în Figura 55. Configurația low-gear este recomandată atunci când se realizează modelarea sistemului, sau experimente de control al poziției și al vitezei cu sau fără încărcătură. Configurația high-gear este recomandat să se folosească împreună cu module adiționale cum ar fi sistemul ball-and-beam, modulul pentru legătura flexibilă sau giroscopul.

3.2.Modelarea matematică a motorului de curent continuu

În continuare vom lucra pe configurația high-gear. Pentru deducerea modelului matematic, vom reprezenta schematic ecuațiile de funcționare ale motorului.

Există două tipuri de ecuații care se vor combina în determinarea modelului: ecuațiile electrice și cele mecanice. Ele au o structură asemanatoare.

Astfel, pentru partea electrică putem scrie:

În ecuația de mai sus, u(t) este tensiunea ( este tensiunea de intrare, iar este cea de la ieșire), i(t) este curentul iar R si L reprezintă rezistența, respectiv inductanța.

Pentru partea mecanică putem scrie o ecuație asemănătoare:

ecuație în care τ(t) reprezintă cuplul (de intrare sau de ieșire), ω(t) este viteza unghiulară, B este un coeficient de frecare vâscoasă iar J este momentul de inerție rotativ.

Dacă ne situăm în cazul configurației high-gear, atunci este viteza unghiulară a motorului cuplat la roata dințată mică () care transmite mișcarea la roata dințată mare (). Aceasta se va învârti cy viteza unghiulară .

Ecuațiile se vor scrie ținând cont de cele de mai sus precum și de alte relașii care fac legătura dintre mărimile electrice (curenți) și cele mecanice (cupluri de rotație).

(3.1)

Pentru un motor de curent continuu cu excitașie separată cu câmp electric constant sau un motor de curent continuu cu magnet permanent, armătura produce un cuplu care este proporțional cu curentul prin circuit, . Randamentul cutiei de viteze ca și randamentul motorului datorate pierderilor de rotație ar putea afecta cuplul de rotație. Randamentul cutiei de viteze nu este constant, fiind luată în considerare o valoare medie .

, unde .

În domeniul Laplace avem: unde (3.2)

Tensiunea contra-electromotoare a motorului este proporțională cu viteza unghiulară și intensitatea câmpului electric de excitație. Cu um câmp electric constant (excitație separată sau magnet permanent) tensiunea contra-electromotoare a motorului este data prin

sau în domeniul Laplace: . (3.3)

Datorita analogiei între ecuațiile electrice și cele mecanice, partea mecanică se poate modela precum una electrică, unde tensiunea este înlocuită de cuplul τ(t), rezistența de coeficientul de frecare vâscoasă B, inductanța de cuplul de rotație J, iar curentul de viteza de rotație ω(t). Figura 55 arată circuitul mecanic analog circuitului electric în domeniul Laplace.

Se pot scrie urmatoarele ecuații:

(3.4)

(3.5)

(3.6)

(3.7)

Funcția de transfer în circuit direct de la la este:

Funcțiile de transfer ale celor două bucle distincte, dar ne-disjuncte sunt:

Funcția de transfer în circuit închis va fi:

Deoarece , obținem:

Astfel, neglijând inductanța armaturii obținem funcția de transfer in circuit închis:

unde și .

Unghiul de ieșire in domeniul Laplace este: .

Funcția de transfer a servoinstalației având ieșirea este:

sau

3.3.Identificarea parametrilor motorului

În acest capitol se va prezenta algoritmul de determinare a parametrilor funcțiilor de transfer sau a coeficienților ecuațiilor diferențiale, a unor obiecte fizice în următoarele condiții:

Sunt obiecte cu o intrare și o ieșire

Sunt obiecte descrise de ecuații diferențiale liniare cu coeficienți constanți

Se prelucrează răspunsurile la intrare treaptă sau caracteristicile de frecvența.

În majoritatea cazurilor se impune structura modelului matematic ca fiind de ordinul unu sau doi, cu și fără autoechilibrare, iar în câteva cazuri ordinul rezultă din calcul.

Condiții de experimentare:

a) Înaintea aplicării semnalului de testare (treaptă, impuls, sinusoidal) se așteaptă intrarea ín regim staționar.

b) Semnalele de testare se aplică cel puțin pentru sarcină minimă, maximă și nominală, pentru a observa efectul neliniarităților.

c) Se vor aplica semnale treaptă sau impuls în ambele sensuri de variație.

d) Semnalele treaptă să reprezinte variații de (5 ÷ 15)% din domeniul intrării iar semnalele impuls (15 ÷ 30)% din domeniul intrării.

e) Dacă obiectul are întârziere pură, constanta de timp mort pur t se consideră ca fiind intervalul de timp dintre momentul aplicării semnalului treaptă și momentul în care ieșirea are o variație procentuală mai mare decât clasa de precizie a traductoarelor și înregistratoarelor.

f) Se va considera punct inițial al răspunsului punctul corespunzător momentului în care ieșirea variază față de regimul staționar anterior datorită semnalului treaptă de la intrare.

3.3.1.Determinarea funcției de transfer, pe baza răspunsului la intrare treaptă

Funcția de transfer, considerând și timp mort este

K – factor de amplificare

T – constante de timp

Figură 61:Rezultate experimentale

Determinarea factorului de amplificare K

Pentru determinarea factorului de amplificare K se măsoară valorile Δu și [𝑦(∞) − y𝑠𝑡(t0)] corespunzătoare.

Se calculează factorul , .

Determinarea constantei de timp T prin metoda tangentei

În punctul inițial B se duce o tangentă la răspuns care intersectează ordonata finală în C. Proiecția DE a segmentului BC, pe axa timpului este egală cu T.

Observație: Tangenta se poate duce în orice punct F al răspunsului până la intersecția G a ordonatei finale y(∞). Acesta subtinde pe axa timpului un segment PQ egal cu T, oricare ar fi punctul F. Dacă sistemul este de ordinul întâi atunci toate segmentele PQ au o aceeași lungime.

Determinarea constantei de timp T prin metoda ordonatei

Pentru determinarea constantei de timp T prin metoda ordonatei, trebuie știut faptul că valoarea constantei T este egală cu intervalul de timp dintre momentul inițial (când raspunsul are valoarea y𝑠𝑡(t0)) și momentul în care ieșirea atinge valoarea y𝑠𝑡(t0) + 0,6321 · [𝑦(∞) − y𝑠𝑡(t0)].

Determinarea constantei de timp T prin metoda ariei

Pentru determinarea constantei de timp T prin metoda ariei se calculează suprafața:

după care se calculează valoarea constantei de timp T ca fiind:

.

Observații:

1. Metoda tangentei este rapidă, însă erorile de trasare a tangentei, în special când obiectul are în realitate ordinul mai mare decât unu, afectează direct rezultatul.

2. Metoda ordonatei, este de asemenea rapidă, dar este dependentă de perturbațiile aditive sau erorile de măsurare care afectează direct rezultatul.

3. Metoda ariei, deși solicită un efort de determinare mai mare, realizează echivalarea cu un obiect de ordinul unu având în vedere întreaga evoluție a răspunsului, astfel că erorile ce apar la primele două metode aici se compensează prin mediere.

Pentru a calcula funcția de transfer a motorului SRV02 este nevoie sa analizăm răspunsul acestuia la intrare de tip treaptă.

Analizând răspunsul sistemului la intrare de tip treaptă, obținem următoarea funcție de transfer:

4.Rezultate experimentale

4.1.Proiectarea legilor de reglare de tip PID

În vederea proiectării legilor de reglare s-a folosit unealta PID Tuning din mediul de dezvoltare Matlab&Simulink.

4.1.1.Utilitarul PID Tuner

Utilitarul SISOTool este o unealtă pusă la dispoziție de mediul de dezvoltare Matlab&Simulink indispensabilă oricărui inginer automatist prin faptul că permite proiectarea rapidă a sistemelor ce îndeplinesc anumite condiții, precum și analiza sistemelor existente.

Aplicația PID Tuner caută automat parametrii optimi unui regulator PID pentru o instalație de SISO pentru a realiza un echilibru între performanță și robustețe. Se perimite specificarea tipul de controller, precum PI, PID cu filtru derivat sau PID cu două grade de libertate (2 DOF). Graficele de analiză permit examinarea performanței controllerului în domenii de timp și de frecvență. Este posibilă rafinarea interactiv a performanței controllerului pentru reglarea lățimii de bandă a buclei și marja de fază sau pentru a favoriza urmărirea valorii de referință sau respingerea perturbațiilor.

Se poate utiliza Tunerul PID cu o instalație reprezentată de un model LTI numeric, cum ar fi o funție de transfer (tf sau zpk) sau un spațiul al starilor (ss-state space). Dacă exista un design Simulink ® Control™ software, PID Tuner permite reglarea unui controller bloc PID sau PID(2DOF) direct în modelul Simulink. Dacă aveți software-ul System Identification Toolbox™, puteți utiliza aplicația pentru a estima lege de reglare din datele măsurate sau simulate și pentru a proiecta un controler pentru instalația estimate.

Figură 62: PID TUNER

Considerăm ansamblul ce se dorește a fi reglat asociat cu sistemul de reglare convențional descris prin urmatoarea schemă bloc:

Figură 63:Schema bloc a sistemului de reglare convențional

unde:

(i) dispozitivele componente sunt:

– regulatorul, reprezentat prin microcontrollerul PIC 18F8722;

– partea fixă, reprezentată prin instalația Quanser și care este ansamblul element de execuție + instalație tehnologică + traductor,

iar

(ii) semnificațiile semnalelor sunt:

– v(t) reprezintă semnalul de referință pe care trebuie să-l urmărească mărimea de ieșire y(t);

– ε(t) reprezintă eroarea sistemului, ε(t) = v(t) – y(t);

– u(t) reprezintă semnalul de comandă furnizat de regulator către partea fixă;

– y(t) este semnalul de ieșire din partea fixă sau mărimea care se reglează;

– p(t) este semnalul perturbator care tinde să modifice valoarea mărimii de ieșire y(t).

Legile de reglare de tip PID (Proporțional-Integrator-Derivator) sunt de departe cele mai utilizate legi de reglare în aplicații practice.

Proiectarea legilor de reglare a fost realizată folosindu-se funcția de transfer a motorului de curent continuu Quanser SRV02,

H(s)=

inserată in editorul Matlab sub forma

H=tf([15],[0.03 1])

Aceasta a fost importată in PID Tuner, selectându-se forma standard a legilor de reglare:

P: H(s)=Kp, Kp – factorul de proporționalitate

PI: H(s)= , Kp – factorul de proporționalitate, Ti – constanta de timp de integrare

PID:H(s)=, Kp – factor de proporționalitate, Ti – constanta de timp de integrare, Td – componenta de timp derivativă; determinându-se parametrii Kp, Ti, Td corespunzătoare funcțiilor de transfer legilor de reglare necesare pentru reglarea automată a procesului.

4.2.Proiectarea legilor de reglare numerice

Experiența operatorilor umani de sisteme este formată pe utilizarea unor legi de tip continuu, în timp ce implemetările pe echipamente numerice a structurilor de reglare impun algoritmi discreți.

Din această cauză este importantă analiza legăturii dintre legile continue de reglare și modelele lor discrete.

O lege de reglare PID continuă, cu o intrare u(t) și o ieșire y(t) în general realizează explicit sau echivalent o sumă de trei componente:

y(t) = yP(t) + yI(t) + yD(t)

unde:

Componenta proporțională (P):

yP(t) = KR*u(t) → HP(s) = KR ,

Componenta integrală (I):

,

Componenta derivativă ideală (Did) :

,

Componenta derivativă reală (Dre):

.

Aproximarea operatorului de integrare

Se consideră că operatorul de integrare se aplică unei funcții u(t) obținându-se:

.

De asemenea, se presupune că ∃k0∈ Z, k0T≥t0 , astfel încât

.

Figură 64:Procesul de integrare

Aproximarea integralei prin dreptunghiuri înapoi:

Aproximarea integralei prin trapeze înapoi:

4.2.1. Metode de discretizare a algoritmilor de tip PID

4.2.1.1. Model discret pentru legea PID-ideal, obținut aproximând derivata prin diferență înapoi și integrala prin sumă de trapeze

În această aproximare, integrală se aproximează printr-o sumă de trapeze și se obține:

+

Si in aest caz, funcția de transfer Dt(z) se poate obține direct din funcția de transfer prin substituții directe, dar se substituie variabila s de la componenta integrală prin , ce reprezintă aproximarea integralei prin sumă de trapeze(substituția Tustin), iar variabila s de la componenta derivativă prin ce exprimă aproximarea derivatei prin diferență inapoi. Se obține:

DTU(z)= cu

)

4.2.1.2. Model discret pentru legea PID-ideal, obținut aproximând derivata prin diferență înapoi și integrala prin sumă de dreptunghiuri

Se consideră perioada de eșantionare T și se notează

Răspunsul regulatorului PID-ideal H(s)= în momentele t=kT este aproximat prin

și utilizând metoda diferenței inapoi care poate fi exprimată de formula acest lucru reprezentând faptul ca se va lua o valoare cu un pas inapoi a derivatei noastre, și înlocuind în relația de mai sus pe k=k-1:

iar prin scadere

unde, după aranjarea termenilor devine

unde

Se remarcă caracterul integrator al relației recursive de sus deoarece valoarea ieșrii depinde de valoarea sa anterioară la care se adaugă termenii dependeți de intrare, iar integrarea este aproximată prin sumă de dreptunghiuri.

Aplicând substituția rezultă:

DTU(z)=

4.2.2. Algoritmul dead-beat clasic pentru sisteme fără timp mort

Dacă partea fixă discretă este o rațională strict proprie de forma

unde

B(z-1)=b1*z-1+…+bm*z-m

A(z-1)=a1*z-1+…+am*z-m

atunci, legea de reglare obținută prin metoda dead-beat clasic, pentru sisteme fără timp mort, este:

Prima comandă aplicată este

iar ultima comandă aplicată la ieșire de către legea de reglare este

Algoritmul numeric de conducere automată implementat este deci:

unde reprezintă factorul de conversie analog-numerică si respecti numeric-analogică.

4.3.Reglarea turației motorului Quanser SRV02

Se urmărește reglarea automată a turației motorului de curent continuu Quanser SRV02 cu ajutorul microcontrollerului PIC 18F8722.

Echipamentele folosite pentru realizarea acestui proiect de reglare automată sunt următoarele:

Instalația Quanser care cuprinde: motorul de curent continuu SRV02 și amplificatorul UPM-1503

Microcontroller-ul PIC 18F8722

Dispozitivul programator/debugger PICkitTM 3

Pentru programarea microcontrollerului se procedează astfel:

Se deschide mediul de programare MPLAB IDE v8.91

Figură 65: Fereastra de lucru MPLAB

Se accesează meniul Project și se selectează opțiunea New… . Se deschide o fereastră de dialog ce permite introducerea numelui proiectului și directorul în care să fie salvat.

Figură 66:Crearea unui proiect nou

Se selectează din meniul View opțiunea Project. În acest moment proiectul nu conține nici un fișier.

Figură 67:Fișierele conținute de proiect

Se precizează parametrii importanți ai proiectului, și anume tipul de microcontroller utilizat. Pentru aceasta din meniul Configure –> Select Device… se alege microcontrollerul PIC18F8722. În această fereastră sunt specificate (folosind led-uri roșii și verzi) ce instrumente pot fi utilizate pentru acest tip de microcontroller.

Figură 68:Selectarea microcontroller-ului PIC18F8722

Se precizează limbajul de programare utilizat. Poate fi utilizat limbajul de asamblare sau alte compilatoare Microchip sau de la alte societăți. Pentru a realiza această configurație se selectează din meniul Project opțiunea LanguageToolsuite alegând Microchip XC8 Toolsuite ce conține un compilator C pentru microcontrollere PIC pe 8 biți.

Figură 69:Selectarea compilatorului

Se deschide fișierul editor pentru scrierea programului sursă accesând meniul File–>New. Se salvează cu numele licenta.c, după care în fereastra corespunzătoare proiectului se dă click dreapta pe Source Files și se selectează Add Files … selectând fișierul licenta.c de unde a fost salvat.

Figură 70:Selectarea fișierului sursă licenta.c creat din directorul salvat anterior

În continuare trebuie realizate următoarele:

– din meniul View se bifează opțiunea Output,

– din meniul Programmer–> Select Programmer… se alege PICkit 3

– din meniul Project–>Build Configuration se setează opțiunea Release.

Sursă de tensiune

O punte H

O punte H este un circuit construit din 4 tranzistoare care acționează ca niște întrerupătoare, iar poziția acestora determină sensul de rotire al motorului.

Figură 71:Punte H

În stânga figurii de mai sus comutatoarele A1 și A2 sunt închise și curentul va trece prin ele, iar sensul va fi prin A1-motor-A2 si motorul se va roti în sensul acelor de ceasornic.

În dreapta figurii de mai sus celelalte două comutatoare B și B2 sunt închise și curentul va trece prin ele și prin motor, iar motorul se va roti în sens invers acelor de ceasornic.

În total există 24=16 poziții posibile ale comutatoarelor. În general se folosesc doar 4:

toate deschise –> motorul este în standby

A1, A2 închise, B1, B2 deschise –> motorul se învârte în sensul acelor de ceas

A1, A2 deschise, B1, B2 închise –> motorul se învârte în sens invers acelor de ceas

cele de sus închise, cele de jos deschise sau invers –> motorul este frânat.

Un divizor de tensiune

În electronică, un divizor de tensiune (de asemenea, cunoscut ca un divizor de potențial) este un circuit liniar pasiv care produce o tensiune de ieșire (Vout), care este o fracțiune din tensiunea de intrare (Vin). Divizarea tensiunii reprezintă rezultatul distribuirii tensiunii de intrare între componentele divizorului. Un exemplu simplu de divizor de tensiune îl reprezintă două rezistoare conectate în serie, cu tensiunea de intrare aplicată pe perechea de rezistoare, iar tensiunea de ieșire culeasă din punctul de legătură dintre ele.

Figură 72:Divizor de tensiune

Folosind legea lui Ohm:

Rezistențele folosite pentru realizarea divizorului de tensiune utilizat în proiect au valorile de Z2=460Ω respectiv Z1=230Ω.

O sondă USB PicoScope

Sonda USB PicoScope este folosită pentru achiziționarea semnalului reglat al motorului.

Figură 73:PicoScope 2105

Osciloscopul pentru PC Picoscope 2105 este alimentat în totalitate de ieșirea USB de la laptop sau de la calculator. Programul care vine la pachet cu PicoScope 2105 permite analiza formelor de undă ale tensiunii dar și achiziții pentru procese tehnologice avasate cum ar fi frecvența, factorul de umplere și timpul de creștere al semnalelor.

El poate fi folosit pe post de:

-Osciloscop

-Analizor de spectre

-Voltmetru

sau toate trei în acelaș timp.

Calculatorul personal pe care rulează mediul de programare MPLAB și se conectează compilatorul XC8 și PicoScope 2105

Cabluri de conectare

4.3.1. Realizarea programului de reglare

Primul pas în realizarea proiectului este conectarea corectă a tuturor componentelor enumerate mai sus și verificarea bunei funcționări a acestora. După realizarea conexiunilor tuturor componentelor începem implementarea software a regulatorului.

Declararea bibliotecilor folosite în program, necesare programarii microcontrollerului:

#include <xc.h>

#include <spi.h>

#include <delays.h>

#include <stdlib.h>

#include <math.h>

#include <adc.h>

Configurarea microcontrollerului pentru a putea fi folosit ca regulator:

// CONFIGURARE Microcontroller

#pragma config OSC = HSPLL

#pragma config FCMEN = OFF

#pragma config IESO = OFF

#pragma config PWRT = OFF

#pragma config BOREN = OFF

#pragma config WDT = OFF

#pragma config MCLRE = ON

#pragma config LVP = OFF

#pragma config XINST = OFF

Pentru a putea folosi LCD-ul microcontroller-ului PIC18F8722 se definesc adresele addresele registrilor circuitului MCP23S17:

// addresele registrilor circuitului MCP23S17

#define CS PORTAbits.RA2

#define IODIRA_ADDRESS 0x00

#define IODIRB_ADDRESS 0x01

#define GPIOA_ADDRESS 0x12

#define GPIOB_ADDRESS 0x13

Etapa urmatoare în realizarea programului este definirea funcțiilor care vor fi folosite pentru ca microcontroller-ul să devină un regulator. Pentru a putea fi utilizată într-un program, o funcție trebuie să fie definite/declarată și apelată. O funcție void fără parametri prelucrează variabilele globale și locale. Declararea unei funcții se face prin precizarea prototipului funcției. La apelarea funcției se execută corpul său, după revenindu-se în funcția apelantă, la instrucțiunea următoare apelului.

// Prototipuri functii

void setIODIR(char, char);

void setGPIO(char, char);

void lcdCommand(char);

void lcdChar(unsigned char);

void lcdGoTo(char);

void lcdWriteString(unsigned char*);

Funțiile realizate pentru activarea și utilizarea LCD-ului sunt următoarele:

Scrierea și configurarea corectă transmisiei valorilor către porturile MCP23S17.

// Funcție utilizată pentru scrierea valorilor in porturile MCP23S17

void setGPIO(char address, char value){

CS=0; // începutul transmisiei

WriteSPI1(0x40);

WriteSPI1(address);

WriteSPI1(value);

CS=1; // sfarșitul transmisiei

}

Scrierea și configurarea corectă a direcției porturilor MCP23S17.

// Funcție utilizată pentru setarea direcției porturilor circuitului MCP23S17

void setIODIR(char address, char dir){

CS=0;

WriteSPI1(0x40);

WriteSPI1(address); // selectare IODIRB

WriteSPI1(dir); // setare direcție

CS=1;

}

Transmiterea comenzilor către display

// Funcție pentru transmitere comenzi către display

void lcdCommand(char command){

setGPIO(GPIOA_ADDRESS,0x00); // E=0

Delay10TCYx(0);

setGPIO(GPIOB_ADDRESS, command); // transmitere date

Delay10TCYx(0);

setGPIO(GPIOA_ADDRESS,0x40); // E=1

Delay10TCYx(0);

setGPIO(GPIOA_ADDRESS,0x00); // E=0

Delay10TCYx(0);

}

Configurarea corectă pentru transmitere pe LCD a unui caracter.

// Funcția pentru afișarea unui caracter pe display

void lcdChar(unsigned char letter){

setGPIO(GPIOA_ADDRESS,0x80); // RS=1

Delay10TCYx(0);

setGPIO(GPIOB_ADDRESS,letter); // transmitere caracter pentru afisare

setGPIO(GPIOA_ADDRESS, 0xc0); // RS=1, EN=1

Delay10TCYx(0);

setGPIO(GPIOA_ADDRESS,0x00); // RS=0, EN=0

Delay10TCYx(0);

}

Și în ultimul rând funcția folosită pentru poziționarea pe LCD a cursorului.

//* pozitionare cursor

void lcdGoTo(char pos){

lcdCommand(0x80+pos);

}

void lcdWriteString(unsigned char *s){

while(*s)

lcdChar(*s++);

}

Se declarareă variabile folosite pentru:

-conversia analog-digitala;

-legea de reglare de tip PID discretizată: Kp=3, Ti=2, Td=0.01, uk, uk1=0, ek, ek1=0, ek2=0;

-afișarea pe display;

-stailirea referinței sistemului;

-perioada de eșantionare: Te=0.01.

int i,j;

static float error=0,u=0,Kp=3,Ti=2,Td=0.01,Te=0.01,uk,uk1=0,ek,ek1=0,ek2=0;

unsigned int ADCResult=0,ADCTuratie=0,reference1=0;

float voltage=0, P0=0.235, P1=0.168;

char buf1[8],buf2[8],refbuf1[8],refbuf2[8];

static int U,k=1, reference=0,afis=0;

Analizând următoarea secvență observăm că aceasta activează întreruperile pe portul RB0(buton).

//Activarea întreruperilor pe portul RB0(buton)sau S1

INTCONbits.GIE=1; // activarea întreruperilor

INTCONbits.INT0IE=1; // activare întreruperi externe pe pinul INT0

INTCONbits.INT0IF=0; // resetare bit de flag pentru INT0

INTCON2bits.INTEDG0=1; // activare intrerupere pe front crescator

Se realizează funcția de întrerupere pe butonul RB0 pentru a putea fi folosit ca referință pentru legea de reglare. Această referință va avea o incrementare cu pasul de 10 rotații/minut până la 60 rotații/minut.

void interrupt INTRERUPERE_Buton(void)

{

if(INTCONbits.INT0IE && INTCONbits.INT0IF){

if(k==1){

reference=reference+10;

}

else{

reference=reference-10;

}

if (reference==60)

k=0;

if (reference==0)

k=1;

}

INTCONbits.INT0IF=0; // resetare bit de flag pentru INT0

}

În continuare se folosesc 5 regiștri ai modului de conversie AD într-un număr pe 10 biți.

Având o alimentare maximă cu tensiunea de 5V la nivelul microcontrollerului, valoarea maximă a numărului returnat este de 1024. Pentru afișarea turației pe display valoarea tensiunii se înmulțeste cu 20 deoarece Turația= val. tensiune * 9.52, iar daca tensiunea noastra este înjumătățită datorită divizorului de tensiune , tensinea citită la niveul ADC-ului pe pinul RA0 se înmulțește cu 2 rezultând Turația= 2*val.tensiune*9.52; rotunjind pe 9.52 la 10 vom avea Turația=val.tensiune*20, rezultând valoarea turației afișată pe display; astfel realizâdu-se o configurare corectă a microcontroller-ului pentru conversia analog-digitală realizată cu Convertorul Analog-Digital (ADC).

// Conversie analog numerica

CloseADC();

ADCON0=0;

ADCON0bits.ADON = 1; // Activare modul A/D

ADCON1=0b00001110; // RA0 = analog input

ADCON2=0b10111010; // right Justified Fosc/32

ADCON0bits.GO=1; // start conversie

while (ADCON0bits.GO);

ADCResult = (unsigned int) ReadADC();

ADCTuratie=ADCResult*20;

voltage = (ADCTuratie*5.0)/1023; // conversia numărului în tensiune

CloseADC(); // închiderea modulului A/D

Implementarea efectivă a legilor de reglare P, PI, PID pentru calculul erorii procesului se face considerând sistemul nostru similar cu unul convențional.

// Calculul eroarii sistemului

error=reference-voltage;

Implementarea se realizează conform discretizării efectuate asupra funcțiilor de transfer ale legilor de reglare de P, PI, PID prin metoda tapezelor cu diferențe înapoi, dar și asupra funcției de transfer a motorului în cazul metodei Dead Beat care este tot un algoritm de reglare.

Relația de recurență a legi de reglare de tip P:

//Lege P

//uk=Kp*error;

Prametrul Kp (factorul de proporționalitate) este stabilit prin intermediul PID Tuner pentru regulatorul P și fucția de transfer a motorului: Kp=5.

Relația de recurență a legi de reglare de tip PI:

//Lege Pi

//ek=error;

//uk=uk1+Kp*(1+Te/(2*Ti))*ek-(1-Te/(2*Ti))*Kp*ek1;

//uk1=uk;

//ek1=ek;

Prametrii Kp (factorul de proporționalitate), Ti (constanta de timp de integrare) sunt stabilite prin intermediul PID Tuner pentru regulatorul PI și fucția de transfer a motorului: Kp=1.5, Ti=2.

Relația de recurență a legi de reglare de tip PID:

//Lege PID

//ek=error;

//uk=uk1+Kp*(1+Te/(2*Ti)+Td/Te)*ek+Kp*(Te/(2*Ti)-1-2*Td/Te)*ek1+(Kp*Td/Te)*ek2;

//uk1=uk;

//ek2=ek1;

//ek1=ek;

Prametrii Kp (factorul de proporționalitate), Ti (constanta de timp de integrare), Td (constanta de timp derivativă) sunt stabilite prin intermediul PID Tuner pentru regulatorul PID și fucția de transfer a motorului: Kp=3, Ti=2, Td=0.01.

Relația de recurență obținută prin metoda Dead Beat:

//Dead-Beat

ek=error;

uk=uk1+P0*ek-P1*ek1;

uk1=uk;

ek1=ek;

Pentru determinarea parametrilor P0 și P1 s-a folosit mediul de calcul Matlab. Folosidu-ne de funcția de transfer a motorului Quanser SRV02:

și impunând perioada de eșantionare Te=0.01, utilizând funcția Matlab G=c2d(h,Te), unde h=tf([15][0.03 1]) se obține funcția de transfer discretizată:

Legea de reglare obținută prin metoda Dead Beat este:

Astfel se identifică parametrii P0=0.235 și P1=0.1668

Dupa cum se observa, se folosesc variabilele declarate mai sus pentru această implementare. Aceste legi de reglare se pot folosi pe rând în funcție de timpul de reglare dorit pentru sistem. Pentru observarea tipului de răspuns pentru fiecare lege de reglare s-a realizat achiziția cu ajutorul PicoScope-ului a semnalului de ieșire din regulator la intrarea semnalui de tip treaptă:

Figură 74:Răspunsul regulatorului de tip P la semnalul de intrare treaptă

Figură 75:Figură 74:Răspunsul regulatorului de tip PI la semnalul de intrare treaptă

Figură 76:Răspunsul regulatorului de tip PID la semnalul de intrare treaptă

Figură 77:Răspunsul regulatorului obținut prin metoda Dead Beat la semnalul de intrare treaptă

Setarea și configurarea semnalului PWM.

//Semnalul PWM se obține pe pinul RC2.

TRISCbits.RC2=1;//portul RC2

PR2 = 0xFF;

CCP1CON=0b00001100; // Setare modul ECCP1 ca PWM simplu

CCPR1L=0xFF; // Setare duty cycle

PIR1bits.TMR2IF=0;

T2CON=0b00000101;

while (!PIR1bits.TMR2IF);

TRISCbits.RC2=0;

if(uk>10)uk=10;

if(uk<0)uk=0;

Conversia analog-numerica a semnalului PWM și modificarea factorului de umplere:

// Conversie analog numerica

U = (int)(uk*102);

CCP1CONbits.DC1B0=U&1;

CCP1CONbits.DC1B0=U&2;

U=U>>2;

CCPR1L=U; // Modificare factor de umplere

Variabila afiș așteaptă ca programul sa ajungă la 100 de rulări pentru a se afișa pe display valoarea referinței, date de întrerupere și valoarea mărimii reglate.

if(afis++==100)

{

TRISAbits.RA2=0; // pe portul RA2 se face activarea circuitului Slave

CS=1; // setarea CS la high, pentru transmitere informatii la MCP23S17

OpenSPI1(SPI_FOSC_64, MODE_10, SMPEND); // configurare SPI

setIODIR(IODIRB_ADDRESS,0x00); // setare pini DB0-DB7 ca iesiri

setIODIR(IODIRA_ADDRESS,0x00); // set RS si E LCD ca iesiri

lcdCommand(0b00111111); // Functie setare display: 8 biti, 2 linii

lcdCommand(0b00001111); // Cursor

lcdCommand(0b00000001); // clear display

lcdCommand(0b00000110); // entry mode

Mai jos avem implementarea pe microcontroller a afișării caracterelor pe LCD utilizând variabile care rețin și afișează valoarea turației, rotațiilor pe minut furnizate de motor.

// Afisare marime masurata

double i_val, f_val, val,i_val1, f_val1;

f_val = modf( voltage, &i_val);

itoa(buf1, i_val, 10);

lcdWriteString("y:"); // scrierea unui sir de caractere

lcdWriteString(buf1);

lcdChar('.');

val=f_val*100;

f_val1 = modf( val, &i_val1);

itoa(buf2, i_val1, 10);

lcdWriteString(buf2);

lcdWriteString("r/min");

Acelaș lucru ca și în secvența de mai sus, doar că in acest caz se afișează valoarea returnată de întreruperilor date de butonul RB0(S1) care reprezintă marimea de referință a procesului condus.

// Afisare referinta

lcdGoTo(0x40);

lcdWriteString("r:"); // scrierea unui sir de caractere

double i_ref, f_ref, ref,i_ref1, f_ref1;

f_ref = modf( reference, &i_ref);

itoa(refbuf1, i_ref, 10);

lcdWriteString(refbuf1);

lcdChar('.');

ref=f_ref*100;

f_ref1 = modf( ref, &i_ref1);

itoa(refbuf2, i_ref1, 10);

lcdWriteString(refbuf2);

CloseSPI1();

afis=0;

}

În momentul terminării afișării referinței și a turației variaila afis este resetată pentru a contoriza următoarele 100 de cicluri până la următoarea afișare.

4.4.Reglarea poziției motorului Quanser SRV02

Concluzii

În concluzie aceasta lucrare reprezintă o aplicație de modelare matematică, identificare și control în timp real a unei instalații Quanser. Modelarea matematică reprezintă o componentă esențială în identificarea sistemelor și conducerea acestora. Realizarea de sisteme automate pentru procese conducere presupune cunoașterea exactă a elementelor proceselor conduse. Inginerul automatist are datoria de a identifica modelele matematice, identificarea sistemului și mai apoi creearea unei soluții de control pentru proces.

Odată cu dezvoltarea microprocesoarelor,calculatoarele de proces au adus o evoluție în domeniul industrial datorită eficienței lor în timp. Acest lucru este vizibil datorită revoluțiilor industriale care au apărut de-a lungul timpului. Prima revoluție industrialăa fost mecanizarea cu puterea apei și aburului, apoi a urmat a doua revoluție industrială când a apărut producția în masă cu benzile rulante acționate de energie electrică, a treia revoluție industrială a fost când au început sa se foloseasca componente electronice și IT pentru automatizarea producției, această revoluție a fost cunoscută ca revoluția digitală, iar cea de-a patra revoluție industrială urmează sa fie implementată prin interconectarea dispozitivelor, mașinilor și senzorilor pentru a avea o comunicare permanentă între ele și a oferi informații utilizatorilor care îl folosesc. Costul redus, puterea de calcul și rapiditatea procesării informațiilor a microcontrollerelor au revoluționat domeniul industrial aducând profit marilor companii.

Inginerul automatist are obligația de a înțelege fenomenul de reglare automată, fiind capabil sa creeze o soluție de control pentru procesul în cauză.

Aceast proiect reprezintă o soluție performantă la scară mică pentru controlul unui proces.

În această lucrare este descris cum cu ajutorul microcontroller-ului PIC18F8722 se poate controla turația și poziția unui motor de curent continuu.

În primul capitol se urmărește stabilirea noțiunilor despre ingineria reglării automate punându-se accent pe legile tipizate de reglare de tip PID și derivatele acesteia. Tot în acest capitol se urmărește delimitarea noțiunilor generale de reglare automată față de noțiunea de algoritm numeric de reglare automată.

Capitolul doi prezintă avantajele și dezavantajele utilizării microcontrollerului PIC18F8722 precum și caracteristicile sale tehnice prezentându-se tehnologiile necesare realizării proiectului încorporate pe placuța de dezvoltare. Tehnologiile folosite în dezvoltarea aplicației sunt: PWM-ul(Pulse Width Modulation), ADC-ul (Analog to Digital Converter), transmisia serială și afișarea pe LCD. Se prezintă de asemenea și programatorul( debugger) PIClkit 3 împreună cu mediul de programare MPLAB, mediu de programare dedicat lucrului cu microcontrollerul menționat anterior.

În al treilea capitol este prenzentat motorul de curent continuu Quanser SRV02, elementul de execuție al sistemului ce se dorește a fi controlat. Modelarea matematică a motorului de curent continuu reprezintă punctul de start în identificare parametrilor motorului pentru a se cunoaște funcția de transfer ce îl caracterizează.

Capitolul patru se axează pe aplicarea cunoștințelor teoretice menționate în cele trei capitole anterioare, într-o aplicație fizică și are ca scop reglarea aplicației în timp real. În acest capitol legile de reglare tipizate sunt discretizate pentru a putea fi utilizate în implementarea regulatorului din procesul în cauză. Pentru identificarea parametrilor algoritmilor de reglare se utilizează utilitarul PID Tuner și mediul de calcul Matlab. În realizarea codului de programare pentru legile discretizate se stabilește o relație de recurență cu o perioada de eșantionare prestabilită.

Finalul lucrării prezintă reglarea efectivă a turației motorului Quanser SRV02 dar și reglarea poziției acestui.

Motorul de curent continuu Quanser SRV02 are o anumită turație, iar această valoare a turației este transmisă prin tahometru către amplificatorul UPM-1503, acesta la rândul său transmite în divizorul de tensiune la care este conectat portul RA0 al microcontrollerului PIC18F8722. Dupa primirea valorii pe portul RA0, microcontrollerul citește valoarea recepționată și o compară cu referința stabilită de noi, iar în acel moment regulatorul PID se pune în funcțiune și începe sa regleze procesul transmițând impulsuri sub formă de semnal PWM pe portul RC2 prin puntea H la motorul de curent continuu SRV02.

A.CODUL SURSĂ

A.a. Reglarea turației motorului Quanser SRV02

#include <xc.h>

#include <spi.h>

#include <delays.h>

#include <stdlib.h>

#include <math.h>

#include <adc.h>

// CONFIGURARE Microcontroller

#pragma config OSC = HSPLL

#pragma config FCMEN = OFF

#pragma config IESO = OFF

#pragma config PWRT = OFF

#pragma config BOREN = OFF

#pragma config WDT = OFF

#pragma config MCLRE = ON

#pragma config LVP = OFF

#pragma config XINST = OFF

#define CS PORTAbits.RA2

// addresele registrilor circuitului MCP23S17

#define IODIRA_ADDRESS 0x00

#define IODIRB_ADDRESS 0x01

#define GPIOA_ADDRESS 0x12

#define GPIOB_ADDRESS 0x13

// Prototipuri functii

void setIODIR(char, char);

void setGPIO(char, char);

void lcdCommand(char);

void lcdChar(unsigned char);

void lcdGoTo(char);

void lcdWriteString(unsigned char*);

int i,j;

static float error=0,u=0,Kp=3,Ti=2,Td=0.01,Te=0.01,uk,uk1=0,ek,ek1=0,ek2=0;

unsigned int ADCResult=0,ADCTuratie=0;

float voltage=0, P0=0.235, P1=0.168;

char buf1[8],buf2[8],refbuf1[8],refbuf2[8];

static int U,k=1, reference=0,afis=0;

void interrupt INTRERUPERE_Buton(void){

if(INTCONbits.INT0IE && INTCONbits.INT0IF){

if(k==1){reference=reference+10;}

else{reference=reference-10;}

if (reference==60) k=0;

if (reference==0) k=1;

}

INTCONbits.INT0IF=0; // resetare bit de flag pentru INT0

}

void main(void){

while(1){

// Conversie analog numerica

CloseADC();

ADCON0=0;

ADCON0bits.ADON = 1; // Activare modul A/D

ADCON1=0b00001110; // RA0 = analog input

ADCON2=0b10111010; // right Justified Fosc/32

ADCON0bits.GO=1; // start conversie

while (ADCON0bits.GO);

ADCResult = (unsigned int) ReadADC();

ADCTuratie=ADCResult*20;

voltage = (ADCTuratie*5.0)/1023; // conversia numarului în tensiune

CloseADC(); // închiderea modulului A/D

// Calculul eroarii sistemului

error=reference-voltage;

//Lege P

//uk=Kp*error;

//Lege Pi

//ek=error;

//uk=uk1+Kp*(1+Te/(2*Ti))*ek-(1-Te/(2*Ti))*Kp*ek1;

//uk1=uk;

//ek1=ek;

//Lege PID

//ek=error;

//uk=uk1+Kp*(1+Te/(2*Ti)+Td/Te)*ek+Kp*(Te/(2*Ti)-1-2*Td/Te)*ek1+(Kp*Td/Te)*ek2;

//uk1=uk;

//ek2=ek1;

//ek1=ek;

//Dead-Beat

ek=error;

uk=uk1+P0*ek-P1*ek1;

uk1=uk;

ek1=ek;

//Semnalul PWM se obtinut pe pinul RC2.

TRISCbits.RC2=1;//portul RC2

PR2 = 0xFF;

CCP1CON=0b00001100; // Setare modul ECCP1 ca PWM simplu

CCPR1L=0xFF; // Setare duty cycle

PIR1bits.TMR2IF=0;

T2CON=0b00000101;

while (!PIR1bits.TMR2IF);

TRISCbits.RC2=0;

if(uk>10)uk=10;

if(uk<0)uk=0;

// Conversie analog numerica

U = (int)(uk*102);

CCP1CONbits.DC1B0=U&1;

CCP1CONbits.DC1B0=U&2;

U=U>>2;

CCPR1L=U; // Modificare factor de umplere

//Activarea intreruperilor pe portul RB0(buton)sau S1

INTCONbits.GIE=1; // activarea întreruperilor

INTCONbits.INT0IE=1; // activare întreruperi externe pe pinul INT0

INTCONbits.INT0IF=0; // resetare bit de flag pentru INT0

INTCON2bits.INTEDG0=1; // activare intrerupere pe front crescator

if(afis++==100){

TRISAbits.RA2=0; // pe portul RA2 se face activarea circuitului Slave

CS=1; // setarea CS la high, pentru transmitere informatii la MCP23S17

OpenSPI1(SPI_FOSC_64, MODE_10, SMPEND); // configurare SPI

setIODIR(IODIRB_ADDRESS,0x00); // setare pini DB0-DB7 ca iesiri

setIODIR(IODIRA_ADDRESS,0x00); // set RS si E LCD ca iesiri

lcdCommand(0b00111111); // Functie setare display: 8 biti, 2 linii

lcdCommand(0b00001111); // Cursor

lcdCommand(0b00000001); // clear display

lcdCommand(0b00000110); // entry mode

// Afisare marime masurata

double i_val, f_val, val,i_val1, f_val1;

f_val = modf( voltage, &i_val);

itoa(buf1, i_val, 10);

lcdWriteString("y:"); // scrierea unui sir de caractere

lcdWriteString(buf1);

lcdChar('.');

val=f_val*100;

f_val1 = modf( val, &i_val1);

itoa(buf2, i_val1, 10);

lcdWriteString(buf2);

lcdWriteString("r/min");

lcdGoTo(0x40);

lcdWriteString("r:"); // scrierea unui sir de caractere

// Afisare referinta

double i_ref, f_ref, ref,i_ref1, f_ref1;

f_ref = modf( reference, &i_ref);

itoa(refbuf1, i_ref, 10);

lcdWriteString(refbuf1);

lcdChar('.');

ref=f_ref*100;

f_ref1 = modf( ref, &i_ref1);

itoa(refbuf2, i_ref1, 10);

lcdWriteString(refbuf2);

CloseSPI1();

afis=0;

}

}

}

// functie utilizata pentru scrierea valorilor in porturile MCP23S17

void setGPIO(char address, char value){

CS=0; // inceputul transmisiei

WriteSPI1(0x40);

WriteSPI1(address);

WriteSPI1(value);

CS=1; // sfarsitul transmisiei

}

// functie utilizata pentru setarea directiei porturilor circuitului MCP23S17

void setIODIR(char address, char dir){

CS=0;

WriteSPI1(0x40);

WriteSPI1(address); // selectare IODIRB

WriteSPI1(dir); // setare directie

CS=1;

}

// functie pentru transmitere comenzi catre display

void lcdCommand(char command){

setGPIO(GPIOA_ADDRESS,0x00); // E=0

Delay10TCYx(0);

setGPIO(GPIOB_ADDRESS, command); // transmitere date

Delay10TCYx(0);

setGPIO(GPIOA_ADDRESS,0x40); // E=1

Delay10TCYx(0);

setGPIO(GPIOA_ADDRESS,0x00); // E=0

Delay10TCYx(0);

}

// Functia pentru afisarea unui caracter pe display

void lcdChar(unsigned char letter){

setGPIO(GPIOA_ADDRESS,0x80); // RS=1

Delay10TCYx(0);

setGPIO(GPIOB_ADDRESS,letter); // transmitere caracter pentru afisare

setGPIO(GPIOA_ADDRESS, 0xc0); // RS=1, EN=1

Delay10TCYx(0);

setGPIO(GPIOA_ADDRESS,0x00); // RS=0, EN=0

Delay10TCYx(0);

}

//* pozitionare cursor

void lcdGoTo(char pos){

lcdCommand(0x80+pos);

}

void lcdWriteString(unsigned char *s){

while(*s)

lcdChar(*s++);

}

A.b. Reglarea poziției motorului Quanser SRV02

B.CD/DVD

Similar Posts