Sunteți pe pagina 1din 92

Universitatea Politehnica din Bucureti Facultatea de Electronic, Telecomunicaii i Tehnologia Informaiei

Controlul turaiei motoarelor de curent continuu folosind microcontroler PIC i msurarea tensiunii autoinduse

Lucrare de licen
Prezentat ca cerin parial pentru obinerea titlului de Inginer n domeniul Electronic i Telecomunicaii/ Calculatoare i Tehnologia Informaiei programul de studii Electronica Aplicata

Conductor tiinific
Prof. Dr. Ing. Sever PACA

Absolvent
Alexandru Marius DOBRE

2011

Universitatea Politehnica din Bucureti Facultatea de Electronic, Telecomunicaii i Tehnologia Informaiei Catedra Electronic Aplicat i Ingineria Informaiei Aprobat ef de Catedr: Prof. Dr. Ing. D. A. Stoichescu TEMA LUCRRII DE LICEN a studentului Alexandru Marius DOBRE 1. Titlul temei: Controlul turaiei motoarelor de curent continuu folosind microcontroller PIC i msurarea tensiunii autoinduse. 2. Date iniiale: - Platforma Microchip PICDEM Mechatronics - Motor de curent continuu 5-9 V MABUCHI RS-385PH - Reglajul turaiei cu ajutorul PWM - Metod de feedback: tensiunea autoindus 3. Coninutul memoriului: - Controlul turaiei motoarelor de curent continuu - Microcontrolerul PIC16F917 - Placa de dezvoltare PICDEM Mechatronics - Proiectare software a aplicaiei pentru microcontroller folosind limbaj C - Proiectare software a aplicaiei pentru PC folosind Visual Basic.NET - Rezultate experimentale - Bibliografie 4. Forme de prezentare: - Lucrare de licen tiprit i n format electronic pe CD - Prezentare PowerPoint - Model experimental, surse software 5. Contribuia studentului: - Sintez teoretic despre controlul motoarelor de curent continuu - Prezentarea sistemului de dezvoltare PICDEM Mechatronics - Implementare i testare software o Program n limbaj C pentru microcontrollerul PIC16F917 o Aplicaie PC folosind Visual Basic.NET 6. Lucrarea servete ca: autodotare 7. Locul de desfurare a activitii: Facultatea de Electronic, Telecomunicaii i Tehnologia Informaiei, UPB, Leu B324 8. Mijloacele materiale sunt puse la dispoziie de: UPB 9. Realizarea practic rmane n proprietatea: UPB 10. Data eliberrii temei: 08.10.2010 CONDUCTOR LUCRARE: Prof. Dr. Ing. Sever PACA STUDENT: Alexandru Marius DOBRE

Declaraie de onestitate academic

Prin prezenta declar c lucrarea cu titlul Titlul complet al proiectului, prezentat n cadrul Facultii de Electronic, Telecomunicaii i Tehnologia Informaiei a Universitii Politehnica din Bucureti ca cerin parial pentru obinerea titlului de Inginer/ Master n domeniul Inginerie Electronic i Telecomunicaii/ Calculatoare i Tehnologia Informaiei, programul de studii Electronica Aplicata este scris de mine i nu a mai fost prezentat niciodat la o facultate sau instituie de nvmnt superior din ar sau strintate. Declar c toate sursele utilizate, inclusiv cele de pe Internet, sunt indicate n lucrare, ca referine bibliografice. Fragmentele de text din alte surse, reproduse exact, chiar i n traducere proprie din alt limb, sunt scrise ntre ghilimele i fac referin la surs. Reformularea n cuvinte proprii a textelor scrise de ctre ali autori face referin la surs. neleg c plagiatul constituie infraciune i se sancioneaz conform legilor n vigoare. Declar c toate rezultatele simulrilor, experimentelor i msurtorilor pe care le prezint ca fiind fcute de mine, precum i metodele prin care au fost obinute, sunt reale i provin din respectivele simulri, experimente i msurtori. neleg c falsificarea datelor i rezultatelor constituie fraud i se sancioneaz conform regulamentelor n vigoare. Bucureti, Alexandru Marius DOBRE

Cuprins
Capitolul 1. Introducere......................................................................................................................14 1.1 Obiectivul lucrrii.....................................................................................................................14 1.2 Scopul lucrrii..........................................................................................................................14 1.3 Contribuia studentului.............................................................................................................14 Capitolul 2. Prezentare teoretic.........................................................................................................15 2.1 Plac de dezvoltare PICDEM Mechatronics............................................................................15 2.1.1 Introducere.........................................................................................................................15 2.1.2 Descrierea plcii de dezvoltare..........................................................................................15 2.1.3 Faciliti.............................................................................................................................16 2.2 Microcontrolerul PIC16F917...................................................................................................18 2.2.1 Prezentare general............................................................................................................18 2.2.2 Organizarea memoriei.......................................................................................................19 2.2.3 Porturile I/O.......................................................................................................................22 2.2.4 Modulul oscilator (cu sistem de monitorizare a ceasului).................................................22 2.2.5 Modulele Timer.................................................................................................................23 2.2.6 Modulul comparator..........................................................................................................24 2.2.7 Transmitor Receptor Sincron Asincron Universal (AUSART)......................................25 2.2.8 Modulul de comand al ecranului LCD............................................................................27 2.2.9 Convertorul analog digital (ADC).....................................................................................28 2.2.10 Modulul de Stocare/Comparare/PWM (CCP).................................................................30 2.3 Afiaje cu cristale lichide (LCD)..............................................................................................34 2.4 Motorul de curent continuu cu perii.........................................................................................36 2.4.1 Introducere.........................................................................................................................36 2.4.2 Principiu de funcionare....................................................................................................36 2.4.3 Tipuri de motoare de curent continuu...............................................................................37 2.4.4 Modele de circuite de comand.........................................................................................38 2.4.5 Controlul vitezei................................................................................................................40 2.4.6 Elemente constructive ale motorului de curent continuu cu perii cu magnei permaneni ....................................................................................................................................................41 2.4.7 Tensiunea electromotoare autoindus...............................................................................42 Capitolul 3. Proiectare software.........................................................................................................45 3.1 Introducere................................................................................................................................45 3.2 Proiectarea software pentru microcontroler.............................................................................45 3.2.1 Introducere.........................................................................................................................45 3.2.2 Semnificaia i funciile componentelor:...........................................................................46 3.2.3 Stabilirea unui protocol de comunicare ntre microcontroler i PC..................................47

3.2.4 Descrierea algoritmului i a codului sursa.........................................................................48 3.3 Proiectarea software pentru PC................................................................................................57 3.3.1 Introducere.........................................................................................................................57 3.3.2 Prezentarea interfeei grafice.............................................................................................57 3.3.3 Descrierea general a algoritmului....................................................................................60 Capitolul 4. Date experimentale.........................................................................................................62 4.1 Introducere................................................................................................................................62 4.2 Msurarea vitezei reale de rotaie.............................................................................................62 4.3 Tensiunea medie a semnalului PWM.......................................................................................65 4.4 Legtura dintre viteza de rotaie i tensiunea electromotoare autoindus................................66 Capitolul 5. Concluzii.........................................................................................................................71 Bibliografie........................................................................................................................................73 Capitolul 6. ANEXA 1 Schema plcii de dezvoltare PICDEM Mechatronics...............................75 ANEXA 2 Structura intern a microcontrolerului PIC16F917......................................................76 ANEXA 3 Funciile pinilor pentru microcontrolerul PIC16F917..................................................77 ANEXA 4 Schema electric simplificat a proiectului..................................................................78 ANEXA 5 Descrierea modulului de comand pentru ecranul LCD..............................................79 ANEXA 6 - Schema ecranului LCD VIM-332.................................................................................79 ANEXA 7 Codul surs al aplicaiei pentru microcontroler............................................................80 ANEXA 8 Codul surs al aplicaiei PC..........................................................................................86

Lista figurilor:

Figura 2.1 Placa de dezvoltare PICDEM Mechatronics[1]................................................................16 Figura 2.2 Harta memoriei de program..............................................................................................20 Figura 2.3 ncrcarea numrtorului de program...............................................................................21 Figura 2.4 Un singur comparator........................................................................................................25 Figura 2.5 Generarea ceasului pentru LCD........................................................................................28 Figura 2.6 Schema bloc a circuitului de conversie analog digital....................................................29 Figura 2.7 Alinierea rezultatului conversiei A/D...............................................................................30 Figura 2.8 Schema bloc de funcionare n modul stocare..................................................................31 Figura 2.9 Schema bloc de funcionare n modul comparare.............................................................32 Figura 2.10 Schema bloc simplificata pentru funcionarea CCP n modul PWM..............................33 Figura 2.11 Ieirea CCP n modul PWM............................................................................................34 Figura 2.12 Comanda direct a unui afiaj LCD cu un digit..............................................................34 Figura 2.13 Comanda multiplexata a unui LCD cu 3 digiti folosind 4 plane comune.......................35 Figura 2.14 Schema simplificat a unui motor de curent continuu....................................................36 Figura 2.15 Motor cu magnet permanent...........................................................................................37 Figura 2.16 Motor cu excitaie paralel..............................................................................................37 Figura 2.17 Motor cu excitaie serie...................................................................................................37 Figura 2.18 Motor cu excitaie mixt.................................................................................................38 Figura 2.19 Circuit de comand de tip A...........................................................................................38 Figura 2.20 Circuit de comand de tip B............................................................................................39 Figura 2.21 Schema unei punti H.......................................................................................................39 Figura 2.22 Utilizarea senzorului optic..............................................................................................41 Figura 2.23 Utilizarea senzorului Hall...............................................................................................41 Figura 2.24 Msurarea tensiunii electromotoare autoinduse folosind puntea H................................41 Figura 2.25 Elemente constructive ale motorului de cc. cu magnet permanent[6]............................42 Figura 2.26 T.e.m autoindus pentru factor de umplere 25%[8]........................................................43 Figura 2.27 T.e.m autoindus pentru factor de umplere 75%[8]........................................................44 Figura 2.28 T.e.m autoindus pentru factor de umplere 75% sub sarcin[8].....................................44 Figura 3.29 Diagrama sistemului de reglaj automat...........................................................................45 Figura 3.30 Diagrama buclei principale de program..........................................................................51 Figura 3.31 T.e.m autoindus pentru factor de umplere 68.62%.......................................................52 Figura 3.32 Diagrama rutinei adjustRPM..........................................................................................53 Figura 3.33 LCD cu 7 segmente.........................................................................................................55 Figura 3.34 Fereastra principal de program......................................................................................59 Figura 3.35 Fereastra informaii.........................................................................................................60

Figura 4.36 Osciloscop digital Tektronix TPS2014...........................................................................62 Figura 4.37 Rspunsul senzorului optic pentru un factor de umplere de 62.35%..............................63 Figura 4.38 Rspunsul senzorului optic pentru un factor de umplere de 87.45%..............................63 Figura 4.39 Dependena vitezei de rotaie de limea impulsului PWM............................................64 Figura 4.40 Semnal PWM pentru factor de umplere 24,7%..............................................................65 Figura 4.41 Semnal PWM pentru factor de umplere 68,63%............................................................65 Figura 4.42 Variaia tensiunii n funcie de limea impulsului PWM...............................................66 Figura 4.43 T.e.m autoindus pentru factor de umplere 43.52%.......................................................66 Figura 4.44 T.e.m autoindus pentru factor de umplere 68.62%.......................................................67 Figura 4.45 Viteza de rotaie n funcie de valoarea registrului ADRESH........................................68

Lista tabelelor:

Tabelul 2.1 Selecia bank-ului de memorie........................................................................................20 Tabelul 2.2 Sursa ceasului de sistem..................................................................................................24 Tabelul 2.3 Formule de calcul pentru rata de semn............................................................................26 Tabelul 2.4 Tensiuni de polarizare.....................................................................................................28 Tabelul 2.5 Resursele folosite de modulele CCP...............................................................................31 Tabelul 2.6 Interaciunea dintre cele dou module CCP....................................................................31 Tabelul 2.7 Configuraii de comand a motoarelor folosind puntea H..............................................40 Tabelul 3.8 Codificarea cifrelor hexazecimale...................................................................................56 Tabelul 4.9 Dependena vitezei de rotaie de limea impulsului PWM............................................63 Tabelul 4.10 Termeni necesari pentru determinarea dreptei de regresie............................................64 Tabelul 4.11 Variaia tensiunii n funcie de factorul de umplere al semnalului PWM.....................65 Tabelul 4.12 Viteza de rotaie n funcie de t.e.m autoindus............................................................67

Lista acronimelor

IDE PWM RISC SFR GPR LCD PC EEPROM AUSART

Integrated Development Environment (Mediu integrat de dezvoltare) Pulse Width Modulation (Modulatie in durata a impulsurilor) Reduced Instruction Set Controller (Controler cu set redus de instructiuni) Special Function Register (Registru de functii speciale) General Purpose Register (Registru de uz general) Liquid Crystal Dysplay (Afisaj cu cristale lichide) Program Counter (Numarator de program) Electrically Erasable Programmable Read-Only Memory Addressable Universal Synchronous/Asynchronous Receiver/Transmitter

13

Capitolul 1. Introducere
Motoarele de curent continuu sunt folosite ntr-o gam larg de aplicaii care necesit controlul turaiei: aparatura electrocasnic (mixere, maini de splat, ventilatoare), aplicaii din domeniul auto (maini hibride, controlul electronic al direciei, controlul electric al oglinzilor i al tergtoarelor de parbriz, etc.), componente de caculator (DVD Player, Hard Disc, Cooler), controlul roboilor mobili, controlul braelor robotice folosite n procesele industriale de fabricaie, componente de caculator (DVD Player, Hard Disc, Cooler) i altele. Sunt eficiente din punct de vedere al consumului de energie i pot fi alimentate folosind baterii sau celule solare.

1.1 Obiectivul lucrrii


Obiectivul acestui proiect este de a implementa un sistem de control al turaiei unui motor de curent continuu cu perii folosind un microcontroler PIC. Sistemul va fi capabil s menin motorul la o anumit viteza impus sub influena unei sarcini variabile.

1.2 Scopul lucrrii


Pentru a atinge obiectivul impus am folosit microcontrolerul PIC16F917 montat pe placa de dezvoltare PICDEM Mechatronics pentru a controla turaia unui motor de curent continuu cu perii i magnet permanent. Viteza real de rotaie a motorului este estimat prin msurarea tensiunii electromotoare autoinduse.

1.3 Contribuia studentului


Proiectarea celor dou module software pentru microcontroler i PC: 1. Programarea microcontrolerlui a fost realizat folosind limbajul C i mediul de dezvoltare MPLAB IDE al firmei Microchip. Aplicaia comanda motorul de curent continuu i afieaz rezultatele pe un ecran LCD de pe placa de dezvoltare. 2. Aplicaie software pentru PC cu rol de interfa pentru comanda motorului i vizualizarea n timp real a rezultatelor (graficul vitezei de rotaie n funcie de timp). Interfaa este realizat folosind limbajul Visual Basic.NET 2010 folosind mediul de dezvoltare Microsoft Visual Studio IDE. Comunicaia ntre microcontroler i PC este realizat prin intermediul portului serial folosind standardul RS-232.

14

Capitolul 2. Prezentare teoretic


2.1 Plac de dezvoltare PICDEM Mechatronics

2.1.1

Introducere

Placa de dezvoltare PICDEM Mechatronics[1] a fost conceput de firma MICROCHIP pentru a demonstra principiile ce stau la baza implementrii sistemelor mecatronice folosind microcontrolere PIC. Mecatronica reprezint integrarea controlului electronic n sistemele mecanice prin nlocuirea componentelor mecanice cu soluii electronice. Microcontrolerele PIC sunt ideale pentru sistemele mecatronice datorit dimeniunilor mici, eficienei ridicate, vitezei crescute i numrului ridicat de configuraii periferice. Sistemele mecatronice sunt foarte variate: de la un simplu comutator electromecanic cu ieire multiplexata, pn la controlul complex de stabilizare al unui avion supersonic cu reacie. Sistemele mecatronice sunt din ce n ce mai des folosite n aparatele electrocasnice precum i n automobile. De exemplu, mainile de splat moderne ncorporeaz microcontrolere pentru a msura intervalele fiecrui program de splare, pentru a citi comenzile date de utilizator i pentru reglarea vitezei de rotaie a motorului. 2.1.2 Descrierea plcii de dezvoltare

Pe placa este montat un microcontroler PIC16F917 ntr-un soclu de 40 de pini, iar 22 dintre cei 36 de pini de intrare/ieire reprezint conexiuni dedicate ctre diverse componente de pe plac. Ceilali 14 pini sunt disponibili utilizatorului pentru a conecta alte componente prin intermediul firele de legtur. Conexiunile dedicate permit accesul la urmtoarele componente: - Switch 1 1 pin: MCLR (Master Clear Reset) - LCD 17 pini - Conector serial de programare n circuit 2 pini + MCLR - Port de comunicaie RS-232 2 pini: RX, TX Schema placii de dezvoltare este prezentat n ANEXA 1. Pe placa este disponibil i un soclu de 20 de pini compatibil cu microcontrolerele ce folosesc 8, 14 sau 20 de pini. Microcontrolerul PIC16F690 poate fi conectat la acest soclu avnd 5 din cei 18 pini de intrare/ieire conectai la diverse componente de pe plac, iar restul de 13 pini sunt disponibili utilizatorului pentru a conecta alte componente folosind firele de legtur. Conexiunile dedicate pentru acest soclu sunt: - Switch 1 1 pin: MCLR (Master Clear Reset) - Conector serial pentru programare n circuit (ICSP): 2 pini + MCLR - Port de comunicaie RS-232 2 pini: RX, TX Placa de dezvoltare este descris n figur 1 i are n componen urmtoarele elemente: 1. Soclu cu 40 de pini 2. Soclu cu 20 de pini 3. Regulator de tensiune i conectori de alimentare 4. 8 LED-uri 15 5. LCD cu 39 de segmente, conectat la 14 pini ai soclului cu 40 de pini 6. Conector RS-232 i componente asociate 7. Senzor de temperatur 8. Senzor de lumin

9. Dou poteniometre 10. Oscilator de 32.768 kHz 11. Patru switch-uri 12. Conector ICD 13. Conector ICSP 14. Circuit de protecte la supracurent cu switch de reset 15. Punte H pentru controlul motoarelor 16. Detector de curent

17. Detector de tensiune electromotoare invers 18. Senzor optic pentru detecia vitezei de rotaie a motorului de curent continuu 19. Motor de curent continuu cu perii 20. Motor pas cu pas 21. Terminale cu urub pentru acionarea motoarelor 22. Baterie de 9V DC

Figura 2.1 Placa de dezvoltare PICDEM Mechatronics[1]

2.1.3

Faciliti

Bar de LED-uri Cele 8 LED-uri de pe placa ajuta la depanarea programelor scrise permind afiarea strii pinilor de ieire i afiarea n binar a coninutului variabilelor folosite. Circuitul de protecie la supracurent Circuitul de protecie la supracurent inclus n plac oprete circuitul de acionare a motoarelor n cazul n care motorul consuma 1.2 A timp de 100ms sau mai mult. Cnd este 16

introdus alimentarea plcii, circuitul de acionare a motorului este dezactivat, lucru indicat prin aprinderea LED-ului FAULT. Pentru a putea alimenta motorul trebuie apsat butonul CLEAR FAULT. Dac se folosete alt motor dect cel furnizat cu placa de dezvoltare, trebuie inut cont c plac nu va putea furniza un curent mai mare de 1.2 A. Comunicaia serial Comunicaia serial prin USART se poate realiza prin intermediul pinilor de transmisiune TX i recepie RX. Conectorul JP2 permite legarea pinilor RX, TX pentru realizarea transmisiunii seriale pe un singur pin. Senzori detaabili Senzorul de temperatur i senzorul de lumin pot fi detaai pentru a oferi flexibilitate ridicat n utilizarea lor. De exemplu, senzorul de temperatura poate fi poziionat ntr-un mediu ostil i conectat prin fire la plac de dezvoltare. Rezistentele de scalare a tensiunii electromotoare autoinduse n cazul folosirii unui alt motor de curent continuu cu perii fa de cel cu care este livrat plac PICDEM Mechatronics, la o tensiune de alimentare mai mare de 5V DC, tensiunea electromotoare autoindus trebuie adus n intervalul 0-5V DC. Pentru acest scop se pot poziiona rezistente pe placa n pozitile R55 i R56 pentru a crea un divizor de tensiune. Detector de curent Placa de dezvoltare ncorporeaz un circuit simplu de detecie a curentului ce poate fi accesat prin pinul J15. Tensiunea msurat la acest pin este egal cu curentul 10%. De exemplu, dac un motor este pornit i consuma 0.9A atunci tensiunea msurat va fi 0.9V ( 10%). LCD VIM-332 PICDEM Mechatronics are ncorporat un LCD cu 39 de segmente care poate afia cifre pe 3 poziti folosind cte 7 segmente, iar pe a patra poziie poate afia doar cifra 1. LCD-ul poate afia punctul zecimal pe 3 poziii diferite, precum i alte simboluri.

17

2.2 Microcontrolerul PIC16F917


PIC16F917[2] este un microcontroler pe 8 bii cu memorie flash, construit n tehnologie CMOS i avnd ncorporat un circuit de comand pentru LCD. Structura interna a microcontrolerului PIC16F917 este prezentata in ANEXA 2. 2.2.1 Prezentare general Procesor RISC de nalt performanta: o Folosete doar 35 de instruciuni: toate instruciunile se execut ntr-un singur ciclu cu excepia instruciunilor de salt o Frecventa maxim de operare: 20 MHz o Posibilitate de citire a memoriei de program o Mai multe surse de ntreruperi o Stiv hardware cu 8 nivele o Moduri de adresare: direct, indirect i relativ Caracteristici speciale ale microcontrolerului o Oscilator intern de mare precizie Calibrat la 1% Frecvena de lucru poate fi selectat software ntre 8MHz i 125 kHz Detecia lipsei oscilatorului extern pentru aplicaiile critice Schimbarea automat a sursei de ceas n timpul rulrii programului pentru economisirea energiei o Oscilator intern de 31 kHz selectabil prin soft o Mod cu consum sczut de energie (Sleep mode) o Poate opera ntr-un domeniu larg de tensiuni (2.0V 5.5V) o Operare la temperaturi industriale o Resetare la alimentare (Power-on Reset) o Watchdog Timer cu activare software o Protecia codului de program o Celula Flash/EEPROM performanta: Flash rezistent la 100.000 de scrieri EEPROM rezistent la 1.000.000 de scrieri Datele pot fi stocate mai mult de 40 ani Caracteristici de economisire a energiei o Curent de Standby: < 100 nA la 2.0 V o Curent de funcionare normal: 11 A la 32 kHz i 2.0 V 220 A la 4 MHz i 2.0 V o Curentul folosit de Watchdog Timer: 1 A la 2.0 V Periferice o Modul LCD: Capacitate de a comanda pn la 96 de pixeli Patru cai comune o Pn la 35 de pini I/O programabili individual 18

o Programare serial n circuit (ICSP) folosind 2 pini o Modul comparator analogic Dou comparatoare analogice Referin intern de tensiune programabil Intrrile i ieirile comparatoarele sunt accesibile din exterior o Convertor analog/digital: rezoluie de 10 bii i pn la 8 canale analogice o Timer0: timer/numrtor pe 8 bii cu divizor programabil o Timer1: Timer/numrtor pe 16 bii cu divizor programabil Posibilitatea de numrare a impulsurilor de pe un pin extern o Timer2: timer/numrtor pe 8 bii cu divizor anterior i posterior o Transmitor/Receptor Sincron/Asincron Universal (AUSART) o Dou module CCP (Stocare, Comparare, PWM) Stocare pe 16 bii, rezoluie de 12.5 ns Comparare pe 16 bii, rezoluie de 200 ns PWM pe 10 bii, frecventa maxim 20 kHz Functiile pinilor microcontrolerului sunt prezentate in ANEXA 3. 2.2.2
2.2.2.1

Organizarea memoriei
Memoria de program

PIC16F917 are un numrtor de program pe 13 bii capabil s adreseze o memorie de program format din 14 blocuri a cte 8K (0000h 1FFFh). Vectorul de Reset se afla la adresa 0000h iar vectorul de ntrerupere la adresa 0004h.

19

Figura 2.2 Harta memoriei de program

2.2.2.2

Memoria de date

Memoria de date este mprit n mai multe bank-uri care conin registrele de uz general (GPR) i registrele pentru funcii speciale (SFR). Bitii RP0 i RP1 sunt folosii pentru selecia bankului curent. RP1 RP0 Bank Selectat 0 0 0 0 1 1 1 0 2 1 1 3 Tabelul 2.1 Selecia bank-ului de memorie. Fiecare bank de memorie conine 128 octei (0h 7Fh). Locaiile inferioare ale fiecrui bank sunt rezervate pentru Registrele de Funcii Speciale. Dup SFR se gsesc registrele de uz general (GPR) implementate c RAM static. Toate bank-urile de memorie conin registre de funcii speciale. Unele registre de funcii speciale des folosite sunt copiate n toate bank-urile de memorie pentru a permite accesul rapid i reducerea dimensiunii codului. Fiierul de registre de uz general

20

PIC16F917 are un fiier de registre organizat ca 352 x 8 bii. Fiecare registru poate fi accesat direct sau indirect prin intermediul registrului de selecie (FSR) Registrele de funcii speciale

Registrele de funcii speciale sunt registre folosite de procesor i de funciile periferice pentru a putea controla operaia ntreprins. Aceste registre se afla n memoria RAM. Aceste registre pot fi clasificate n dou categorii: nucleu i periferice.
2.2.2.3 Numrtorul de program i stiv

Numrtorul de program (PC) are o lime de 13 bii. Octetul inferior provine din registrul PCL, care poate fi scris i citit. Octetul superior, care conine ceilali 5 bii ai numrtorului de program, nu poate fi accesat direct di provine din registrul PCLATH. La Reset numrtorul de program este ters. n Figura 2.3 sunt ilustrate cele dou situaii n care numrtorul de program este ncrcat. n partea superioar a figurii este ilustrat cazul scrierii n registrul PCL iar n partea inferioar este descris ncrcarea numrtorului de program n timpul executrii unei instruciuni CALL sau GOTO. Stiva PIC16F917 are o stiv cu adncime de 8 nivele i o lime de 13 bii implementat hardware. Spaiul de memorie al stivei nu face parte nici din memoria de program, nici din memoria de date, iar Indicatorul de stiv nu poate fi citit sau scris. Numrtorul de program este scris n stiv atunci cnd se execut o instruciune CALL sau atunci cnd o ntrerupere produce un salt. Numrtorul de program este scos din stiva atunci cnd se ntlnete o instruciune RETURN, RETLW sau RETFIE. PCLATH nu este afectat de operaiile de introducere sau scoatere din stiv.

Figura 2.3 ncrcarea numrtorului de program Stiv se comport ca o memorie circular. Acest lucru nseamn c dup ce s-au introdus 8 elemente n stiv, a noua scriere n stiv va rescrie prima valoare introdus.
2.2.2.4 Paginarea memoriei de program

PIC16F917 este capabil s adreseze un bloc continuu de memorie de 8K. Instruciunile CALL i GOTO pun la dispoziie doar 11 bii de adresa pentru a permite saltul n interiorul oricrei 21

pagini de memorie de program cu dimensiunea de 2K. La execuia unei instruciuni CALL sau GOTO, cei mai semnificativi 2 bii ai adresei provin din bitii 4 i 3 ai registrului PCLATH. n timpul instruciunilor CALL sau GOTO, utilizatorul trebuie s se asigure c bii de selectare a paginii sunt configurai astfel nct s se fac adresarea ctre pagina de memorie de program dorit. n cazul executrii unei instruciuni de ntoarcere dup executarea instruciunii CALL sau dup o rutin de ntrerupere, ntregul numrtor de program de 13 bii este scos din stiv. Aadar, n acest caz, modificarea PCLATH<4:3> nu este necesar.
2.2.2.5 Adresarea indirect, regitrii INDF i FSR

Registrul INDF nu este un registru fizic. Adresarea indirect este posibil prin folosirea registrului INDF. Orice instruciune care folosete registrul INDF va accesa de fapt datele din locaia de memorie indicat de registrul de selecie FSR. Citirea valorii lui INDF va rezulta ntr-o operaie nul (NOP). 2.2.3 Porturile I/O

Microcontrolerul PIC16F917 include 4 registre PORT pe 8 bii (PORTA, PORTB, PORTC, PORTD) i un registru PORT pe 4 bii (PORTE). Fiecrui registru PORT i corespunde un registru TRIS care permite configurarea c intrare sau ieire a portului respectiv. Registrul ANSEL este folosit pentru a configura modul de intrare al unui pin I/O ca analogic. Setarea unui bit din ANSEL cu valoarea 1 va determina funcionarea acelei intrri n modul analogic iar orice citire digital pe acel pin va avea ca rspuns valoarea 0. Starea biilor registrului ANSEL nu are nici un efect asupra funciile digitale de ieire. Un pin care are bitul corespunator din registrul TRIS setat cu valoarea 1 iar cel din registrul ANSEL setat cu valoarea 0 va funciona ca ieire digital dar modul de intrare va fi analogic. Acest lucru poate cauza un comportament neateptat atunci cnd se execut instruciuni de tip citire-modificarescriere asupra acestui port. 2.2.4 Modulul oscilator (cu sistem de monitorizare a ceasului)

Modulul oscilator ofer o gam variat de surse de ceas i posibiliti de selectare permind utilizarea microcontrolerului pentru diverse aplicaii avnd o permormanta ridicat i un consum sczut de energie. Sursele de ceas pot proveni de la oscilatoare externe, rezonatoare cu cristal de cuar, rezonatoare cermaice i circuite RC. n plus, ceasul de sistem poate fi configurat pentru a folosi unul dintre cele dou oscilatoare interne cu opiunea de a selecta frecventa prin software. Caracteristici ale acestui modul: - Sursa ceasului de sistem poate fi selectat prin software i poate fi intern sau extern - Pornirea ceasului de sistem se face n dou etape, minimaliznd decalajul dintre pornirea oscilatorului extern i execuia codului. - Sistem de monitorizare a ceasului (FSCM) conceput pentru a detecta problemele aprute la surs extern de ceas i pentru a face automat trecerea la oscilatorul intern. Modulul oscilator poate fi configurat ntr-unul din cele opt moduri de ceas: - EC ceas extern cu I/O pe pinul OSC2/CLKOUT - LP mod de lucru pentru consum redus de energie, 32 kHz - XT rezonator ceramic sau cristal de cuar cu ctig mediu 22

HS rezonator ceramic sau cristal de cuar cu ctig ridicat RC circuit RC extern cu ieire FOSC/4 pe pinul OSC2/CLKOUT RCIO circuit RC extern cu I/O pe pinul OSC2/CLKOUT INTOSC oscilator intern cu ieire FOSC/4 pe pinul OSC2 i I/O pe pinul OSC1/CLKIN INTOSCIO oscilator intern cu I/O pe pinii OSC1/CLKIN i OSC2/CLKOUT

Selecia sursei de ceas se face configurnd bitii FOSC<2:0> din Registrul de Configurare (CONFIG). Ceasul intern poate fi generat de dou oscilatoare interne: HFINTOSC oscilator calibrat de nalt frecven i LFINTOSC oscilator necalibrat de frecven joas. 2.2.5 Modulele Timer

Microcontrolerul PIC16F917 dispunde de 3 module Timer/Numrtor care pot fi folosite n combinaie cu alte periferice disponibile pentru o gam larg de aplicaii.
2.2.5.1 Modulul Timer0

Timer0 este un timer/numrtor pe 8 bii cu urmtoarele caracteristici: - Registru timer/counter pe 8 bii (TMR0) - Divizor anterior de frecven pe 3 bii programabil - Sursa de ceas intern sau extern programabila - Posibilitate de selecie a frontului de ceas - ntrerupere la depire Modul de lucru al Timer0 poate fi selectat prin modificarea bitului T0CS din registrul OPTION. Cnd T0CS este egal cu 0 Timer0 lucreaz n modul Timer iar cnd T0CS este egal cu 1 Timer0 lucreaz n modul Counter. Depirea timerului 0 este indicat de bitul T0IF din registrul INTCON. Acest bit trebuie resetat prin software. Timerul 0 este dezactivat atunci cnd microcontrolerul funcioneaz n regim de consum redus de energie.
2.2.5.2 Modulul Timer1

Timer1 este un timer/counter pe 16 bii cu urmtoarele caracteristici: - Pereche de regitri timer/counter totaliznd 16 bii (TMR1H:TMR1L) - Sursa de ceas intern sau extern programabila - Divizor anterior de frecven pe 3 bii programabil - Oscilator LP opional - Mod de operare sincron sau asincron - Poarta timerului 1 poate fi controlat de comparator sau de pinul T1G - ntrerupere la depire - Poate scoate microcontrolerul din modul de consum redus (dac se folosete surs extern de ceas i modul asincron) - Poate fi folosit ca sursa de ceas pentru modulul LCD Timer1 este un counter cresctor pe 16 bii care poate fi accesat prin intermediul perechii de registre TMR1H:TMR1L. Scrierea n TMR1H sau TMR1L actualizeaz n mod direct counter-ul. Cnd este folosit cu o surs de ceas intern, modulul este un timer. Cnd este folosit cu o surs de ceas extern, modulul poate fi folosit ca timer sau counter i poate numra evenimentele externe de pe pinul T1G sau cele date de ieirea coparatorului C2. 23

Sursa de ceas se poate selecta modificnd bitul TMR1CS din registrul T1CON astfel: Sursa de ceas TMR1CS FOSC/4 0 Pinul T1CKI 1 Tabelul 2.2 Sursa ceasului de sistem

2.2.5.3

Modulul Timer2

Timer2 este un timer pe 8 bii cu urmtoarele caracteristici: - Registru timer pe 8 bii (TMR2) - Registru perioada pe 8 bii (PR2) - Genereaz ntrerupere atunci cnd TMR2 i PR2 au aceeai valoare - Divizor anterior de frecven programabil - Divizor posterior de frecven programabil Intrarea de ceas a modulului Timer2 este ceasul de sistem FOSC/4. Ieirea ceasului este introdus n divizorul anterior al timerului 2. Ieirea acestui divizor este apoi folosit pentru a incrementa registrul TMR2. Valorile registrelor TMR2 i PR2 sunt comparate n mod continuu pentru a determina dac acestea sunt egale. TMR2 va fi incrementat plecnd de la 00h pn cnd va valoarea sa va fi egal cu cea a registrului PR2. Registrele TMR2 i PR2 pot fi scrise i citite. La orice eveniment de reset, registrul TMR2 ia valoarea 00h iar registrul PR2 ia valoarea FFh. Timer2 poate fi activat sau dezactivat prin modificarea bitului TMR2ON din registrul T2CON. 2.2.6 Modulul comparator

Comparatoarele sunt folosite pentru a face legtura ntre un circuit analogic i un circuit digital realiznd comparaia ntre dou tensiuni analogice. Comprtorul produce un semnal digital care indic relaia dintre mrimile celor dou semnale analogice de la intrare. Comparatoarele ofer funcionalitate analogic independent de execuia programului i sunt des folosite n circuitele ce combina semnale analogice i digitale. Comprtorul analogic are urmtoarele caracteristici: - Dou comparatoare - Mai multe moduri de configurare a comparatoarelor - Ieirile comparatoarelor sunt disponibile att intern ct i extern - Polaritatea ieirilor este programabila - Lanseaz o ntrerupere la modificarea ieirii - Poate scoate microcontrolerul din modul de consum redus de energie - Posibiltatea de a determina incrementarea Timerului 1 - Ieirea poate fi sincronizata cu intrarea de ceas a Timerului 1 - Referin de tensiune programabil n Figura 2.4 este prezentat un comparator i relaia dintre semnalele analogice de intrare i semnalul digital format la ieire.

24

Figura 2.4 Un singur comparator Cele opt moduri de funcionare a comparatorului pot fi selectate prin modificarea biilor CM<2:0> ai registrului CMCON0. 2.2.7 Transmitor Receptor Sincron Asincron Universal (AUSART)

Modulul AUSART este un periferic de I/O pentru comunicaii seriale. Conine generatoare de ceas, registre de deplasare i memorii de date necesare pentru realizar unei transmisiuni sau recepii seriale de date, independent de execuia programului. AUSART este cunoscut i c Interfaa de comunicaie serial (SCI) i poate fi configurata ca sistem duplex asincron sau ca sistem semiduplex sincron. Modul de lucru duplex este utilizat n comunicaia cu sisteme periferice cum ar fi terminalele CRT i calculatoarele personale. Modul semi-duplex sincron este folosit pentru comunicarea cu dispozitive periferice cum ar fi circuitele integrate A/D sau D/A, memoriile seriale EEPROM sau alte microcontrolere. n mod normal aceste dispozitive nu au surse interne de ceas pentru a genera rata de semn i necesit o surs extern de ceas furnizat de dispozitivul sincron principal. Modulul AUSART are urmtoarele capabiliti: - Transmisiune i recepie duplex asincrona - Memorie de intrare de 2 caractere - Memorie de ieire de 1 caracter - Lungimea caracterelor este programabila i poate avea 8 sau 9 bii - Detecia erorii de depire a dimensiunii memoriei de intrare Modalitatea de funcionare a modulului AUSART este stabilit cu ajutorul a doua registre: registrul de control i stare a transmisiunii (TXSTA) i registrul de control i stare a recepiei (RCSTA) Funcionarea AUSART n modul asincron Modulul AUSART transmite i recepioneaz date folosind formatul standard NRZ (nonreturn-to-zero). Formatul NRZ este implementat folosind dou nivele: VOH care reprezint valoarea 1 a unui bit de date i VOL care reprezint valoarea 0 a unui bit de date. Acest format presupune c bitii de date de aceeai valoare transmii consecutiv rmn la acelai nivel de ieire al acelui bit fr a se ntoarce la un nivel neutru ntre transmisiunea fiecrui bit. Atunci cnd nu se transmite informaie, un port care folosete NRZ va fi stabilit la nivelul VOH. Fiecare transmisiune de caracter va fi format dintr-un bit de start, urmat de opt bii de date i n final unul sau mai muli bii de stop. Bitul de start este ntotdeauna 0 iar bitii de stop sunt ntotdeauna 1. Cel mai ntlnit format de date este cel pe 8 bii. Fiecare bit de date transmis va avea o perioda de 1/(Rata de semn). 25

Pentru a obine o anumit rata de semn plecnd de la oscilatorul sistemului se folosete generatorul intern pe 8 bii al ratei de semn. Transmisiunea i recepia prin AUSART ncepe cu cel mai puin semnificativ bit. Transmitorul i receptorul modulului AUSART sunt independente din punct de vedere funcional, ns folosesc acelai format de date i aceeai rat de semn. Paritatea nu este implementat hardware dar poate fi calculat prin software i reinut n al noulea bit de date. Generatorul ratei de semn Generatorul ratei de semn (BRG) este un timer pe 8 bii care este utilizat att pentru modul de operare asincron ct i pentru cek sincron. Registrul SPBRG determina perioada timerului folosit pentru rata de semn. n modul asincron, bitul BRGH din registrul TXSTA determina multiplicatorul perioadei ratei de semn. n modul sincron acest bit este ignorat. Scrierea unei noi valori n registrul SPBRG produce resetarea timerului BRG. Bii de configurare Formula de calcul a Mod de operare ratei de semn SYNC BRGH 0 0 Asincron FOSC/[64(n+1)] 0 1 Asincron FOSC/[16(n+1)] 1 X Sincron FOSC/[4(n+1)] Tabelul 2.3 Formule de calcul pentru rata de semn Calculul erorii ratei de semn pentru frecvena de oscilaie de 8 MHz i o rat de semn dorit de 9600 n modul asincron:

Pentru configurarea transmisiunii asincrone trebuie parcuri urmtorii pai: Iniializarea registrului SPBRG i a bitului BRGH pentru a obitne rata de semn dorit Activarea portului serial asincron prin resetarea bitului SYNC i setarea bitului SPEN Dac se folosete transmisiunea pe 9 bii trebuie setat bitul TX9. Activarea transmisiunii prin setarea bitului de control TXEN. Acest lucru va determina setarea bitului de ntrerupere TXIF. Dac se dorete folosirea ntreruperilor, trebuie setat bitul TXIE din registrul PIE1. Pentru ca ntreruperea s aib loc trebuie c bitii GIE i PEIE din registrul INTCON s fie de asemenea setai. Dac se folosete transmisiunea pe 9 bii, cel de-al noulea bit trebuie ncrcat n bitul TX9D Scrierea unui octet n registrul TXREG va determina pornirea transmisiunii.

Pentru configurarea recepiei asincrone trebuie parcuri urmtorii pai: 26

2.2.8

Iniializarea registrului SPBRG i a bitului BRGH pentru obinerea ratei de semn dorite Activarea portului serial prin setarea bitului SPEN. Bitul SYNC trebuie s fie resetat n cazul modului de operare asincron. Dac se dorete folosirea ntreruperilor, trebuie setat bitul RCIE din registrul PIE1 i bitii GIE i PEIE din registrul INTCON. n cazul recepiei pe 9 bii, trebuie setat bitul RX9. Activarea recepiei prin setarea bitului CREN. Bitul de ntrerupere RCIF al registrului PIR1 va fi setat atunci cnd un caracter este transfrat din registrul de deplasare RSR ctre memoria de recepie. O ntrerupere va fi declanat n cazul n care bitul RCIE al registrului PIE1 este setat. Citirea registrului RCSTA pentru a verifica indicatorii de eroare i n cazul transmisiunii pe 9 bii, valoarea celui de-al noulea bit. Citirea registrului RCREG va ntoarce cei mai puin semnificativi 8 bii din memoria de recepie. n cazul apariiei unei erori de depire a memoriei de recepie, trebuie resetat fanionul OERR prin dezactivarea recepiei prin intermediul bitului CREN. Modulul de comand al ecranului LCD

Modulul LCD genereaz semnalele necesare pentru a conduce un dispozitiv LCD static sau multiplexat. PIC16F917 poate comanda panouri LCD cu pn la patru cai comune i pn la 24 de segmente. Acest modul permite i controlul matricei de pixeli a LCD-ului. Modulul de comand al panoului LCD are urmtoarele caracteristici: - Comanda direct a panoului LCD - Trei surse de ceas cu divizor anterior de frecven programabil - Pn la patru cai comune o Static (o cale comun) o Multiplexare 1/2 (2 cai comune) o Multiplexare 1/3 (3 cai comune) o Multiplexare 1/4 (4 cai comune) - Pn la 24 de segmente Regitrii folosii pentru configurarea LCD-ului: - Registrul de control (LCDCON) - Registrul de faz (LCDPS) - 4 registre de activare a segmentelor (LCDSE0:CLDSE3) - 12 registre de date (LCDDATA0:LCDDATA11) Dup configurarea modulului, bitul LCDEN din registrul LCDCON este folosit pentru activarea i dezactivarea LCD. Selectarea sursei de ceas Modulul LCD poate selecta una dintre cele trei surse de ceas disponibile: FOSC/8192 T1OSC/32 LFINTOSC/32

Prima sursa de ceas este ceasul sistemului divizat cu 8192. Acest raport de divizare a fost ales pentru a obine o ieire de 1 kHz atunci cnd ceasul sistemului este la 8 MHz. Acest divizor nu este programabil, n schimb se poate modifica divizorul anterior la LCD-ului folosind bitii LP<3:0> din registrul LCDPS. 27

Figura 2.5 Generarea ceasului pentru LCD A doua sursa de ceas folosete T1OSC/32 i se obine tot o frecven de 1 kHz atunci cnd se folosete un rezonator de 32.768 kHz pentru oscilatorul Timerului 1. Pentru a folosi oscilatorul Timerului 1 ca sursa de ceas, trebuie setat bitul T1OSCEN din registrul T1CON. A treia surs de ceas este oscilatorul intern de frecven joas LFINTOSC divizat cu 32 care de asemenea duce la o frecven de 1 kHz. Tensiuni de polarizare n funcie de modul de operare, modulul LCD poate folosi mai multe niveluri pentru tensiunea de polarizare: - Polarizare static (2 niveluri de tensiune: VSS i VDD) - Polarizare 1/2 (3 niveluri de tensiune: VSS, 1/2 VDD i VDD) - Polarizare 1/3 (4 niveluri de tensiune: VSS, 1/3 VDD, 2/3 VDD i VDD) Tensiunile pe pinii VLCD sunt rezumate n urmtorul tabel n funcie de modul de operare ales: Static 1/2 1/3 VLCD 0 VSS VSS VSS VLCD 1 1/2 VDD 1/3 VDD VLCD 2 1/2 VDD 2/3 VDD VLCD 3 VDD VDD VDD Tabelul 2.4 Tensiuni de polarizare Pentru configurarea modulului LCD trebuie parcuri urmtorii pai: - Selectarea divizorului de ceas cu ajutorul biilor LP<3:0> din registrul LCDPS - Configurarea registrelor LCDSEn pentru a activa funcia de comand a segmentelor - Configurarea registrului LCDCON astfel: o Modul de multiplexare i cel de polarizare: bitii LMUX<1:0> o Sursa de ceas: bitii CS<1:0> 2.2.9 o Modul de consum redus de energie: bitul Introducerea valorilor de iniializare n registrele de date LCDDATA0 LCDDATA11 Resetarea fanionului de ntrerupere: bitul LCDIF din registrul PIR2 i dac este necesar activarea interuperii cu ajutorul bitului LCDIE din registrul PIE2 Activarea pinilor de polarizare (VLCD<3:1>) prin setarea bitului VLCDEN din registrul LCDCON. Activarea modulului LCD prin setarea bitului LCDEN din registrul LCDCON. Convertorul analog digital (ADC) 28

Convertorul analog digital permite realizarea conversiei unui semnal analogic de intrare ntr-o reprezentare binar folsind 10 bii. Acest dispozitiv folosete intrri analogice multiplexate ntr-un singur circuit de eantionare i memorare. Ieirea cicuitului de eantionare i memorare este conectat la intrarea convertorului. Convertorul genereaz un rezultat pe 10 bii folosind algoritmul de aproximri succesive i nregistreaz rezultatul n regitrii ADC (ADRESL i ADRESH). Referin de tensiune folosit de ADC poate fi selectat prin software i poate fi generat intern sau furnizat din exterior. Convertorul poate genera o ntrerupere la finalizarea conversiei. Aceast ntrerupere poate fi utilizat pentru a scoate microcontrolerul din starea de consum redus de energie.

Figura 2.6 Schema bloc a circuitului de conversie analog digital Configurarea convertorului trebuie s in cont de urmtoarele funcii: - Configurarea porturilor - Selecia canalului - Selecia referinei de tensiune - Sursa ceasului de conversie - Controlul ntreruperilor - Formatul rezultatelor Configurarea porturilor: modulul ADC poate fi folosit pentru a converti att semnale analogice ct i digitale. Cnd se convertesc semnale analogice, pinul de intrare/ieire trebuie configurat c intrare analogic prin intermediul registrelor TRIS i ANSEL. Selecia canalului: bitii CHS ai registrului ADCON0 determina care dintre cele 8 canale analogice este conectat la circuitul de eantionare i memorare. Cnd se schimb canalul, trebuie introdus o ntrziere nainte de a ncepe o nou conversie. Referin de tensiune: tensiunile de referin pot fi configurate folosind bitii FCFG din registrul ADCON0. Tensiunea pozitiv poate fi VDD sau o surs de tensiune extern. Tensiunea negativ poate fi VSS sau o surs extern de tensiune. Ceasul de conversie: sursa ceasului de conversie poate fi selectat prin software cu ajutorul biilor ADCS din registrul ADCON1. Ceasul de conversie poate avea urmtoarele surse: FOSC/2, 29

FOSC/4, FOSC/8, FOSC/16, FOSC/32, FOSC/64, FRC). Durata necesar conversiei unui bit este notat cu TAD. O conversie complet pe 10 bii necesit 11 perioade TAD. ntreruperile: modulul ADC poate genera o ntrerupere la finalizarea unei conversii analog digitale. Fanionul de ntrerupere este dat de bitul ADIF din registrul PIR1. ntreruperea poate fi activat prin setarea bitului ADIE din registrul PIE1. Bitul ADIF trebuie resetat prin software. Formatul rezultatului: rezultatul conversiei A/D pe 10 bii poate fi furnizat n dou moduri: cu aliniere la stnga sau cu aliniere la dreapta. Bitul ADFM din registurl ADCON0 controleaz formatul rezultatului conversiei. n partea superioar a Figurii 2.7 este prezentat formatul cu aliniere la stnga iar n partea inferioar cel cu aliniere la dreapta.

Figura 2.7 Alinierea rezultatului conversiei A/D Pentru a realiza o conversie analog digital folosind ADC trebuie urmai urmtorii pai: - Configurarea porturilor: o Dezactivarea ieirii pe pinul de intrare folosind registrul TRIS o Configurarea pinului c intrare analogice folosind registrul ANSEL - Configurarea modulului ADC: o Selectarea ceasului de conversie o Configurarea referinei de tensiune o Selectarea canalului de intrare o Selectarea formatului rezultatului o Activarea modulului ADC - Configurarea interuperii ADC (opional): o Resetarea fanionului de ntrerupere o Activarea ntreruperii ADC o Activarea interuperilor generate de periferice o Activarea global a ntreruperilor - Ateptarea finalizrii achiziiei Pornirea conversiei prin setarea bitului . sau prin ateptarea Ateptarea finalizrii conversiei prin verificarea bitului apariiei ntreruperii. Citirea rezultatului Resetarea fanionului de ntrerupere.

2.2.10 Modulul de Stocare/Comparare/PWM (CCP)

30

Modulul CCP este un periferic care permite utilizatorului s cronometreze i s controleze diferite evenimente. n modul stocare, perifericul permite msurarea duratei unui eveniment. Modul comparare permite declanarea unui eveniment extern dup trecerea unui interval de timp predeterminat. Modul PWM poate gener un semnal cu modulaie n durata a impulsurilor cu frecven i factor de umplere variabil. Mod CCP Timer Stocare Timer1 Comparare Timer1 PWM Timer2 Tabelul 2.5 Resursele folosite de modulele CCP Cele dou module CCP pot funciona n moduri diferite iar interaciunea dintre acestea este prezentat n Tabelul 2.6: Mod CCP1 Stocare Stocare Comparare PWM PWM PWM Mod CCP2 Stocare Comparare Comparare PWM Interaciune Aceeai configuraie pentru Timer1 Aceeai configuraie pentru Timer1 Aceeai configuraie pentru Timer1 Aceeai frecven i rata de actualizare (ntreruperea TMR2). Fronturile cresctoare vor fi aliniate. Stocare Nici una Comparare Nici una Tabelul 2.6 Interaciunea dintre cele dou module CCP

Modul stocare n acest mod registrele CCPRxH:CCPRxL stocheaz valoarea pe 16 bii a registrului TMR1 n momentul apariiei evenimentului pe pinul CCPx. Evenimentele pot fi definite prin modificarea biilor CCPxM<3:0> ai registrului CCPxCON i pot fi: - O dat la fiecare front scztor - O dat la fiecare front cresctor - O dat la 4 fronturi cresctoare - O dat la 16 fronturi cresctoare Atunci cnd se face o stocare, se seteaz bitul de ntrerupere CCPxIF al registrului PIRx. Fanionul de ntrerupere trebuie resetat din software. Dac are loc o alt stocare nainte c perechea de registre CCPRxH:CCPRxL s fie citit, vechea valoare este rescrisa cu cea nou.

Figura 2.8 Schema bloc de funcionare n modul stocare

31

n modul stocare pinul CCPx trebuie configurat c intrare prin setarea bitului din registrul TRIS asociat. Modul comparare n acest mod valoarea pe 16 bii a registrului CCPRx este comparat n mod continuu cu valoarea aflat n perechea de registre a Timerului 1. Cnd aceste valori sunt egale, modulul CCPx poate efectua urmtoarele operaii: - Complementarea ieirii modulului CCPx - Setarea ieiri modulului CCPx - Resetarea ieirii modulului CCPx - Declanarea unui eveniment - Generarea unei ntreruperi software Aciunea dorit este selectat prin modificarea biilor CCPxM<3:0> din registrul CCPxCON. Toate modurile de comparare pot genera o ntrerupere.

Figura 2.9 Schema bloc de funcionare n modul comparare Utilizatorul trebuie s configureze pinul CCPx ca ieire prin resetarea bitului corespunztor din registrul TRIS asociat. Modul PWM Acest mod genereaz pe pinul CCPx un semnal cu impulsuri modulate n durat. Factorul de umplere, perioad i rezoluia sunt determinate de urmtorii regitri: - PR2 - T2CON - CCPRxL - CCPxCON Modulul CCP poate produce o ieire PWM cu o rezoluie de pn la 10 bii pe pinul CCPx. Deoarece pinul CCPx este multiplexat cu portul de date, registrul TRIS asociat acestui pin trebuie resetat pentru a activa comanda de ieire.

32

Figura 2.10 Schema bloc simplificata pentru funcionarea CCP n modul PWM. Ieirea PWM are o perioad i un interval n care ieirea ia valoarea 1 logic. Perioada PWM este specificata n registrul PR2 al Timerului 2. Perioada poate fi calculat folosind urmtoarea ecuaie: unde . Atunci cnd valoarea registrului TMR2 este egal cu cea a registrului PR2, au loc urmtoarele: - TMR2 este resetat - Pinul CCPx este setat (exceptnd cazul n care factorul de umplere este 0%) - Valoarea care determin factorul de umplere este copiat din CCPRxL n CCPRxH Durata impulsului PWM este specificata prin scrierea unei valori de 10 bii astfel: cei mai semnificativi 8 bii n registrul CCPRxL i cei mai puin semnificativi 2 bii n registrul CCPxCON pe poziiile 5 i 4. Registrul CCPRxL i bitii CCPx<1:0> ai registrului CCPxCON pot fi scrii la orice moment de timp. Durata impulsului PWM nu este scris n CCPRxH dect dup trecerea unei perioade PWM. Durata impulsului PWM poate fi calculat cu urmtoare formul:

Factorul de umplere poate fi calculat cu urmtoarea formul:

Registrul TMR2 pe 8 bii este concatenat cu 2 bii de la ceasul de sistem sau de la divizor pentru a forma o valoarea pe 10 bii. Atunci cnd aceast valoare pe 10 bii este egal cu valoarea perioadei PWM se reseteaz bitul CCPx.

33

Figura 2.11 Ieirea CCP n modul PWM. Rezoluia PWM determina numrul de durate distincte ale impulsului PWM care pot fi selectate pentru o anumit perioad PWM. De exemplu pentru o rezoluie de 10 bii vor rezulta 1024 de durate discrete, iar pentru o rezoluie de 8 bii vor rezulta doar 256 de durate discrete. Rezoluia PWM maxim este de 10 bii atunci cnd PR2 ia valoarea 255. Rezoluia este o funcie care depinde de valoarea registrului PR2 conform urmtoarei ecuaii:

n cazul n care durata impulsului este mai mare dect perioad, ieirea PWM va rmne neschimbat.

2.3 Afiaje cu cristale lichide (LCD)


Dispozitivile LCD utilizeaz o tehnologie pasiv de afiare a imaginii. Acestea nu emit lumin, ci folosesc lumina ambiental. Prin manipularea acestei lumini, LCD-urile afieaz imagini consumnd foarte puin energie. Datorit acestui lucru tehnologia LCD este cea mai utilizat n aplicaiile care necesit consum redus de energie i dimensiuni reduse. Modaliti de comand a dispozitivelor LCD Exist dou tipuri de comand a afiajelor LCD: direct i multiplexata[3]. Comanda direct care se mai numete i static presupune c suprafaa inferioar a fiecrui segment s fie conectat la un plan comun iar suprafaa superioar s aib o conexiune independenta ctre circuitul de comand. Astfel de afiaje au un contrast foarte bun funcionnd ntr-un domeniu larg de temperaturi. LCD-urile comandate static necesita frecvente de comand ntre 30 Hz i 60 Hz. Frecvenele sub 30 Hz pot provoca fenomenul de plpire a ecranului.

Figura 2.12 Comanda direct a unui afiaj LCD cu un digit. Dezavantajul acestui tip de comand este c n cazul LCD-urilor cu multe segmente, conectarea individual a fiecrui segment la circuitul de comand devine impracticabila. 34

Afiajele LCD necesita tensiune de comand alternativ cu componenta continua nul. Fiecare segment este controlat prin amplitudinea tensiunii alternative aplicat pe acesta. Tensiunea alternativ trebuie aplicat pe toate segmentele ntotdeauna pentru a preveni apariia unei componente continue. Aplicarea unei componente continue poate duce la declanarea unor procese chimice n interiorul ecranului LCD care vor cauza reducerea vieii de funcionare a dispozitivului. Comanda multiplexata[4] poate simplifica schema de interconectare a unui LCD cu numr mare de segmente. Afiajele multiplexate au ntotdeauna mai multe plane comune Anumite segmente sunt conectate mpreun pentru a forma grupuri care sunt adresate secvenial cu ajutorul mai multor plane comune. Aceste grupuri sunt organizate ntr-o matrice cu rnduri i coloane. Circuitele de comand genereaz forme de und cu amplitudine variabil, sincronizate n timp pe care le aplic pe liniile i coloanele matricei de comand pentru a adres un anumit segment. Numrul de segmente ce pot fi adresate de un plan comun este dat de raportul de multiplexare. Un raport de multiplexare de 1/4 indic faptul c LCD-ul are 4 plane comune. Reducerea numrului de conexiuni externe mbuntete durata de via a LCD-ului i permite creterea densitii acestuia.

Figura 2.13 Comanda multiplexata a unui LCD cu 3 digiti folosind 4 plane comune. Deoarece aceast metod necesita lucrul cu mai multe nivele de tensiune, multiplexarea folosind un numr mare de plane comune poate duce la reducerea domeniului de temperatur n care LCD-ul poate funciona corect. De asemenea, multiplexarea necesita folosirea unor circuite de comand mai complexe sau n cazul folosirii unui microcontroler fr circuit de comand pentru LCD, a unui software mai elaborat.

35

2.4 Motorul de curent continuu cu perii

2.4.1

Introducere

Motoarele de curent continuu sunt folosite n diverse aplicaii pornind de la jucrii pn la scaune de main reglabile electric. Motoarele de curent continuu cu perii sunt ieftine, pot fi comandate uor i sunt disponibile n mai multe tipuri i dimensiuni. 2.4.2 Principiu de funcionare

Structura unui motor de curent continuu[5] cu perii simplu este ilustrat n Figura 2.14. Toate motoarele BDC conin urmtoarele componente: stator, rotor, perii i comutator. Statorul genereaz cmpul magnetic staionar care nconjoar rotorul. Acest cmp este generat cu ajutorul unui magnet permanent sau au unui electromagnet. Tipurile de motoare BDC se difereniaz prin modul de construcie a statorului sau prin modul n care nfurrile electromagnetului sunt conectate la sursa de alimentare. Rotorul poate avea una sau mai multe nfurri. Cnd aceste nfurri sunt alimentate produc un cmp magnetic. Polii magnetici ai cmpului rotorului sunt atrai de polii opui generai de stator, determinnd micarea rotorului. Cnd motorul se rotete, nfurrile sunt alimentate ntro anumit ordine astefel nct polii magnetici generai de rotor s nu fie n acelai plan cu polii generai de stator. Aceasta alternare a cmpului magnetic generat de nfurrile rotorului se numete comutaie.

Figura 2.14 Schema simplificat a unui motor de curent continuu Periile i comutatorul. Spre deosebire de alte tipuri de motoare electrice (BDC fr perii, AC cu inducie), motoarele BDC nu au nevoie de controler pentru comutaia curentului n nfurri. Comutaia nfurrilor ntr-un motor BDC este realizat mecanic. O cma de cupru segmentat, numit comutator, este poziionat pe axul motorului BDC. n timp ce motorul se rotete, periile de carbon trec peste comutator, intrnd n contact cu diferite segmente ale acestuia. Segmentele sunt conectate la nfurri distincte ale rotorului, iar atunci cnd este aplicat tensiune la bornele motorului se genereaz astfel un cmp magnetic dinamic. Periile i comutatorul sunt componentele motorului BDC cele mai supuse uzurii. 36

2.4.3

Tipuri de motoare de curent continuu Cu magnet permanent

Motorul cu magnet permanent este cel mai utilizat tip de motor de curent continuu din lume. Aceste motoare folosesc magnei permaneni pentru a produce cmpul magnetic al statorului. Motoarele PMDC sunt n general folosite n aplicaiile de putere mic deoarece n acest caz magneii permaneni sunt mai ieftini dect electromagneii. Dezavantajul acestui tip de motor este c n timp magneii i pierd proprietile magnetice. Unele motoare cu magnei permaneni au nfurri speciale care previn pierderea proprietilor magnetice. Curb de performatna (tensiuneviteza) este foarte liniara n cazul motoarelor de curent continuu cu magnei permaneni. De asemenea consumul de curent variaz liniar cu cuplul. Aceste motoare rspund foarte rapid la modificarea teniunii deoarece cmpul magnetic al statorului este ntotdeauna constant.

Figura 2.15 Motor cu magnet permanent. Motor cu excitaie paralel Motoarele de curent continuu cu cmp magnetic de excitaie paralel au bobin de excitaie n paralel cu rotorul. Curentul din bobina i cel din rotor sunt independeni. Astfel aceste motoare au un control foarte bun al turaiei. Acest tip de motor este folosit n aplicaii de putere mai mare dect cele cu magnei permaneni. Spre deosebire de motoarele cu magnei permaneni, pierderea proprietilor magnetice nu mai este o problem la acest tip de motor.

Figura 2.16 Motor cu excitaie paralel Motor cu excitaie serie Motoarele de curent continuu cu perii cu cmp magnetic de excitaie serie au bobin de excitaie n serie cu nfurarea rotorica. Aceste motoare sunt ideale pentru aplicaiile care necesit cuplu ridicat deoarece curenii din stator i rotor cresc odat cu creterea sarcinii. Un dezavantaj al acestui tip de motor este c spre deosebire de motoarele cu magnei permaneni i cele cu excitaie paralel, nu permite controlul precis al vitezei.

Figura 2.17 Motor cu excitaie serie 37

Motor cu excitaie mixt Motoarele cu excitaie mixt reprezint o combinaie a motoarelor cu excitaie serie i a celor cu excitaie paralel. Dup cum se observ n Figura 2.18, aceste motoare au att o nfurare de excitaie serie ct i una paralel. Motoarele cu excitaie mixt au cuplu mai mare dect cele motoarele cu excitaie paralel i permit un control al vitezei mai exact dect n cazul motoarelor cu excitaie serie.

Figura 2.18 Motor cu excitaie mixt

2.4.4

Modele de circuite de comand

Circuitele de comand sunt folosite n aplicaiile n care se folosete un controler i este necesar controlul vitezei. Scopul circuitului de comand este de a permite controlerului s varieze curentul din nfurrile unui motor de curent continuu cu perii. Circuitele de comand prezentate n continuare permit controlerului s aplice tensiune motorului folosind modulaia n durata a impulsurilor (PWM). Din punct de vedere al consumului de putere, acest tip de control al vitezei reprezint o metod mult mai eficient de variaie a turaiei dect metodele tradiionale de control analogic. Controlul analogic necesita folosirea unor rezistente variabile ineficiente n serie cu motorul. Motoarele de curent continuu cu perii sunt comandate n diverse moduri. n unele cazuri motorul are nevoie s se roteasc ntr-o singur direcie. Figurile 2.19 i 2.20 ilustreaz circuite care permit comanda unui motor BDC ntr-o singur direcie. Pentru primul circuit nu este necesar folosirea unui circuit de comand pentru tranzistorul MOSFET. Circuitul de comand pentru tranzistor are rolul de a aduce semnalul TTL de comand la nivelul tensiunii de alimentare, de a furniza curentul necesar pentru comanda tranzistorului i de a permite schimbarea de nivel n aplicaiile cu jumti de punte. n amblee circuite este folosit o dioda n paralel cu motorul. Aceasta dioda protejeaz tranzistorul MO de tensiunea electromotoare autoindus generat de motor atunci cnd acesta se nvrte. Cnd tranzistorul este blocat, nfurrile din motor sunt nc ncrcate i genereaz un curent invers. Dioda D1 trebuie aleasa astfel nct s disipe acest curent.

Figura 2.19 Circuit de comand de tip A 38

Figura 2.20 Circuit de comand de tip B Rezistentele R1 i R2 din Figurile 2.19 i 2.20 sunt importante pentru funcionarea fiecrui circuit. R1 protejeaz microcontrolerul de supracurent iar R2 permite blocarea tranzistorului atunci cnd pinul de intrare este configurat n modul tristate. Controlul bidirecional al motoarelor de curent continuu cu perii presupune folosirea unui circuit numit punte H. Puntea H permite permite circulaia curentului n amble sensuri prin nfurrile motorului. Pentru a putea nelege puntea H, aceasta trebuie descompus n dou pri numite jumti de punte. n Figura 2.21 tranzistoarele Q1 i Q2 fac parte din prima jumtate de punte iar Q3 i Q4 din a doua jumtate. Fiecare dintre aceste jumti de punte poate comut motorul la tensiunea de alimentare sau la mpmntare. Atunci cnd Q1 este pornit i Q2 este blocat, partea stng a motorului va fi legat la sursa de alimentare. Prin pornirea tranzistorului Q4 i blocarea tranzistorului Q3 se leag partea dreapt a motorului la mas.

Figura 2.21 Schema unei punti H Sgeata marcat IFWD arata sensul curentului n aceast configuraie. Tipurile de comand cu ajutorul punii H sunt prezentate n Tabelul 2.7. n modurile Direct sau Invers, o parte a punii este legat la masa iar cealalt la borna de alimentare. n Figura 2.21 sgeile indic sensul curenilor n cazul modurilor Direct i Indirect. n modul Liber terminalele motorului nu sunt conectate iar acesta se nvrte liber pn se oprete. n modul Frnare, terminalele motorului sunt legate la mas. Motorul se comport ca un generator atunci cnd se rotete. Scurtcircuitarea terminalelor motorului se comport ca o sarcin infinit care oprete motorul rapid. Sgeata IBRK ilustreaz acest lucru. 39

Tabelul 2.7 Configuraii de comand a motoarelor folosind puntea H

2.4.5

Controlul vitezei

Viteza unui motor de curent continuu cu perii este proporional cu tensiunea aplicat la bornele motorului. n cazul controlului digital, la bornele motorului se aplic un semnal cu modulaie n durata a impulsurilor pentru a genera o tensiune medie. Deoarece motorul de curent continuu se comport ca un filtru trece-jos, un semnal PWM de frecven suficient de mare va gener un curent stabil n nfurrile motorului. Relaia de legtur ntre tensiunea medie, tensiunea de alimentare i factorul de umplere este urmtoarea:

Viteza i factorul de umplere sunt liniar dependente una de cealalt. De exemplu, dac un motor are 15000 RPM la 12 V, atunci acesta va avea 7500 RPM atunci cnd este alimentat cu un semnal PWM cu factor de umplere 50%. Frecvena semnalului PWM reprezint un factor important. La frecvene prea joase, motorul va fi zgomotos la viteze mici i va rspunde greu la modificarea factorului de umplere. La frecvene prea mari scade eficiena sistemului din cauza pierderilor din dispozitivele de comutaie. n general este bine s se aleag o frecven intre peste 4kHz pentru a reduce zgomotul produs de motor. Generarea semnalului PWM cu ajutorul microcontrolerelor PIC se poate face prin software cu ajutorul unui program care alterneaz starea unui pin ntre 0 i 1 sau folosind un microcontroler cu modul hardware CCP. Modulul CCP poate produce un semnal PWM cu rezoluie de 10 bii ntre 0% i 100%. Este preferata folosirea unui microcontroler cu un astfel de modul deoarece generarea semnalului PWM se face independent i nu consuma timpul alocat programului principal. Modaliti de msurare a vitezei (feedback) Dei viteza unui motor de curent continuu cu perii este n general proporional cu factorul de umplere, nici un motor nu este ideal. Cldura, uzura comutatorului i sarcina influeneaz viteza motorului. n sistemele care necesit controlul precis al vitezei este necesar introducerea unui mecanism de determinare a vitezei reale. Determinarea vitezei se poate face n dou moduri: cu ajutorul unui senzor de vitez sau prin msurarea tensiunii eletromotoare autoinduse a motorului. Determinarea vitezei cu ajutorul senzorilor Exist o gam larg de senzori folosii pentru determinarea vitezei de rotaie. Senzorii optici presupun montarea unei roi cu fante pe axul motorului. Pe o parte a roii este montat un LED infrarou care trimite lumina ctre un fototranzistor poziionat de cealalt parte a roii. Cnd lumina trece printr-o fant fototranzistorul este activat iar n caz contrar este blocat. Frecvena de comutaie a tranzistorului indica viteza motorului. Folosind senzori optici se poate determina i poziia motorului la un moment dat. 40

Figura 2.22 Utilizarea senzorului optic Senzorii cu efect Hall folosesc o roat ataat axului motorului. Pe marginea acestei roti sunt montai unul sau mai muli magnei. Atunci cnd un magnet trece prin apropierea sa, senzorul staionar emite un impuls TTL. n Figura 2.22 sunt prezentate componentele de baz ale unui senzor cu efect Hall.

Figura 2.23 Utilizarea senzorului Hall O alt form de determinare a vitezei de rotaie este msurarea tensiunii electromotoare autoinduse care este proporional cu vitez. Figura 2.24 arata punctele n care se poate msura tensiunea electromotoare autoindus n schema punii H. Pentru a putea citi tensiunea folosind convertorul analog digital sefoloseste un divizor pentru a aduce tensiunea n intervalul 0-5V. Tensiunea autoindus este msurat atunci cnd alimentarea motorului este ntrerupt pentru un scurt moment de timp.

Figura 2.24 Msurarea tensiunii electromotoare autoinduse folosind puntea H

2.4.6

Elemente constructive ale motorului de curent continuu cu perii cu magnei permaneni

Motoarele de curent continuu cu perii i magnei permaneni conin magnei permaneni n stator i nfurri n rotor. Capetele nfurrilor sunt conectate la segmentele comutatorului care intr n contact cu periile staionare. Periile sunt conectate la sursa de alimentare de curent continuu. Schimbarea direciei de rotaie poate fi realizat prin inversarea polaritii tensiunii de alimentare. 41

Circulaia curentului prin bobine creeaz poli magnetici n rotor care interacioneaz cu polii magneilor permaneni. Pentru a putea genera cuplu n aceeai direcie, trebuie inversat sensul curentului atunci cnd polul nord al rotorului trece de polul sud al statorului. Acest lucru este realizat de comutator. Periile sunt fabricate din carbon sau metale preioase. Periile din metale preioase sunt folosite la tensiuni joase i timp de funcionare ndelungat, au rezistena de contact redus i produc mai puin zgomot electromagnetic dect periile din carbon. Periile din carbon sunt folosite la consum mare de putere, vitez mare de rotaie, porniri frecvente, tensiuni mari.

Figura 2.25 Elemente constructive ale motorului de cc. cu magnet permanent[6] Elemente componente: - Rotorul reprezint partea mobila a motorului i este poziionat n interiorul carcasei. Este format dintr-un ax metalic i o armatur rotorica ce susine nfurrile. Capetele nfurrilor sunt conectate la comutator care este de asemenea fixat pe ax. - Statorul este partea fix a motorului i este format dintr-o carcasa cilindric n interiorul creia sunt fixai magnei permaneni. 2.4.7 Tensiunea electromotoare autoindus

Tensiunea electromotoare autoindus[7] este tensiunea care se opune curentului care o produce. Aceasta tensiune este produs de un cmp electromagnetic variabil conform legii Lenz a electromagnetismului. Tensiunea apare la motoarele electrice n care exist o micare relativ ntre motor i stator. O aplicaie practic a acestui fenomen este msurarea indirect a vitezei de rotaie a unui motor. Polaritatea tensiunii autoinduse este ntotdeauna opus polaritii tensiunii de alimentare. ntr-un motor n care rotorul se nvrte ntr-un cmp magnetic, conductoarele intersecteaz liniile de cmp magnetic. Variaia intensitii cmpului magnetic produce o tensiune n bobin, motorul comportndu-se ca un generator. Aceasta tensiune se opune tensiunii aplicate iniial. Deoarece exist o tensiune mai mic pe rotor, curentul care intr n nfurrile motorului este redus. Deoarece tensiunea electromotoare autoindus crete rezistenta aparent a circuitului prin generarea unei tensiuni de sens opus, un motor electric care este deja n micare de rotaie consuma 42

mai puin energie dect unul care tocmai pornete sau care i schimb direcia. Pentru a maximiza acest efect, nfurrile motorului ar trebuie fabricate din cupru, argint sau orice material (de obicei metalic) care are o rezistivitate electric redus, iar componentele fixe ale motorului ar trebui s nu conin fier, majoritatea tipurilor de oel sau orice material cu histerezis pronunat. Tensiunea generat de un motor aflat n micare poate fi folosit pentru a determina viteza de rotaie a acestuia. Acest lucru poate fi folosit n algoritmii de control al turaiei pentru a determina viteza de micare a unui robot mobil. n mod obinuit un motor consuma energie electric i o transform n energie mecanic sub forma unei micri de rotaie. n cazul unui generator acest fenomen este inversat. Un generator preia energie mecanic i o convertete n energie electric. Majoritatea motoarelor pot fi i generatoare dac sunt rotie de o for exterioar lor. Atunci cnd se dorete utilizarea tensiunii electromotoare autoinduse n sistemele de reglaj al turaiei, motorul este alimentat aproape continuu, ns pentru intervale de timp foarte scurte de timp tensiunea de alimentare este ntrerupt iar motorul este lsat n gol, timp n care se realizeaz msurarea tensiunii generate de acesta. Tensiunea msurat atunci cnd motorul se nvrte n gol este direct proporional cu viteza de rotaie a motorului. Acest lucru este folosit pentru a determina viteza motoarelor atunci cnd nu este disponibil un senzor optic sau un senzor cu efect Hall. Determinarea vitezei unui motor folosind msurarea tensiunii autoinduse[8] se realizeaz n dou etape care se succed repetat. nti motorul este alimentat pentru o perioad de timp. Alimentarea se poate face prin PWM pentru a putea varia viteza motorului. A doua etap implica deconectarea alimentrii i lsarea motorului s se roteasc n gol. Ineria motorului i permite acestuia s se roteasc pentru un interval de timp suficient de lung pentru a putea msura tensiunea generat de motor. n general aceste etape se alterneaz cu o frecven de aproximativ 50Hz. Timpul necesar unui motor pentru a trece n starea de generator depinde de sarcin inductiv stocat n nfurri. Acest interval de timp este de obicei de ordinul unei milisecunde sau dou.

Figura 2.26 T.e.m autoindus pentru factor de umplere 25%[8] n Figura 2.26 se observ o tensiune electromotoare autoindus pentru un semnal PWM cu factor de umplere 25%. Tensiunea PWM urca pn la din valoarea maxim posibil iar apoi se stabilizeaz. Dac intervalul de msurare a tensiunii electromotoare autoinduse este prea mare, motorul va ncepe s ncetineasc. n Figura 2.27 se observ un o tensiune electromotoare corespunztoare unui factor de umplere de 75%. 43

Figura 2.27 T.e.m autoindus pentru factor de umplere 75%[8] Figura 2.28 ilustreaz cazul n care motorul funcioneaz la un factor de umplere de 75% dar este n sarcina. Deoarece atunci cnd este n sarcina motorul are o energie inductiv ridicat n nfurri, intervalul de timp necesar atingerii nivelului de stabilizare este mai mare. ntr-o aplicaie de control al turaiei trebuie determinat intervalul minim de timp necesar msurrii tensiunii electromotoare autoinduse.

Figura 2.28 T.e.m autoindus pentru factor de umplere 75% sub sarcin[8] Limitri Spre deosebire de senzorii optici sau cu efect Hall, tensiunea electromotoare autoindus nu poate reda poziia absolut a motorului la un anumit moment de timp, ci doar viteza acestuia. Deoarece msurarea tensiunii autoinduse necesita decuplarea motorului de la sursa de alimentare pentru intervale scurte de timp, aceast metod de determinare a vitezei de rotaie reduce factorul de umplere care poate fi maxim obinut.

44

Capitolul 3. Proiectare software


3.1 Introducere
Proiectul a fost realizat n dou etape. n prima etap a fost scris programul n limbaj C pentru microcontrolerul PIC16F917 folosind MPLAB IDE i compilatorul HITECH-C, iar n cea de-a doua etap a fost realizat aplicaia pentru PC n limbajul Visual Basic .NET folosind Visual Studio IDE. Sistemul de reglaj al turaiei are urmtoarele funcii: - Permite modificarea direct a factorului de umplere al semnalului PWM prin intermediul poteniometrului P2 de pe placa de dezvoltare sau prin comanda PC prin portul serial. - Msoar tensiunea electromotoare autoindus a motorului de curent continuu - Regleaz automat viteza motorului, aflat sub sarcin variabil, la o anumit valoare indicat de poteniometrul P2 sau primit de la aplicaia PC - Afiarea vitezei curente precum i a altor parametrii pe ecranul LCD i cu ajutorul LEDurilor de pe placa de dezvoltare. - Aplicaia pentru PC reprezint grafic variaia turaiei motorului n funcie de timp. - Informaiile de pe placa de dezvoltare (LCD, LED-uri, valorile variabilelor de control) sunt disponibile i n aplicaia software pentru PC, starea acestora fiind sincronizata prin transmisiune bidirecional prin portul serial. Diagrama sistemului de reglaj automat al turaiei este ilustrat n Figura 3.1.

Figura 3.29 Diagrama sistemului de reglaj automat

3.2 Proiectarea software pentru microcontroler

3.2.1

Introducere

Componentele hardware alese aduc anumite avantaje importante n ceea ce privete algoritmul implementat. Microcontrolerul PIC16F917 conine un modul CCP care permite generarea independent a semnalului PWM (fr a reduce performanta sistemului) precum i un 45

circuit de comand pentru afiajul LCD. Placa de dezvoltare PICDEM Mechatronics are incorporat o punte H care permite controlul bidirecional al motorului de curent continuu i msurarea tensiunii electromotoare autoinduse. Schema electric simplificat a proiectului este ilustrat n ANEXA 4. Pentru a rula programul trebuie realizate urmtoarele conexiuni pe placa de dezvoltare: - AN0 (J13) la POT2(J4) - AN1(J13) la BACK EMF(J16) - RA3(J13) la D4(J14) - RA4(J13) la SW3(J4) - RA5(J13) la D7(J14) - RD1(J13) la SW2(J4) - RD7(J10) la P1(J1) - RD6(J10) la D0(J14) - RD5(J10) la D1(J14) - RD4(J10) la SW4(J4) - CCP2(J10) la N2(J10) 3.2.2 Semnificaia i funciile componentelor: Poteniometrul P2 are un dublu rol o dac reglajul automat al turaiei este dezactivat, atunci tensiunea convertit de la poteniometrul P2 controleaz direct factorul de umplere al semnalului PWM o n caz contrar variaia tensiunii de la poteniometrul P2 n intervalul 0-5V este tradus ntr-o variaie a variabilei setRPM n intervalul 0 2000RPM conform caracteristicii Viteza_de_rotaie=f(Tensiune_electromotoare_autoindus) verificat experimental. Switch-ul 2 activeaz sau dezactiveaz funcia de reglaj automat al turaiei. La fiecare apsare a acestui buton se complementeaz variabil AUTO care controleaz funcia de reglaj automat al turaiei. Modificarea este transmis imediat ctre aplicaia PC pentru a menine sincronizarea interfeei grafice cu starea microcontrolerului. Switch-ul 3 controleaz informaia afiat pe ecranul LCD. Ct timp acest buton este inut apsat, pe ecranul LCD este afiat viteza de rotaie impus (cu ajutorul potentiometurlui P2 sau prin comanda de la PC), iar n caz contrar (butonul este relaxat) este afiat valoarea curent a turaiei motorului de curent continuu. Switch-ul 4 permite dezactivarea controlului software (controlul prin aplicaia PC). Ct timp controlul software este activ, potentiometurl P2 este dezactivat, iar comenzile de control al turaiei sunt date de aplicaia PC. Acest buton trebuie apsat atunci cnd controlul software este activ i se dorete modificarea turaiei cu ajutorul poteniometrului P2. LED-ul D0 atunci cnd reglajul automat al turaiei este activ LED-ul 0 indic (aprins) realizarea unei corecii pozitive a tensiunii aplicate motorului de curent continuu (creterea factorului de umplere al semnalului PWM). LED-ul D1 are funcionalitate complementar LED-ului 0 aprinzndu-se n momentul aplicrii unei corecii negative asupra tensiunii de alimentare a motorului (descreterea factorului de umplere al semnalului PWM) 46

LED-ul D4 indica sursa curent de control a turaiei: cnd LED-ul este stins, viteza de rotaie a motorului de curent continuu este controlat de pe placa de dezvoltare prin intermediul poteniometrului P2 (control hardware), iar cnd LED-ul este stins comenzile de control al turaiei sunt date de aplicaia PC. LED-ul D7 indica starea de activare/dezactivare a funciei de control automat al turaiei. Atunci cnd LED-ul este stins controlul automat al turaiei este dezactivat, iar aplicarea unei sarcini duce la scderea turaiei fr ca programul s ncerce aplicarea unei corecii (creterea tensiunii aplicate factor de umplere mai mare al semnalului PWM). Dac LEDul este aprins atunci algoritmul ncearc s pstreze o vitez constant atunci cnd se aplic o sarcin variabil pe motorul de curent continuu. Ecranul LCD este folosit pentru afiarea vitezei de rotaie curente sau a celei dorite n funcie de starea Switch-ului 3. De asemenea se folosete simbolul special A pentru a indica starea funciei de reglaj automat. Stabilirea unui protocol de comunicare ntre microcontroler i PC

3.2.3

Comunicaia este realizat cu un o rat de semn de 9600, cu 8 bii de date, 1 bit de start, 1 bit de stop i fr control de paritate.Comunicarea prin portul serial se face trimind informaii sub forma unui ir de valori pe 8 bii (valori ntre 0 i 255). Pentru a putea transmite i primi comenzi prin portul serial, pe lng configurarea modului USART trebuie stabilit un protocol. Pentru ca cele dou dispozitive s se neleag trebuie formulat un set de comenzi predefinite (mesaje) i formatul acestora. Structura acestor mesaje trebuie cunoscut de ambele aplicaii. Am ales un protocol simplu n care informaia dintr-un pachet de comunicaie (att la transmisie ct i la recepie) are 5 octei dintre care 3 sunt identificatori de comand (3 caractere ASCII) iar ultimii doi sunt date asociate acelei comenzi (viteza de rotaie, factorul de umplere al semnalului PWM, starea parametrilor (reglaj automat, comanda software)). Mesajele trimise de microcontroler ctre PC sunt (fiecare caracter este trimis sub form de cod ASCII (un octet); - concatenare): - PWMM Factor_de_umplere (un octet) ultimul octet conine valoarea curent a factorului de umplere (variabil DutyCycle) al semnalului PWM. SET Viteza_de_rotaie_dorit (doi octei) ultimii doi octei conin valoarea variabilei setRPM (viteza de rotaie impus). Cel de-al 4-lea octet conine biii cei mai semnificativi ai variabilei setRPM (pe 16 bii) iar ultimul octet conine biii cei mai puini semnificativi. RPM Viteza_de_rotaie_curent (doi octei) - ultimii doi octei conin valoarea variabilei RPM (viteza de rotaie curent, stabilit prin msurarea tensiunii autoinduse). Cel de-al 4-lea octet conine biii cei mai semnificativi ai variabilei RPM (pe 16 bii) iar ultimul octet conine biii cei mai puini semnificativi. INI Reglaj_automat (un octet) Control_Software (un octet) acest mesaj este transmis ca rspuns la o cerere de sincronizare din partea aplicaiei PC. Cnd aplicaia PC se conecteaz la portul de comunicaie i detecteaz prezena microcontrolerului primete mesaje pe care le poate identifica pe baza protocolului predefinit trimite un mesaj ctre 47

acesta prin care cere informaii despre starea funciei de Reglaj Automat i a celei de Control Software. Astfel conectarea aplicaiei PC poate fi realizat n orice moment de timp, indiferent de starea microcontrolerului. Starea celor dou funcii este stocat pe cte un bit de informaie, ns pentru a pstra o lungime constant a mesajului (5 octei) se transmite cte un octet pentru fiecare bit. LOOP Reglaj_automat (un octet) atunci cnd funcia de reglaj automat este activat/dezactivat folosind Switch-ul 2 de pe placa de dezvoltare, nou valoare este trimis ctre aplicaia PC pentru a pstra sincronizarea. Ultimul octet conine valoarea variabilei AUTO din programul microcontrolerului. REMOT Acest mesaj este trimis atunci cnd se dezactiveaz controlul software prin apsarea Switch-ului 4 de pe placa de dezvoltare. Controlul software este reactivat automat atunci cnd microcontrolerul primete de la aplicaia PC o comand de modificare a factorului de umplere al semnalului PWM sau o nou valoare pentru viteza de rotaie impus. Starea funciei de reglaj automat poate fi modificat i din aplicaia software indiferent de starea funciei de control automat.

Mesajele trimise de aplicaia PC ctre microcontroler sunt (fiecare caracter este trimis sub form de cod ASCII (un octet); - concatenare): - LOOP Reglaj_automat (un octet) acest mesaj este trimis atunci cnd funcia de reglaj automat al turaiei este activat/dezactivat prin intermediul aplicaiei PC. RPM Viteza_de_rotaie_impus (doi octei) cei mai semnificativi bii ai variabilei setRPM sunt stocai n penultimul octet iar cei mai puin semnificativi n ultimul octet. PWMM Factor_de_umplere (un octet) cnd microcontrolerul primete aceast comand, o introduce n variabil DutyCycle, care este mai apoi scris n registrele CCPR2L i CCP2CON (biii 5-4) pentru a modifica factorul de umplere al semnalului PWM. INITT acest mesaj este trimis de aplicaia PC atunci cnd este detectat microcontrolerul i reprezint prima etap (cererea de informaii) de sincronizare. Microcontrolerul va rspunde la acest mesaj cu informaii legate de starea (activat/dezactivat) funciilor de Reglaj Automat i Control Software. Descrierea algoritmului i a codului sursa Codul sursa al aplicatiei pentru mirocontroler este prezentat integral in ANEXA 7.
3.2.4.1 Iniializarea

3.2.4

n etapa de iniializare a programului se configureaz modul de lucru al microcontrolerului (configurarea porturilor de intrare/ieire, analogice/digitale, selectarea oscilatorului i configurarea frecvenei de sistem), perifericele folosite (convertor analog/digital, modul CCP, Timer0, Timer1, Timer2, USART), afiajul LCD, se activeaz ntreruperile. Configurarea ceasului de sistem la frecvena de 8 MHz se face prin setarea biilor 6-4 din registrul OSCCON. Configurarea porturilor de intrare/ieire se face prin setarea biilor din registrele TRIS asociate porturilor iar pentru selectarea intrrilor analogice se folosete registrul ANSEL. - Ieiri digitale: 48

o RA3 LED-ul D4 o RA4 Switch-ul 3 o RA5 LED-ul D7 o RD1 Switch-ul 2 o RD2 Ieirea modulului CCP o RD4 Switch-ul 4 o RD5 LED-ul D1 o RD6 LED-ul D0 o RD7 comanda tranzistorului nMOS Intrri analogice: o AN0 tensiunea electromotoare autoindus de la pinul BACK EMF o AN1 tensiunea controlat de poteniometrul P2

Configurarea modulului USART. n aceast aplicaie am folosit o rat de semn de 9600, 8 bii de date, un bit de start, un bit de stop, fr control de paritate. Avnd n vedere c am configurat oscilatorul intern la 8MHz trebuie determinat valoarea registrului SPBRG pentru o rat de semn de 9600:

Verificam eroarea de cuantizare astfel:

Eroarea relativ de 0.16% este suficient de mic astfel nct s nu afecteze comunicaia prin portul serial. Acest lucru se dovedete i n testele practice. Urmtorul pas n iniializarea USART este activarea recepiei (registrul RCSTA) i a transmisiunii seriale (registrul TXSTA). Recepia este indicat prin setarea fanionului RCIF iar finalizarea unei transmisiunii prin setarea fanionului TXIF. Att transmisiunea ct i recepia pot fi configurate pentru a lansa o ntrerupere. Configurarea convertorului analog/digital. Conversia analog-digitala are o rezoluie de 10 bii, iar rezultatul conversiei este aliniat la stnga n registrele ADRESH i ADRESL. Frecvena convertorului este f = FOSC/16 = 8MHz / 16 = 500 kHz. Perioada de bit este T AD = 1/f = 2 s, iar conversia dureaz 11 perioade de bit, adik 11 * TAD = 22 s. Configurarea se face din registrele ADCON1 i ADCON0. Registrul ADCON0 permite selectarea intrrii analogice care va furniza semnalul ce trebuie convertit. n aceast aplicaie se folosesc pinii AN0 (tensiune electromotoare autoindus) i AN1 (tensiunea controlat de poteniometrul P2). Configurarea modulului CCP. Pentru o valoare de 63 a registrului PR2, acest modul va genera n modul PWM un semnal dreptunghiular cu frecvena de 31.25 kHz cruia i corespunde o perioad de 32 s ce poate fi calculat astfel:

49

Rezoluia PWM maxim este de 10 bii atunci cnd PR2 ia valoarea 255. Rezoluia este o funcie care depinde de valoarea registrului PR2 conform urmtoarei ecuaii:

Pentru PR2 = 63, rezoluia semnalului PWM va fi de 8 bii, suficient pentru aceast aplicaie. Configurarea Timer-ului 0. Depirea timer-ului 0 este folosit ca baza de timp pentru execuia buclei principale de program. Divizorul timer-ului este selectat la valoarea 256 prin modificarea registrului OPTION_REG. Activarea ntreruperilor. n acest program am folosit ntreruperea pentru recepie a modulului USART. Aceasta se activeaz prin setarea bitului RCIE din registrul PIE1, activarea ntreruperilor pentru periferice (bitul PEIE din registrul INTCON) i n final activarea global a ntreruperilor (bitul GIE din registrul INTCON). Iniializarea ecranului LCD este realizat prin apelarea funciei initLCD. Aceast funcie este definit ntr-un fiier de cod separat.
3.2.4.2 Bucla principal de program

Baza de timp folosit pentru bucla principal de program este dat de depirea generat de Timerul 0 al microcontrolerului. Instruciunile din interiorul buclei se execut la fiecare depire a Timerului 0 sau la intervale care sunt multipli ai bazei de timp. Timerul 0 este configurat s genereze o depire o dat la 32,768 ms conform formulei:

Instruciunile din bucla principal: La fiecare ntrerupere a Timer-ului 0 se verific starea switch-urilor 2 i 4. Un buton este detectat ca apsat dac acesta i pstreaz starea (apsat) timp de 32ms (intervalul dintre dou depiri consecutive ale Timer-ului 0). Acest interval asigura depirea perioadei n care butonul poate face un contact imperfect (debounce). Variabil pushed de tip bit este setat atunci cnd se detecteaz pentru prima oar apsarea unui buton. Dac la apariia urmtoarei ntreruperi butonul este tot apsat (variabil pushed fiind setat) se ia n considerare apsarea butonului i se reseteaz variabila. Fanionul care indic depirea Timer-ului 0 (T0IF) trebuie resetat prin software. Variabila Contor este incrementata iar n funcie de valoarea ei se vor executa anumite instruciuni la intervale egale cu multipli ai bazei de timp. Este apelat rutina ReadBackEMF care citete i memoreaz valoarea tensiunii electromotoare autoinduse. 50

Figura 3.30 Diagrama buclei principale de program 51

Dup msurarea tensiunii autoinduse, n cazul n care funcia de Reglaj Automat este activ, este apelat rutina adjustRPM care calculeaz eroarea de vitez i modific factorul de umplere n cazul n care eroarea nu se ncadreaz ntre anumite limite impuse. n acest caz funcia primete ca parametru viteza de rotaie calculat ca media ultimelor 4 valori nregistrate pentru tensiunea electromotoare autoindus. La fiecare interval mai mare de 64 de ori dect baza de timp se calculeaz viteza de rotaie folosind media ultimelor 64 de valori ale tensiunii electromotoare autoinduse msurate. Aceast vitez de rotaie obinut este afiat pe ecranul LCD folosind funcia DisplayRPM iar variabila Contor este resetat. Dup afiarea turaiei bucla principal de program se reia.
Descrierea subrutinelor principale

3.2.4.3

ReadBackEMF

Aceast subrutina efectueaz conversia analog digital a tensiunii electromotoare autoinduse i reine ultimele 64 de rezultate ale conversiei. Media acestor valori va da o estimare mai bun a vitezei de rotaie reducnd zgomotul. n Figura 3.3 se observ tensiunea autoindus pentru un factor de umplere de 68.62%. Dup ntreruperea alimentrii, atunci cnd motorul se afl sub sarcin, intervalul de timp necesar tensiunii autoinduse pentru a ajunge n zona de stabilizare este mai mare. Folosind osciloscopul am determinat c acest interval nu depete valoarea de 400s.

Figura 3.31 T.e.m autoindus pentru factor de umplere 68.62% Convertorul analog-digital este configurat pentru a converti semnalul de pe pinul AN0 (regisrtul ADCON0 biii 2-0). Astfel, pentru msurarea tensiunii autoinduse, se ntrerupe alimentarea motorului, se dezactiveaz modulul PWM pentru 400s apoi se fac 4 conversii analog/digitale consecutive la intervale de 40 s, iar media acestor 4 valori este trecut n variabila insantEMF. Acesta este un prim pas n ncercarea de a reduce zgomotul. Valorile astfel obinute sunt trecute ntr-un vector cu 64 de valori (EMFVector). Acest vector este accesat circular folosind ca index variabil Pointer care ia valori inrte 0 i 63, trecnd din 63 n 0 la incrementare. Tot n aceast subrutin este calculat suma ultimelor 4 valori citite (microEMFSum) precum i suma tuturor celor 64 de valori (EMFSum). Deoarece valorile sunt memorate ntr-un 52

vector suma poate fi recalculat prin simpla adunare a noii valori citite i scderea celei mai vechi valori din vector. Media ultimelor 4 valori citite va fi folosit pentru a aplica o corecie rapid, semnificativ a turaiei atunci cnd eroarea are valori mari. Media pe 64 de valori este folosit pentru corecia fin atunci cnd eroarea scade i se ncearc stabilizarea turaiei n apropierea celei impuse. Chiar i dup luarea tuturor acestor msuri de reducere a zgomotului, turaia nu ajunge ntotdeauna exact la viteza de rotaie impus ci doar n vecintatea acesteia. Pentru o performan mai bun trebuie folosit alt metod de msurare a turaiei reale (feedback): senzor optic sau senzor cu efect Hall. adjustRPM

Aceasta subrutin realizeaz coreciile necesare asupra factorului de umplere al semnalului PWM pentru meninerea unei viteze de rotaie constante n condiiile unei sarcini variabile. Argumentele importante cu care se apeleaz aceste funcii sunt: - cRPM viteza curent de rotaie exprimat n rotaii pe minut - threshold marja de eroare. Dac diferena dintre viteza impus (setRPM) i cRPM este mai mare n modul dect acest argument atunci va avea loc o corecie - gain valoarea cu care se va modifica factorul de umplere (variabil DutyCycle) n cazul aplicrii unei corecii. n cazul n care se aplic o corecie, se aprinde LED-ul D0 (corecie negativ, scderea factorului de umplere) sau LED-ul D1 (corecie pozitiv, creterea factorului de umplere). Apelarea acestei subrutine se face la fiecare depire a timer-ului 0 (32 ms) pentru corecii rapide i semnificative (erori mari) sau la fiecare 16 depiri (0.5s) pentru corecii mai puin semnificative bazate pe eroarea calculat pe baza mediei tuturor celor 64 de valori ale tensiunii autoinduse memorate.

Figura 3.32 Diagrama rutinei adjustRPM

53

SetMotorSpeed

nti se citete tensiunea de la poteniometrul P2 realiznd o conversie analog/digital dup selectarea canalului de intrare AN1 (ADCON0 bitul 0). n cazul n care controul software este dezactivat (SOFT=0, viteza comandat de microcontroler), viteza de rotaie impus (setRPM, dat n acest caz de poteniometrul P2) este calculat n funcie de rezultatul conversiei. Am observat experimental c viteza de rotaie nu este perfect liniar i poate fi aproximat mai bine printr-o funcie ptratic de forma Unde x este rezultatul conversiei analog/digitale. Dac funcia de Reglaj Automat este activ, atunci cei mai semnificativi 8 bii ai conversiei sunt copiai n variabil DutyCycle. n final cei mai semnificativi 6 bii ai factorului de umplere (variabil DutyCycle) sunt copiai n registrul CCP2CON (biii 5-0) iar cei mai puin semnificativi 2 bii sunt copiai n registrul CCP2CON (bitii 5-4). DisplayRPM

Aceast procedur este apelat o dat la fiecare 500 ms i afieaz viteza de rotaie curent pe ecranul LCD. n cazul n care switch-ul 3 este inut apsat, pe ecran va fi afiat valoarea variabilei setRPM (viteza impus). Tot aici, viteza curent de rotaie, viteza impus i valoarea factorului de umplere sunt transmise ctre PC prin intermediul subrutinei transmit. Afiarea pe ecranul LCD se realizeaz cu o serie de funcii definite ntr-un alt fiier C. Aceste funcii permit afiarea cifrelor cu 7 segmente pe cele trei poziii ale LCD-ului, precum i afiarea punctului zecimal pe una din cele 3 poziii disponibile sau activarea altor simboluri conform ANEXEI 6. SendTXT

Subrutina SendTXT efectueaz transmisiunea n ordine a tuturor caracterelor dintr-un ir constat primit ca argument. Pentru fiecare caracter se trimite codul su ASCII (un octet). Transmisiunea poate fi nceput prin scrierea unui octet n registrul TXREG. Fanionul de ntrerupere TXIF este resetat hardware atunci cnd transmisiunea este finalizat. Transmit

Aceast procedur primete ca argument un ir constant de trei caractere ce reprezint codul mesajului ce trebuie transmis ctre PC. Acest ir de caractere este comparat cu ntreaga list de comenzi definite n protocolul de comunicaie i efectueaz transmisiunea unui pachet de 5 octei care conine un cod de comand i informaia ataat. Descrierea comenzilor posibile este fcut la nceputul acestui capitol. checkCMD

Funcia checkCMD primete ca argument un ir constant de 3 caractere pe care l compar cu primele 3 caractere din vectorul de recepie rcvBuffer. n cazul unei potriviri funcia returneaz valoarea 1 i 0 n caz contrar.

54

Uart_int

Aceast este rutin de ntrerupere folosit n program pentru a recepiona datele primite prin portul serial. Datele primite sunt mprite n pachete de 5 octei i apoi verificate conform protocolului de comunicare (lista de comenzi predefinit). Microcontrolerele din familia PIC16 au un singur vector de ntreruperi, deci o singur rutin de rspuns la ntreruperi. n acest program am folosit o singur ntrerupere pentru recepia datelor prin modulul USART. Dac se folosesc mai multe surse de ntrerupere trebuie verificat prin cod care este perifericul care a generat ntreruperea.
3.2.4.4 Implementarea funciilor pentru afiajul LCD

Dup cum se poate observa n ANEXA 5, circuitul de comand pentru afiaje LCD al microcontrolerului PIC16F917 permite comandarea LCD-urilor cu pn la 96 de segmente folosind 24 de de pini de segment i pn la 4 ci comune. Starea (aprins/stins) fiecrui segment de pe LCD poate fi modificat folosint biii celor 12 registre LCDDATA0-11. Pentru LCD-ul cu 39 de segmente VIM-332 montat pe placa de dezvoltare se folosesc doar 10 pini de segment i 4 ci comune ns biii de stare ai segmentelor sunt rspndii n toate cele 12 registre LCDDATA. Schema ecranului LCD VIM-332 este prezentata in ANEXA 6. Pentru a uura modalitatea de afiare a informaiilor pe LCD am implementat o serie de funcii care primesc ca parametru un ir de octei (cifre hexazecimale) i afieaz cifrele respective pe LCD modificnd automat registrele LCDDATA. Pentru fiecare dintre cele 3 poziii de pe LCD n care se pot afia cifre am identificat cele 7 segmente n ordine conform Figurii 3.5.

Figura 3.33 LCD cu 7 segmente. Am plecat de la ideea declarrii cte unui vector cu 7 valori (corespunztoare celor 7 segmente ale unei cifre) n care s rein adresele biilor din registrele LCDDATA care controleaz segmentele fiecrei cifre n ordinea ABCDEFG. Deoarece compilatorul HI-TECH C nu permite adresarea indirect a variabilelor de tip bit, am folosit cte o pereche de vectori pentru fiecare poziie: - Vectorii pos rein adresele registrelor LCDDATA n care se afla bitii corespunztori segmentelor. - Vectorii mask rein poziiile biilor respectivi n interiorul registrelor LCDDATA Astfel se poate face o adresare indirect a registrelor LCDDATA, iar din valoarea adresat se citete bitul cu numrul corespunztor din vectorul mask. Dup memorarea adreselor fiecrui segment pentru fiecare dintre cele 3 poziii, trebuie fcut o legtur ntre cifrele care vor fi afiate i segmentele care le compun. Astfel cifra 2 este compus din segmentele ABDEG. Dac reprezentm segmentele care fac parte din reprezentarea unei cifre cu 1 iar segmentele care nu fac parte cu 0, atunci pentru ordinea de parcurgere ABCDEFG, cifra 2 va avea reprezentarea 1101101. Astfel se pot reprezenta toate cifrele hexazecimale. La cei 7 bii se mai adug bitul cel mai puin semnificativ cu valoarea 0. Vectorul digits conine codurile corespunztoare cifrelor hexazecimale, conform Tabelului 3.1: 55

Cifra Hex. 0 1 2 3 4 5 6 7 8 9 A b C d E F

Rezultat0

1 1 1 1 1 1 0 11111100 1 1 0 0 0 0 0 01100000 1 1 0 1 1 0 1 11011010 1 1 1 1 0 0 1 11110010 0 1 1 0 0 1 1 01100110 1 0 1 1 0 1 1 10110110 1 0 1 1 1 1 1 10111110 1 1 1 0 0 0 0 11100000 1 1 1 1 1 1 1 11111110 1 1 1 1 0 1 1 11110110 1 1 1 0 1 1 1 11101110 0 0 1 1 1 1 1 00111110 1 0 0 1 1 1 1 10011100 0 1 1 1 1 0 1 01111010 1 0 0 1 1 1 1 10011110 1 0 0 0 1 1 1 10001110 Tabelul 3.8 Codificarea cifrelor hexazecimale

Atunci cnd se dorete afiarea unei cifre algoritmul este urmtorul: - Cifra respectiv este folosit ca index pentru vectorul digits pentru a afla codul acesteia. - Se parcurg vectorii pos i mask iar la fiecare valoare de la adresele din vectorul pos se atribuie bitului cu ordinul corespunztor din vectorul mask, valoarea bitului corespunztor din codul cifrei. Fiierul LCDLib.c conine urmtoarele subrutine: - initLCD iniializeaz afiajul LCD prin activarea pinilor de segment (registrele LCDSE20) i resetarea biilor de segment (resetarea registrelor LCDDATA11-0). Registrul LCDCON este folosint pentru activarea modulului de comand LCD i selectarea sursei de ceas FOSC/8192 aproximativ egal cu 1 kHz. - DisplayDP n funcie de valoarea argumentului k, aceast procedur afieaz punctul zecimal pe una din cele trei poziii posibile. - DisplayDIGIT1 primete ca argument un numr ntre 0 i 15 i afieaz pe cifra hexazecimal corespunztoare pe poziia 1 a LCD-ului (prima de la dreapta la stnga). - DisplayDIGIT2 primete ca argument un numr ntre 0 i 15 i afieaz pe cifra hexazecimal corespunztoare pe poziia 2 a LCD-ului (a doua de la dreapta la stnga). - DisplayDIGIT3 primete ca argument un numr ntre 0 i 15 i afieaz pe cifra hexazecimal corespunztoare pe poziia 3 a LCD-ului (a treia de la dreapta la stnga). - DisplaySymbol se ocup de afiarea celorlalte simboluri ce pot fi afiate pe LCD. Aceste simboluri sunt definite n ANEXA 5. Subrutina primete ca argument un ir de caractere ce reprezint denumirea simbolului (V, K, BATT, -, etc) i un al doilea argument care va lua valoarea 0 sau 1 reprezentnd starea dorit a simbolului (0 stins, 1 aprins).

56

3.3 Proiectarea software pentru PC

3.3.1

Introducere

Aplicaia software pentru microcontroler ndeplinete cerinele proiectului, permind controlul turaiei motorului de curent continuu cu posibilitatea de a menine vitez constant atunci cnd motorul se afl sub sarcin. Cu toate acestea, posibilitile plcii de dezvoltare de a afia rezultatele sunt limitate: ecranul LCD poate afia doar 3 caractere cu 7 segmente fiecare. Am considerat necesar implementarea unei aplicaii software pentru PC care s poat controla turaia motorului, oferind n plus posibilitatea afirii n timp real a datelor primite de la microcontroler pe un grafic n funcie de timp. Aplicaia a fost realizat n Visual Studio 2010 folosind limbajul Visual Basic.NET 2010. Interfaa grafic a aplicaiei PC este intuitiv i permite observarea variaiei n timp a turaiei motorului. 3.3.2 Prezentarea interfeei grafice

Funcionalitatea elementelor de interfa. Grupul Informaii Conexiune: Port serial Lista tuturor porturilor disponibile pe PC-ul pe care ruleaz aplicaia. n mod implicit la pornirea programului primul port din lista este selectat automat. Conectare Dup selectarea portului serial corespunztor la care este conectat placa de dezvoltare, se apas acest buton pentru a deschide portul. Dac portul a fost deschis cu succes acest buton este dezactivat mpreun cu lista de selecie a porturilor, iar butonul Deconectare devine activ. Deconectare nchide portul de comunicaie. Dup apsare butonul este dezactivat, iar lista de selecie a porturilor i butonul Conectare devin active. n partea dreapt a acestui chenar sunt prezentate alte detalii privitoare la parametrii conexiunii seriale (rata de semn, control paritate, numr de bii de stop, numr de bii de date).

Grupul Date Recepionate: Viteza curent turaia motorului de curent continuu primit de la microcontroler la intervale de 500 ms. Viteza impus turaia care trebuie meninut atunci cnd funcia de Reglaj Automat este activat. Atunci cnd Controlul Soft este activ aceast valoare este aceea introdus n csua text Vitez din grupul Comenzi Microcontroler. Dac turaia este controlat de plac de dezvoltare (Control Soft dezactivat) atunci Viteza impus este indicat de poteniometrul P2. 57

Factor de umplere PWM Atunci cnd Reglajul Automat este activ, microcontrolerul modifica factorul de umplere pentru a menine turaia constant atunci cnd motroul este sub sarcin. Dac Reglajul Automat este inactiv atunci Factorul de umplere este constant. Aceeai valoare este indicat i n graficul PWM din partea dreapt colorat cu un gradient de la albastru la rou, albastru corespunznd valorii 0 i rou valorii 100.

Grupul Comenzi Microcontoler: PWM csua text n care se pot introduce numere ntre 0 i 100 reprezentnd factorul de umplere dorit. Prin apsarea tastei Enter atunci cnd csua text este selectat, sau prin apsarea butonului Trimite, nou valoare a factorului de umplere este trimis ctre microcontroler. Aceast comand va activa Controlul Soft i va dezactiva funcia de Reglaj Automat. Viteza se introduce o valoare ntre 0 i 2000 de rotaii pe minut, reprezentnd viteza impus. Aceast valoare este trimis ctre microcontroler dup apsarea tastei Enter sau apsarea butonului Trimite corespunztor. Aceast comand va activa Controlul Soft i funcia de Reglaj Automat. Reglaj Automat la apsarea acestui buton starea funciei de Reglaj Automat este activat/dezactivat. Aceast comand este independent de starea Controlului Soft.

Alte elemente de interfa: Indicatorul Control Soft arat starea curent a funciei Control Soft. Culoarea Verde indic faptul c turaia este controlat de aplicaia PC iar culoarea Rosie arata c pentru controlul turaiei este folosit poteniometrul P2 de pe placa de dezvoltare. Indicatorul Reglaj Automat culoarea Verde semnific activarea Reglajului Automat (microcontrolerul modific automat semnalul PWM pentru a menine turaia constant) iar culoarea Rosie indic faptul c funcia de Reglaj Automat este inactiv. Lupa modific domeniul de valori care este afiat pe axa vertical a graficului. Dac aceast funcie este bifat, graficul va afia un domeniu de 300 RPM centrat pe valoarea curent a vitezei de rotaie. Dac funcia Lupa este debifat, atunci domeniul de valori de pe axa vertical va fi ntotdeauna 0-2000 RPM. Netezire permite modificarea modalitii de afiarea a graficului. Dac aceast funcie este dezactivat, punctele de pe grafic (recepionate la intervale de 500ms) vor fi interconectate prin linii drepte. Dac funcia netezire este activ atunci punctele intermediare valorilor eantionate sunt aproximate cu funcii spline, graficul avnd un aspect mai bun.

Graficul n funcie de timp Acest grafic este poziionat n partea de jos a interfeei i se redimensioneaz automat odat cu fereastra principal de program. Pe grafic sunt afiate ultimele 46 de valori ale vitezei de rotaie totaliznd 23 de secunde. Axa orizontal este mprit n intervale de 1 secund cu etichete de marcare la fiecare 5 secunde. Domeniul afiat pe axa vertical se modific n funcie de starea opiunii Lupa. Cnd Lupa este dezactivat, sunt afiate valori ntre 0 i 2000 RPM cu linii de marcaj la interval de 200 58

RPM. Dac funcia Lupa este activa se afieaz un domeniu de 300 RPM n jurul valorii curente a vitezei de rotaie. n acest caz, liniile de marcaj sunt afiate la intervale de 50 RPM. Atunci cnd funcia Reglaj Automat este activ, n partea dreapt a axei verticale este indicat valoarea vitezei de rotaie impuse. Realizarea unui Dublu-Click pe suprafaa graficului activeaz/dezactiveaz funcia Lupa.

Figura 3.34 Fereastra principal de program Reprezentarea grafic a factorului de umplere n partea dreapt sus a interfeei este reprezentat grafic valoarea factorului de umplere al semnalului PWM folosind o schem de culori care variaz gradual de la Albastru (factor de umplere 0%) ctre Rou (factor de umplere 100%). Acest grafic are funcie dubl: Afieaz valoarea curent a factorului de umplere trimis de microcontroler. Dac se efectueaz un click n interiorul dreptughiului marcat, n funcie de nlimea cursorului fa de marginea de jos a graficului este calculat o valoare ntre 0 i 100 care este apoi trecut n csua text PWM din grupul Comenzi Microcontroler i apoi aceast comand este trimis prin portul serial.

Prezentarea brii de meniu: Fiier 59

o Conectare o Deconectare o Ieire Opiuni o Lup o Reglaj Automat o Netezire Ajutor o Despre

Opiunea Despre din meniul Ajutor va afia informaii despre tema proiectului, autor i coordonator.

Figura 3.35 Fereastra informaii

3.3.3

Descrierea general a algoritmului

Codul sursa al aplicatiei pentru PC este prezentat integral in ANEXA 8. Visual Basic Net este un limbaj de programare de nivel nalt orientat pe obiecte. Orice aciune pe care programul o ntreprinde este declanat de un eveniment cum ar fi: apsarea unui buton, micarea cursorului, Click, Dublu-Click. Blocuri importante de program: frmMain_Load Se execut la rularea programului. Aici se pot face iniializri precum ncrcarea listei de porturi disponibile i starea iniial a diferitelor elemente de interfa (butonul Deconectare dezactivat, lista de porturi activ, ) btnSendPWM_Click Se execut la apsarea pe butonul Trimite din dreptul csuei text PWM din grupul Comenzi Microcontroler. Verific dac valoarea introdus n csua text este ntre 0 i 100 iar n caz contrar afieaz un mesaj de avertizare. Dac valoarea se ncadreaz n domeniul stabilit atunci se trimite ctre microcontroler comanda PWMM urmat de nou valoare a factorului de umpere. btnSendRPM_Click Se execut la efectuarea unui click pe butonul Trimite din dreptul csuei text Viteza. Se verific dac valoarea se ncadreaz n intervalul 0-1950 i n caz afirmativ se trimite ctre microcontroler comanda RPM urmat nou valoare a turaiei impuse.

60

SerialPort1_DataReceived Este echivalentul unei ntreruperi pentru microcontroler. Este executat atunci cnd prin portul serial s-au primit cel puin 5 octei de informaie. Din aceast procedur se apeleaz rutina ReceivedText. ReceivedText Aceasta este rutina de rspuns la ntreruperea generat la primirea unui pachet prin portul serial. Se compar primii 3 octei din pachet cu toate comenzile din protocolul predefinit. n cazul unei potriviri se execut o secven de cod specific prin care se modifica elementele de interfa. n cazul comenzilor de tip SET sau RPM se apeleaz comanda pbGraph.Invalidate care foreaz redesenarea graficului n funcie de timp. pbGraph_DoubleClick Se execut la efectuarea unui dublu-click n aria graficului. Are ca efect complementarea strii funciei Lup. pbGraph_Paint Aceasta este rutina n care am implementat afiarea graficului. Am definit zona de tip dreptunghi (Area) n care se realizeaz desenul. nti se deseneaz axele de coordonate, apoi valorile vitezei de rotaie stocate n vectorul rpmValues sunt desenate i unite prin linii. Vectorul rpmValues este actualizat la primirea fiecrei noi valori (o dat la 500ms). Procedeul de desenare a graficului este destul de complex, aceasta fiind procedura cu cele mai multe linii de cod. Am folosit funcii i proprieti ale clasei Graphics din cadrul domeniului System.Drawing al Framework-ului .NET. pbPWM_Paint Asemntor cu pbGraph_Paint aceast procedur este folosit pentru redesenarea reprezentrii grafice a factorului de umplere al semnalului PWM. Acest grafic este poziionat n partea superioar dreapt a ferestrei principale de program. i aici am folosit clasa Graphics pentru a desena toate elmentele care apar pe grafic. btnLoop_Click Se execut la apsarea pe butonul Reglaj Automat i modific starea acestei funcii trimind apoi nou valoare ctre microcontroler. btnConnect_Click Este apelata la apsarea pe butonul Conectare i are ca efect deschiderea portului serial de comunicare i stabilirea parametrilor de comunicare (rata de bit, paritate, bii de stop, bii de start). n cazul n care portul care se ncearc a fi deschis este folosit de o alt aplicaie windows, programul afieaz un mesaj de avertizare. btnDisconnect_Click Aceast procedur se execut la apsarea butonului Deconectare i are ca efect nchiderea portului de comunicaie serial i readucerea variabilelor de program i a interfeei grafice la starea iniial de dinainte de conectare.

61

Capitolul 4. Date experimentale

4.1 Introducere
Spre deosebire de senzorii optici sau senzorii cu efect Hall, tensiunea electromotoare autoindus nu este la fel de precis n ceea ce privete determinarea vitezei de rotaie. ns aceast metod nu implic un cost ridicat i poate fi folosit i n anumite situaii n care montarea unui senzor optic sau cu efect Hall nu este posibil din cauza lipsei spaiului necesar. Pentru a putea implementa sistemul automat de reglare a turaiei motorului de curent continuu folosind msurarea tensiunii electromotoare autoinduse trebuie observat dependenta acestei tensiunii de viteza real de rotaie. Pentru efectuarea msurtorilor am folosit osciloscopul digital Tektronix TPS2014.

Figura 4.36 Osciloscop digital Tektronix TPS2014

4.2 Msurarea vitezei reale de rotaie


Pentru determinarea vitezei reale la diferite valori ale tensiunii de alimentare am folosit senzorul optic de pe placa de dezvoltare PICDEM Mechatronics. Intru-cat motorul are ataat o roat cu dou fante, senzorul optic va genera cte dou impulsuri la fiecare rotaie complet. Pentru frecventa PWM aleasa f = 31.25 kHz i frecvena de sistem fOSC = 8MHz, valoarea registrului perioad PR2 este calculat astfel:

Pentru aceast perioad se poate calcula rezoluia semnalului PWM:

Aadar se pot defini 256 de valori distincte ale limii impulsului. Pentru determinarea dependenei lime impuls vitez de rotaie am variat limea impulsului n domeniul 15 255 cu increment 16 (folosind MPLAB IDE i compilator C) i am msurat cu osciloscopul frecventa impulsurilor date de senzorul optic. mprind aceast frecven la 2 i apoi nmulind cu 60 se poate determina viteza real de rotaie. 62

Figura 4.37 Rspunsul senzorului optic pentru un factor de umplere de 62.35%

Figura 4.38 Rspunsul senzorului optic pentru un factor de umplere de 87.45% Lime impuls
15 31 47 63 79 95 111 127

Frecvena
0 0 0 0 10.06 15.42 20.12 24.99

Viteza de rotaie
0 0 0 0 301.8 462.6 603.6 749.7

Lime impuls
143 159 175 191 207 223 239 255

Frecvena
29.67 33.83 39.11 44.99 50.47 55.27 60.15 65.42

Viteza de rotaie
890.1 1014.9 1173.3 1349.7 1514.1 1658.1 1804.5 1962.6

Tabelul 4.9 Dependena vitezei de rotaie de limea impulsului PWM Atunci cnd se activeaz reglajul automat iar controlul soft este dezactivat, tensiunea de la poteniometrul P2 este cea care controleaz turaia. Cei mai semnificativi 8 bii ai rezultatului conversiei tensiunii de la poteniometrul P2 formeaz un numr care ia valori ntre 0 i 255. Acest numr trebuie convertit ntr-o turaie impus cu valori ntre 0 i 2000. Pentru a putea realiza acest lucru trebuie calculat ecuaia dreptei de regresie pentru graficul de mai jos. Calculul ecuaiei dreptei de regresie pentru limea impulului ntre 79 i 255. Dreapta de regresie are forma: unde:

63

Figura 4.39 Dependena vitezei de rotaie de limea impulsului PWM x 79 95 111 127 143 159 175 191 207 223 239 255 y 301.8 462.6 603.6 749.7 890.1 1014.9 1173.3 1349.7 1514.1 1658.1 1804.5 1962.6 x*y 23842.2 43947 66999.6 95211.9 127284.3 161369.1 205327.5 257792.7 313418.7 369756.3 431275.5 500463 x2 6241 9025 12321 16129 20449 25281 30625 36481 42849 49729 57121 65025

(x) (y) (x*y) (x2) 2004 13485.6 2596687.8 371276 Tabelul 4.10 Termeni necesari pentru determinarea dreptei de regresie ((x))2 = 4016016
n=12

Ecuaia dreptei de regresie este:

64

4.3 Tensiunea medie a semnalului PWM

Figura 4.40 Semnal PWM pentru factor de umplere 24,7%

Figura 4.41 Semnal PWM pentru factor de umplere 68,63% Factor de umplere (Lime impuls/255)
0 0.05882353 0.12156863 0.18431373 0.24705882 0.30980392 0.37254902 0.43529412 0.49803922 0.56078431 0.62352941 0.68627451 0.74901961 0.81176471 0.8745098 0.9372549 1

Lime impuls Durata impuls [s] (0-255)


0 15 31 47 63 79 95 111 127 143 159 175 191 207 223 239 255 0 1878 3874 5880 7878 9861 11860 13860 15850 17840 19840 21850 23840 25840 27820 29820 31800

Factor de umplere msurat


0 0.0588162 0.1213279 0.1841528 0.2467272 0.3088318 0.3714375 0.4340745 0.4963984 0.5587222 0.6213592 0.6843094 0.7466333 0.8092703 0.8712809 0.9339179 0.9959286

Tensiune Msurat [mV]


0 296 606 916 1230 1540 1840 2170 2580 2990 3290 3600 3910 4220 4530 4840 5150

Tabelul 4.11 Variaia tensiunii n funcie de factorul de umplere al semnalului PWM. 65

Figura 4.42 Variaia tensiunii n funcie de limea impulsului PWM

4.4 Legtura dintre viteza de rotaie i tensiunea electromotoare autoindus


Pentru msurarea tensiunii electromotoare autoinduse am conectat osciloscopul la pinul Back EMF al plcii de dezvoltare. Apoi am variat limea impulsului PWM folosind aceleai valori din intervalul 15-255 cu increment 16.

Figura 4.43 T.e.m autoindus pentru factor de umplere 43.52%

66

Figura 4.44 T.e.m autoindus pentru factor de umplere 68.62%

Lime impuls Tensiune autoindusa Rezultatul conversiei Viteza de rotaie (0-255) Msurat [mV] tensiunii autoinduse msurat [rpm]
0 15 31 47 63 79 95 111 127 143 159 175 191 207 223 239 255 0 0 0 0 0 720 1040 1440 1760 2160 2480 2640 3120 3520 3680 4080 4480 0 0 0 0 0 35 51 70 86 106 122 129 153 173 181 200 220 0 0 0 0 0 301.8 462.6 603.6 749.7 890.1 1014.9 1173.3 1349.7 1514.1 1658.1 1804.5 1962.6

Tabelul 4.12 Viteza de rotaie n funcie de t.e.m autoindus

67

Figura 4.45 Viteza de rotaie n funcie de valoarea registrului ADRESH. Calculul ecuatiei dreptei de regresie: x valoarea registrului ADRESH cei mai semnificativi 8 bii ai rezultatului conversiei tensiunii electromotoare autoinduse y viteza de rotaie x 0 35 51 70 86 106 122 129 153 173 181 200 220 y
0 301.8 462.6 603.6 749.7 890.1 1014.9 1173.3 1349.7 1514.1 1658.1 1804.5 1962.6

x*y 23842.2 43947 66999.6 95211.9 127284.3 161369.1 205327.5 257792.7 313418.7 369756.3 431275.5 500463

x2 6241 9025 12321 16129 20449 25281 30625 36481 42849 49729 57121 65025

(x) (y) (x*y) (x2) 1526 13485 2071637.4 233382 Tabelul 4.5 Date necesare pentru determinarea dreptei de regresie ((x))2 = 2328676

68

Ecuaia dreptei de regresie este: Folosind aceast ecuaie putem calcula eroarea vitezei de rotaie pentru diferite valori ale tensiunii autoinduse. x y calculat eroare 0 0 -20.08 20.08 35 6.60 301.8 295.19 51 462.6 439.32 23.27 70 603.6 610.47 6.87 86 749.7 754.59 4.89 106 44.65 890.1 934.75 122 1014.9 1078.88 63.98 129 1173.3 1141.93 31.36 153 1349.7 1358.12 8.42 173 1514.1 1538.28 24.18 181 1658.1 1610.34 47.75 200 1804.5 1781.49 23.00 220 1962.6 1961.65 9.43 Tabelul 4.6 Eroarea vitezei de rotaie y

69

70

Capitolul 5.

Concluzii

Motoarele de curent continuu permit controlul turaiei, cuplului i chiar al direciei de rotaie. Datorit acestor capabiliti, motoarele de curent continuu sunt folosite ntr-o gam larg de aplicaii pornind de la jucrii, ventilatoare, aparatur electrocasnic (mixer, main de splat) pn la sisteme de control automat al direciei pentru autovehicule, unelte electrice, roboi mobili, etc. Obiectivul acestui proiect a fost realizarea unui sistem de control al turaiei motoarelor de curent continuu folosind microcontroler PIC i msurarea tensiunii electromotoare autoinduse. Pentru a ndeplini acest obiectiv am folosit placa de dezvoltare PICDEM Mechatronics echipat cu microcontrolerul PIC16F917 i cu un motor de curent continuu alimentat la 5 V avnd o turaie maxim de 2000 rpm. Pentru a implementa sistemul de reglaj al turaiei n bucl nchis am folosit ca metoda de feedback msurarea tensiunii electromotoare autoinduse. n partea iniial a proiectului am utilizat osciloscopul pentru a determina cu precizie parametrii motorului de curent continuu (caracteristica viteza de rotaie tensiune electromotoare autoindus, domeniul de variaie i intervalul de timp necesar pentru stabilizarea tensiunii autoinduse). n etapa de proiectare software am implementat un program pentru microcontroler n care am folosit o metod proporional de control al turaiei motorului de curent continuu. Deoarece tensiunea electromotoare autoindus prezint un zgomot sesizabil am implementat o metod filtrare a acestuia bazat pe mediere. Afiarea turaiei n timp real este realizat cu ajutorul ecranului LCD al plcii de dezvoltare. Pentru a putea afia cu uurin viteza pe ecran, am implementat o librrie de funcii speciale ce permit afiarea de caractere hexazecimale pe cele 3 poziii cu 7 segmente, precum i afiarea tuturor celorlalte simboluri speciale disponibile pe LCD. Pe lng programul pentru microcontroler am implementat i o aplicaie pentru PC prin care se pot trimite comenzi ctre microcontroler pentru a comanda turaia motorului. Prin intermediul unei interfee grafice intuitive, aplicaia PC permite, pe lng posibilitatea de control al turaiei motorului i afiarea graficului vitezei de rotaie n funcie de timp. Obiectivul proiectului este ndeplinit, sistemul de reglaj implementat permind meninerea unei viteze de rotaie impuse (ntre anumite limite), n condiiile unei sarcinii variabile. O problem a acestui sistem este zgomotul ce apare la citirea tensiunii electromotoare autoinduse. Acest zgomot poate avea drept cauz vibraia motorului sau uzura lagrelor de fixare a axului motorului.

71

72

Bibliografie

[1] Microchip, PICDEM Mechatronics Demonstration Board Users Guide, URL: http://ww1.microchip.com/downloads/en/DeviceDoc/51557C.pdf, accesat la data: 03.07.2011. [2] Microchip, PIC16F917/916/914/913Data Sheet, URL: http://ww1.microchip.com/downloads/en/DeviceDoc/41250E.pdf , accesat la data: 05.07.2011. [3] AMP Display Inc, LCD DRIVERS, URL: http://www.ampdisplay.com/resources_lcd_drivers.html, accesat la data: 05.07.2011 [4] AMP Display Inc, Multiplex Drive and Bias of LCD Technology, URL: http://www.tstonramp.com/~pddwebacc/lcd_multiplex_drive.htm , 05.07.2011 accesat la data:

[5] Microchip, Brushed DC Motor Fundamentals, URL: http://ww1.microchip.com/downloads/en/AppNotes/00905a.pdf , accesat la data: 02.07.2011 [6] Terry Bartelt, Basic DC Electrical Motor Construction, URL: http://www.wisc-online.com/objects/ViewObject.aspx?ID=IAU9508, 03.06.2011 accesat la data:

[7] Wikipedia, Counter-electromotive force, URL: http://en.wikipedia.org/wiki/Counterelectromotive_force, accesat la data: 02.06.2011 [8] Acroname Robotics, Back-EMF Motion Feedback, URL: http://www.acroname.com/robotics/info/articles/back-emf/back-emf.html , accesat la data: 04.07.2011

73

74

Capitolul 6.

ANEXA 1 Schema plcii de dezvoltare PICDEM Mechatronics.

75

ANEXA 2 Structura intern a microcontrolerului PIC16F917

76

ANEXA 3 Funciile pinilor pentru microcontrolerul PIC16F917.

77

ANEXA 4 Schema electric simplificat a proiectului.

78

ANEXA 5 Descrierea modulului de comand pentru ecranul LCD

ANEXA 6 - Schema ecranului LCD VIM-332

79

ANEXA 7 Codul surs al aplicaiei pentru microcontroler.

BackEMF.c
#include <htc.h> #include "LCDLib.h" __CONFIG(CP_OFF & CPD_OFF & BOREN_OFF & PWRTE_ON & WDTE_OFF & FOSC_INTOSCIO & MCLRE_ON & FCMEN_OFF & IESO_OFF); #define _XTAL_FREQ 8000000UL //PINI FOLOSITI #define N2 RD2 #define P1 RD7 #define majorUP RD6 #define majorDOWN RD5 #define remoteSW RD4 #define rpmSW RA4 #define loopSW RD1 #define LOOP RA5 #define REMOTE RA3 //FUNCTII SI PROCEDURI void SetMotorSpeed(void); void ReadBackEMF(void); void primaryStep(void); void DisplayRPM(void); void SendTXT(const char* txt); void adjustRPM(unsigned short cRPM,unsigned char threshold, unsigned char gain, unsigned char major); void transmit(const char* txt); unsigned char checkCMD(const char * cmd); //RUTINA DE INTRERUPERI void interrupt uart_int(void); //VARIABILE GLOBALE unsigned char DutyCycle; unsigned char Pointer=0; unsigned char Contor=0; unsigned char j=0; unsigned char rcvIndex=0; unsigned char rcvBuffer[5]={0}; unsigned char EMFVector[64]={0}; unsigned short RPM=0; unsigned short setRPM=800; unsigned short microEMFSum=0; unsigned short EMFSum=0; unsigned short instantEMF=0; signed short deltaRPM=0; bit pushed; bit init; void main(void) { OSCCON=0b01110000; //OSCILATOR INTERN 8 MHZ //INITIALIZARE PORTURI TRISA0=TRISA1=TRISD1=TRISA4=TRISD4=1; TRISD2=TRISD7=TRISD6=TRISD5=TRISA5=TRISA3=0; TRISC7=TRISC6=1; ANSEL=0b00000011; //INITIALIZARE USART SPBRG=51; RCSTA=0b10010000; TXSTA=0b00100100; //INITIALIZARE ADC ADCON1=0b01010000; ADCON0=0b00000101;

80

//INITIALIZARE MODUL PWM PR2=0x3F; CCPR2L=0; CCP2CON=0b00001100; TMR2ON=1; OPTION_REG=0b10000111; CMCON0=0x07; //DEZACTIVAREA COMPARATOARELOR //INITIALIZAREA VARIABILELOR GLOBALE LOOP=1; REMOTE=0; init=0; //ACTIVAREA INTRERUPERILOR RCIE=1; PEIE=1; ei(); //INITIALIZARE LCD initLCD(); DisplaySymbol("K",1); //ALIMENTAREA MOTORULUI P1=1; N2=1; while (1) { if (T0IF) { if ((!loopSW)||(!remoteSW)) { if (!pushed) { if (!loopSW) { LOOP=~LOOP; transmit("AUT"); } if (!remoteSW) { REMOTE=0; transmit("RMT"); } } pushed=1; } else pushed=0; T0IF=0; Contor++; ReadBackEMF(); if (LOOP) adjustRPM((microEMFSum*9)/4,100,5,1); SetMotorSpeed(); if (Contor & 1<<4) { RPM=(EMFSum/64)*9; if (LOOP) if(!(majorUP||majorDOWN)) adjustRPM(RPM,20,1,0); DisplayRPM(); Contor=0; }

} } }

void ReadBackEMF(void) { //OPRIREA MOTORULUI SI A MODULULUI CCP P1=0; CCP2CON=CCP2CON & 0xF0; N2=1; __delay_us(400); //CONVERSIA TENSIUNII AUTOINDUSE instantEMF=0;

81

ADCON0=0b00000101; for(j=0;j<4;j++) { GO=1; while(nDONE); instantEMF+=ADRESH; __delay_us(40); } instantEMF/=4; //RECALCULAREA SUMELOR Pointer=Pointer & 0x3F; //SUMA CELOR MAI RECENTE 4 VALORI microEMFSum+=instantEMF; microEMFSum-=EMFVector[(Pointer-4)&0x3F]; //SUMA ULTIMELOR 64 DE VALORI EMFSum+=instantEMF; EMFSum-=EMFVector[Pointer]; EMFVector[Pointer]=instantEMF; Pointer++; //PORNIREA MOTORULUI SI A MODULULUI CCP CCP2CON=CCP2CON | 0x0F; P1=1; } void adjustRPM(unsigned short cRPM,unsigned char threshold, unsigned char gain, unsigned char major) { deltaRPM=setRPM-cRPM; //EROAREA if(deltaRPM>threshold) { majorUP=major; if (DutyCycle<(255-gain)) DutyCycle+= gain; else DutyCycle=255; } else if (deltaRPM<(-threshold)) { majorDOWN=major; if (DutyCycle>gain) DutyCycle-= gain; else DutyCycle=0; } else majorUP=majorDOWN=0; } void SetMotorSpeed(void) { //CONVERSIE DE LA POTENTIOMETRUL P2 ADCON0=0b00000001; GO=1; while(nDONE); if (!REMOTE) { setRPM=0.0034*ADRESH*ADRESH+8.2898*ADRESH-364.9538; if (setRPM & 0x1000) setRPM=0; if (!LOOP) DutyCycle=ADRESH; } //MODIFICAREA FACTORULUI DE UMPLERE CCP2CON=0b00001100 | ((DutyCycle & 0b00000011)<<4); CCPR2L=DutyCycle>>2 & 0b00111111; } void DisplayRPM(void) { if (init) { transmit("INI"); init=0; } transmit("RPM"); transmit("SET"); transmit("PWM"); DisplayDP(3); if (!rpmSW)

82

RPM=setRPM; DisplaySymbol("A",!rpmSW); DisplaySymbol("S1",LOOP); DisplaySymbol("BC",RPM>1000); DisplayDIGIT3((RPM%1000)/100); DisplayDIGIT2((RPM%100)/10); DisplayDIGIT1(RPM%10);

void SendTXT(const char* txt) { while(*txt) { while (!TXIF); TXREG=*txt; asm("nop"); while (!TXIF); txt++; } } void transmit(const char* cmd) { __delay_us(200); if (*cmd=='P' && *(cmd+1)=='W' && *(cmd+2)=='M') { SendTXT("PWMM"); TXREG=DutyCycle; asm("nop"); while (!TXIF); } else if (*cmd=='S' && *(cmd+1)=='E' && *(cmd+2)=='T') { SendTXT("SET"); TXREG=setRPM>>8; asm("nop"); while (!TXIF); TXREG=setRPM & 0x00FF; asm("nop"); while (!TXIF); } else if (*cmd=='R' && *(cmd+1)=='P' && *(cmd+2)=='M') { SendTXT("RPM"); TXREG=RPM>>8; asm("nop"); while (!TXIF); TXREG=RPM & 0x00FF; asm("nop"); while (!TXIF); } else if (*cmd=='I' && *(cmd+1)=='N' && *(cmd+2)=='I') { SendTXT("INI"); TXREG=LOOP; asm("nop"); while (!TXIF); TXREG=REMOTE; asm("nop"); while (!TXIF); } else if (*cmd=='A' && *(cmd+1)=='U' && *(cmd+2)=='T') { SendTXT("LOOP"); TXREG=LOOP; asm("nop"); while (!TXIF); } else if (*cmd=='A' && *(cmd+1)=='U' && *(cmd+2)=='T') { SendTXT("REMOT"); } } unsigned char checkCMD(const char * cmd) { if ((*cmd==rcvBuffer[0]) && (*(cmd+1)==rcvBuffer[1]) && (*(cmd+2)==rcvBuffer[2])) return 1; else

83

return 0;

void interrupt uart_int(void) { if (RCIE && RCIF) { rcvBuffer[rcvIndex]=RCREG; rcvIndex++; if (rcvIndex==5) { rcvIndex=0; if (checkCMD("LOO")) LOOP=((rcvBuffer[4])>0); else if (checkCMD("RPM")) { LOOP=1; REMOTE=1; setRPM=rcvBuffer[3]; setRPM=(setRPM<<8) | rcvBuffer[4]; } else if (checkCMD("PWM")) { LOOP=0; REMOTE=1; DutyCycle=rcvBuffer[4]; } else if (checkCMD("INI")) { init=1; } } } }

LCDLib.c
#ifndef _XTAL_FREQ #define _XTAL_FREQ 8000000UL #endif #include <htc.h> #include "LCDLib.h" unsigned char digits[16]={0b11111100,0b01100000,0b11011010,0b11110010,0b01100110, 0b10110110,0b10111110,0b11100000,0b11111110,0b11110110,0b11101110, 0b00111110, 0b10011100, 0b01111010, 0b10011110, 0b10001110}; volatile unsigned char *pos1[7] ={&LCDDATA2,&LCDDATA2,&LCDDATA8,&LCDDATA11, &LCDDATA8,&LCDDATA5,&LCDDATA5}; unsigned char mask1[7]={6,7,7,6,6,6,7}; volatile unsigned char *pos2[7] ={&LCDDATA0,&LCDDATA2,&LCDDATA8,&LCDDATA9, &LCDDATA6,&LCDDATA3,&LCDDATA5}; unsigned char mask2[7]={6,5,5,6,6,6,5}; volatile unsigned char *pos3[7] ={&LCDDATA0,&LCDDATA1,&LCDDATA7,&LCDDATA9, &LCDDATA6,&LCDDATA3,&LCDDATA4}; unsigned char mask3[7]={3,3,3,3,3,3,3}; void initLCD(void) { LCDPS=0b00000000; LCDSE0=0b01001111; LCDSE1=0b00001000; LCDSE2=0b11100001; LCDDATA0=LCDDATA1=LCDDATA2=0x00; LCDDATA3=LCDDATA4=LCDDATA5=0x00; LCDDATA6=LCDDATA7=LCDDATA8=0x00; LCDDATA9=LCDDATA10=LCDDATA11=0x00; LCDCON=0b10010011; } void DisplayDP(unsigned char k) { switch(k) { case 1: S21C3=1; S11C3=0; S2C3 =0; break; case 2: S21C3=0; S11C3=1; S2C3 =0; break; case 3: S21C3=0; S11C3=0; S2C3 =1; break; default: S21C3=0; S11C3=0; S2C3 =0; break; }

84

} void DisplayDIGIT1(unsigned char k) { unsigned char i=0; if (k<=15) for (i=0;i<7;i++) *pos1[i] = digits[k] & (1<<(7-i)) ? *pos1[i] | (1<<mask1[i]) : *pos1[i] & ~(1<<mask1[i]); else for (i=0;i<7;i++) *pos1[i] &= ~(1<<mask1[i]); } void DisplayDIGIT2(unsigned char k) { unsigned char i=0; if (k<=15) for (i=0;i<7;i++) *pos2[i] = digits[k] & (1<<(7-i)) ? *pos2[i] | (1<<mask2[i]) : *pos2[i] & ~(1<<mask2[i]); else for (i=0;i<7;i++) *pos2[i] &= ~(1<<(mask2[i])); } void DisplayDIGIT3(unsigned char k) { unsigned char i=0; if (k<=15) for (i=0;i<7;i++) *pos3[i] = digits[k] & (1<<(7-i)) ? *pos3[i] | (1<<mask3[i]) : *pos3[i] & ~(1<<mask3[i]); else for (i=0;i<7;i++) *pos3[i] &= ~(1<<mask3[i]); } void DisplaySymbol(const char * k, unsigned char enable) { switch(*k) { case 'A': if (*(k+1)==0) S0C0=enable; else if (*(k+1)=='C') S1C3=enable; break; case 'V': S0C1=enable; break; case 'K': S0C2=enable; break; case 'D': if (*(k+1)=='H') S2C0=enable; break; case 'O': S0C3=enable; break; case 'R': if (*(k+1)=='H') S2C1=enable; else if (*(k+1)=='C') S1C0=enable; break; case 'B': if (*(k+1)=='C') S2C2=enable; else if ((*(k+1)=='A') && (*(k+2)=='T') && (*(k+3)=='T')) break; case '-': S1C2=enable; break; case 'm': S16C2=enable; break; case 'M': S16C3=enable; break; case 'S': if (*(k+1)=='1') S16C0=enable; else if (*(k+1)=='2') S16C1=enable; break; default: break; } }

S1C1=enable;

LCDLib.h
extern extern extern extern extern extern void void void void void void DisplayDIGIT1(unsigned char DisplayDIGIT2(unsigned char DisplayDIGIT3(unsigned char DisplayDP(unsigned char k); DisplaySymbol(const char *k, initLCD(void); k); k); k); unsigned char enable);

85

ANEXA 8 Codul surs al aplicaiei PC

frmMain.vb
Imports Imports Imports Imports Imports Imports System System.ComponentModel System.Threading System.IO.Ports System.Text System.Drawing.Drawing2D

Public Class frmMain Dim myPort As Array Dim myBytes(4) As Byte Dim rpmPoints(44) As PointF Dim currentRPM As Int16 = 0 Dim rpmValues(44) As Int16 Dim setValues(1) As Int16 Dim setPoints(1) As PointF Dim setRPM As Int16 = 0 Dim currentPWM As Int16 = 0 Dim Initialized As Boolean = False Dim bRemote As Boolean Dim bLoop As Boolean Dim pwmRectangle As RectangleF Dim pwmPen As New Pen(Color.LightGray) Delegate Sub SetTextCallback() Private Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load myPort = IO.Ports.SerialPort.GetPortNames() For i = 0 To UBound(myPort) cmbPort.Items.Add(myPort(i)) Next cmbPort.Text = cmbPort.Items.Item(0) Me.ActiveControl = cmbPort btnDisconnect.Enabled = False End Sub Private Sub btnSendPWM_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSendPWM.Click If SerialPort1.IsOpen = True Then If IsNumeric(Me.txtSendPWM.Text) Then Dim myfloat As Single myfloat = CSng(Me.txtSendPWM.Text) If myfloat <= 100 And myfloat >= 0 Then Dim transmitBytes() As Byte = {Asc("P"), Asc("W"), Asc("M"), Asc("M"), CByte(myfloat / 100 * 255)} SerialPort1.Write(transmitBytes, 0, 5) ledLoop.BackColor = Color.DarkRed bLoop = False bRemote = True ledRemote.BackColor = Color.Lime Else MsgBox("Trebuie introdusa o valoare intre 0 si 100.", MsgBoxStyle.OkOnly, "Eroare") End If Else MsgBox("Trebuie introdusa o valoare intre 0 si 100.", MsgBoxStyle.OkOnly, "Eroare") End If Else MsgBox("Portul nu este deschis.", MsgBoxStyle.OkOnly, "Eroare") End If End Sub Private Sub btnSendRPM_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSendRPM.Click If SerialPort1.IsOpen = True Then If IsNumeric(Me.txtSendRPM.Text) Then Dim myint As Int16 myint = CInt(Me.txtSendRPM.Text) If myint <= 1950 And myint >= 0 Then

86

Dim transmitBytes() As Byte = {Asc("R"), Asc("P"), Asc("M"), CByte(myint \ 256), CByte(myint Mod 256)} SerialPort1.Write(transmitBytes, 0, 5) bRemote = True bLoop = True ledLoop.BackColor = Color.Lime ledRemote.BackColor = Color.Lime Else MsgBox("Trebuie introdusa o valoare intre 0 si 1950.", MsgBoxStyle.OkOnly, "Eroare") End If Else MsgBox("Trebuie introdusa o valoare intre 0 si 1950.", MsgBoxStyle.OkOnly, "Eroare") End If Else MsgBox("Portul nu este deschis.", MsgBoxStyle.OkOnly, "Eroare") End If End Sub Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived SerialPort1.Read(myBytes, 0, 5) ReceivedText() End Sub Private Sub ReceivedText() If SerialPort1.IsOpen Then If Me.txtRPM.InvokeRequired Then Dim x As New SetTextCallback(AddressOf ReceivedText) Me.BeginInvoke(x) Else If UBound(myBytes) = 4 Then Dim temp As String temp = Chr(myBytes(0)) & Chr(myBytes(1)) & Chr(myBytes(2)) Select Case temp Case "RPM" If Not Initialized Then Dim transmitBytes() As Byte = {Asc("I"), Asc("N"), Asc("I"), Asc("T"), Asc("T")} SerialPort1.Write(transmitBytes, 0, 5) Initialized = True End If currentRPM = myBytes(3) * 256 + myBytes(4) If currentRPM > 2000 Or currentRPM < 0 Then currentRPM = rpmValues(UBound(rpmValues)) Debug.Print(":( :( :( :( :( :( :( :(") End If For i = 0 To UBound(rpmValues) - 1 rpmValues(i) = rpmValues(i + 1) Next rpmValues(UBound(rpmValues)) = currentRPM Me.pbGraph.Invalidate() Me.txtRPM.Text = CStr(currentRPM) Case "SET" setRPM = myBytes(3) * 256 + myBytes(4) setValues(0) = setRPM setValues(1) = setRPM Me.txtSetRPM.Text = CStr(setRPM) Case "INI" If myBytes(3) = 1 Then ledLoop.BackColor = Color.Lime bLoop = True Else ledLoop.BackColor = Color.DarkRed bLoop = False End If If myBytes(4) = 1 Then ledRemote.BackColor = Color.Lime bRemote = True Else ledRemote.BackColor = Color.DarkRed bRemote = False End If Case "LOO" If myBytes(4) = 1 Then ledLoop.BackColor = Color.Lime bLoop = True Else ledLoop.BackColor = Color.DarkRed

87

bLoop = False End If Case "PWM" currentPWM = myBytes(4) Me.txtPWM.Text = (currentPWM / 255.0).ToString("F2") Me.pbPWM.Invalidate() Case "REM" ledRemote.BackColor = Color.DarkRed bRemote = False Case Else Debug.Print("Undefined Command") SerialPort1.DiscardInBuffer() End Select If temp = "RPM" Then End If Else End If End If End If End Sub Private Sub pbGraph_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles pbGraph.DoubleClick chkZoom.Checked = Not chkZoom.Checked End Sub Private Sub pbGraph_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles pbGraph.Paint Dim redPen As New Pen(Color.Red, 2) Dim bluePen As New Pen(Color.Blue, 2) Dim blackPen As New Pen(Color.Black, 2) Static Dim lowerLimit As Int16 Static Dim upperLimit As Int16 Dim Area As Rectangle Area.X = 10 Area.Y = 10 Area.Width = pbGraph.ClientRectangle.Width - 50 Area.Height = pbGraph.ClientRectangle.Height - 30 Dim myFormat As New StringFormat myFormat.Alignment = StringAlignment.Center myFormat.LineAlignment = StringAlignment.Near setPoints(0).X = Area.X + Area.Width setPoints(1).X = Area.X + Area.Width + 10 Dim brushVertical As New HatchBrush(HatchStyle.DarkVertical, Color.LightGray, Color.White) Dim brushHorizontal As New HatchBrush(HatchStyle.DarkHorizontal, Color.LightGray, Color.White) Dim dashVertical As New Pen(brushVertical) Dim dashHorizontal As New Pen(brushHorizontal)

If Me.chkZoom.Checked Then If ((upperLimit - currentRPM) < 50) Or ((currentRPM - lowerLimit) < 50) Or (upperLimit lowerLimit <> 300) Then lowerLimit = (currentRPM \ 100 - 1) * 100 upperLimit = lowerLimit + 300 End If For i = 0 To UBound(rpmValues) rpmPoints(i).Y = Area.Y + Area.Height - (rpmValues(i) - lowerLimit) / 250 * Area.Height * 5 / 6 rpmPoints(i).X = Area.X + Area.Width - (44 - i) / 44 * Area.Width Next For i = 0 To 1 setPoints(i).Y = Area.Y + Area.Height - (setValues(i) - lowerLimit) / 250 * Area.Height * 5 / 6 Next i 'horizontal dashed lines + 2 tick points at 1/3 and 2/3 For i = 0 To 6 e.Graphics.DrawLine(dashVertical, Area.X, CSng(Area.Y + Area.Height * i / 6), Area.X + Area.Width, CSng(Area.Y + Area.Height * i / 6)) If i = 2 Or i = 4 Then

88

e.Graphics.DrawLine(Pens.Black, Area.X + Area.Width - 4, CSng(Area.Y + Area.Height * i / 6), Area.X + Area.Width + 4, CSng(Area.Y + Area.Height * i / 6)) End If Next Else lowerLimit = 0 upperLimit = 2000 For i = 0 To UBound(rpmValues) rpmPoints(i).Y = Area.Y + Area.Height - rpmValues(i) / 2000 * Area.Height rpmPoints(i).X = Area.X + Area.Width - (44 - i) / 44 * Area.Width Next setPoints(0).Y = Area.Y + Area.Height - setValues(0) / 2000 * Area.Height setPoints(1).Y = Area.Y + Area.Height - setValues(1) / 2000 * Area.Height For i = 0 To 10 e.Graphics.DrawLine(dashVertical, Area.X, CSng(Area.Y + Area.Height * i / 10), Area.X + Area.Width, CSng(Area.Y + Area.Height * i / 10)) If i = 5 Then e.Graphics.DrawLine(Pens.Black, Area.X + Area.Width - 4, CSng(Area.Y + Area.Height * i / 10), Area.X + Area.Width + 4, CSng(Area.Y + Area.Height * i / 10)) End If Next End If For i = 0 To UBound(rpmValues) If i <> 44 And (i Mod 2 = 0) Then e.Graphics.DrawLine(dashHorizontal, Area.X + Area.Width - (Area.X + Area.Width rpmPoints(i).X) * 22 / 23, Area.Y, Area.X + Area.Width - (Area.X + Area.Width - rpmPoints(i).X) * 22 / 23, Area.Y + Area.Height) If (44 - i) Mod 10 = 0 Then e.Graphics.DrawString(((44 - i) / 2).ToString & "s", New Font("Arial", 10), Brushes.Black, Area.X + Area.Width - (Area.X + Area.Width - rpmPoints(i).X) * 22 / 23, Area.Y + Area.Height, myFormat) End If End If Next i e.Graphics.DrawLine(blackPen, Area.X + Area.Width, Area.Y, Area.X + Area.Width, Area.Y + Area.Height) e.Graphics.DrawLine(blackPen, Area.X + Area.Width - 4, Area.Y, Area.X + Area.Width + 4, Area.Y) e.Graphics.DrawLine(blackPen, Area.X + Area.Width - 4, Area.Y + Area.Height, Area.X + Area.Width + 4, Area.Y + Area.Height) e.Graphics.DrawLine(blackPen, Area.X, Area.Y, Area.X, Area.Y + Area.Height) e.Graphics.DrawLine(blackPen, Area.X - 4, Area.Y, Area.X + +4, Area.Y) e.Graphics.DrawLine(blackPen, Area.X - 4, Area.Y + Area.Height, Area.X + +4, Area.Y + Area.Height)

If chkNetezire.Checked Then e.Graphics.DrawCurve(redPen, rpmPoints, 0.5) Else e.Graphics.DrawLines(redPen, rpmPoints) End If myFormat.Alignment = StringAlignment.Far myFormat.LineAlignment = StringAlignment.Far e.Graphics.DrawString(CStr(currentRPM), New Font("Arial", 10), Brushes.Red, rpmPoints(UBound(rpmPoints)), myFormat) myFormat.Alignment = StringAlignment.Near myFormat.LineAlignment = StringAlignment.Center If bLoop Then e.Graphics.DrawLine(bluePen, setPoints(0), setPoints(1)) e.Graphics.DrawString(CStr(setRPM), New Font("Arial", 10), Brushes.Blue, setPoints(1), myFormat) End If e.Graphics.DrawString(CStr(lowerLimit), New Font("Arial", 8), Brushes.Black, Area.X + Area.Width + 5, Area.Y + Area.Height - 2, myFormat) e.Graphics.DrawString(CStr(upperLimit), New Font("Arial", 8), Brushes.Black, Area.X + Area.Width + 5, Area.Y - 2, myFormat) End Sub

89

Private Sub chkZoom_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkZoom.CheckedChanged Me.pbGraph.Invalidate() End Sub Private Sub pbPWM_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbPWM.MouseDown If pwmRectangle.Contains(e.X, e.Y) Then txtSendPWM.Text = ((pwmRectangle.Height + pwmRectangle.Y - e.Y) / pwmRectangle.Height * 100).ToString("F2") btnSendPWM.PerformClick() End If End Sub Private Sub pbPWM_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbPWM.MouseMove Static isin As Boolean If pwmRectangle.Contains(e.X, e.Y) Then pwmPen = Pens.Black If Not isin Then pbPWM.Invalidate() isin = True End If Else If isin Then pbPWM.Invalidate() isin = False End If pwmPen = Pens.LightGray End If End Sub Private Sub pbPWM_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles pbPWM.Paint Dim linGrBrush As New LinearGradientBrush(New Point(0, 20), New Point(0, pbPWM.ClientRectangle.Height), Color.FromArgb(255, 255, 0, 0), Color.FromArgb(255, 0, 0, 255)) Dim pen As New Pen(linGrBrush) pwmRectangle.X = 20 pwmRectangle.Y = 20 pwmRectangle.Width = 20 pwmRectangle.Height = pbPWM.ClientRectangle.Height e.Graphics.FillRectangle(linGrBrush, 20, CSng(20 + (255 - currentPWM) / 255 * pbPWM.ClientRectangle.Height), 20, pbPWM.ClientRectangle.Height) e.Graphics.DrawRectangle(pwmPen, pwmRectangle.X, pwmRectangle.Y, pwmRectangle.Width, pwmRectangle.Height) e.Graphics.DrawLine(Pens.Black, 0, 20, 5, 20) e.Graphics.DrawLine(Pens.Black, pbPWM.ClientRectangle.Width - 5, 20, pbPWM.ClientRectangle.Width, 20) Dim myFormat As New StringFormat myFormat.Alignment = StringAlignment.Center myFormat.LineAlignment = StringAlignment.Far e.Graphics.DrawString((currentPWM / 255.0).ToString("P2"), New Font("Arial", 8), Brushes.Black, pwmRectangle.X + pwmRectangle.Width / 2, _ CSng(20 + (255 - currentPWM) / 255 * pbPWM.ClientRectangle.Height), myFormat) End Sub Private Sub txtSendPWM_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtSendPWM.KeyPress If Not (Char.IsDigit(e.KeyChar) Or Char.IsControl(e.KeyChar) Or (e.KeyChar = "." And txtSendPWM.Text.IndexOf(".") < 0)) Then e.Handled = True End If If e.KeyChar = ChrW(Keys.Return) Then btnSendPWM.PerformClick() End If End Sub Private Sub txtSendRPM_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtSendRPM.KeyPress If Not (Char.IsDigit(e.KeyChar) Or Char.IsControl(e.KeyChar) Or (e.KeyChar = "." And txtSendRPM.Text.IndexOf(".") < 0)) Then e.Handled = True End If

90

If e.KeyChar = ChrW(Keys.Return) Then btnSendRPM.PerformClick() End If End Sub Private Sub btnLoop_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnLoop.Click If SerialPort1.IsOpen Then bLoop = Not bLoop If bLoop Then ledLoop.BackColor = Color.Lime Else ledLoop.BackColor = Color.DarkRed End If If bRemote And bLoop Then Dim auxRPM As Int16 auxRPM = currentRPM Dim transmitBytes1() As Byte = {Asc("R"), Asc("P"), Asc("M"), CByte(auxRPM \ 256), CByte(auxRPM Mod 256)} SerialPort1.Write(transmitBytes1, 0, 5) setRPM = auxRPM txtSendRPM.Text = auxRPM.ToString() Else Dim transmitBytes() As Byte = {Asc("L"), Asc("O"), Asc("O"), Asc("P"), bLoop} SerialPort1.Write(transmitBytes, 0, 5) End If End If Me.pbGraph.Invalidate() End Sub Private Sub btnConnect_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnConnect.Click Try SerialPort1.PortName = cmbPort.Text SerialPort1.BaudRate = 9600 SerialPort1.Parity = IO.Ports.Parity.None SerialPort1.StopBits = IO.Ports.StopBits.One SerialPort1.DataBits = 8 SerialPort1.ReceivedBytesThreshold = 5 SerialPort1.Open() btnConnect.Enabled = False btnDisconnect.Enabled = True cmbPort.Enabled = False ConectareToolStripMenuItem.Enabled = False DeconectareToolStripMenuItem.Enabled = True Catch exception As Exception MsgBox("Accesul la portul " & SerialPort1.PortName & " este restrictionat!", MsgBoxStyle.Critical, "Eroare") End Try End Sub Private Sub btnDisconnect_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDisconnect.Click SerialPort1.Close() btnConnect.Enabled = True btnDisconnect.Enabled = False cmbPort.Enabled = True For i = 0 To UBound(rpmValues) rpmValues(i) = 0 Next setValues(0) = 0 setValues(1) = 0 currentPWM = 0 setRPM = 0 currentRPM = 0 Initialized = False bLoop = False bRemote = False ledLoop.BackColor = Color.DarkRed ledRemote.BackColor = Color.DarkRed Me.txtSetRPM.Text = "0" Me.txtRPM.Text = "0" Me.txtPWM.Text = "0" Me.txtSendPWM.Text = "0"

91

Me.txtSendRPM.Text = "0" Me.pbGraph.Invalidate() Me.pbPWM.Invalidate() ConectareToolStripMenuItem.Enabled = True DeconectareToolStripMenuItem.Enabled = False End Sub Private Sub ConectareToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ConectareToolStripMenuItem.Click btnConnect.PerformClick() DeconectareToolStripMenuItem.Enabled = True ConectareToolStripMenuItem.Enabled = False End Sub Private Sub DeconectareToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DeconectareToolStripMenuItem.Click btnDisconnect.PerformClick() ConectareToolStripMenuItem.Enabled = True DeconectareToolStripMenuItem.Enabled = False End Sub Private Sub IesireToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles IesireToolStripMenuItem.Click Application.Exit() End Sub Private Sub LupaToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LupaToolStripMenuItem.Click chkZoom.Checked = Not chkZoom.Checked End Sub Private Sub ReglajAutomatToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ReglajAutomatToolStripMenuItem.Click btnLoop.PerformClick() End Sub Private Sub pbGraph_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles pbGraph.SizeChanged pbGraph.Invalidate() End Sub Private Sub DespreToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DespreToolStripMenuItem.Click 'AboutBox1.ShowDialog() End Sub Private Sub NetezireToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles NetezireToolStripMenuItem.Click chkNetezire.Checked = Not chkNetezire.Checked End Sub End Class

92