Controlul Unei Instalatii Quanser Folosind Microcontrollerul Pic 18f8722
LISTA FIGURILOR
Figura 1: Structura generală a unui sistem de conducere xviii
Figura 2: Raspunsul la semnal treapta xxi
Figura 3: Placa de dezvoltare PICDEM 18 xxv
Figura 4: PICKIT3 xxvii
Figura 5: Microcontroller-ul PIC18F8722 xxviii
Figura 6: Biții de control si configurare ai potului A/D xxxi
Figura 7: Conversie A/D prin aproximari successive xxxiv
Figura 8: Ieșire PWM xxxix
LISTA TABELELOR
Tabel 1: Parametrii de acordare xxiii
Tabel 2: Relațiile de acordare xxiii
Tabel 3: ADCON0: A/D REGISTRUL DE CONTROL xxix
Tabel 4: ADCON1: A/D REGISTRUL DE CONTROL xxx
Tabel 5: ADCON1: A/D REGISTRUL DE CONTROL xxxi
INTRODUCERE
CAPITOLUL I: Sisteme de reglare
Structura generală a unui sistem de conducere
În orice sistem de conducere automată se regăsesc următoarele elemente interconectate:
Obiectul condus;
Dispozitivul de conducere;
Elemente de execuție;
Sistemul informatic de culegere și transmitere a informațiilor privind obiectul condus;
Figura 1: Structura generală a unui sistem de conducere
Structura de mai sus este o structură de conducere în circuit închis, deoarece se ține cont de mărimile măsurate la elaborarea deciziilor.
Deciziile sunt elaborate de dispozitivul de conducere și se aplică obiectului condus, prin intermediul elementelor de execuție pe baza mărimilor măsurate. Deciziile de conducere au ca scop respectarea unor criterii de calitate, a satisfacerii unor restricții când asupra obiectului acționează o serie de factori perturbanți.
Sistemul de mai sus se poate numi sistem de conducere automat deoarece este capabil să elaboreze decizii de conducere folosindu-și mijloacele proprii de informare.
Sistemele de reglare automată constituie un caz particular de sisteme de conducere automată.
“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ă și mărimea impusă, diferență care se mai numește abatere sau eroarea sistemului.”
Cele două principii prin care se anulează eroarea într-un sistem de reglare automată sunt:
Principiul acțiunii prin discordanța – 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.
Principiul compensației – una sau mai multe mărimi sunt măsurate și se aplică la elementele de execuție, comenzi ce trebuiesc să compenseze pe această cale efectul perturbațiilor asupra mărimii de ieșire ce este transmis pe cale naturală.
Orice sistem de reglare care îmbină cele două principii se numește sistem de reglare combinată.
Legile tipizate de reglare
Prezentare generală
În practica industrială a reglării automate s-au impus legile de reglare de tip PID (proporțional – integrator – derivator) ce îndeplinesc în majoritatea situațiilor cerințele tehnice impuse sistemelor de reglare convențională.
Se pot utiliza diverse combinații ale acestor trei componente: proporțional, integrator sau derivator.
Prin folosirea 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 unde se prescriu valorile parametrilor acestor legi rezultate în urma proiectării analitice a sistemul.
Nu se poate deduce exact efectul fiecărei componente a unei legi de reglare asupra calității sistemului de reglare automată deoarece depinde foarte mult de instalație.
Componenta proporțională, cu factorul de proporționalitate KP, deternină o comandă proporțională cu eroarea sistemului.
Componenta integrală, exprimată prin constanta de timp de integrare TI , determină o comandă proporțională cu integrala erorii sistemului.
Componenta derivativă, exprimată prin constanta de timp de derivare, TD, determină o comandă proporțională cu derivata erorii sistemului.
Element proporțional Integrator
Funcția de transfer este:
Unde:
KR = factorul de proporționalitate
TI = constanta de timp de integrare
Determinarea experimentală a parametrilor funcției de transfer de ordinul unu
Funcția de transfer, considerând și timp mort este,
Figura 2: Raspunsul la semnal treapta
Determinarea factorului de amplificare K
Se măsoară valorile Du și [y(∞) – yst (t0)] corespunzătoare segmentelor din
grafic.
Se calculează factorul K
,
Determinarea constantei de timp T prin metoda tangentei
În punctul inițial B se duce o tangentă la răspunsul 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 raspunsului păna 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.
Relații și metode practice de acordare a regulatoarelor tipizate
În acest capitol se prezintă o serie de relații pentru determinarea valorilor optime ale parametrilor regulatoarelor tipizate, în raport cu diferite criterii, considerând parțile fixe ale sistemului cu timp sau fără timp mort, de ordinul I sau II și câteva cazuri particulare de ordin mare.
Acordarea regulatoarelor după metoda Nichols
Se determină experimental si . Pentru aceasta, având = și , se mărește factorul de proporționalitate până apar oscilații întreținute.
Acea valoare a lui este , ce înseamnă o bandă de proporționalitate , iar perioada oscilațiilor este .
Regulator P : ;
Regulator PI : ; ;
Regulator PID : ; ;
Regulator PID cu factor de interdependență ,(q=1):
; ;
Acordarea regulatoarelor după metoda Oppelt
Parametrii de acordare sunt:
Tabel 1: Parametrii de acordare
Acordarea regulatoarelor după metoda Chien-Hrones-Reswick (CHR)
Relațiile de acordare a parametrilor regulatorului pentru răspunsul optim la variația mărimii impuse sunt prezentate în tabelul de mai jos:
Tabel 2: Relațiile de acordare
Discretizarea funcției de transfer a unui element PI
Deoarece s-au dezvoltat foarte mult sistemele numerice, a venit și nevoia de a realiza regulatoare sub formă numerică.
Exemple de avantaje ale folosirii sistemelor numerice pentru implementare regulatoarelor:
Ușurința de modificare a regulatoarelor;
Adaptabilitatea;
Posibilitatea de păstrare a evoluției în memorie;
Posibilitatea de realizare software a regulatoarelor.
Semnalele primite de la traductoare trebuiesc discretizate atunci când dorim să implementăm un regulator numeric pentru a controla un proces continuu. Astfel, semnalul nu o să mai fie continuu, ci va fi construit dintr-o multitudine de puncte măsurate la anumite intervale de timp bine determinate.
Perioada dintre două măsurători se numește perioada de eșantionare și este notată cu Te.
Ca urmare a acestor modificări, apare necesitatea de a calcula o forma discretă a funcției de transfer pentru regulatoarele numerice.
Funcția de transfer discretizată are forma:
CAPITOLUL II: Prezentarea plăcii de dezvoltare PICDEM 18
Prezentare generală
Placa de dezvoltare PICDEM 18 a fost dezvoltată de Microchip și reprezintă o soluție bună pentru crearea acestui proiect deoarece dispune de intrări – ieșiri analogice și un număr mare de intrări – ieșiri digitale.
Este ușor de programat de la un calculator prin intermediul unui cablu USB și poate fi alimentat separat de la o sursă a cărei tensiune poate varia între 9V și 15V.
Placa de dezvoltare PICDEM 18 poate fi echipată cu unul din cele două microcontrollere: PIC18F8722 sau PIC18F87J11.
Principalele caracteristici ale plăcii de dezvoltare PICDEM 18
În continuare sunt prezentate unele dintre facilitățile oferite de placa de dezvoltare PICDEM 18. Acestea se pot observa în Figura 3:
Figura 3: Placa de dezvoltare PICDEM 18
1. Microcontroller-ul PIC18F8722, microcontroller-ul primar montat pe placă;
2. Pini tata pentru conectarea modulului PIM. Un PIM permit unui dispozitiv PIC18 să fie conectat alternativ la placă ca microcontroller primar;
3. Conector ICD (In-Circuit Debugger) pentru conectarea la MPLAB ICD 2;
4. Conector cu 6 pini PICkit 3;
5. Potențiometu de 10kΩ pentru intrări analogice;
6. Buton PUSH pentru resetare externă;
7. Conector USB pentru comunicare RS-232;
8. Microcontroler-ul PIC18LF2450, pentru conversia de comunicare RS-232 pentru protocolul USB pentru atașarea la un PC;
9. 12 MHz, pentru microcontroler PIC18LF2450;
10. Soclu RS-232 DB9 și hardware-ul necesar asociat pentru conectarea directă la interfața RS-232;
11. Jumper J13 pentru rutarea comunicației RS-232 fie prin portul USB sau prin RS-232;
12. Jumper J4 pentru selectarea programului din dispozitivului principal PIC folosit prin USB pentru comunicare RS-232;
13. Comutarea butonului S4 pentru desemnarea microcontroller-ului principal, să fie montate pe placa PIC18F8722 sau pe un microcontroler PIM montat;
14. Indicator LED pentru pornire;
15. JP1 pentru deconectarea a celor 8 LED-uri de afișare;
16. 8 LED-uri;
17. 32.768 kHz cristali pentru Timer1 pentru funcționarea ceasului;
18. Două butoane PUSH;
19. Senzor de temperatură microchip MPC9701A;
20. 25LC256 SPI EEPROM;
21. JP2 pentru a activa / dezactiva EEPROM-ul;
22. JP3 pentru a activa / dezactiva LCD-ul;
23. 10 MHz cristali pentru microcontroller-ul principal;
24. Soclu pentru conectori “fiică”;
25. Expander SPI intrare/ieșire pentru display-ul LCD, MCP23S17;
26. Zona prototype pentru hardware-ul utilizatorului;
27. Afișajul LCD;
28. J2 trei pini tata pentru a selecta o tensiune de 3.3V sau5V;
29. J14 cu patru pini tata pentru utilizarea unui PIM, dacă este necesar, pentru a se conecta la o tensiune de 3.3V sau 5V, VIN și ICE MCLR;
PICKIT 3 Programmer/Debugger
Programatorul PICKit 3 este un dispozitiv controlat de calculator pe care lucrează programul MPLAB IDE. Acesta este folosit pentru dezvoltarea aplicațiilor pentru Microcontrollere PIC și dsPIC bazate pe In-Circuit Serial Programming și Enhanced In-Circuit Serial Programming cu interfețe pe două fire. Programatorul PICKIT 3 execută codul programului ca un dispozitiv real.
Avantajele programatorului PICKIT 3:
Execuție în timp real;
Procesoarele rulează cu viteza maximă;
Ștergere orice tip de memorie (ID, EEPROM);
Citirea/scrierea programului și datele în memoria microcontrolerului.
Arhitectura PIC
PIC este o familie de microcontrollere cu arhitectură Harvard produse de Microchip Technology, derivate din PIC1640 dezvoltate inițial de divizia de microelectronice de la General Instrument. Numele PIC se referea inițial la „Peripheral Interface Controller”.
PIC-urile sunt populare atât printre dezvoltatorii industriali cât și pentru hobby-iști datorită costului lor scăzut, disponiblității mari, bazei largi de utilizatori, colecției extinse de note aplicative, disponibilitatea uneltelor de dezvoltare gratuite sau foarte ieftine, și a compatibilității cu programarea serială.
Arhitectura nucleului: Arhitectura PIC este caracterizată de multele sale atribute:
• Spații separate de cod și date (arhitectura Harvard) pentru toate dispozitivele în afara de PIC32, care are o arhitectură Von Neumann;
• un număr mic de instrucțiuni cu lungime fixă;
• majoritatea instrucțiuniilor sunt execuții cu un singur ciclu;
• o stivă hardware pentru a stoca adresele de întoarcere;
• un spațiu relativ mic de spațiu adresabil de date (de obicei 256 bytes) care poate fi extins;
• registre CPU, port și periferice mappate data space;
• contorul de program este de asemenea mappat în spațiul de date și este modificabil (este utilizat pentru a implementa săriturile indirecte).
Nu există diferență între spațiul de memorie și spațiul de registru pentru ca RAM-ul îndeplinește sarcina pentru ambele, iar ram-ul este considerat de obicei fișierul registru sau mai simplu, registru.
Spațiul data (RAM): PIC-urile au un set de registre care funcționează ca un RAM cu scop general. Registrele de control cu scop specific pentru resursele on-chip hardware sunt de asemenea mapp-ate în spațiul de date. Adresabilitatea memoriei variază depinzând de seriile dispozitvelor; de asemenea toate dispozitvele PIC au un mecanism pentru a extinde adresabilitatea și către memoria adițională. Seriile ulterioare de dispozitive prezintă mai multe instrucțiuni care pot acoperi întreg spațiul adresabil, independent de banca aleasă. În dispozitivele timpurii, orice mișcare de registru trebuia arhivată prin acumulator.
Pentru a implementa adresarea indirectă, un „registru de selectare fișier” și un „registru indirect” sunt necesare. Un număr de registru este scris în RSF, după care acesta citește din sau scrie în. Dispozitivele ulterioare au extins acest concept cu post și pre incrementare/decrementare pentru o mai mare efieciență în accesarea datelor stocate secvențial. Aceasta permite RSF-urilor să fie tratate ca un indicator de stivă.
Memoria de date externă nu este adresabilă în mod direct cu excepția dispozitivelor cu număr mare de pini PIC18.
Spațiul de cod Spațiul de cod este în general implementat ca ROM, EPROM sau ROM flash. În general, memoria cod externă nu este direct adresabilă din cauza lipsei unei interfețe cu memoria externă. Excepțiile sunt PIC17 și PIC18.
Mărimea cuvântului: Toate PIC-urile gestionează (și adresează) datele în bucăți de 8 biți. Totuși, unitatea adresabilității spațiului de cod nu este în general acceași cu cea a spațiului de date. De exemplu, PIC-urile din linia de bază și clasa mijlocie au memorie program adresabilă cu aceeași mărime de cuvânt ca și lățimea instrucțiunii, 12 respectiv 14 biți. La polul opus, seria PIC18, memoria program este adresată în incremente de 8 biți (bytes) care diferă de lățimea instrucțiunii de 16 biți.
Pentru a fi clar, capacitatea de memorie de program este de obicei măsurată în număr de instrucțiuni, și nu în bytes.
Stive: PIC-urile au o stivă hardware de apelare, folosită să salveze adresele de întoarcere. Stiva hardware nu este accesibilă pe dispozitivele precedente, dar asta s-a schimbat o dată cu cele din seria 18.
Compatibilitatea hardware pentru o stivă parametru de scop general nu se găsea în seriile timpurii, dar acest lucru s-a îmbunătățit simțitor în seria 18, făcând arhitectura acesteiea mai prietenoasă pentru compilatoarele de limbaj de înalt nivel. Set de instrucțiuni:
Instrucțiunile unui PIC variază de la aproximativ 35 de instrucțiuni pentru PIC-urile low-end până la peste 80 pentru cele high-end. Seturile de instrucțiuni includ instrucțiuni pentru a realiza o varietate de operații direct pe registre, pe acumulator și o constantă literală sau acumulator și registru, și de asemenea pentru o execuție condiționată și branșamentul de programe.
Unele operații, cum ar fi setarea și testarea biților, pot fi efectuate pe orice registru numerotat, dar operațiile aritmetice bi-operande tot timpul implică utilizarea acumulatorului (w), scriind înapoi rezultatul ori W-ului sau altui registru operând. Pe nucleele mai vechi, toate mișcăriile mai vechi trebuiau să treacă prin W, dar asta s-a schimbat odată cu apariția celor high-end.
Nucleele PIC au instrucțiuni de ingnorare care sunt utilizate pentru executarea condiționată și branșament. Instrucțiunile de skip sunt „skip if bit set” și „skip if bit not set”. Pentru că nucleele dinaintea PIC18 aveau doar instrucțiuni de branșă necondiționate, salturile condiționate sunt implementate de un skip.
Arhitecturile PIC au următoarele avantaje:
• Set mic de intrucțiuni de învățat;
• Arhitectura RISC;
• Oscilator integrat cu viteze selectabile;
• Microcontrolere ieftine;
Microcontrolerul PIC 18F8722
Placa de dezvoltare PICDEM 18 folosește microcontrollerele PIC 18F8722 și PIC 18F87J11. Schimbarea microcontrollerului de pe placă se va realiza cu mare atenție, avînd grijă ca pinii să nu se rupă sau să fie îndoiți.
Pinii microcontrollerului sunt conectați la diferite periferice ale plăcii (interfața serial, ethernet, convertoare, etc).
De asemenea, toți pinii sunt conectati la LED-uri, făcând foarte ușoară monitorizarea stării acestora pe timpul aplicațiilor.
Figura 5: Microcontroller-ul PIC18F8722
Conector USB
Placa de dezvoltare PICDEM 18 conține un conector USB prin intermediul căruia se poate realiza o conexiune serială de tip RS – 232.
Convertorul analog numeric (CAN)
Convertorul analog numeric are 12 intrări pentru dispozitivele pe 64 de pini și 16 intrări pentru dispozitivele 80 de pini. Acest modul permite conversia unui semnal de intrare analogic în reprezentarea sa digitală într-un număr pe 10 biți.
Modulul CAN dispune de 5 registrii:
– Registrul rezultat HIGH al conversiei A/D (ADRESH);
– Registrul rezultat LOW al conversiei A/D (ADRESL);
– Registrul de control 0 (ADCON0);
– Registrul de control 1 (ADCON1);
– Registrul de control 2 (ADCON2).
Registrul ADCON0, descris în tabelul 1, controlează modul de operație al modulului A/D. Registrul ADCON1, descris în tabelul 2, configurează funcțiie pinilor portului. Registrul ADCON2, descris în tabelul 3, configurează ceasul sursei, timpul programabil de achiziție și justificarea rezultatului.
Tabel 3: ADCON0: A/D REGISTRUL DE CONTROL
bit 7-6 Neimplementați: Citit ca ‘0’
bit 5-2 CHS<3:0> Canalul analog de selecție al biților(1)
0000 = Canalul 0 (AN0)
0001 = Canalul 1 (AN1)
0010 = Canalul 2 (AN2)
0011 = Canalul 3 (AN3)
0100 = Canalul 4 (AN4)
0101 = Canalul 5 (AN5)
0110 = Canalul 6 (AN6)
0111 = Canalul 7 (AN7)
1000 = Canalul 8 (AN8)
1001 = Canalul 9 (AN9)
1010 = Canalul 10 (AN10)
1011 = Canalul 11 (AN11)
1100 = Canalul 12 (AN12)(1)
1101 = Canalul 13 (AN13)(1)
1110 = Canalul 14 (AN14)(1)
1111 = Canalul 15 (AN15)(1)
bitul 1 GO/DONE: A/D Conversia bitului status
Cât timp ADON = 1:
1 = A/D conversia este în desfășurare
0 = A/D Idle
bit 0 ADON: A/D On bit
1 = A/D modulul convertorului este activat
0 = A/D modulul convertorului este dezazctivat
Nota 1: Aceste canale nu sunt implementate pe dispozitivele ce rulează pe 64 de pini.
Tabel 4: ADCON1: A/D REGISTRUL DE CONTROL
bit 7-6 Neimplementați: Citiți ca și ‘0’
bit 5-4 VCFG<1:0>: Biții care controlează voltajul de referință.
bit 3-0 PCFG<3:0>: A/D Biții de control ce configurează Portul:
Figura 6: Biții de control si configurare ai potului A/D
Tabel 5: ADCON1: A/D REGISTRUL DE CONTROL
bit 7 ADFM: A/D Formatul bitului de selecție rezultat
1 = Aliniat la dreapta
0 = Aliniat la stanga
bit 6 Neimplementat: Citit ca și ‘0’
bit 5-3 ACQT<2:0>: A/D Timpul de achiziție al biților de selecție
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>: A/D Conversia ceasului de selecție al biților
111 = FRC (ceasul este derivat din oscilatorul A/D RC)(1)
110 = FOSC/64
101 = FOSC/16
100 = FOSC/4
011 = FRC (ceasul este derivat din oscilatorul A/D RC)(1)
010 = FOSC/32
001 = FOSC/8
000 = FOSC/2
Nota 1: Dacă sursa ceasului A/D FRC este selectată, o întârziere a instrucțiunii ciclului TCY este adăugată înainte de startul ceasului A/D. Acesta permite instrucțiunii SLEEP să fie executată înainte de startul conversiei.
Tensiunea de referință poate fi programată software și poate fi aleasă să fie diferența de tensiune între borna pozitiva (VDD ) și masă (VSS ) sau nivelul de tensiune de pe pinii RA3/AN3/VREF+ și RA2/AN2/VREF-.
Convertorul A/D are o caracteristică unică, aceea de a fi capabil să opereze în timp ce dispozitivul este în modul Sleep. Pentru a opera în modul Sleep, ceasul de conversie A/D trebuie să fie derivat din oscilatorul intern RC al A/D-ului.
Ieșirea din așteptare este intrarea în convertor, care generează rezultatul prin succesive aproximări.
Dispozitivul Reset forțează toate registrele din starea Reset. Acesta forțează modulul A/D pentru a fi oprit și orice conversie care este în curs este întreruptă.
Fiecare pin din port asociat cu convertorul A/D poate fi configurat ca o intrare analogică sau ca o intrare-ieșire digitală. Registrele ADRESH și ADRESL conțin rezultatele conversiei A/D. Când conversia A/D este completă, rezultatul este încărcat în registrul pereche ADRESH:ADRESL, bitul GO/DONE (registrul ADCON0) este golit și întreruperea bitului de flag, ADIF (PIR<6>), este setată.
Valoarea din registrii ADRESH:ADRESL nu este modificată după realizarea unei reporniri ca urmare al unui Reset. Regiștrii ADRESH:ADRESL vor conține o valoare necunoscută dupa o resetare.
După ce modulul A/D a fost configurat cum s-a dorit, selectarea canalului trebuie să fie făcută înainte să înceapă conversia. Intrarea canalelor analogice trebuie să conțină biții TRIS corespunzători selectați ca și intrare. Pentru a determina timpul de achiziție de folosește formula:
TACQ = Amplifier Settling Time + Holding Capacitor Charging Time + Temperature Coefficient
= TAMP + TC + TCOFF
După ce timpul de achiziție a ajuns la final, conversia A/D trebuie să înceapă. Timpul de achiziție poate fi programat să se desfașoare setând bitul GO/DONE si timpul actual de incepere a conversiei.
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 porneste 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 TAD ca timpul de conversie pe bit. Pentru inceperea următoarei achiziții trebuie așteptat minim 2TAD.
Principiul conversiei analog numerice este prezentat in figura de mai jos:
Figura 7: Conversie A/D prin aproximari successive
CAPITOLUL IV: Modulația în durată a impulsurilor (PWM)
Familia de dispositive, PIC18F8722, are un total de 5 module CCP (Capture/Compare/PWM). Două dintre acestea (CCP4 si CCP5) implementează modul standard Capture, Compare și modul Pulse-Width Modulation (PWM) ce urmează a fi discutate. Celelalte trei module (ECCP1, ECCP2, ECCP3) implementează modul standard Capture și modul Compare, la fel ca și modul PWM.
Modul de configurare CCP
Fiecare modul Capture/Compare/ PWM este asociat cu un registru de control (în general, CCPxCON) și un registru de date (CCPRx). Registrul de date, în schimb, este alcătuit din două registere de 8 biți: CCPRxL (octetul cel mai putin semnificativ) și CCPRxH(octetul cel mai semnificativ). Toate registrele pot fi citite și scrise.
Modulele CCP și Timer
Modulele CCP/ECCP utilizează Timerele 1,2,3 sau 4, în funcție de modul selectat. Timer1 și Timer2 sunt disponibile pentru module în modul Capture sau Compare, pe când Timer2 și Timer4 sunt disponibile pentru module în modul PWM.
Atribuirea unui anumit timer unui modul este determinată de biții de enable Timer la CCP din registrul T3CON. În funcție de configurația selectată, până la patru timere pot fi active simultan, cu modulele în acceași confiurație (Capture, Compare sau PWM) împărțind aceeași resursă timer.
Pinul de atribuire ECCP2
Pinul de atribuire pentru ECCP2 (Capture Input, Compare și ieșirea PWM) se poate schimba, în funcție de configurație. Bitul de configurare CCP2MX determină care pin ECCP2 este multiplexat. Implicit, este asignat pinului RC1 (CCP2M = 1). Dacă bitul de configurare este șters, ECCP2 este multiplexat cu RE7 în modul microcontrolerului, sau cu RE3 în toate celelalte moduri.
Schimbând pinul de atribuire al ECCP2 nu se schimba automat toate cerințele pentru configurarea pinului port. Utilizatorul trebuie să verifice întotdeauna ca registrul TRIS adecvat este configurat correct pentru ca operația ECCP2 să funcționeze indiferent de locul în care se află.
Modul Capture
În modul Capture, perechea de regiștrii CCPRxH:CCPRxL reține valoarea de 16-biți a registrelor TMR1 sau TMR3 atunci când apare un eveniment pe pinul CCPx corespunzător. Un eveniment este definit ca fiind 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.
Evenimentul este selectat de biții de selecție ai modului utilizând biții CCPxM<3:0> (CCPCON<3:0>). Atunci când o captură este făcută, bitul pentru flagul de cerere de întrerupere, CCPxIF, este setat; Acesta trebuie să fie adus în zero prin software. Dacă apare o altă captură înainte ca valoarea din registrul CCPRx să fie citită, vechea valoare capturată este suprascrisă de noua valoare capurată.
Pinul de configurație CCPx
În modul Capture, pinii adecvați CCPx trebuie să fie configurați ca intrări prin setarea în mod corespunzător a bitului de direcție TRIS.
Nota: Dacă un pin CCPx este configurat ca o ieșire, o scriere în port poate fi considerată o condiție de captură validă.
Modul de selecție TIMER1/TIMER3
Timerele care urmează să fie folosite cu caracteristica de captură (TIMER1 și/sau TIMER3) trebuie să ruleze în modul timer sau modul counter sincronizat. În modul counter asincron, operațiunea de captură nu va funcționa. Fiecare modul CCP din timerul care urmează să fie folosit poate fi selectat în registrul T3CON.
Întreruperea Software
Atunci când modul Capture se schimbă, exista posibilitatea să se genereze o întrerupere de captură falsă. Utilizatorul trebuie să păstreze bitul de acceptare a întreruperilor CCPxIE în zero pentru a evuta apariția de întreruperi false. Bitul de fanion de întrerupere CCPxIF ar trebui de asemenea să se șteargă după fiecare schimbare în modul de operare.
Prescaler-ul CCP
Există patru setări ale prescaler-ului în modul Capture. Ele sunt specificate ca parte a modului de funcționare prin biții de selecție ai modului (CCPxM<3:0>). Ori de câte ori modulul CPP este oprit, sau modul Capture este dezactivat, contorul prescaler-ului este șters. Asta inseamnă că orice Reset va șterge counter-ul prescaler-ului.
Trecerea de la un prescaler Capture la altul poate să genereze o întrerupere. De asemenea, counter-ul prescaler-ului nu va fi resetat; de aceea prima captura s-ar putea să nu fie de la un prescaler diferit de zero.
Modul de comparare
În modul Compare, valoarea de 16 biți a registrului CCPRx este constant comparată cu valoarea pereche a registrului TMR1 sau TMR3. Când acest lucru se întâmplă, pinul CCPx trebuie să fie:
– pus în high;
– pus în low;
– comutat (high to low sau low to high);
– rămân neschimbate (reflectă starea de blocare I/O).
Acțiunea asupra pinului se bazează pe valoarea modului de selecție al biților (CCPxM<3:0>). În același timp, întreruperea flagului bit, CCPxIF, este setată.
Pinul de configurare CCPx
Userul trebuie să configureze pinul CCPx ca ieșire, resetand bitul corespunzator TRIS.
Notă: Resetând registrul CCPxCON se va forța compararea latch-ului de ieșire (în funcție de configurarea dispozitivului) să fie setat la nivelul implicit low. Acesta nu este latch-ul de date al port-ului I/O.
Modul de selecție TIMER1/TIMER3
Timer1 și/sau Timer 3 trebuie să ruleze în modul Timer sau modul counter sincronizat dacă modulul CCP este folosit pentru a compara. În modul counter asincronizat, operația de comparare s-ar putea să nu funcționeze.
Modul întreruperii software
Atunci când modul de generare al întreruperii software este ales (CCPxM<3:0>=1010), pinul CCPx corespunzător nu este afectat. Doar o întrerupere CCP este generată, dacă este activată și bitul CCPxIE este setat.
Evenimentul special TRIGGER
Toate modulele CCP sunt echipate cu un Trigger pentru eveniment special. Acesta este un semnal intern hardware generat în modul Compare pentru a declanșa acțiuni de către alte module. Trigger-ul pentru evenimente speciale este activat prin selectarea modului Compare specific acestuia (CCPxM<3:0>=1011).
Pentru toate modulele CCP, trigger-ul pentru evenimente speciale resetează perechea registrului timer pentru orice resursă timer care este atribuit în prezent ca bază de timp al modulului. Aceasta permite registrelor CCPRx să servească ca un registru cu perioada programabilă pentru oricare timer.
Trigger-ul pentru evenimente speciale ECCP2 poate să înceapă cu conversia A/D. Pentru a se putea realiza, convertorul A/D trebuie să fie deja pornit.
Modul PWM
În modul PWM, pinul CCPx poate să producă o ieșire PWM cu o rezoluție de până la 10 biți. Deoarece pinii CCP4 și CCP5 sunt multiplexați cu un latch de date din PORTG, bitul TRISG corespunzător trebuie să fie resetat pentru a face pinul CCP4 sau CCP5 ca ieșire.
Frecvența PWM-ului este inversul perioadei(1/[PWM period]).
Figura 8: Ieșire PWM
Prin scrierea registrului PR2 (sau PR4) al modulului Timer2, respectiv Timer 4, putem obține perioada PWM-ului.
Această perioadă se poate calcula folosind următoarea formula:
Unde
TPWM -> reprezintă perioada PWM-ului
TOSC -> reprezintă perioadă de oscilație a ceasului
TMR2PRE -> reprezintă valoarea de prescalare.
Pot avea loc următoarele acțiuni, atunci când TMR2 este egal cu PR2:
Se resetează TMR2;
Se resetează pinul CCPx, cu excepția cazului în care factorul de umplere este egal cu 0;
Se transferă valoarea registrului CCPRxL în registrul CCPRxH.
Factorul de umplere este obținut prin scrierea biților 5 și 4 din registrul CCPxCON și scrierea registrului CCPR1L. Acesta se calculează cu următoarea relație:
Notă: ”Resetarea registrului CCP4CON sau CCP5Con va forța ieșirea latch RG3 sau RG4 (depinzând de configurarea dispozitivului) la nivelul low implicit. Acesta nu este latch-ul de date al PORTG de I/O”.
Tratarea întreruperilor
Familia de dispozitive PIC18F8722 dispune de numeroase surse de întrerupere și posibilitatea de asignare de priorități întreruperilor, ceea ce permite celor mai multe surse de întreruperi să le fie asignate întreruperi de un nivel mai înalt sau de un nivel mai scăzut de prioritate. Întreruperea cu prioritatea cea mai inaltă se găsește la adresa 0008h și întreruperea scăzută se găsește la adresa 0018h.
Evenimentele de întrerupere de mare prioritate vor întrerupe orice întrerupere cu prioritate scăzută care pot rula în acel moment.
Microcontroler-ul dispune de 10 regiștrii ce se folosesc pentru a controla operațiile de întrerupere. Aceștia sunt:
RCON;
INTCON;
INTCON2;
INTCON3;
PIR1, PIR2, PIR3;
PIE 1, PIE2, PIE3;
IPR1, IPR2, IPR3.
În general, sursele întreruperilor dispun de trei biți ce controlează aceste operații. Cei trei biți sunt:
Bitul de flag (flag bit) ce indică dacă a avut loc o întrerupere.
Bitul de activare (enable bit) ce permite executarea programului de ramură la adresa vectorului de întrerupere atunci când bitul flag este setat.
Bitul de prioritate (priority bit) ce selectează prioritatea înaltă sau scăzută.
Caracteristica priorității întreruperii este să permită setarea bitului IPEN (RCON<7>). Atunci când prioritatea întreruperii este activată, există doi biți ce activează întreruperile globale. Setând bitul GIEH (INTCON<7>) se activează toate întreruperile ce au setat bitul de prioritate (high priority). Setând bitul GIEL (INTCON<6>) se activează toate întreruperile ce au prioritatea bitului scazută (low priority). Atunci când flagul de întrerupere, bitul de activare și bitul de setare al întreruperii globale corespunzătoare sunt setați, întreruperea va fi trimisă imediat la adresa 0008h sau 0018h, în funcție de prioritatea bitului setat. Individual, întreruperile pot fi dezactivate prin intermediul resetării bitilor corespunzători.
Atunci când IPEN este resetat, prioritatea întreruperii este dezactivată și întreruperile sunt compatibile cu dispozitivele din gama de mijloc PIC. În modul de compatibilitate, biții priorității de întrerupere pentru fiecare sursă nu au niciun efect. INTCON<6> este bitul PEIE ce permite activarea/dezactivarea tuturor surselor de întrerupere periferice. INTCON<7> este bitul GIE ce permite activarea/dezactivarea tuturor surselor de întrerupere. Toate întreruperile se găsesc la adresa 0008h în modul de compatibilitate.
Atunci când o întrerupere răspunde, întreruperea globală permite bitului să fie resetat pentru a dezactiva întreruperile suplimentare. Dacă bitul IPEN este resetat, acesta va reseta și bitul GIE. Dacă nivelul priorității întreruperii este folosit, bitul va fi GIEH sau GIEL. Sursele de întreruperi cu prioritatea înaltă pot întrerupe o întrerupere cu o prioritate scăzută. Întreruperile cu prioritatea scăzută nu rulează cât timp întreruperile cu prioritate înaltă rulează.
Adresa returnată este impinsă într-o stivă și PC-ul este încărcat cu adresa vectorului de întrerupere (0008h sau 0018h). O data aflați în rutina de tratare a întreruperii, sursa întreruperilor poate fi determinata prin interogarea biților de flag ai întreruperii. Biții de flag ai întreruperii trebuie să fie resetați software înainte de reactivarea întreruperilor pentru a evita întreruperile recursive.
Instrucțiunea “întoarcerea de la întrerupere”, RETFIE, închide întreruperile de rutină și setează bitul GIE (GIEH sau GIEL în funcție de nivelele priorității folosite), care reactivează întreruperile.
Pentru evenimentele întreruperilor externe, cum ar fi pinii INTx sau schimbarea intrării întreruperii PORTB, latenta întrerupere va fi de la trei la patru cicluri program. Latenta exactă este aceeași pentru una sau două cicluri ale instrucțiunilor. Biții fanion ai întreruperilor individuale sunt setați, indiferent de statusul biților de activare corespunzători sau de statusul bitului GIE.
CAPITOLUL V: Controlul debitului de aer În instalația labvolt 3522-05
Prezentarea instalației de laborator LabVolt 3522-05
Scopul primar al controlului este menținerea unei variabile fizice, numită variabilă controlată, la o valoare specifică cerută sau într-o gamă cerută. Această variabilă ar putea fi, de exemplu, temperatura, debitul, etc. Pentru a controla procesul, pot fi utilizate controlul sistemului în buclă deschisă sau controlul sistemului în buclă închisă.
Instalația are două părți, una pentru controlul temperaturii și cealaltă pentru controlul debitului de aer. Cele două componente pot fi folosite simultan pentru diferite configurații.
Partea de reglare a temperaturii este alcătuită dintr-o rezistență electrică și un traductor de temperatură. Rezistență electrică poate fi comandată prin tensiune între 0-5V sau curent 4-20mA. Traductorul de temperatură transmite o tensiune între 0-5V sau curent 4-20mA.
Pe lângă traductor și elementul de execuție se mai găsesc și două potențiometre pentru calibrarea senzorului de temperatură.
Partea de reglare a temperaturii este prezentată în Figura 26
Figura 29 – Reglarea temperaturii
Pentru reglarea debitului de aer instalația folosește un traductor de debit ce măsoară debitul de aer trecut printr-un tub venturi. Ca element de execuție se folosește un ventilator.
La fel ca la partea de reglare a temperaturii sunt folosite semnale unificate de tensiune 0-5V și curent 4-20mA.
Partea de reglare a debitului arată ca în Figura 27 .
Figura 30 – Reglarea debitului de aer
Pentru a se face reglarea corect, masa instalației trebuie conectată la masa regulatorului.
Componentele instalației de reglare a debitului
Instalația de control a proceselor de temperatură sau debit LabVolt permite controlul temperaturii și debitului. Mai mult, temperatura procesului poate fi controlată fie în modul “încălzire” fie în modul “răcire”.
În esență instalația constă dintr-un tub ce permite trecerea aerului, un ventilator utilizat pentru circularea aerului, un amortizor utilizat pentru modificarea de sarcini sau generarea perturbațiilor, un element de încălzire și traductoare de temperatură și debit.
Figura 31 arată interiorul instalației. Identificarea și descrierea fiecărei componente a instalației este prezentată mai jos.
1. Canalul de intrare: deschidere cu grilaj prin care aerul intră în tub.
2. Încălzitorul: constă dintr-un element de încălzire care convertește energia electrică în căldură și un radiator pentru disiparea căldurii.
3. Tub Venturi: secțiune îngustată a tubului de-a lungul căreia este creată o presiune diferențială când este parcursă de aer. Cu cât debitul de aer care trece prin tub este mai mare, cu atât presiunea diferențială este mai mare.
4. Amortizorul: un orificiu în tub care este utilizat pentru crearea de perturbații prin modificarea debitului de aer care curge prin tub.
5. Ventilatorul: este utilizat pentru a crea un debit de aer prin tub. Când ventilatorul se rotește, el trage aerul în tub prin orificiul de intrare și îl trimite către ieșire.
6. Ieșirea tubului: deschidere cu grilaj prin care aerul părăsește tubul.
Figura 9: Instalația de control a proceselor de temperatură și debit
7. Motorul ventilatorului: convertește tensiunea sau curentul de la intrarea de control a ventilatorului într-o putere proporțională utilizată pentru antrenarea ventilatorului.
8. Traductorul de debit: măsoară presiunea diferențială de-a lungul tubului și produce o tensiune standardizată (0-5 V) sau un curent (4-20 mA) proporționale cu presiunea ce pot fi transmise la regulator.
9. Traductorul de temperatură: produce o tensiune (0-5 V) și un curent (4-20 mA) proporționale cu temperatura radiatorului. În acest scop, traductorul măsoară o tensiune generată de un senzor semiconductor și o convertește într-una utilă, tensiune sau curent standardizate care pot fi transmise la regulator.
10. Motorul încălzitorului: convertește tensiunea sau curentul de la intrarea de control a încălzitorului într-o putere proporțională utilizată pentru antrenarea încălzitorului.
Așa cum se observă în Figura 31, ventilatorul face ca aerul să circule prin crearea unei presiuni foarte mici la ieșirea din tub. Acest lucru face ca presiunea atmosferică de la intrarea tubului, să forțeze circulația aerului prin tub. Cu cât viteza ventilatorului este mai mare, cu atât diferență de presiune este mai mare și deci cu atât debitul de aer ce va circula prin tub va fi mai mare.
Conform legii conservării masei, masa de aer ce intră în tub în orice moment de timp este egală cu masa aerului care părăsește tubul. Acest lucru implică faptul că debitul de aer este constant.
Pentru a menține un debit constant, viteza aerului trebuie să crească atunci când aerul trece prin tubul Venturi, datorită scăderii secțiunii transversale a canalului. Acest lucru înseamnă că viteza aerului la intrarea tubului Venturi, v1, este mai mică decât viteza aerului din interiorul acesteia.
Conform ecuației lui Bernoulli, dacă viteza aerului crește, atunci presiunea aerului este în descreștere. Acest lucru înseamnă că presiunea aerului pe partea de intrare a tubului Venturi, este mai mare decât presiunea aerului din tubul Venturi. Cu cât viteza aerului prin tubul Venturi este mai mare, cu atât presiunea diferențială va fi mai mare de-a lungul tubului Venturi.
Când nu se alimentează elementul de încălzire, radiatorul se află la temperatura camerei indiferent de viteza ventilatorului. Când ventilatorul funcționează, temperatura radiatorului va scădea odată cu creșterea vitezei ventilatorului. Această descreștere are loc deoarece creșterea vitezei ventilatorului face să crească rata schimbului de căldură dintre radiator și aer.
Calibrarea traductorului de debit
Procedura de calibrare a traductorului pentru debitul de aer este similară cu calibrarea senzorului de temperatură. Deosebirea este că în acest caz, nu este nevoie să așteptăm pentru a obține valoarea maximă a debitului de aer deoarece la comandă maximă pentru ventilator, în foarte scurt timp debitul prin tubul venturi va fi maxim. Tot ce avem de făcut este să punem potențiometrele zero și span în pozițiile corespunzătoare pentru a avea la ieșire tensiune 0 pentru cea mai mică turație a ventilatorului, și 5V pentru cea mai mare turație.
Potențiometrele pentru calibrarea traductorului pentru debit se pot vedea în Figura 9.
Figura 10:Potențiometre pentru calibrarea traductorului de debit
Conducerea procesului de reglare a debitului de aer
În cazul unui sistem de reglare în buclă deschisă, variabila controlată nu rămâne la valoarea dorită în cazul apariției unei perturbații, deoarece sistemul controlează puterea aplicată elementului de execuție și nu temperatura sau debitul.
Adăugarea unui regulator și a unei bucle cu reacție inversă reduce variațiile variabilei controlate. Acest tip de sistem, prezentat în Figura 34, este numit sistem de conducere în buclă închisă. Acesta poate menține variabila controlată aproape constantă peste o gamă dată de sarcini sau perturbații:
– bucla cu reacție inversă conține un senzor ce măsoară valoarea variabilei controlate și generează un semnal proporțional care este trimis înapoi la regulator;
– regulatorul calculează eroarea ce reprezintă diferența dintre valoarea de referință și variabila măsurată și corectează această diferență prin reajustarea elementului de control până este atinsă o stare de echilibru. Eroarea este diferită de zero când operatorul schimbă valoarea de referință în mod intenționat sau când schimbările de perturbații sau sarcina modifică variabila controlată;
Figura 11: Conducerea în bucla închisa a proceselor de debit ale instalației
Figura 10 prezintă conducerea în buclă închisă a sistemului de reglare a debitului de aer ce trece prin incinta instalației:
– bucla cu reacție inversă constă dintr-un traductor de presiune care măsoară debitul de aer ce trece prin instalație și generează o tensiune proporțională cu acesta. Această tensiune, numită tensiune de reacție, este transmisă la regulator;
– regulatorul compară tensiunea de reacție, tensiunea referinței și corectează orice diferență dintre cele două prin modificarea puterii aplicate la ventilator până ce este atinsă o stare de echilibru. Dezavantajul principal al utilizării sistemelor de conducere cu reacție inversă este faptul că trebuie să aibă loc o schimbare.
Capitolul V: Mediul de dezvoltare
Mediul MPLAB IDE
MPLAB IDE a fost folosit pentru a programa microcontrollerul PIC 18F8722 utilizat în această aplicație. MPLAB IDE, un Mediu Integrat de Dezvoltare, este un set de instrumente gratuit, pus la dispoziție de către Microchip. Versiunea actuala a MPLAB IDE este versiunea 8. Este o aplicație pe 32-biți ce ruleaza sub Windows și include si alte programe componente gratuite pentru dezvoltarea aplicațiilor, emularea hardware sau debugging.
MPLAB IDE poate fi folosit nativ atât cu limbaj de asamblare cât și cu limbaj C. Alte limbaje de programare ar putea fi suportate prin intermediul instalării unor programe suplimentare.
Exemple de coduri, tutoriale si drivere se pot gasi pe site-ul Microchip. MPLAB IDE nu ruleaza pe Linux, Unix sau Mac.
Print screen lucrare: PWM
Print screen lucrare: Răspunsul la semnal treaptă
Concluzii
Bibliografie
[SSRA05] – Marin, Constantin, Structuri și legi de reglare automată, Ed. Sitech, Craiova, 2005;
Referințe web
[MICROCHIP] http://ww1.microchip.com/downloads/en/DeviceDoc/39564c.pdf
[WIKI] – disponibil via web la adresa http://en.wikipedia.org/wiki/
Codul sursă
#include <xc.h>
#include <spi.h>
#include <delays.h>
#include <stdlib.h>
#include <math.h>
#include <adc.h>
/*
#pragma config FCMEN = OFF
#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;
float uk=0, uk1=0, ek=0, ek1=0, ek2=0, b0=0, b1=0, b2=0;
float T= 0.001, k=3,Ti= 0.05, Td= 0;
unsigned int ADCResult=0;
float voltage = 0;
double referinta = 0;
char buf1[8];buf2[8];
void interrupt intrerupereS1(void)
{
if(INTCONbits.INT0IE && INTCONbits.INT0IF)
{
referinta += 0.5;
if (referinta>5)
referinta=0;
}
INTCONbits.INT0IF = 0; // resetare flag
}
void setupADC()
{
ADCON0bits.ADON = 1; // Activare modul A/D
ADCON1=0b00001110; // AN1 = analog input
ADCON2=0b10111010; // right Justified Fosc/32
}
unsigned int getADC(unsigned char channel)
{
ADCON0bits.CHS = channel;
ADCON0bits.GO = 0b1;
while(ADCON0bits.DONE);
return (ADRESH<<8)|ADRESL;
}
void main(void)
{
OSCCONbits.IRCF2=1;
OSCCONbits.IRCF1=0;
OSCCONbits.IRCF0=0;
double i_val, f_val, val,i_val1, f_val1;
INTCONbits.GIE=1;
INTCONbits.INT0IE=1;
INTCONbits.INT0IF=0;
INTCON2bits.INTEDG0=1;
CCPR1L = 0;
b0 = k*(1+T/(2*Ti) + Td/T);
b1 = k*(-1+T/(2*Ti) -2 * Td/T);
b2 = k*(Td/T);
setupADC();
while(1){
/* for(i=0;i<10;i++)
_delay(50000);
*/
TRISAbits.RA2=0;
CS=1;
OpenSPI1(SPI_FOSC_64, MODE_10, SMPEND);
setIODIR(IODIRB_ADDRESS,0x00);
setIODIR(IODIRA_ADDRESS,0x00);
lcdCommand(0b00111111);
lcdCommand(0b00001111);
lcdCommand(0b00000001);
lcdCommand(0b00000110);
f_val = modf(referinta, &i_val);
itoa(buf1, i_val, 10);
//itoa(buf1, ADCResult, 10);
lcdWriteString(buf1);
lcdChar('.');
val=f_val*100;
f_val1 = modf(val, &i_val1);
itoa(buf2, i_val1, 10);
lcdWriteString(buf2);
lcdGoTo(0x40); // salt la linia 2
// get the result on channel 0
ADCResult = getADC(1);
voltage = (ADCResult * 5.0)/1024;
//CloseADC();
f_val = modf( voltage, &i_val);
itoa(buf1, i_val, 10);
//itoa(buf1, ADCResult, 10);
lcdWriteString(buf1);
lcdChar('.');
val=f_val*100;
f_val1 = modf( val, &i_val1);
itoa(buf2, i_val1, 10);
lcdWriteString(buf2);
lcdChar('V');
CloseSPI1();
CCP1CON=0b00001100;
PR2 = 0xFF;
T2CONbits.TMR2ON = 1;
T2CONbits.T2CKPS1 = 1;
T2CONbits.T2CKPS0 = 1;
while (!PIR1bits.TMR2IF);
TRISCbits.RC2=0;
ek = referinta – voltage;
uk= uk1 + ek*b0 + ek1*b1 + ek2*b2;
// u = k * eps;
if(uk<0)
uk=0;
if (uk>5)
uk=5;
CCPR1L = uk*51;
uk1=uk;
ek2=ek1;
ek1=ek;
}
}
void setGPIO(char address, char value)
{
CS=0; // inceputul transmisiei
WriteSPI1(0x40);
WriteSPI1(address);
WriteSPI1(value);
CS=1; // sfarsitul transmisiei
}
void setIODIR(char address, char dir)
{
CS=0;
WriteSPI1(0x40);
WriteSPI1(address); // selectare IODIRB
WriteSPI1(dir); // setare directie
CS=1;
}
void lcdCommand(char command)
{
setGPIO(GPIOA_ADDRESS,0x00); // E=0
Delay10TCYx(0);
setGPIO(GPIOB_ADDRESS, command);
Delay10TCYx(0);
setGPIO(GPIOA_ADDRESS,0x40);
Delay10TCYx(0);
setGPIO(GPIOA_ADDRESS,0x00);
Delay10TCYx(0);
}
void lcdChar(unsigned char letter)
{
setGPIO(GPIOA_ADDRESS,0x80);
Delay10TCYx(0);
setGPIO(GPIOB_ADDRESS,letter);
setGPIO(GPIOA_ADDRESS, 0xc0);
Delay10TCYx(0);
setGPIO(GPIOA_ADDRESS,0x00);
Delay10TCYx(0);
}
void lcdGoTo(char pos)
{
lcdCommand(0x80+pos);
}
void lcdWriteString(unsigned char *s)
{
while(*s)
lcdChar(*s++);
}
Index
B
Bibliografie 9
C
CUPRINSUL xi
D
Dimensiuni 3
F
Figuri 4
Formulele matematice 4
I
Ilustrațiile 4
L
Legenda 6
LISTA FIGURILOR xii
LISTA TABELELOR xiii
R
Referințe web 10
S
Structura documentului 2
T
Tabele 5
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Controlul Unei Instalatii Quanser Folosind Microcontrollerul Pic 18f8722 (ID: 162247)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
