controlul turatiei mot cc folosind pic

92
Universitatea “Politehnica” din Bucureşti Facultatea de Electronică, Telecomunicaţii şi Tehnologia Informaţiei Controlul turaţiei motoarelor de curent continuu folosind microcontroler PIC şi măsurarea tensiunii autoinduse Lucrare de licenţă Prezentată ca cerinţă parţială pentru obţinerea titlului de Inginer în domeniul Electronică şi Telecomunicaţii/ Calculatoare şi Tehnologia Informaţiei programul de studii Electronica Aplicata Conducător ştiinţific Absolvent Prof. Dr. Ing. Sever PAŞCA Alexandru Marius DOBRE 2011

Upload: jicutu

Post on 19-Feb-2015

212 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Controlul Turatiei Mot CC Folosind PIC

Universitatea “Politehnica” din Bucureşti

Facultatea de Electronică, Telecomunicaţii şi Tehnologia Informaţiei

Controlul turaţiei motoarelor de curent continuu folosind microcontroler PIC şi măsurarea tensiunii autoinduse

Lucrare de licenţăPrezentată ca cerinţă parţială pentru obţinerea titlului de

Inginer în domeniul Electronică şi Telecomunicaţii/

Calculatoare şi Tehnologia Informaţiei

programul de studii Electronica Aplicata

Conducător ştiinţific Absolvent

Prof. Dr. Ing. Sever PAŞCA Alexandru Marius DOBRE

2011

Page 2: Controlul Turatiei Mot CC Folosind PIC
Page 3: Controlul Turatiei Mot CC Folosind PIC

Universitatea “Politehnica” din BucureştiFacultatea de Electronică, Telecomunicaţii şi Tehnologia InformaţieiCatedra Electronică Aplicată şi Ingineria Informaţiei

Aprobat Şef de Catedră:Prof. Dr. Ing. D. A. Stoichescu

TEMA LUCRǍRII DE LICENŢǍa studentului Alexandru Marius DOBRE

1. Titlul temei: Controlul turaţiei motoarelor de curent continuu folosind microcontroller PIC şi măsurarea

tensiunii autoinduse.

2. Date iniţiale:- Platforma Microchip PICDEM Mechatronics- Motor de curent continuu 5-9 V MABUCHI RS-385PH- Reglajul turaţiei cu ajutorul PWM- Metodă de feedback: tensiunea autoindusă

3. Conţinutul memoriului: - Controlul turaţiei motoarelor de curent continuu- Microcontrolerul PIC16F917- Placa de dezvoltare PICDEM Mechatronics- Proiectare software a aplicaţiei pentru microcontroller folosind limbaj C- Proiectare software a aplicaţiei pentru PC folosind Visual Basic.NET- Rezultate experimentale- Bibliografie

4. Forme de prezentare:- Lucrare de licenţă tipărită şi în format electronic pe CD- Prezentare PowerPoint- Model experimental, surse software

5. Contribuţia 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 Aplicaţie PC folosind Visual Basic.NET

6. Lucrarea serveşte ca: autodotare

7. Locul de desfăşurare a activităţii: Facultatea de Electronică, Telecomunicaţii şi Tehnologia Informaţiei, UPB, Leu B324

8. Mijloacele materiale sunt puse la dispoziţie de: UPB

9. Realizarea practică rămane în proprietatea: UPB

10. Data eliberării temei: 08.10.2010

CONDUCĂTOR LUCRARE: STUDENT:Prof. Dr. Ing. Sever PAŞCA Alexandru Marius DOBRE

Page 4: Controlul Turatiei Mot CC Folosind PIC
Page 5: Controlul Turatiei Mot CC Folosind PIC

Declaraţie de onestitate academică

Prin prezenta declar că lucrarea cu titlul “Titlul complet al proiectului”, prezentată în cadrul Facultăţii de Electronică, Telecomunicaţii şi Tehnologia Informaţiei a Universităţii “Politehnica” din Bucureşti ca cerinţă parţială pentru obţinerea titlului de Inginer/ Master în domeniul Inginerie Electronică şi Telecomunicaţii/ Calculatoare şi Tehnologia Informaţiei, programul de studii Electronica Aplicata este scrisă de mine şi nu a mai fost prezentată niciodată la o facultate sau instituţie de învăţământ superior din ţară sau străinătate.

Declar că toate sursele utilizate, inclusiv cele de pe Internet, sunt indicate în lucrare, ca referinţe 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 către alţi autori face referinţă la sursă. Înţeleg că plagiatul constituie infracţiune şi se sancţionează conform legilor în vigoare.

Declar că toate rezultatele simulărilor, experimentelor şi măsurătorilor pe care le prezint ca fiind făcute de mine, precum şi metodele prin care au fost obţinute, sunt reale şi provin din respectivele simulări, experimente şi măsurători. Înţeleg că falsificarea datelor şi rezultatelor constituie fraudă şi se sancţionează conform regulamentelor în vigoare.

Bucureşti,

Alexandru Marius DOBRE

Page 6: Controlul Turatiei Mot CC Folosind PIC
Page 7: Controlul Turatiei Mot CC Folosind PIC

Cuprins

Capitolul 1. Introducere ...................................................................................................................... 14

1.1 Obiectivul lucrării ..................................................................................................................... 14

1.2 Scopul lucrării .......................................................................................................................... 14

1.3 Contribuţia studentului ............................................................................................................. 14

Capitolul 2. Prezentare teoretică ......................................................................................................... 15

2.1 Placă de dezvoltare PICDEM Mechatronics ............................................................................ 15

2.1.1 Introducere ......................................................................................................................... 15

2.1.2 Descrierea plăcii de dezvoltare .......................................................................................... 15

2.1.3 Facilităţi ............................................................................................................................. 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 Transmiţător 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 Afişaje cu cristale lichide (LCD) .............................................................................................. 34

2.4 Motorul de curent continuu cu perii ......................................................................................... 36

2.4.1 Introducere ......................................................................................................................... 36

2.4.2 Principiu de funcţionare .................................................................................................... 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 magneţi permanenţi .................................................................................................................................................... 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 Semnificaţia şi funcţiile componentelor: ........................................................................... 46

3.2.3 Stabilirea unui protocol de comunicare între microcontroler şi PC .................................. 47

Page 8: Controlul Turatiei Mot CC Folosind PIC

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 interfeţei grafice ............................................................................................. 57

3.3.3 Descrierea generală a algoritmului .................................................................................... 60

Capitolul 4. Date experimentale ......................................................................................................... 62

4.1 Introducere ................................................................................................................................ 62

4.2 Măsurarea vitezei reale de rotaţie ............................................................................................. 62

4.3 Tensiunea medie a semnalului PWM ....................................................................................... 65

4.4 Legătura dintre viteza de rotaţie şi tensiunea electromotoare autoindusă ................................ 66

Capitolul 5. Concluzii ......................................................................................................................... 71

Bibliografie ........................................................................................................................................ 73

Capitolul 6. ANEXA 1 – Schema plăcii de dezvoltare PICDEM Mechatronics. .............................. 75

ANEXA 2 – Structura internă a microcontrolerului PIC16F917 ...................................................... 76

ANEXA 3 – Funcţiile 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 aplicaţiei pentru microcontroler. ........................................................... 80

ANEXA 8 – Codul sursă al aplicaţiei PC .......................................................................................... 86

Page 9: Controlul Turatiei Mot CC Folosind PIC

Lista figurilor:

Figura 2.1 Placa de dezvoltare PICDEM Mechatronics[1]................................................................16

Figura 2.2 Harta memoriei de program..............................................................................................20

Figura 2.3 Încărcarea numărătorului 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 funcţionare în modul stocare..................................................................31

Figura 2.9 Schema bloc de funcţionare în modul comparare.............................................................32

Figura 2.10 Schema bloc simplificata pentru funcţionarea CCP în modul PWM..............................33

Figura 2.11 Ieşirea CCP în modul PWM............................................................................................34

Figura 2.12 Comanda directă a unui afişaj 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 excitaţie paralelă..............................................................................................37

Figura 2.17 Motor cu excitaţie serie...................................................................................................37

Figura 2.18 Motor cu excitaţie 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 Măsurarea 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 informaţii.........................................................................................................60

Page 10: Controlul Turatiei Mot CC Folosind PIC

Figura 4.36 Osciloscop digital Tektronix TPS2014...........................................................................62

Figura 4.37 Răspunsul senzorului optic pentru un factor de umplere de 62.35%..............................63

Figura 4.38 Răspunsul senzorului optic pentru un factor de umplere de 87.45%..............................63

Figura 4.39 Dependenţa vitezei de rotaţie de lăţimea 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 Variaţia tensiunii în funcţie de lăţimea 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 rotaţie în funcţie de valoarea registrului ADRESH........................................68

Page 11: Controlul Turatiei Mot CC Folosind PIC

Lista tabelelor:

Tabelul 2.1 Selecţia 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 Interacţiunea dintre cele două module CCP....................................................................31

Tabelul 2.7 Configuraţii de comandă a motoarelor folosind puntea H..............................................40

Tabelul 3.8 Codificarea cifrelor hexazecimale...................................................................................56

Tabelul 4.9 Dependenţa vitezei de rotaţie de lăţimea impulsului PWM............................................63

Tabelul 4.10 Termeni necesari pentru determinarea dreptei de regresie............................................64

Tabelul 4.11 Variaţia tensiunii în funcţie de factorul de umplere al semnalului PWM.....................65

Tabelul 4.12 Viteza de rotaţie în funcţie de t.e.m autoindusă............................................................67

Page 12: Controlul Turatiei Mot CC Folosind PIC

Lista acronimelor

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

Page 13: Controlul Turatiei Mot CC Folosind PIC

13

Page 14: Controlul Turatiei Mot CC Folosind PIC

Capitolul 1. Introducere

Motoarele de curent continuu sunt folosite într-o gamă largă de aplicaţii care necesită controlul turaţiei: aparatura electrocasnică (mixere, maşini de spălat, ventilatoare), aplicaţii din domeniul auto (maşini hibride, controlul electronic al direcţiei, controlul electric al oglinzilor şi al ştergătoarelor de parbriz, etc.), componente de caculator (DVD Player, Hard Disc, Cooler), controlul roboţilor mobili, controlul braţelor robotice folosite în procesele industriale de fabricaţie, 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 lucrării

Obiectivul acestui proiect este de a implementa un sistem de control al turaţiei unui motor de curent continuu cu perii folosind un microcontroler PIC. Sistemul va fi capabil să menţină motorul la o anumită viteza impusă sub influenţa unei sarcini variabile.

1.2 Scopul lucrării

Pentru a atinge obiectivul impus am folosit microcontrolerul PIC16F917 montat pe placa de dezvoltare PICDEM Mechatronics pentru a controla turaţia unui motor de curent continuu cu perii şi magnet permanent. Viteza reală de rotaţie a motorului este estimată prin măsurarea tensiunii electromotoare autoinduse.

1.3 Contribuţia 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. Aplicaţia comanda motorul de curent continuu şi afişează rezultatele pe un ecran LCD de pe placa de dezvoltare.

2. Aplicaţie software pentru PC cu rol de interfaţă pentru comanda motorului şi vizualizarea în timp real a rezultatelor (graficul vitezei de rotaţie în funcţie de timp). Interfaţa este realizată folosind limbajul Visual Basic.NET 2010 folosind mediul de dezvoltare Microsoft Visual Studio IDE.

Comunicaţia între microcontroler şi PC este realizată prin intermediul portului serial folosind standardul RS-232.

14

Page 15: Controlul Turatiei Mot CC Folosind PIC

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 implementării sistemelor mecatronice folosind microcontrolere PIC. Mecatronica reprezintă integrarea controlului electronic în sistemele mecanice prin înlocuirea componentelor mecanice cu soluţii electronice.

Microcontrolerele PIC sunt ideale pentru sistemele mecatronice datorită dimeniunilor mici, eficienţei ridicate, vitezei crescute şi numărului ridicat de configuraţii periferice. Sistemele mecatronice sunt foarte variate: de la un simplu comutator electromecanic cu ieşire multiplexata, până la controlul complex de stabilizare al unui avion supersonic cu reacţie. Sistemele mecatronice sunt din ce în ce mai des folosite în aparatele electrocasnice precum şi în automobile. De exemplu, maşinile de spălat moderne încorporează microcontrolere pentru a măsura intervalele fiecărui program de spălare, pentru a citi comenzile date de utilizator şi pentru reglarea vitezei de rotaţie a motorului.

2.1.2 Descrierea plăcii 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/ieşire reprezintă conexiuni dedicate către diverse componente de pe placă. Ceilalţi 14 pini sunt disponibili utilizatorului pentru a conecta alte componente prin intermediul firele de legătură. Conexiunile dedicate permit accesul la următoarele componente:

- Switch 1 – 1 pin: MCLR (Master Clear Reset)- LCD – 17 pini- Conector serial de programare în circuit – 2 pini + MCLR- Port de comunicaţie RS-232 – 2 pini: RX, TXSchema 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 având 5 din cei 18 pini de intrare/ieşire conectaţi la diverse componente de pe placă, iar restul de 13 pini sunt disponibili utilizatorului pentru a conecta alte componente folosind firele de legătură. 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 comunicaţie RS-232 – 2 pini: RX, TX

Placa de dezvoltare este descrisă în figură 1 şi are în componenţă următoarele elemente:

1. Soclu cu 40 de pini2. Soclu cu 20 de pini3. Regulator de tensiune şi conectori

de alimentare4. 8 LED-uri

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ă

15

Page 16: Controlul Turatiei Mot CC Folosind PIC

9. Două potenţiometre10. Oscilator de 32.768 kHz11. Patru switch-uri12. Conector ICD13. Conector ICSP14. Circuit de protecte la supracurent

cu switch de reset15. Punte H pentru controlul

motoarelor16. Detector de curent

17. Detector de tensiune electromotoare inversă

18. Senzor optic pentru detecţia vitezei de rotaţie a motorului de curent continuu

19. Motor de curent continuu cu perii20. Motor pas cu pas21. Terminale cu şurub pentru

acţionarea motoarelor22. Baterie de 9V DC

Figura 2.1 Placa de dezvoltare PICDEM Mechatronics[1]

2.1.3 Facilităţi

Bară de LED-uri

Cele 8 LED-uri de pe placa ajuta la depanarea programelor scrise permiţând afişarea stării pinilor de ieşire şi afişarea în binar a conţinutului variabilelor folosite.

Circuitul de protecţie la supracurent

Circuitul de protecţie la supracurent inclus în placă opreşte circuitul de acţionare a motoarelor în cazul în care motorul consuma 1.2 A timp de 100ms sau mai mult. Când este

16

Page 17: Controlul Turatiei Mot CC Folosind PIC

introdusă alimentarea plăcii, circuitul de acţionare a motorului este dezactivat, lucru indicat prin aprinderea LED-ului “FAULT”. Pentru a putea alimenta motorul trebuie apăsat butonul “CLEAR FAULT”. Dacă se foloseşte alt motor decât cel furnizat cu placa de dezvoltare, trebuie ţinut cont că placă nu va putea furniza un curent mai mare de 1.2 A.

Comunicaţia serială

Comunicaţia serială prin USART se poate realiza prin intermediul pinilor de transmisiune TX şi recepţie RX. Conectorul JP2 permite legarea pinilor RX, TX pentru realizarea transmisiunii seriale pe un singur pin.

Senzori detaşabili

Senzorul de temperatură şi senzorul de lumină pot fi detaşaţi pentru a oferi flexibilitate ridicată în utilizarea lor. De exemplu, senzorul de temperatura poate fi poziţionat î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 poziţiona 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 detecţie a curentului ce poate fi accesat prin pinul J15. Tensiunea măsurată la acest pin este egală cu curentul ± 10%. De exemplu, dacă un motor este pornit şi consuma 0.9A atunci tensiunea măsurată va fi 0.9V (± 10%).

LCD VIM-332

PICDEM Mechatronics are încorporat un LCD cu 39 de segmente care poate afişa cifre pe 3 poziti folosind câte 7 segmente, iar pe a patra poziţie poate afişa doar cifra 1. LCD-ul poate afişa punctul zecimal pe 3 poziţii diferite, precum şi alte simboluri.

17

Page 18: Controlul Turatiei Mot CC Folosind PIC

2.2 Microcontrolerul PIC16F917

PIC16F917[2] este un microcontroler pe 8 biţi cu memorie flash, construit în tehnologie CMOS şi având î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 Foloseşte doar 35 de instrucţiuni: toate instrucţiunile se execută într-un singur ciclu

cu excepţia instrucţiunilor de salto Frecventa maximă de operare: 20 MHzo Posibilitate de citire a memoriei de programo Mai multe surse de întreruperio Stivă hardware cu 8 niveleo Moduri de adresare: directă, indirectă şi relativă

• Caracteristici speciale ale microcontroleruluio Oscilator intern de mare precizie

§ Calibrat la ±1%§ Frecvenţa de lucru poate fi selectată software între 8MHz şi 125 kHz§ Detecţia lipsei oscilatorului extern pentru aplicaţiile critice§ Schimbarea automată a sursei de ceas în timpul rulării programului pentru

economisirea energieio Oscilator intern de 31 kHz selectabil prin softo Mod cu consum scăzut de energie (Sleep mode)o Poate opera într-un domeniu larg de tensiuni (2.0V – 5.5V)o Operare la temperaturi industrialeo Resetare la alimentare (Power-on Reset)o Watchdog Timer cu activare softwareo Protecţia codului de programo 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 energieio Curent de Standby: < 100 nA la 2.0 Vo Curent de funcţionare 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 până la 96 de pixeli§ Patru cai comune

o Până la 35 de pini I/O programabili individual

18

Page 19: Controlul Turatiei Mot CC Folosind PIC

o Programare serială în circuit (ICSP) folosind 2 pinio Modul comparator analogic

§ Două comparatoare analogice§ Referinţă internă de tensiune programabil㧠Intrările şi ieşirile comparatoarele sunt accesibile din exterior

o Convertor analog/digital: rezoluţie de 10 biţi şi până la 8 canale analogiceo Timer0: timer/numărător pe 8 biţi cu divizor programabilo Timer1:

§ Timer/numărător pe 16 biţi cu divizor programabil§ Posibilitatea de numărare a impulsurilor de pe un pin extern

o Timer2: timer/numărător pe 8 biţi cu divizor anterior şi posterioro Transmiţător/Receptor Sincron/Asincron Universal (AUSART)o Două module CCP (Stocare, Comparare, PWM)

§ Stocare pe 16 biţi, rezoluţie de 12.5 ns§ Comparare pe 16 biţi, rezoluţie de 200 ns§ PWM pe 10 biţi, frecventa maximă 20 kHz

Functiile pinilor microcontrolerului sunt prezentate in ANEXA 3.

2.2.2 Organizarea memoriei

2.2.2.1 Memoria de program

PIC16F917 are un numărător de program pe 13 biţi capabil să adreseze o memorie de program formată din 14 blocuri a câte 8K (0000h – 1FFFh). Vectorul de Reset se afla la adresa 0000h iar vectorul de întrerupere la adresa 0004h.

19

Page 20: Controlul Turatiei Mot CC Folosind PIC

Figura 2.2 Harta memoriei de program

2.2.2.2 Memoria de date

Memoria de date este împărţită în mai multe bank-uri care conţin registrele de uz general (GPR) şi registrele pentru funcţii speciale (SFR). Bitii RP0 şi RP1 sunt folosiţi pentru selecţia bank-ului curent.

RP1 RP0 Bank Selectat0 0 00 1 11 0 21 1 3

Tabelul 2.1 Selecţia bank-ului de memorie.

Fiecare bank de memorie conţine 128 octeţi (0h – 7Fh). Locaţiile inferioare ale fiecărui bank sunt rezervate pentru Registrele de Funcţii Speciale. După SFR se găsesc registrele de uz general (GPR) implementate că RAM static. Toate bank-urile de memorie conţin registre de funcţii speciale. Unele registre de funcţii speciale des folosite sunt copiate în toate bank-urile de memorie pentru a permite accesul rapid şi reducerea dimensiunii codului.

- Fişierul de registre de uz general

20

Page 21: Controlul Turatiei Mot CC Folosind PIC

PIC16F917 are un fişier de registre organizat ca 352 x 8 biţi. Fiecare registru poate fi accesat direct sau indirect prin intermediul registrului de selecţie (FSR)

- Registrele de funcţii speciale

Registrele de funcţii speciale sunt registre folosite de procesor şi de funcţiile periferice pentru a putea controla operaţia întreprinsă. Aceste registre se afla în memoria ŞRAM. Aceste registre pot fi clasificate în două categorii: nucleu şi periferice.

2.2.2.3 Numărătorul de program şi stivă

Numărătorul de program (PC) are o lăţime de 13 biţi. Octetul inferior provine din registrul PCL, care poate fi scris şi citit. Octetul superior, care conţine ceilalţi 5 biţi ai numărătorului de program, nu poate fi accesat direct di provine din registrul PCLATH. La Reset numărătorul de program este şters. În Figura 2.3 sunt ilustrate cele două situaţii în care numărătorul de program este încărcat. În partea superioară a figurii este ilustrat cazul scrierii în registrul PCL iar în partea inferioară este descrisă încărcarea numărătorului de program în timpul executării unei instrucţiuni CALL sau GOTO.

StivaPIC16F917 are o stivă cu adâncime de 8 nivele şi o lăţime de 13 biţi implementată

hardware. Spaţiul 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. Numărătorul de program este scris în stivă atunci când se execută o instrucţiune CALL sau atunci când o întrerupere produce un salt. Numărătorul de program este scos din stiva atunci când se întâlneşte o instrucţiune RETURN, RETLW sau RETFIE. PCLATH nu este afectat de operaţiile de introducere sau scoatere din stivă.

Figura 2.3 Încărcarea numărătorului 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. Instrucţiunile CALL şi GOTO pun la dispoziţie doar 11 biţi de adresa pentru a permite saltul în interiorul oricărei

21

Page 22: Controlul Turatiei Mot CC Folosind PIC

pagini de memorie de program cu dimensiunea de 2K. La execuţia unei instrucţiuni CALL sau GOTO, cei mai semnificativi 2 biţi ai adresei provin din bitii 4 şi 3 ai registrului PCLATH. În timpul instrucţiunilor CALL sau GOTO, utilizatorul trebuie să se asigure că biţi de selectare a paginii sunt configuraţi astfel încât să se facă adresarea către pagina de memorie de program dorită. În cazul executării unei instrucţiuni de întoarcere după executarea instrucţiunii CALL sau după o rutină de întrerupere, întregul numărător de program de 13 biţi este scos din stivă. Aşadar, în acest caz, modificarea PCLATH<4:3> nu este necesară.

2.2.2.5 Adresarea indirectă, regiştrii INDF şi FSR

Registrul INDF nu este un registru fizic. Adresarea indirectă este posibilă prin folosirea registrului INDF. Orice instrucţiune care foloseşte registrul INDF va accesa de fapt datele din locaţia de memorie indicată de registrul de selecţie FSR. Citirea valorii lui INDF va rezulta într-o operaţie nulă (NOP).

2.2.3 Porturile I/O

Microcontrolerul PIC16F917 include 4 registre PORT pe 8 biţi (PORTA, PORTB, PORTC, PORTD) şi un registru PORT pe 4 biţi (PORTE). Fiecărui registru PORT îi corespunde un registru TRIS care permite configurarea că intrare sau ieşire 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 funcţionarea acelei intrări în modul analogic iar orice citire digitală pe acel pin va avea ca răspuns valoarea ‘0’.

Starea biţilor registrului ANSEL nu are nici un efect asupra funcţiile digitale de ieşire. Un pin care are bitul corespunator din registrul TRIS setat cu valoarea ‘1’ iar cel din registrul ANSEL setat cu valoarea ‘0’ va funcţiona ca ieşire digitală dar modul de intrare va fi analogic. Acest lucru poate cauza un comportament neaşteptat atunci când se execută instrucţiuni de tip citire-modificare-scriere 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 posibilităţi de selectare permiţând utilizarea microcontrolerului pentru diverse aplicaţii având o permormanta ridicată şi un consum scăzut 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 opţiunea 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, minimalizând decalajul dintre pornirea

oscilatorului extern şi execuţia codului.- Sistem de monitorizare a ceasului (FSCM) conceput pentru a detecta problemele apărute 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 câştig mediu

22

Page 23: Controlul Turatiei Mot CC Folosind PIC

- HS – rezonator ceramic sau cristal de cuarţ cu câştig ridicat- RC – circuit RC extern cu ieşire FOSC/4 pe pinul OSC2/CLKOUT- RCIO – circuit RC extern cu I/O pe pinul OSC2/CLKOUT- INTOSC – oscilator intern cu ieşire 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

Selecţia sursei de ceas se face configurând 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/Numărător care pot fi folosite în combinaţie cu alte periferice disponibile pentru o gamă largă de aplicaţii.

2.2.5.1 Modulul Timer0

Timer0 este un timer/numărător pe 8 biţi cu următoarele caracteristici:- Registru timer/counter pe 8 biţi (TMR0)- Divizor anterior de frecvenţă pe 3 biţi programabil- Sursa de ceas internă sau externă programabila- Posibilitate de selecţie a frontului de ceas- Întrerupere la depăşireModul de lucru al Timer0 poate fi selectat prin modificarea bitului T0CS din registrul OPTION.

Când T0CS este egal cu 0 Timer0 lucrează în modul Timer iar când T0CS este egal cu 1 Timer0 lucrează în modul Counter.

Depăşirea timerului 0 este indicată de bitul T0IF din registrul INTCON. Acest bit trebuie resetat prin software.

Timerul 0 este dezactivat atunci când microcontrolerul funcţionează în regim de consum redus de energie.

2.2.5.2 Modulul Timer1

Timer1 este un timer/counter pe 16 biţi cu următoarele caracteristici:- Pereche de regiştri timer/counter totalizând 16 biţi (TMR1H:TMR1L)- Sursa de ceas internă sau externă programabila- Divizor anterior de frecvenţă pe 3 biţi programabil- Oscilator LP opţional- Mod de operare sincron sau asincron- Poarta timerului 1 poate fi controlată de comparator sau de pinul T1G- Întrerupere la depăşire- Poate scoate microcontrolerul din modul de consum redus (dacă se foloseşte sursă externă

de ceas şi modul asincron)- Poate fi folosit ca sursa de ceas pentru modulul LCDTimer1 este un counter crescător pe 16 biţi care poate fi accesat prin intermediul perechii de

registre TMR1H:TMR1L. Scrierea în TMR1H sau TMR1L actualizează în mod direct counter-ul.Când este folosit cu o sursă de ceas internă, modulul este un timer. Când este folosit cu o sursă

de ceas externă, modulul poate fi folosit ca timer sau counter şi poate număra evenimentele externe de pe pinul T1G sau cele date de ieşirea coparatorului C2.

23

Page 24: Controlul Turatiei Mot CC Folosind PIC

Sursa de ceas se poate selecta modificând bitul TMR1CS din registrul T1CON astfel:

Sursa de ceas TMR1CSFOSC/4 0Pinul T1CKI 1

Tabelul 2.2 Sursa ceasului de sistem

2.2.5.3 Modulul Timer2

Timer2 este un timer pe 8 biţi cu următoarele caracteristici:- Registru timer pe 8 biţi (TMR2)- Registru perioada pe 8 biţi (PR2)- Generează întrerupere atunci când TMR2 şi PR2 au aceeaşi valoare- Divizor anterior de frecvenţă programabil- Divizor posterior de frecvenţă programabilIntrarea de ceas a modulului Timer2 este ceasul de sistem FOSC/4. Ieşirea ceasului este introdusă

în divizorul anterior al timerului 2. Ieşirea 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 plecând de la 00h până când 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 legătura între un circuit analogic şi un circuit digital realizând comparaţia între două tensiuni analogice. Compărătorul produce un semnal digital care indică relaţia dintre mărimile celor două semnale analogice de la intrare. Comparatoarele oferă funcţionalitate analogică independentă de execuţia programului şi sunt des folosite în circuitele ce combina semnale analogice şi digitale. Compărătorul analogic are următoarele caracteristici:

- Două comparatoare- Mai multe moduri de configurare a comparatoarelor- Ieşirile comparatoarelor sunt disponibile atât intern cât şi extern- Polaritatea ieşirilor este programabila- Lansează o întrerupere la modificarea ieşirii- Poate scoate microcontrolerul din modul de consum redus de energie- Posibiltatea de a determina incrementarea Timerului 1- Ieşirea poate fi sincronizata cu intrarea de ceas a Timerului 1- Referinţă de tensiune programabilăÎn Figura 2.4 este prezentat un comparator şi relaţia dintre semnalele analogice de intrare şi

semnalul digital format la ieşire.

24

Page 25: Controlul Turatiei Mot CC Folosind PIC

Figura 2.4 Un singur comparator

Cele opt moduri de funcţionare a comparatorului pot fi selectate prin modificarea biţilor CM<2:0> ai registrului CMCON0.

2.2.7 Transmiţător Receptor Sincron Asincron Universal (AUSART)

Modulul AUSART este un periferic de I/O pentru comunicaţii seriale. Conţine generatoare de ceas, registre de deplasare şi memorii de date necesare pentru realizară unei transmisiuni sau recepţii seriale de date, independent de execuţia programului. AUSART este cunoscut şi că Interfaţa de comunicaţie serială (SCI) şi poate fi configurata ca sistem duplex asincron sau ca sistem semi-duplex sincron. Modul de lucru duplex este utilizat în comunicaţia 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 următoarele capabilităţi:- Transmisiune şi recepţie duplex asincrona- Memorie de intrare de 2 caractere- Memorie de ieşire de 1 caracter- Lungimea caracterelor este programabila şi poate avea 8 sau 9 biţi- Detecţia erorii de depăşire a dimensiunii memoriei de intrareModalitatea de funcţionare 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 recepţiei (RCSTA)

Funcţionarea AUSART în modul asincron

Modulul AUSART transmite şi recepţionează date folosind formatul standard NRZ (non-return-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 aceeaşi valoare transmişi consecutiv rămân la acelaşi nivel de ieşire al acelui bit fără a se întoarce la un nivel neutru între transmisiunea fiecărui bit. Atunci când nu se transmite informaţie, un port care foloseşte NRZ va fi stabilit la nivelul VOH. Fiecare transmisiune de caracter va fi formată dintr-un bit de start, urmat de opt biţi de date şi în final unul sau mai mulţi biţi de stop. Bitul de start este întotdeauna ‘0’ iar bitii de stop sunt întotdeauna ‘1’. Cel mai întâlnit format de date este cel pe 8 biţi. Fiecare bit de date transmis va avea o perioda de 1/(Rata de semn).

25

Page 26: Controlul Turatiei Mot CC Folosind PIC

Pentru a obţine o anumită rata de semn plecând de la oscilatorul sistemului se foloseşte generatorul intern pe 8 biţi al ratei de semn. Transmisiunea şi recepţia prin AUSART începe cu cel mai puţin semnificativ bit. Transmiţătorul şi receptorul modulului AUSART sunt independente din punct de vedere funcţional, însă folosesc acelaşi format de date şi aceeaşi rată de semn. Paritatea nu este implementată hardware dar poate fi calculată prin software şi reţinută în al nouălea bit de date.

Generatorul ratei de semn

Generatorul ratei de semn (BRG) este un timer pe 8 biţi care este utilizat atât pentru modul de operare asincron cât ş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.

Biţi de configurareMod de operare

Formula de calcul a ratei de semnSYNC 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 frecvenţa de oscilaţie de 8 MHz şi o rată de semn dorită de 9600 în modul asincron:

Pentru configurarea transmisiunii asincrone trebuie parcurşi următorii paşi:

- Iniţializarea 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 foloseşte transmisiunea pe 9 biţi trebuie setat bitul TX9.- Activarea transmisiunii prin setarea bitului de control TXEN. Acest lucru va determina

setarea bitului de întrerupere TXIF.- Dacă se doreşte 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 setaţi.

- Dacă se foloseşte transmisiunea pe 9 biţi, cel de-al nouălea bit trebuie încărcat în bitul TX9D

- Scrierea unui octet în registrul TXREG va determina pornirea transmisiunii.

Pentru configurarea recepţiei asincrone trebuie parcurşi următorii paşi:

26

Page 27: Controlul Turatiei Mot CC Folosind PIC

- Iniţializarea registrului SPBRG şi a bitului BRGH pentru obţinerea 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 doreşte folosirea întreruperilor, trebuie setat bitul RCIE din registrul PIE1 şi bitii

GIE şi PEIE din registrul INTCON.- În cazul recepţiei pe 9 biţi, trebuie setat bitul RX9.- Activarea recepţiei prin setarea bitului CREN.- Bitul de întrerupere RCIF al registrului PIR1 va fi setat atunci când un caracter este transfrat

din registrul de deplasare RSR către memoria de recepţie. O întrerupere va fi declanşată î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 biţi, valoarea celui de-al nouălea bit.

- Citirea registrului RCREG va întoarce cei mai puţin semnificativi 8 biţi din memoria de recepţie.

- În cazul apariţiei unei erori de depăşire a memoriei de recepţie, trebuie resetat fanionul OERR prin dezactivarea recepţiei prin intermediul bitului CREN.

2.2.8 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 până la patru cai comune şi până la 24 de segmente. Acest modul permite şi controlul matricei de pixeli a LCD-ului.

Modulul de comandă al panoului LCD are următoarele caracteristici:- Comanda directă a panoului LCD- Trei surse de ceas cu divizor anterior de frecvenţă programabil- Până 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)

- Până la 24 de segmenteRegiştrii folosiţi 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 obţine o ieşire de 1 kHz atunci când 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

Page 28: Controlul Turatiei Mot CC Folosind PIC

Figura 2.5 Generarea ceasului pentru LCD

A doua sursa de ceas foloseşte T1OSC/32 şi se obţine tot o frecvenţă de 1 kHz atunci când se foloseşte 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 funcţie 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 următorul tabel în funcţie de modul de operare ales:

Static 1/2 1/3VLCD 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 parcurşi următorii paşi:- Selectarea divizorului de ceas cu ajutorul biţilor LP<3:0> din registrul LCDPS- Configurarea registrelor LCDSEn pentru a activa funcţia 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>

o Modul de consum redus de energie: bitul - Introducerea valorilor de iniţializare î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.

2.2.9 Convertorul analog digital (ADC)

28

Page 29: Controlul Turatiei Mot CC Folosind PIC

Convertorul analog digital permite realizarea conversiei unui semnal analogic de intrare într-o reprezentare binară folsind 10 biţi. Acest dispozitiv foloseşte intrări analogice multiplexate într-un singur circuit de eşantionare şi memorare. Ieşirea cicuitului de eşantionare şi memorare este conectată la intrarea convertorului. Convertorul generează un rezultat pe 10 biţi folosind algoritmul de aproximări succesive şi înregistrează rezultatul în regiştrii 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 următoarele funcţii:- Configurarea porturilor- Selecţia canalului- Selecţia referinţei de tensiune- Sursa ceasului de conversie- Controlul întreruperilor- Formatul rezultatelor

Configurarea porturilor: modulul ADC poate fi folosit pentru a converti atât semnale analogice cât şi digitale. Când se convertesc semnale analogice, pinul de intrare/ieşire trebuie configurat că intrare analogică prin intermediul registrelor TRIS şi ANSEL.

Selecţia canalului: bitii CHS ai registrului ADCON0 determina care dintre cele 8 canale analogice este conectat la circuitul de eşantionare şi memorare. Când se schimbă canalul, trebuie introdusă o întârziere î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 biţilor ADCS din registrul ADCON1. Ceasul de conversie poate avea următoarele surse: FOSC/2,

29

Page 30: Controlul Turatiei Mot CC Folosind PIC

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 biţi 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 biţi poate fi furnizat în două moduri: cu aliniere la stânga 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 stânga 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 urmaţi următorii paşi:- Configurarea porturilor:

o Dezactivarea ieşirii pe pinul de intrare folosind registrul TRISo Configurarea pinului că intrare analogice folosind registrul ANSEL

- Configurarea modulului ADC:o Selectarea ceasului de conversieo Configurarea referinţei de tensiuneo Selectarea canalului de intrareo Selectarea formatului rezultatuluio Activarea modulului ADC

- Configurarea interuperii ADC (opţional):o Resetarea fanionului de întrerupereo Activarea întreruperii ADCo Activarea interuperilor generate de perifericeo Activarea globală a întreruperilor

- Aşteptarea finalizării achiziţiei

- Pornirea conversiei prin setarea bitului .

- Aşteptarea finalizării conversiei prin verificarea bitului sau prin aşteptarea apariţiei întreruperii.

- Citirea rezultatului- Resetarea fanionului de întrerupere.

2.2.10 Modulul de Stocare/Comparare/PWM (CCP)

30

Page 31: Controlul Turatiei Mot CC Folosind PIC

Modulul CCP este un periferic care permite utilizatorului să cronometreze şi să controleze diferite evenimente. În modul stocare, perifericul permite măsurarea duratei unui eveniment. Modul comparare permite declanşarea unui eveniment extern după trecerea unui interval de timp predeterminat. Modul PWM poate generă un semnal cu modulaţie în durata a impulsurilor cu frecvenţă şi factor de umplere variabil.

Mod CCP TimerStocare Timer1

Comparare Timer1PWM Timer2

Tabelul 2.5 Resursele folosite de modulele CCP

Cele două module CCP pot funcţiona în moduri diferite iar interacţiunea dintre acestea este prezentată în Tabelul 2.6:

Mod CCP1 Mod CCP2 InteracţiuneStocare Stocare Aceeaşi configuraţie pentru Timer1Stocare Comparare Aceeaşi configuraţie pentru Timer1

Comparare Comparare Aceeaşi configuraţie pentru Timer1PWM PWM Aceeaşi frecvenţă şi rata de actualizare (întreruperea TMR2).

Fronturile crescătoare vor fi aliniate.PWM Stocare Nici unaPWM Comparare Nici una

Tabelul 2.6 Interacţiunea dintre cele două module CCP

Modul stocare

În acest mod registrele CCPRxH:CCPRxL stochează valoarea pe 16 biţi a registrului TMR1 în momentul apariţiei evenimentului pe pinul CCPx. Evenimentele pot fi definite prin modificarea biţilor CCPxM<3:0> ai registrului CCPxCON şi pot fi:

- O dată la fiecare front scăzător- O dată la fiecare front crescător- O dată la 4 fronturi crescătoare- O dată la 16 fronturi crescătoare

Atunci când 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 funcţionare în modul stocare

31

Page 32: Controlul Turatiei Mot CC Folosind PIC

În modul stocare pinul CCPx trebuie configurat că intrare prin setarea bitului din registrul TRIS asociat.

Modul comparare

În acest mod valoarea pe 16 biţi a registrului CCPRx este comparată în mod continuu cu valoarea aflată în perechea de registre a Timerului 1. Când aceste valori sunt egale, modulul CCPx poate efectua următoarele operaţii:

- Complementarea ieşirii modulului CCPx- Setarea ieşiri modulului CCPx- Resetarea ieşirii modulului CCPx- Declanşarea unui eveniment- Generarea unei întreruperi softwareAcţiunea dorită este selectată prin modificarea biţilor CCPxM<3:0> din registrul CCPxCON.

Toate modurile de comparare pot genera o întrerupere.

Figura 2.9 Schema bloc de funcţionare în modul comparare

Utilizatorul trebuie să configureze pinul CCPx ca ieşire prin resetarea bitului corespunzător din registrul TRIS asociat.

Modul PWM

Acest mod generează pe pinul CCPx un semnal cu impulsuri modulate în durată. Factorul de umplere, perioadă şi rezoluţia sunt determinate de următorii regiştri:

- PR2- T2CON- CCPRxL- CCPxCONModulul CCP poate produce o ieşire PWM cu o rezoluţie de până la 10 biţi pe pinul CCPx.

Deoarece pinul CCPx este multiplexat cu portul de date, registrul TRIS asociat acestui pin trebuie resetat pentru a activa comanda de ieşire.

32

Page 33: Controlul Turatiei Mot CC Folosind PIC

Figura 2.10 Schema bloc simplificata pentru funcţionarea CCP în modul PWM.

Ieşirea PWM are o perioadă şi un interval în care ieşirea ia valoarea ‘1’ logic.Perioada PWM este specificata în registrul PR2 al Timerului 2. Perioada poate fi calculată

folosind următoarea ecuaţie:

unde .Atunci când valoarea registrului TMR2 este egală cu cea a registrului PR2, au loc

următoarele:- TMR2 este resetat- Pinul CCPx este setat (exceptând 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 biţi astfel: cei mai semnificativi 8 biţi în registrul CCPRxL şi cei mai puţin semnificativi 2 biţi în registrul CCPxCON pe poziţiile 5 şi 4. Registrul CCPRxL şi bitii CCPx<1:0> ai registrului CCPxCON pot fi scrişi la orice moment de timp. Durata impulsului PWM nu este scrisă în CCPRxH decât după trecerea unei perioade PWM.

Durata impulsului PWM poate fi calculată cu următoare formulă:

Factorul de umplere poate fi calculat cu următoarea formulă:

Registrul TMR2 pe 8 biţi este concatenat cu 2 biţi de la ceasul de sistem sau de la divizor pentru a forma o valoarea pe 10 biţi. Atunci când această valoare pe 10 biţi este egală cu valoarea perioadei PWM se resetează bitul CCPx.

33

Page 34: Controlul Turatiei Mot CC Folosind PIC

Figura 2.11 Ieşirea CCP în modul PWM.

Rezoluţia PWM determina numărul de durate distincte ale impulsului PWM care pot fi selectate pentru o anumită perioadă PWM. De exemplu pentru o rezoluţie de 10 biţi vor rezulta 1024 de durate discrete, iar pentru o rezoluţie de 8 biţi vor rezulta doar 256 de durate discrete.

Rezoluţia PWM maximă este de 10 biţi atunci când PR2 ia valoarea 255. Rezoluţia este o funcţie care depinde de valoarea registrului PR2 conform următoarei ecuaţii:

În cazul în care durata impulsului este mai mare decât perioadă, ieşirea PWM va rămâne neschimbată.

2.3 Afişaje cu cristale lichide (LCD)

Dispozitivile LCD utilizează o tehnologie pasivă de afişare a imaginii. Acestea nu emit lumină, ci folosesc lumina ambientală. Prin manipularea acestei lumini, LCD-urile afişează imagini consumând foarte puţină energie. Datorită acestui lucru tehnologia LCD este cea mai utilizată în aplicaţiile care necesită consum redus de energie şi dimensiuni reduse.

Modalităţi de comandă a dispozitivelor LCD

Există două tipuri de comandă a afişajelor LCD: directă şi multiplexata[3].Comanda directă care se mai numeşte şi statică presupune că suprafaţa inferioară a fiecărui

segment să fie conectată la un plan comun iar suprafaţa superioară să aibă o conexiune independenta către circuitul de comandă. Astfel de afişaje au un contrast foarte bun funcţionând într-un domeniu larg de temperaturi. LCD-urile comandate static necesita frecvente de comandă între 30 Hz şi 60 Hz. Frecvenţele sub 30 Hz pot provoca fenomenul de pâlpâire a ecranului.

Figura 2.12 Comanda directă a unui afişaj LCD cu un digit.

Dezavantajul acestui tip de comandă este că în cazul LCD-urilor cu multe segmente, conectarea individuală a fiecărui segment la circuitul de comandă devine impracticabila.

34

Page 35: Controlul Turatiei Mot CC Folosind PIC

Afişajele 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 apariţia unei componente continue. Aplicarea unei componente continue poate duce la declanşarea unor procese chimice în interiorul ecranului LCD care vor cauza reducerea vieţii de funcţionare a dispozitivului.

Comanda multiplexata[4] poate simplifica schema de interconectare a unui LCD cu număr mare de segmente. Afişajele multiplexate au întotdeauna mai multe plane comune

Anumite segmente sunt conectate împreună pentru a forma grupuri care sunt adresate secvenţial cu ajutorul mai multor plane comune. Aceste grupuri sunt organizate într-o matrice cu rânduri ş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.

Numărul 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 numărului de conexiuni externe îmbunătăţeşte durata de viaţă a LCD-ului şi permite creşterea densităţii 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 număr mare de plane comune poate duce la reducerea domeniului de temperatură în care LCD-ul poate funcţiona corect. De asemenea, multiplexarea necesita folosirea unor circuite de comandă mai complexe sau în cazul folosirii unui microcontroler fără circuit de comandă pentru LCD, a unui software mai elaborat.

35

Page 36: Controlul Turatiei Mot CC Folosind PIC

2.4 Motorul de curent continuu cu perii

2.4.1 Introducere

Motoarele de curent continuu sunt folosite în diverse aplicaţii pornind de la jucării până la scaune de maşină reglabile electric. Motoarele de curent continuu cu perii sunt ieftine, pot fi comandate uşor şi sunt disponibile în mai multe tipuri şi dimensiuni.

2.4.2 Principiu de funcţionare

Structura unui motor de curent continuu[5] cu perii simplu este ilustrată în Figura 2.14. Toate motoarele BDC conţin următoarele componente: stator, rotor, perii şi comutator.

Statorul generează câmpul magnetic staţionar care înconjoară rotorul. Acest câmp este generat cu ajutorul unui magnet permanent sau au unui electromagnet. Tipurile de motoare BDC se diferenţiază prin modul de construcţie a statorului sau prin modul în care înfăşurările electromagnetului sunt conectate la sursa de alimentare.

Rotorul poate avea una sau mai multe înfăşurări. Când aceste înfăşurări sunt alimentate produc un câmp magnetic. Polii magnetici ai câmpului rotorului sunt atraşi de polii opuşi generaţi de stator, determinând mişcarea rotorului. Când motorul se roteşte, înfăşurările sunt alimentate într-o anumită ordine astefel încât polii magnetici generaţi de rotor să nu fie în acelaşi plan cu polii generaţi de stator. Aceasta alternare a câmpului magnetic generat de înfăşurările rotorului se numeşte comutaţie.

Figura 2.14 Schema simplificată a unui motor de curent continuu

Periile şi comutatorul. Spre deosebire de alte tipuri de motoare electrice (BDC fără perii, AC cu inducţie), motoarele BDC nu au nevoie de controler pentru comutaţia curentului în înfăşurări. Comutaţia înfăşurărilor într-un motor BDC este realizată mecanic. O cămaşă de cupru segmentată, numită comutator, este poziţionată pe axul motorului BDC. În timp ce motorul se roteşte, periile de carbon trec peste comutator, intrând în contact cu diferite segmente ale acestuia. Segmentele sunt conectate la înfăşurări distincte ale rotorului, iar atunci când este aplicată tensiune la bornele motorului se generează astfel un câmp magnetic dinamic. Periile şi comutatorul sunt componentele motorului BDC cele mai supuse uzurii.

36

Page 37: Controlul Turatiei Mot CC Folosind PIC

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 magneţi permanenţi pentru a produce câmpul magnetic al statorului. Motoarele PMDC sunt în general folosite în aplicaţiile de putere mică deoarece în acest caz magneţii permanenţi sunt mai ieftini decât electromagneţii. Dezavantajul acestui tip de motor este că în timp magneţii îşi pierd proprietăţile magnetice. Unele motoare cu magneţi permanenţi au înfăşurări speciale care previn pierderea proprietăţilor magnetice. Curbă de performatna (tensiune-viteza) este foarte liniara în cazul motoarelor de curent continuu cu magneţi permanenţi. De asemenea consumul de curent variază liniar cu cuplul. Aceste motoare răspund foarte rapid la modificarea teniunii deoarece câmpul magnetic al statorului este întotdeauna constant.

Figura 2.15 Motor cu magnet permanent.

Motor cu excitaţie paralelă

Motoarele de curent continuu cu câmp magnetic de excitaţie paralel au bobină de excitaţie în paralel cu rotorul. Curentul din bobina şi cel din rotor sunt independenţi. Astfel aceste motoare au un control foarte bun al turaţiei. Acest tip de motor este folosit în aplicaţii de putere mai mare decât cele cu magneţi permanenţi. Spre deosebire de motoarele cu magneţi permanenţi, pierderea proprietăţilor magnetice nu mai este o problemă la acest tip de motor.

Figura 2.16 Motor cu excitaţie paralelă

Motor cu excitaţie serie

Motoarele de curent continuu cu perii cu câmp magnetic de excitaţie serie au bobină de excitaţie în serie cu înfăşurarea rotorica. Aceste motoare sunt ideale pentru aplicaţiile care necesită cuplu ridicat deoarece curenţii din stator şi rotor cresc odată cu creşterea sarcinii. Un dezavantaj al acestui tip de motor este că spre deosebire de motoarele cu magneţi permanenţi şi cele cu excitaţie paralelă, nu permite controlul precis al vitezei.

Figura 2.17 Motor cu excitaţie serie

37

Page 38: Controlul Turatiei Mot CC Folosind PIC

Motor cu excitaţie mixtă

Motoarele cu excitaţie mixtă reprezintă o combinaţie a motoarelor cu excitaţie serie şi a celor cu excitaţie paralelă. După cum se observă în Figura 2.18, aceste motoare au atât o înfăşurare de excitaţie serie cât şi una paralelă. Motoarele cu excitaţie mixtă au cuplu mai mare decât cele motoarele cu excitaţie paralelă şi permit un control al vitezei mai exact decât în cazul motoarelor cu excitaţie serie.

Figura 2.18 Motor cu excitaţie mixtă

2.4.4 Modele de circuite de comandă

Circuitele de comandă sunt folosite în aplicaţiile în care se foloseşte un controler şi este necesar controlul vitezei. Scopul circuitului de comandă este de a permite controlerului să varieze curentul din înfăşurările unui motor de curent continuu cu perii. Circuitele de comandă prezentate în continuare permit controlerului să aplice tensiune motorului folosind modulaţia î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 variaţie a turaţiei decât metodele tradiţionale 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ă direcţie. Figurile 2.19 şi 2.20 ilustrează circuite care permit comanda unui motor BDC într-o singură direcţie. 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 aplicaţiile cu jumătăţi 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 când acesta se învârte. Când tranzistorul este blocat, înfăşurările din motor sunt încă încărcate şi generează un curent invers. Dioda D1 trebuie aleasa astfel încât să disipe acest curent.

Figura 2.19 Circuit de comandă de tip A

38

Page 39: Controlul Turatiei Mot CC Folosind PIC

Figura 2.20 Circuit de comandă de tip B

Rezistentele R1 şi R2 din Figurile 2.19 şi 2.20 sunt importante pentru funcţionarea fiecărui circuit. R1 protejează microcontrolerul de supracurent iar R2 permite blocarea tranzistorului atunci când pinul de intrare este configurat în modul tristate.

Controlul bidirecţional al motoarelor de curent continuu cu perii presupune folosirea unui circuit numit punte H. Puntea H permite permite circulaţia curentului în amble sensuri prin înfăşurările motorului. Pentru a putea înţelege puntea H, aceasta trebuie descompusă în două părţi numite jumătăţi de punte. În Figura 2.21 tranzistoarele Q1 şi Q2 fac parte din prima jumătate de punte iar Q3 şi Q4 din a doua jumătate. Fiecare dintre aceste jumătăţi de punte poate comută motorul la tensiunea de alimentare sau la împământare. Atunci când Q1 este pornit şi Q2 este blocat, partea stângă 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

Săgeata marcată IFWD arata sensul curentului în această configuraţie. Tipurile de comandă cu ajutorul punţii H sunt prezentate în Tabelul 2.7. În modurile Direct sau Invers, o parte a punţii este legată la masa iar cealaltă la borna de alimentare. În Figura 2.21 săgeţile indică sensul curenţilor în cazul modurilor Direct şi Indirect. În modul Liber terminalele motorului nu sunt conectate iar acesta se învârte liber până se opreşte. În modul Frânare, terminalele motorului sunt legate la masă. Motorul se comportă ca un generator atunci când se roteşte. Scurtcircuitarea terminalelor motorului se comportă ca o sarcină infinită care opreşte motorul rapid. Săgeata IBRK ilustrează acest lucru.

39

Page 40: Controlul Turatiei Mot CC Folosind PIC

Tabelul 2.7 Configuraţii de comandă a motoarelor folosind puntea H

2.4.5 Controlul vitezei

Viteza unui motor de curent continuu cu perii este proporţională cu tensiunea aplicată la bornele motorului. În cazul controlului digital, la bornele motorului se aplică un semnal cu modulaţie î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 înfăşurările motorului. Relaţia de legătură între tensiunea medie, tensiunea de alimentare şi factorul de umplere este următoarea:

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 când este alimentat cu un semnal PWM cu factor de umplere 50%.

Frecvenţa semnalului PWM reprezintă un factor important. La frecvenţe prea joase, motorul va fi zgomotos la viteze mici şi va răspunde greu la modificarea factorului de umplere. La frecvenţe prea mari scade eficienţa sistemului din cauza pierderilor din dispozitivele de comutaţie. Î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 rezoluţie de 10 biţi î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.

Modalităţi de măsurare a vitezei (feedback)

Deşi viteza unui motor de curent continuu cu perii este în general proporţională cu factorul de umplere, nici un motor nu este ideal. Căldura, uzura comutatorului şi sarcina influenţează 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 măsurarea tensiunii eletromotoare autoinduse a motorului.

Determinarea vitezei cu ajutorul senzorilor

Există o gamă largă de senzori folosiţi pentru determinarea vitezei de rotaţie. Senzorii optici presupun montarea unei roţi cu fante pe axul motorului. Pe o parte a roţii este montat un LED infraroşu care trimite lumina către un fototranzistor poziţionat de cealaltă parte a roţii. Când lumina trece printr-o fantă fototranzistorul este activat iar în caz contrar este blocat. Frecvenţa de comutaţie a tranzistorului indica viteza motorului. Folosind senzori optici se poate determina şi poziţia motorului la un moment dat.

40

Page 41: Controlul Turatiei Mot CC Folosind PIC

Figura 2.22 Utilizarea senzorului optic

Senzorii cu efect Hall folosesc o roată ataşată axului motorului. Pe marginea acestei roti sunt montaţi unul sau mai mulţi magneţi. Atunci când un magnet trece prin apropierea sa, senzorul staţionar 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 rotaţie este măsurarea tensiunii electromotoare autoinduse care este proporţională cu viteză. Figura 2.24 arata punctele în care se poate măsura tensiunea electromotoare autoindusă în schema punţii H. Pentru a putea citi tensiunea folosind convertorul analog digital sefoloseste un divizor pentru a aduce tensiunea în intervalul 0-5V. Tensiunea autoindusă este măsurată atunci când alimentarea motorului este întreruptă pentru un scurt moment de timp.

Figura 2.24 Măsurarea tensiunii electromotoare autoinduse folosind puntea H

2.4.6 Elemente constructive ale motorului de curent continuu cu perii cu magneţi permanenţi

Motoarele de curent continuu cu perii şi magneţi permanenţi conţin magneţi permanenţi în stator şi înfăşurări în rotor. Capetele înfăşurărilor sunt conectate la segmentele comutatorului care intră în contact cu periile staţionare. Periile sunt conectate la sursa de alimentare de curent continuu. Schimbarea direcţiei de rotaţie poate fi realizată prin inversarea polarităţii tensiunii de alimentare.

41

Page 42: Controlul Turatiei Mot CC Folosind PIC

Circulaţia curentului prin bobine creează poli magnetici în rotor care interacţionează cu polii magneţilor permanenţi. Pentru a putea genera cuplu în aceeaşi direcţie, trebuie inversat sensul curentului atunci când polul nord al rotorului trece de polul sud al statorului. Acest lucru este realizat de comutator.

Periile sunt fabricate din carbon sau metale preţioase. Periile din metale preţioase sunt folosite la tensiuni joase şi timp de funcţionare îndelungat, au rezistenţa de contact redusă şi produc mai puţin zgomot electromagnetic decât periile din carbon. Periile din carbon sunt folosite la consum mare de putere, viteză mare de rotaţie, 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 poziţionat în interiorul carcasei. Este

format dintr-un ax metalic şi o armatură rotorica ce susţine înfăşurările. Capetele înfăşurărilor 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 căreia sunt fixaţi magneţi permanenţi.

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 câmp electromagnetic variabil conform legii Lenz a electromagnetismului. Tensiunea apare la motoarele electrice în care există o mişcare relativă între motor şi stator. O aplicaţie practică a acestui fenomen este măsurarea indirectă a vitezei de rotaţie a unui motor. Polaritatea tensiunii autoinduse este întotdeauna opusă polarităţii tensiunii de alimentare.

Într-un motor în care rotorul se învârte într-un câmp magnetic, conductoarele intersectează liniile de câmp magnetic. Variaţia intensităţii câmpului magnetic produce o tensiune în bobină, motorul comportându-se ca un generator. Aceasta tensiune se opune tensiunii aplicate iniţial. Deoarece există o tensiune mai mică pe rotor, curentul care intră în înfăşurările motorului este redus.

Deoarece tensiunea electromotoare autoindusă creşte rezistenta aparentă a circuitului prin generarea unei tensiuni de sens opus, un motor electric care este deja în mişcare de rotaţie consuma

42

Page 43: Controlul Turatiei Mot CC Folosind PIC

mai puţină energie decât unul care tocmai porneşte sau care îşi schimbă direcţia. Pentru a maximiza acest efect, înfăşurările 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 conţină fier, majoritatea tipurilor de oţel sau orice material cu histerezis pronunţat.

Tensiunea generată de un motor aflat în mişcare poate fi folosită pentru a determina viteza de rotaţie a acestuia. Acest lucru poate fi folosit în algoritmii de control al turaţiei pentru a determina viteza de mişcare a unui robot mobil.

În mod obişnuit un motor consuma energie electrică şi o transformă în energie mecanică sub forma unei mişcări de rotaţie. În cazul unui generator acest fenomen este inversat. Un generator preia energie mecanică şi o converteşte în energie electrică. Majoritatea motoarelor pot fi şi generatoare dacă sunt rotiţe de o forţă exterioară lor.

Atunci când se doreşte utilizarea tensiunii electromotoare autoinduse în sistemele de reglaj al turaţiei, motorul este alimentat aproape continuu, însă pentru intervale de timp foarte scurte de timp tensiunea de alimentare este întreruptă iar motorul este lăsat în gol, timp în care se realizează măsurarea tensiunii generate de acesta.

Tensiunea măsurată atunci când motorul se învârte în gol este direct proporţională cu viteza de rotaţie a motorului. Acest lucru este folosit pentru a determina viteza motoarelor atunci când nu este disponibil un senzor optic sau un senzor cu efect Hall.

Determinarea vitezei unui motor folosind măsurarea tensiunii autoinduse[8] se realizează în două etape care se succed repetat. Întâi 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 alimentării şi lăsarea motorului să se rotească în gol. Inerţia motorului îi permite acestuia să se rotească pentru un interval de timp suficient de lung pentru a putea măsura 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 înfăşurări. 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 până la ¼ din valoarea maxim posibilă iar apoi se stabilizează. Dacă intervalul de măsurare a tensiunii electromotoare autoinduse este prea mare, motorul va începe să încetinească.

În Figura 2.27 se observă un o tensiune electromotoare corespunzătoare unui factor de umplere de 75%.

43

Page 44: Controlul Turatiei Mot CC Folosind PIC

Figura 2.27 T.e.m autoindusă pentru factor de umplere 75%[8]

Figura 2.28 ilustrează cazul în care motorul funcţionează la un factor de umplere de 75% dar este în sarcina. Deoarece atunci când este în sarcina motorul are o energie inductivă ridicată în înfăşurări, intervalul de timp necesar atingerii nivelului de stabilizare este mai mare.

Într-o aplicaţie de control al turaţiei trebuie determinat intervalul minim de timp necesar măsurării tensiunii electromotoare autoinduse.

Figura 2.28 T.e.m autoindusă pentru factor de umplere 75% sub sarcină[8]

Limitări

Spre deosebire de senzorii optici sau cu efect Hall, tensiunea electromotoare autoindusă nu poate reda poziţia absolută a motorului la un anumit moment de timp, ci doar viteza acestuia.

Deoarece măsurarea tensiunii autoinduse necesita decuplarea motorului de la sursa de alimentare pentru intervale scurte de timp, această metodă de determinare a vitezei de rotaţie reduce factorul de umplere care poate fi maxim obţinut.

44

Page 45: Controlul Turatiei Mot CC Folosind PIC

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ă aplicaţia pentru PC în limbajul Visual Basic .NET folosind Visual Studio IDE.

Sistemul de reglaj al turaţiei are următoarele funcţii:- Permite modificarea directă a factorului de umplere al semnalului PWM prin intermediul

potenţiometrului P2 de pe placa de dezvoltare sau prin comanda PC prin portul serial.- Măsoară tensiunea electromotoare autoindusă a motorului de curent continuu- Reglează automat viteza motorului, aflat sub sarcină variabilă, la o anumită valoare indicată

de potenţiometrul P2 sau primită de la aplicaţia PC- Afişarea vitezei curente precum şi a altor parametrii pe ecranul LCD şi cu ajutorul LED-

urilor de pe placa de dezvoltare.- Aplicaţia pentru PC reprezintă grafic variaţia turaţiei motorului în funcţie de timp.- Informaţiile de pe placa de dezvoltare (LCD, LED-uri, valorile variabilelor de control) sunt

disponibile şi în aplicaţia software pentru PC, starea acestora fiind sincronizata prin transmisiune bidirecţională prin portul serial.

Diagrama sistemului de reglaj automat al turaţiei 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 priveşte algoritmul implementat. Microcontrolerul PIC16F917 conţine un modul CCP care permite generarea independentă a semnalului PWM (fără a reduce performanta sistemului) precum şi un

45

Page 46: Controlul Turatiei Mot CC Folosind PIC

circuit de comandă pentru afişajul LCD. Placa de dezvoltare PICDEM Mechatronics are incorporată o punte H care permite controlul bidirecţional al motorului de curent continuu şi măsurarea tensiunii electromotoare autoinduse.

Schema electrică simplificată a proiectului este ilustrată în ANEXA 4. Pentru a rula programul trebuie realizate următoarele 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 Semnificaţia şi funcţiile componentelor:

- Potenţiometrul P2 are un dublu rolo dacă reglajul automat al turaţiei este dezactivat, atunci tensiunea convertită de la

potenţiometrul P2 controlează direct factorul de umplere al semnalului PWMo în caz contrar variaţia tensiunii de la potenţiometrul P2 în intervalul 0-5V este

tradusă într-o variaţie a variabilei setRPM în intervalul 0 – 2000RPM conform caracteristicii Viteza_de_rotaţie=f(Tensiune_electromotoare_autoindusă) verificată experimental.

- Switch-ul 2 activează sau dezactivează funcţia de reglaj automat al turaţiei. La fiecare apăsare a acestui buton se complementează variabilă AUTO care controlează funcţia de reglaj automat al turaţiei. Modificarea este transmisă imediat către aplicaţia PC pentru a menţine sincronizarea interfeţei grafice cu starea microcontrolerului.

- Switch-ul 3 controlează informaţia afişată pe ecranul LCD. Cât timp acest buton este ţinut apăsat, pe ecranul LCD este afişată viteza de rotaţie impusă (cu ajutorul potentiometurlui P2 sau prin comanda de la PC), iar în caz contrar (butonul este relaxat) este afişată valoarea curentă a turaţiei motorului de curent continuu.

- Switch-ul 4 permite dezactivarea controlului software (controlul prin aplicaţia PC). Cât timp controlul software este activ, potentiometurl P2 este dezactivat, iar comenzile de control al turaţiei sunt date de aplicaţia PC. Acest buton trebuie apăsat atunci când controlul software este activ şi se doreşte modificarea turaţiei cu ajutorul potenţiometrului P2.

- LED-ul D0 – atunci când reglajul automat al turaţiei este activ LED-ul 0 indică (aprins) realizarea unei corecţii pozitive a tensiunii aplicate motorului de curent continuu (creşterea factorului de umplere al semnalului PWM).

- LED-ul D1 are funcţionalitate complementară LED-ului 0 aprinzându-se în momentul aplicării unei corecţii negative asupra tensiunii de alimentare a motorului (descreşterea factorului de umplere al semnalului PWM)

46

Page 47: Controlul Turatiei Mot CC Folosind PIC

- LED-ul D4 indica sursa curentă de control a turaţiei: când LED-ul este stins, viteza de rotaţie a motorului de curent continuu este controlată de pe placa de dezvoltare prin intermediul potenţiometrului P2 (control hardware), iar când LED-ul este stins comenzile de control al turaţiei sunt date de aplicaţia PC.

- LED-ul D7 indica starea de activare/dezactivare a funcţiei de control automat al turaţiei. Atunci când LED-ul este stins controlul automat al turaţiei este dezactivat, iar aplicarea unei sarcini duce la scăderea turaţiei fără ca programul să încerce aplicarea unei corecţii (creşterea tensiunii aplicate – factor de umplere mai mare al semnalului PWM). Dacă LED-ul este aprins atunci algoritmul încearcă să păstreze o viteză constantă atunci când se aplică o sarcină variabilă pe motorul de curent continuu.

- Ecranul LCD este folosit pentru afişarea vitezei de rotaţie curente sau a celei dorite în funcţie de starea Switch-ului 3. De asemenea se foloseşte simbolul special “A” pentru a indica starea funcţiei de reglaj automat.

3.2.3 Stabilirea unui protocol de comunicare între microcontroler şi PC

Comunicaţia este realizată cu un o rată de semn de 9600, cu 8 biţi de date, 1 bit de start, 1 bit de stop şi fără control de paritate.Comunicarea prin portul serial se face trimiţând informaţii sub forma unui şir de valori pe 8 biţi (valori între 0 şi 255).

Pentru a putea transmite şi primi comenzi prin portul serial, pe lângă configurarea modului USART trebuie stabilit un protocol.

Pentru ca cele două dispozitive să “se înţeleagă” trebuie formulat un set de comenzi predefinite (mesaje) şi formatul acestora. Structura acestor mesaje trebuie cunoscută de ambele aplicaţii.

Am ales un protocol simplu în care informaţia dintr-un pachet de comunicaţie (atât la transmisie cât şi la recepţie) are 5 octeţi dintre care 3 sunt identificatori de comandă (3 caractere ASCII) iar ultimii doi sunt date asociate acelei comenzi (viteza de rotaţie, factorul de umplere al semnalului PWM, starea parametrilor (reglaj automat, comanda software)).

Mesajele trimise de microcontroler către PC sunt (fiecare caracter este trimis sub formă de cod ASCII (un octet); ↑ - concatenare):

- “PWMM” ↑ Factor_de_umplere (un octet) – ultimul octet conţine valoarea curentă a factorului de umplere (variabilă DutyCycle) al semnalului PWM.

- “SET” ↑ Viteza_de_rotaţie_dorită (doi octeţi) – ultimii doi octeţi conţin valoarea variabilei setRPM (viteza de rotaţie impusă). Cel de-al 4-lea octet conţine biţii cei mai semnificativi ai variabilei setRPM (pe 16 biţi) iar ultimul octet conţine biţii cei mai puţini semnificativi.

- “RPM” ↑ Viteza_de_rotaţie_curentă (doi octeţi) - ultimii doi octeţi conţin valoarea variabilei RPM (viteza de rotaţie curentă, stabilită prin măsurarea tensiunii autoinduse). Cel de-al 4-lea octet conţine biţii cei mai semnificativi ai variabilei RPM (pe 16 biţi) iar ultimul octet conţine biţii cei mai puţini semnificativi.

- “INI” ↑ Reglaj_automat (un octet) ↑ Control_Software (un octet) – acest mesaj este transmis ca răspuns la o cerere de sincronizare din partea aplicaţiei PC. Când aplicaţia PC se conectează la portul de comunicaţie şi detectează prezenţa microcontrolerului – primeşte mesaje pe care le poate identifica pe baza protocolului predefinit – trimite un mesaj către

47

Page 48: Controlul Turatiei Mot CC Folosind PIC

acesta prin care cere informaţii despre starea funcţiei de Reglaj Automat şi a celei de Control Software. Astfel conectarea aplicaţiei PC poate fi realizată în orice moment de timp, indiferent de starea microcontrolerului. Starea celor două funcţii este stocată pe câte un bit de informaţie, însă pentru a păstra o lungime constantă a mesajului (5 octeţi) se transmite câte un octet pentru fiecare bit.

- “LOOP” ↑ Reglaj_automat (un octet) – atunci când funcţia de reglaj automat este activată/dezactivată folosind Switch-ul 2 de pe placa de dezvoltare, nouă valoare este trimisă către aplicaţia PC pentru a păstra sincronizarea. Ultimul octet conţine valoarea variabilei AUTO din programul microcontrolerului.

- “REMOT” – Acest mesaj este trimis atunci când se dezactivează controlul software prin apăsarea Switch-ului 4 de pe placa de dezvoltare. Controlul software este reactivat automat atunci când microcontrolerul primeşte de la aplicaţia PC o comandă de modificare a factorului de umplere al semnalului PWM sau o nouă valoare pentru viteza de rotaţie impusă. Starea funcţiei de reglaj automat poate fi modificată şi din aplicaţia software indiferent de starea funcţiei de control automat.

Mesajele trimise de aplicaţia PC către microcontroler sunt (fiecare caracter este trimis sub formă de cod ASCII (un octet); ↑ - concatenare):

- “LOOP” ↑ Reglaj_automat (un octet) – acest mesaj este trimis atunci când funcţia de reglaj automat al turaţiei este activată/dezactivată prin intermediul aplicaţiei PC.

- “RPM” ↑ Viteza_de_rotaţie_impusă (doi octeţi) – cei mai semnificativi biţi ai variabilei setRPM sunt stocaţi în penultimul octet iar cei mai puţin semnificativi în ultimul octet.

- “PWMM” ↑ Factor_de_umplere (un octet) – când microcontrolerul primeşte această comandă, o introduce în variabilă DutyCycle, care este mai apoi scrisă în registrele CCPR2L şi CCP2CON (biţii 5-4) pentru a modifica factorul de umplere al semnalului PWM.

- “INITT” – acest mesaj este trimis de aplicaţia PC atunci când este detectat microcontrolerul şi reprezintă prima etapă (cererea de informaţii) de sincronizare. Microcontrolerul va răspunde la acest mesaj cu informaţii legate de starea (activat/dezactivat) funcţiilor de Reglaj Automat şi Control Software.

3.2.4 Descrierea algoritmului şi a codului sursa

Codul sursa al aplicatiei pentru mirocontroler este prezentat integral in ANEXA 7.

3.2.4.1 Iniţializarea

În etapa de iniţializare a programului se configurează modul de lucru al microcontrolerului (configurarea porturilor de intrare/ieşire, analogice/digitale, selectarea oscilatorului şi configurarea frecvenţei de sistem), perifericele folosite (convertor analog/digital, modul CCP, Timer0, Timer1, Timer2, USART), afişajul LCD, se activează întreruperile.

Configurarea ceasului de sistem la frecvenţa de 8 MHz se face prin setarea biţilor 6-4 din registrul OSCCON.

Configurarea porturilor de intrare/ieşire se face prin setarea biţilor din registrele TRIS asociate porturilor iar pentru selectarea intrărilor analogice se foloseşte registrul ANSEL.

- Ieşiri digitale:

48

Page 49: Controlul Turatiei Mot CC Folosind PIC

o RA3 – LED-ul D4o RA4 – Switch-ul 3o RA5 – LED-ul D7o RD1 – Switch-ul 2o RD2 – Ieşirea modulului CCPo RD4 – Switch-ul 4o RD5 – LED-ul D1o RD6 – LED-ul D0o RD7 – comanda tranzistorului nMOS

- Intrări analogice:o AN0 – tensiunea electromotoare autoindusă de la pinul BACK EMFo AN1 – tensiunea controlată de potenţiometrul P2

Configurarea modulului USART. În această aplicaţie am folosit o rată de semn de 9600, 8 biţi de date, un bit de start, un bit de stop, fără control de paritate.

Având î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 încât să nu afecteze comunicaţia prin portul serial. Acest lucru se dovedeşte şi în testele practice.

Următorul pas în iniţializarea USART este activarea recepţiei (registrul RCSTA) şi a transmisiunii seriale (registrul TXSTA). Recepţia este indicată prin setarea fanionului RCIF iar finalizarea unei transmisiunii prin setarea fanionului TXIF. Atât transmisiunea cât şi recepţia pot fi configurate pentru a lansa o întrerupere.

Configurarea convertorului analog/digital. Conversia analog-digitala are o rezoluţie de 10 biţi, iar rezultatul conversiei este aliniat la stânga în registrele ADRESH şi ADRESL. Frecvenţa convertorului este f = FOSC/16 = 8MHz / 16 = 500 kHz. Perioada de bit este TAD = 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 intrării analogice care va furniza semnalul ce trebuie convertit. În această aplicaţie se folosesc pinii AN0 (tensiune electromotoare autoindusă) şi AN1 (tensiunea controlată de potenţiometrul P2).

Configurarea modulului CCP. Pentru o valoare de 63 a registrului PR2, acest modul va genera în modul PWM un semnal dreptunghiular cu frecvenţa de 31.25 kHz căruia îi corespunde o perioadă de 32 μs ce poate fi calculată astfel:

49

Page 50: Controlul Turatiei Mot CC Folosind PIC

Rezoluţia PWM maximă este de 10 biţi atunci când PR2 ia valoarea 255. Rezoluţia este o funcţie care depinde de valoarea registrului PR2 conform următoarei ecuaţii:

Pentru PR2 = 63, rezoluţia semnalului PWM va fi de 8 biţi, suficientă pentru această aplicaţie.

Configurarea Timer-ului 0. Depăşirea timer-ului 0 este folosită ca baza de timp pentru execuţia 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 recepţie 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).

Iniţializarea ecranului LCD este realizată prin apelarea funcţiei initLCD. Această funcţie este definită într-un fişier de cod separat.

3.2.4.2 Bucla principală de program

Baza de timp folosită pentru bucla principală de program este dată de depăşirea generată de Timerul 0 al microcontrolerului. Instrucţiunile din interiorul buclei se execută la fiecare depăşire a Timerului 0 sau la intervale care sunt multipli ai bazei de timp.

Timerul 0 este configurat să genereze o depăşire o dată la 32,768 ms conform formulei:

Instrucţiunile din bucla principală:

- La fiecare întrerupere a Timer-ului 0 se verifică starea switch-urilor 2 şi 4. Un buton este detectat ca apăsat dacă acesta îşi păstrează starea (apăsat) timp de 32ms (intervalul dintre două depăşiri consecutive ale Timer-ului 0). Acest interval asigura depăşirea perioadei în care butonul poate face un contact imperfect (debounce). Variabilă “pushed” de tip bit este setată atunci când se detectează pentru prima oară apăsarea unui buton. Dacă la apariţia următoarei întreruperi butonul este tot apăsat (variabilă “pushed” fiind setată) se ia în considerare apăsarea butonului şi se resetează variabila.

- Fanionul care indică depăşirea Timer-ului 0 (T0IF) trebuie resetat prin software.

- Variabila Contor este incrementata iar în funcţie de valoarea ei se vor executa anumite instrucţiuni la intervale egale cu multipli ai bazei de timp.

- Este apelată rutina ReadBackEMF care citeşte şi memorează valoarea tensiunii electromotoare autoinduse.

50

Page 51: Controlul Turatiei Mot CC Folosind PIC

Figura 3.30 Diagrama buclei principale de program

51

Page 52: Controlul Turatiei Mot CC Folosind PIC

- După măsurarea tensiunii autoinduse, în cazul în care funcţia 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 funcţia primeşte ca parametru viteza de rotaţie calculată ca media ultimelor 4 valori înregistrate pentru tensiunea electromotoare autoindusă.

- La fiecare interval mai mare de 64 de ori decât baza de timp se calculează viteza de rotaţie folosind media ultimelor 64 de valori ale tensiunii electromotoare autoinduse măsurate. Această viteză de rotaţie obţinută este afişată pe ecranul LCD folosind funcţia DisplayRPM iar variabila Contor este resetată. După afişarea turaţiei bucla principală de program se reia.

3.2.4.3 Descrierea subrutinelor principale

• ReadBackEMF

Această subrutina efectuează conversia analog digitală a tensiunii electromotoare autoinduse şi reţine ultimele 64 de rezultate ale conversiei. Media acestor valori va da o estimare mai bună a vitezei de rotaţie reducând zgomotul. În Figura 3.3 se observă tensiunea autoindusă pentru un factor de umplere de 68.62%.

După întreruperea alimentării, atunci când 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 depăşeşte valoarea de 400μs.

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 – biţii 2-0).

Astfel, pentru măsurarea tensiunii autoinduse, se întrerupe alimentarea motorului, se dezactivează modulul PWM pentru 400μs 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 obţinute 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, trecând 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

Page 53: Controlul Turatiei Mot CC Folosind PIC

vector suma poate fi recalculată prin simpla adunare a noii valori citite şi scăderea celei mai vechi valori din vector.

Media ultimelor 4 valori citite va fi folosită pentru a aplica o corecţie rapidă, semnificativă a turaţiei atunci când eroarea are valori mari. Media pe 64 de valori este folosită pentru corecţia fină atunci când eroarea scade şi se încearcă stabilizarea turaţiei în apropierea celei impuse.

Chiar şi după luarea tuturor acestor măsuri de reducere a zgomotului, turaţia nu ajunge întotdeauna exact la viteza de rotaţie impusă ci doar în vecinătatea acesteia. Pentru o performanţă mai bună trebuie folosită altă metodă de măsurare a turaţiei reale (feedback): senzor optic sau senzor cu efect Hall.

• adjustRPM

Aceasta subrutină realizează corecţiile necesare asupra factorului de umplere al semnalului PWM pentru menţinerea unei viteze de rotaţie constante în condiţiile unei sarcini variabile. Argumentele importante cu care se apelează aceste funcţii sunt:

- cRPM – viteza curentă de rotaţie exprimată în rotaţii pe minut- threshold – marja de eroare. Dacă diferenţa dintre viteza impusă (setRPM) şi cRPM este

mai mare în modul decât acest argument atunci va avea loc o corecţie- gain – valoarea cu care se va modifica factorul de umplere (variabilă DutyCycle) în cazul

aplicării unei corecţii.În cazul în care se aplică o corecţie, se aprinde LED-ul D0 (corecţie negativă, scăderea

factorului de umplere) sau LED-ul D1 (corecţie pozitivă, creşterea factorului de umplere).Apelarea acestei subrutine se face la fiecare depăşire a timer-ului 0 (32 ms) pentru corecţii

rapide şi semnificative (erori mari) sau la fiecare 16 depăşiri (0.5s) pentru corecţii mai puţin semnificative bazate pe eroarea calculată pe baza mediei tuturor celor 64 de valori ale tensiunii autoinduse memorate.

Figura 3.32 Diagrama rutinei adjustRPM

53

Page 54: Controlul Turatiei Mot CC Folosind PIC

• SetMotorSpeed

Întâi se citeşte tensiunea de la potenţiometrul P2 realizând 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 rotaţie impusă (setRPM, dată în acest caz de potenţiometrul P2) este calculată în funcţie de rezultatul conversiei. Am observat experimental că viteza de rotaţie nu este perfect liniară şi poate fi aproximată mai bine printr-o funcţie pătratică de forma

Unde x este rezultatul conversiei analog/digitale.

Dacă funcţia de Reglaj Automat este activă, atunci cei mai semnificativi 8 biţi ai conversiei sunt copiaţi în variabilă DutyCycle.

În final cei mai semnificativi 6 biţi ai factorului de umplere (variabilă DutyCycle) sunt copiaţi în registrul CCP2CON (biţii 5-0) iar cei mai puţin semnificativi 2 biţi sunt copiaţi în registrul CCP2CON (bitii 5-4).

• DisplayRPM

Această procedură este apelată o dată la fiecare 500 ms şi afişează viteza de rotaţie curentă pe ecranul LCD. În cazul în care switch-ul 3 este ţinut apăsat, pe ecran va fi afişată valoarea variabilei setRPM (viteza impusă).

Tot aici, viteza curentă de rotaţie, viteza impusă şi valoarea factorului de umplere sunt transmise către PC prin intermediul subrutinei “transmit”.

Afişarea pe ecranul LCD se realizează cu o serie de funcţii definite într-un alt fişier C. Aceste funcţii permit afişarea cifrelor cu 7 segmente pe cele trei poziţii ale LCD-ului, precum şi afişarea punctului zecimal pe una din cele 3 poziţii 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 său ASCII (un octet).

Transmisiunea poate fi începută prin scrierea unui octet în registrul TXREG. Fanionul de întrerupere TXIF este resetat hardware atunci când transmisiunea este finalizată.

• Transmit

Această procedură primeşte ca argument un şir constant de trei caractere ce reprezintă codul mesajului ce trebuie transmis către PC. Acest şir de caractere este comparat cu întreaga listă de comenzi definite în protocolul de comunicaţie şi efectuează transmisiunea unui pachet de 5 octeţi care conţine un cod de comandă şi informaţia ataşată. Descrierea comenzilor posibile este făcută la începutul acestui capitol.

• checkCMD

Funcţia checkCMD primeşte ca argument un şir constant de 3 caractere pe care îl compară cu primele 3 caractere din vectorul de recepţie rcvBuffer. În cazul unei potriviri funcţia returnează valoarea 1 şi 0 în caz contrar.

54

Page 55: Controlul Turatiei Mot CC Folosind PIC

• Uart_int

Această este rutină de întrerupere folosită în program pentru a recepţiona datele primite prin portul serial. Datele primite sunt împărţite în pachete de 5 octeţi ş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 răspuns la întreruperi. În acest program am folosit o singură întrerupere pentru recepţia 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 funcţiilor pentru afişajul LCD

După cum se poate observa în ANEXA 5, circuitul de comandă pentru afişaje LCD al microcontrolerului PIC16F917 permite comandarea LCD-urilor cu până la 96 de segmente folosind 24 de de pini de segment şi până la 4 căi comune. Starea (aprins/stins) fiecărui segment de pe LCD poate fi modificată folosint biţii 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 căi comune însă biţii de stare ai segmentelor sunt răspândiţi în toate cele 12 registre LCDDATA. Schema ecranului LCD VIM-332 este prezentata in ANEXA 6.

Pentru a uşura modalitatea de afişare a informaţiilor pe LCD am implementat o serie de funcţii care primesc ca parametru un şir de octeţi (cifre hexazecimale) şi afişează cifrele respective pe LCD modificând automat registrele LCDDATA.

Pentru fiecare dintre cele 3 poziţii de pe LCD în care se pot afişa cifre am identificat cele 7 segmente în ordine conform Figurii 3.5.

Figura 3.33 LCD cu 7 segmente.

Am plecat de la ideea declarării câte unui vector cu 7 valori (corespunzătoare celor 7 segmente ale unei cifre) în care să reţin adresele biţilor din registrele LCDDATA care controlează segmentele fiecărei cifre în ordinea ABCDEFG.

Deoarece compilatorul HI-TECH C nu permite adresarea indirectă a variabilelor de tip bit, am folosit câte o pereche de vectori pentru fiecare poziţie:

- Vectorii “pos” reţin adresele registrelor LCDDATA în care se afla bitii corespunzători segmentelor.

- Vectorii “mask” reţin poziţiile biţilor respectivi în interiorul registrelor LCDDATAAstfel se poate face o adresare indirectă a registrelor LCDDATA, iar din valoarea adresată

se citeşte bitul cu numărul corespunzător din vectorul “mask”.După memorarea adreselor fiecărui segment pentru fiecare dintre cele 3 poziţii, trebuie

făcută o legătură între cifrele care vor fi afişate şi segmentele care le compun.Astfel cifra “2” este compusă din segmentele ABDEG. Dacă reprezentăm 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 biţi se mai adăugă bitul cel mai puţin semnificativ cu valoarea 0. Vectorul “digits” conţine codurile corespunzătoare cifrelor hexazecimale, conform Tabelului 3.1:

55

Page 56: Controlul Turatiei Mot CC Folosind PIC

Cifra Hex. A B C D E F G Rezultat↑0

0 1 1 1 1 1 1 0 111111001 1 1 0 0 0 0 0 011000002 1 1 0 1 1 0 1 110110103 1 1 1 1 0 0 1 111100104 0 1 1 0 0 1 1 011001105 1 0 1 1 0 1 1 101101106 1 0 1 1 1 1 1 101111107 1 1 1 0 0 0 0 111000008 1 1 1 1 1 1 1 111111109 1 1 1 1 0 1 1 11110110A 1 1 1 0 1 1 1 11101110b 0 0 1 1 1 1 1 00111110C 1 0 0 1 1 1 1 10011100d 0 1 1 1 1 0 1 01111010E 1 0 0 1 1 1 1 10011110F 1 0 0 0 1 1 1 10001110

Tabelul 3.8 Codificarea cifrelor hexazecimale

Atunci când se doreşte afişarea unei cifre algoritmul este următorul:- 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 corespunzător din vectorul mask, valoarea bitului corespunzător din codul cifrei.

Fişierul LCDLib.c conţine următoarele subrutine:- initLCD – iniţializează afişajul LCD prin activarea pinilor de segment (registrele LCDSE2-

0) şi resetarea biţilor 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 funcţie de valoarea argumentului “k”, această procedură afişează punctul zecimal pe una din cele trei poziţii posibile.

- DisplayDIGIT1 – primeşte ca argument un număr între 0 şi 15 şi afişează pe cifra hexazecimală corespunzătoare pe poziţia 1 a LCD-ului (prima de la dreapta la stânga).

- DisplayDIGIT2 – primeşte ca argument un număr între 0 şi 15 şi afişează pe cifra hexazecimală corespunzătoare pe poziţia 2 a LCD-ului (a doua de la dreapta la stânga).

- DisplayDIGIT3 – primeşte ca argument un număr între 0 şi 15 şi afişează pe cifra hexazecimală corespunzătoare pe poziţia 3 a LCD-ului (a treia de la dreapta la stânga).

- DisplaySymbol – se ocupă de afişarea celorlalte simboluri ce pot fi afişate pe LCD. Aceste simboluri sunt definite în ANEXA 5. Subrutina primeşte 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 reprezentând starea dorită a simbolului (0 – stins, 1 – aprins).

56

Page 57: Controlul Turatiei Mot CC Folosind PIC

3.3 Proiectarea software pentru PC

3.3.1 Introducere

Aplicaţia software pentru microcontroler îndeplineşte cerinţele proiectului, permiţând controlul turaţiei motorului de curent continuu cu posibilitatea de a menţine viteză constantă atunci când motorul se află sub sarcină.

Cu toate acestea, posibilităţile plăcii de dezvoltare de a afişa rezultatele sunt limitate: ecranul LCD poate afişa doar 3 caractere cu 7 segmente fiecare.

Am considerat necesară implementarea unei aplicaţii software pentru PC care să poată controla turaţia motorului, oferind în plus posibilitatea afişării în timp real a datelor primite de la microcontroler pe un grafic în funcţie de timp.

Aplicaţia a fost realizată în Visual Studio 2010 folosind limbajul Visual Basic.NET 2010. Interfaţa grafică a aplicaţiei PC este intuitivă şi permite observarea variaţiei în timp a turaţiei motorului.

3.3.2 Prezentarea interfeţei grafice

Funcţionalitatea elementelor de interfaţă.

Grupul Informaţii Conexiune:

- Port serial – Lista tuturor porturilor disponibile pe PC-ul pe care rulează aplicaţia. În mod implicit la pornirea programului primul port din lista este selectat automat.

- Conectare – După selectarea portului serial corespunzător 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 selecţie a porturilor, iar butonul Deconectare devine activ.

- Deconectare – Închide portul de comunicaţie. După apăsare butonul este dezactivat, iar lista de selecţie 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, număr de biţi de stop, număr de biţi de date).

Grupul Date Recepţionate:

- Viteza curentă – turaţia motorului de curent continuu primită de la microcontroler la intervale de 500 ms.

- Viteza impusă – turaţia care trebuie menţinută atunci când funcţia de Reglaj Automat este activată. Atunci când Controlul Soft este activ această valoare este aceea introdusă în căsuţa text Viteză din grupul Comenzi Microcontroler. Dacă turaţia este controlată de placă de dezvoltare (Control Soft dezactivat) atunci Viteza impusă este indicată de potenţiometrul P2.

57

Page 58: Controlul Turatiei Mot CC Folosind PIC

- Factor de umplere PWM – Atunci când Reglajul Automat este activ, microcontrolerul modifica factorul de umplere pentru a menţine turaţia constantă atunci când motroul este sub sarcină. Dacă Reglajul Automat este inactiv atunci Factorul de umplere este constant. Aceeaşi valoare este indicată şi în graficul PWM din partea dreaptă colorat cu un gradient de la albastru la roşu, albastru corespunzând valorii 0 şi roşu valorii 100.

Grupul Comenzi Microcontoler:

- PWM – căsuţa text în care se pot introduce numere între 0 şi 100 reprezentând factorul de umplere dorit. Prin apăsarea tastei Enter atunci când căsuţa text este selectată, sau prin apăsarea butonului Trimite, nouă valoare a factorului de umplere este trimisă către microcontroler. Această comandă va activa Controlul Soft şi va dezactiva funcţia de Reglaj Automat.

- Viteza – se introduce o valoare între 0 şi 2000 de rotaţii pe minut, reprezentând viteza impusă. Această valoare este trimisă către microcontroler după apăsarea tastei Enter sau apăsarea butonului Trimite corespunzător. Această comandă va activa Controlul Soft şi funcţia de Reglaj Automat.

- Reglaj Automat – la apăsarea acestui buton starea funcţiei 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 funcţiei Control Soft. Culoarea Verde indică faptul că turaţia este controlată de aplicaţia PC iar culoarea Rosie arata că pentru controlul turaţiei este folosit potenţiometrul P2 de pe placa de dezvoltare.

- Indicatorul Reglaj Automat – culoarea Verde semnifică activarea Reglajului Automat (microcontrolerul modifică automat semnalul PWM pentru a menţine turaţia constantă) iar culoarea Rosie indică faptul că funcţia de Reglaj Automat este inactivă.

- Lupa – modifică domeniul de valori care este afişat pe axa verticală a graficului. Dacă această funcţie este bifată, graficul va afişa un domeniu de 300 RPM centrat pe valoarea curentă a vitezei de rotaţie. Dacă funcţia Lupa este debifată, atunci domeniul de valori de pe axa verticală va fi întotdeauna 0-2000 RPM.

- Netezire – permite modificarea modalităţii de afişarea a graficului. Dacă această funcţie este dezactivată, punctele de pe grafic (recepţionate la intervale de 500ms) vor fi interconectate prin linii drepte. Dacă funcţia netezire este activă atunci punctele intermediare valorilor eşantionate sunt aproximate cu funcţii “spline”, graficul având un aspect mai bun.

Graficul în funcţie de timp

Acest grafic este poziţionat în partea de jos a interfeţei şi se redimensionează automat odată cu fereastra principală de program.

Pe grafic sunt afişate ultimele 46 de valori ale vitezei de rotaţie totalizând 23 de secunde.Axa orizontală este împărţită în intervale de 1 secundă cu etichete de marcare la fiecare 5

secunde.Domeniul afişat pe axa verticală se modifică în funcţie de starea opţiunii Lupa. Când

Lupa este dezactivată, sunt afişate valori între 0 şi 2000 RPM cu linii de marcaj la interval de 200

58

Page 59: Controlul Turatiei Mot CC Folosind PIC

RPM. Dacă funcţia Lupa este activa se afişează un domeniu de 300 RPM în jurul valorii curente a vitezei de rotaţie. În acest caz, liniile de marcaj sunt afişate la intervale de 50 RPM.

Atunci când funcţia Reglaj Automat este activă, în partea dreaptă a axei verticale este indicată valoarea vitezei de rotaţie impuse.

Realizarea unui Dublu-Click pe suprafaţa graficului activează/dezactivează funcţia Lupa.

Figura 3.34 Fereastra principală de program

Reprezentarea grafică a factorului de umplere

În partea dreaptă sus a interfeţei 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%) către Roşu (factor de umplere 100%).

Acest grafic are funcţie dublă:

- Afişează valoarea curentă a factorului de umplere trimis de microcontroler.- Dacă se efectuează un click în interiorul dreptughiului marcat, în funcţie de înălţimea

cursorului faţă de marginea de jos a graficului este calculată o valoare între 0 şi 100 care este apoi trecută în căsuţa text PWM din grupul Comenzi Microcontroler şi apoi această comandă este trimisă prin portul serial.

Prezentarea bării de meniu:

- Fişier

59

Page 60: Controlul Turatiei Mot CC Folosind PIC

o Conectareo Deconectareo Ieşire

- Opţiunio Lupăo Reglaj Automato Netezire

- Ajutoro Despre

Opţiunea Despre din meniul Ajutor va afişa informaţii despre tema proiectului, autor şi coordonator.

Figura 3.35 Fereastra informaţii

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

acţiune pe care programul o întreprinde este declanşată de un eveniment cum ar fi: apăsarea unui buton, mişcarea cursorului, Click, Dublu-Click.

Blocuri importante de program:

• frmMain_LoadSe execută la rularea programului. Aici se pot face iniţializări precum încărcarea listei de

porturi disponibile şi starea iniţială a diferitelor elemente de interfaţă (butonul Deconectare dezactivat, lista de porturi activă, …)

• btnSendPWM_ClickSe execută la apăsarea pe butonul Trimite din dreptul căsuţei text PWM din grupul Comenzi

Microcontroler. Verifică dacă valoarea introdusă în căsuţa text este între 0 şi 100 iar în caz contrar afişează un mesaj de avertizare. Dacă valoarea se încadrează în domeniul stabilit atunci se trimite către microcontroler comanda “PWMM” urmată de nouă valoare a factorului de umpere.

• btnSendRPM_ClickSe execută la efectuarea unui click pe butonul Trimite din dreptul căsuţei text Viteza. Se

verifică dacă valoarea se încadrează în intervalul 0-1950 şi în caz afirmativ se trimite către microcontroler comanda “RPM” urmată nouă valoare a turaţiei impuse.

60

Page 61: Controlul Turatiei Mot CC Folosind PIC

• SerialPort1_DataReceivedEste echivalentul unei întreruperi pentru microcontroler. Este executată atunci când prin

portul serial s-au primit cel puţin 5 octeţi de informaţie. Din această procedură se apelează rutina ReceivedText.

• ReceivedTextAceasta este rutina de răspuns la întreruperea generată la primirea unui pachet prin portul

serial. Se compară primii 3 octeţi 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 forţează redesenarea graficului în funcţie de timp.

• pbGraph_DoubleClickSe execută la efectuarea unui dublu-click în aria graficului. Are ca efect complementarea

stării funcţiei Lupă.

• pbGraph_PaintAceasta este rutina în care am implementat afişarea graficului. Am definit zona de tip

dreptunghi (Area) în care se realizează desenul.Întâi se desenează axele de coordonate, apoi valorile vitezei de rotaţie stocate în vectorul

rpmValues sunt desenate şi unite prin linii. Vectorul rpmValues este actualizat la primirea fiecărei 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 funcţii şi proprietăţi ale clasei Graphics din cadrul domeniului System.Drawing al Framework-ului .NET.

• pbPWM_PaintAsemănător cu pbGraph_Paint această procedură este folosită pentru redesenarea

reprezentării grafice a factorului de umplere al semnalului PWM. Acest grafic este poziţionat î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_ClickSe execută la apăsarea pe butonul Reglaj Automat şi modifică starea acestei funcţii trimiţând

apoi nouă valoare către microcontroler.

• btnConnect_ClickEste apelata la apăsarea pe butonul Conectare şi are ca efect deschiderea portului serial de

comunicare şi stabilirea parametrilor de comunicare (rata de bit, paritate, biţi de stop, biţi de start). În cazul în care portul care se încearcă a fi deschis este folosit de o altă aplicaţie windows, programul afişează un mesaj de avertizare.

• btnDisconnect_ClickAceastă procedură se execută la apăsarea butonului Deconectare şi are ca efect închiderea

portului de comunicaţie serială şi readucerea variabilelor de program şi a interfeţei grafice la starea iniţială de dinainte de conectare.

61

Page 62: Controlul Turatiei Mot CC Folosind PIC

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 priveşte determinarea vitezei de rotaţie. Însă această metodă nu implică un cost ridicat şi poate fi folosită şi în anumite situaţii în care montarea unui senzor optic sau cu efect Hall nu este posibilă din cauza lipsei spaţiului necesar.

Pentru a putea implementa sistemul automat de reglare a turaţiei motorului de curent continuu folosind măsurarea tensiunii electromotoare autoinduse trebuie observată dependenta acestei tensiunii de viteza reală de rotaţie.

Pentru efectuarea măsurătorilor am folosit osciloscopul digital Tektronix TPS2014.

Figura 4.36 Osciloscop digital Tektronix TPS2014

4.2 Măsurarea vitezei reale de rotaţie

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 ataşată o roată cu două fante, senzorul optic va genera câte două impulsuri la fiecare rotaţie completă.

Pentru frecventa PWM aleasa f = 31.25 kHz şi frecvenţa de sistem fOSC = 8MHz, valoarea registrului perioadă PR2 este calculată astfel:

Pentru această perioadă se poate calcula rezoluţia semnalului PWM:

Aşadar se pot defini 256 de valori distincte ale lăţimii impulsului. Pentru determinarea dependenţei lăţime impuls – viteză de rotaţie am variat lăţimea impulsului în domeniul 15 – 255 cu increment 16 (folosind MPLAB IDE şi compilator C) şi am măsurat cu osciloscopul frecventa impulsurilor date de senzorul optic. Împărţind această frecvenţă la 2 şi apoi înmulţind cu 60 se poate determina viteza reală de rotaţie.

62

Page 63: Controlul Turatiei Mot CC Folosind PIC

Figura 4.37 Răspunsul senzorului optic pentru un factor de umplere de 62.35%

Figura 4.38 Răspunsul senzorului optic pentru un factor de umplere de 87.45%

Lăţime impuls

FrecvenţaViteza de

rotaţieLăţime impuls

FrecvenţaViteza de

rotaţie15 0 0 143 29.67 890.131 0 0 159 33.83 1014.947 0 0 175 39.11 1173.363 0 0 191 44.99 1349.779 10.06 301.8 207 50.47 1514.195 15.42 462.6 223 55.27 1658.1

111 20.12 603.6 239 60.15 1804.5127 24.99 749.7 255 65.42 1962.6

Tabelul 4.9 Dependenţa vitezei de rotaţie de lăţimea impulsului PWM

Atunci când se activează reglajul automat iar controlul soft este dezactivat, tensiunea de la potenţiometrul P2 este cea care controlează turaţia. Cei mai semnificativi 8 biţi ai rezultatului conversiei tensiunii de la potenţiometrul P2 formează un număr care ia valori între 0 şi 255. Acest număr trebuie convertit într-o turaţie impusă cu valori între 0 şi 2000. Pentru a putea realiza acest lucru trebuie calculată ecuaţia dreptei de regresie pentru graficul de mai jos.

Calculul ecuaţiei dreptei de regresie pentru lăţimea impulului între 79 şi 255. Dreapta de regresie are forma: unde:

63

Page 64: Controlul Turatiei Mot CC Folosind PIC

Figura 4.39 Dependenţa vitezei de rotaţie de lăţimea impulsului PWM

x y x*y x2

79 301.8 23842.2 624195 462.6 43947 9025

111 603.6 66999.6 12321127 749.7 95211.9 16129143 890.1 127284.3 20449159 1014.9 161369.1 25281175 1173.3 205327.5 30625191 1349.7 257792.7 36481207 1514.1 313418.7 42849223 1658.1 369756.3 49729239 1804.5 431275.5 57121255 1962.6 500463 65025

Σ(x) Σ(y) Σ(x*y) Σ(x2)2004 13485.6 2596687.8 371276

Tabelul 4.10 Termeni necesari pentru determinarea dreptei de regresie

(Σ(x))2 = 4016016n=12

Ecuaţia dreptei de regresie este:

64

Page 65: Controlul Turatiei Mot CC Folosind PIC

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%

Lăţime impuls(0-255)

Durata impuls [μs]Factor de umplere

(Lăţime impuls/255)

Factor de umpleremăsurat

TensiuneMăsurată [mV]

0 0 0 0 015 1878 0.05882353 0.0588162 29631 3874 0.12156863 0.1213279 60647 5880 0.18431373 0.1841528 91663 7878 0.24705882 0.2467272 123079 9861 0.30980392 0.3088318 154095 11860 0.37254902 0.3714375 1840

111 13860 0.43529412 0.4340745 2170127 15850 0.49803922 0.4963984 2580143 17840 0.56078431 0.5587222 2990159 19840 0.62352941 0.6213592 3290175 21850 0.68627451 0.6843094 3600191 23840 0.74901961 0.7466333 3910207 25840 0.81176471 0.8092703 4220223 27820 0.8745098 0.8712809 4530239 29820 0.9372549 0.9339179 4840255 31800 1 0.9959286 5150

Tabelul 4.11 Variaţia tensiunii în funcţie de factorul de umplere al semnalului PWM.

65

Page 66: Controlul Turatiei Mot CC Folosind PIC

.

Figura 4.42 Variaţia tensiunii în funcţie de lăţimea impulsului PWM

4.4 Legătura dintre viteza de rotaţie şi tensiunea electromotoare autoindusă

Pentru măsurarea tensiunii electromotoare autoinduse am conectat osciloscopul la pinul Back EMF al plăcii de dezvoltare. Apoi am variat lăţimea impulsului PWM folosind aceleaşi valori din intervalul 15-255 cu increment 16.

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

66

Page 67: Controlul Turatiei Mot CC Folosind PIC

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

Lăţime impuls(0-255)

Tensiune autoindusaMăsurată [mV]

Rezultatul conversieitensiunii autoinduse

Viteza de rotaţiemăsurată [rpm]

0 0 0 015 0 0 031 0 0 047 0 0 063 0 0 079 720 35 301.895 1040 51 462.6

111 1440 70 603.6127 1760 86 749.7143 2160 106 890.1159 2480 122 1014.9175 2640 129 1173.3191 3120 153 1349.7207 3520 173 1514.1223 3680 181 1658.1239 4080 200 1804.5255 4480 220 1962.6Tabelul 4.12 Viteza de rotaţie în funcţie de t.e.m autoindusă

67

Page 68: Controlul Turatiei Mot CC Folosind PIC

Figura 4.45 Viteza de rotaţie în funcţie de valoarea registrului ADRESH.

Calculul ecuatiei dreptei de regresie:

x – valoarea registrului ADRESH – cei mai semnificativi 8 biţi ai rezultatului conversiei tensiunii electromotoare autoinduse

y – viteza de rotaţie

x y x*y x2

0 0 23842.2 624135 301.8 43947 902551 462.6 66999.6 1232170 603.6 95211.9 1612986 749.7 127284.3 20449

106 890.1 161369.1 25281122 1014.9 205327.5 30625129 1173.3 257792.7 36481153 1349.7 313418.7 42849173 1514.1 369756.3 49729181 1658.1 431275.5 57121200 1804.5 500463 65025220 1962.6

Σ(x) Σ(y) Σ(x*y) Σ(x2)1526 13485 2071637.4 233382

Tabelul 4.5 Date necesare pentru determinarea dreptei de regresie

(Σ(x))2 = 2328676

68

Page 69: Controlul Turatiei Mot CC Folosind PIC

Ecuaţia dreptei de regresie este:

Folosind această ecuaţie putem calcula eroarea vitezei de rotaţie pentru diferite valori ale tensiunii autoinduse.

x y y calculat eroare0 0 -20.08 20.08

35 301.8 295.19 6.6051 462.6 439.32 23.2770 603.6 610.47 6.8786 749.7 754.59 4.89

106 890.1 934.75 44.65122 1014.9 1078.88 63.98129 1173.3 1141.93 31.36153 1349.7 1358.12 8.42173 1514.1 1538.28 24.18181 1658.1 1610.34 47.75200 1804.5 1781.49 23.00220 1962.6 1961.65 9.43Tabelul 4.6 Eroarea vitezei de rotaţie

69

Page 70: Controlul Turatiei Mot CC Folosind PIC

70

Page 71: Controlul Turatiei Mot CC Folosind PIC

Capitolul 5. Concluzii

Motoarele de curent continuu permit controlul turaţiei, cuplului şi chiar al direcţiei de rotaţie. Datorită acestor capabilităţi, motoarele de curent continuu sunt folosite într-o gamă largă de aplicaţii pornind de la jucării, ventilatoare, aparatură electrocasnică (mixer, maşină de spălat) până la sisteme de control automat al direcţiei pentru autovehicule, unelte electrice, roboţi mobili, etc.

Obiectivul acestui proiect a fost realizarea unui sistem de control al turaţiei motoarelor de curent continuu folosind microcontroler PIC şi măsurarea 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 având o turaţie maximă de 2000 rpm. Pentru a implementa sistemul de reglaj al turaţiei în buclă închisă am folosit ca metoda de feedback măsurarea tensiunii electromotoare autoinduse.

În partea iniţială a proiectului am utilizat osciloscopul pentru a determina cu precizie parametrii motorului de curent continuu (caracteristica viteza de rotaţie – tensiune electromotoare autoindusă, domeniul de variaţie ş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ă proporţională de control al turaţiei motorului de curent continuu.

Deoarece tensiunea electromotoare autoindusă prezintă un zgomot sesizabil am implementat o metodă filtrare a acestuia bazată pe mediere.

Afişarea turaţiei în timp real este realizată cu ajutorul ecranului LCD al plăcii de dezvoltare. Pentru a putea afişa cu uşurinţă viteza pe ecran, am implementat o librărie de funcţii speciale ce permit afişarea de caractere hexazecimale pe cele 3 poziţii cu 7 segmente, precum şi afişarea tuturor celorlalte simboluri speciale disponibile pe LCD.

Pe lângă programul pentru microcontroler am implementat şi o aplicaţie pentru PC prin care se pot trimite comenzi către microcontroler pentru a comanda turaţia motorului. Prin intermediul unei interfeţe grafice intuitive, aplicaţia PC permite, pe lângă posibilitatea de control al turaţiei motorului şi afişarea graficului vitezei de rotaţie în funcţie de timp.

Obiectivul proiectului este îndeplinit, sistemul de reglaj implementat permiţând menţinerea unei viteze de rotaţie impuse (între anumite limite), în condiţiile unei sarcinii variabile.

O problemă a acestui sistem este zgomotul ce apare la citirea tensiunii electromotoare autoinduse. Acest zgomot poate avea drept cauză vibraţia motorului sau uzura lagărelor de fixare a axului motorului.

71

Page 72: Controlul Turatiei Mot CC Folosind PIC

72

Page 73: Controlul Turatiei Mot CC Folosind PIC

Bibliografie

[1] Microchip, PICDEM™ Mechatronics Demonstration Board User’s 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 , accesat la data: 05.07.2011

[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, accesat la data: 03.06.2011

[7] Wikipedia, Counter-electromotive force, URL: http://en.wikipedia.org/wiki/Counter-electromotive_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

Page 74: Controlul Turatiei Mot CC Folosind PIC

74

Page 75: Controlul Turatiei Mot CC Folosind PIC

Capitolul 6. ANEXA 1 – Schema plăcii de dezvoltare PICDEM Mechatronics.

75

Page 76: Controlul Turatiei Mot CC Folosind PIC

ANEXA 2 – Structura internă a microcontrolerului PIC16F917

76

Page 77: Controlul Turatiei Mot CC Folosind PIC

ANEXA 3 – Funcţiile pinilor pentru microcontrolerul PIC16F917.

77

Page 78: Controlul Turatiei Mot CC Folosind PIC

ANEXA 4 – Schema electrică simplificată a proiectului.

78

Page 79: Controlul Turatiei Mot CC Folosind PIC

ANEXA 5 – Descrierea modulului de comandă pentru ecranul LCD

ANEXA 6 - Schema ecranului LCD VIM-332

79

Page 80: Controlul Turatiei Mot CC Folosind PIC

ANEXA 7 – Codul sursă al aplicaţiei 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 PROCEDURIvoid 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 INTRERUPERIvoid interrupt uart_int(void);

//VARIABILE GLOBALEunsigned 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 PORTURITRISA0=TRISA1=TRISD1=TRISA4=TRISD4=1;TRISD2=TRISD7=TRISD6=TRISD5=TRISA5=TRISA3=0;TRISC7=TRISC6=1;ANSEL=0b00000011;

//INITIALIZARE USARTSPBRG=51;RCSTA=0b10010000;TXSTA=0b00100100;

//INITIALIZARE ADCADCON1=0b01010000;ADCON0=0b00000101;

80

Page 81: Controlul Turatiei Mot CC Folosind PIC

//INITIALIZARE MODUL PWMPR2=0x3F;CCPR2L=0;CCP2CON=0b00001100;TMR2ON=1;

OPTION_REG=0b10000111;CMCON0=0x07; //DEZACTIVAREA COMPARATOARELOR

//INITIALIZAREA VARIABILELOR GLOBALELOOP=1;REMOTE=0;init=0;

//ACTIVAREA INTRERUPERILORRCIE=1;PEIE=1;ei();

//INITIALIZARE LCDinitLCD();DisplaySymbol("K",1);

//ALIMENTAREA MOTORULUIP1=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 CCPP1=0;CCP2CON=CCP2CON & 0xF0;N2=1;__delay_us(400);

//CONVERSIA TENSIUNII AUTOINDUSEinstantEMF=0;

81

Page 82: Controlul Turatiei Mot CC Folosind PIC

ADCON0=0b00000101;for(j=0;j<4;j++){GO=1;while(nDONE);instantEMF+=ADRESH;__delay_us(40);}instantEMF/=4;

//RECALCULAREA SUMELORPointer=Pointer & 0x3F;//SUMA CELOR MAI RECENTE 4 VALORImicroEMFSum+=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 CCPCCP2CON=CCP2CON | 0x0F;P1=1;

}

void adjustRPM(unsigned short cRPM,unsigned char threshold, unsigned char gain, unsigned char major){

deltaRPM=setRPM-cRPM; //EROAREAif(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 P2ADCON0=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 UMPLERECCP2CON=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

Page 83: Controlul Turatiei Mot CC Folosind PIC

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

Page 84: Controlul Turatiei Mot CC Folosind PIC

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

Page 85: Controlul Turatiei Mot CC Folosind PIC

}

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')) S1C1=enable;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;

}}

“LCDLib.h”

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

85

Page 86: Controlul Turatiei Mot CC Folosind PIC

ANEXA 8 – Codul sursă al aplicaţiei PC

“frmMain.vb”

Imports SystemImports System.ComponentModelImports System.ThreadingImports System.IO.PortsImports System.TextImports 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

Page 87: Controlul Turatiei Mot CC Folosind PIC

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

Page 88: Controlul Turatiei Mot CC Folosind PIC

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

Page 89: Controlul Turatiei Mot CC Folosind PIC

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

Page 90: Controlul Turatiei Mot CC Folosind PIC

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

Page 91: Controlul Turatiei Mot CC Folosind PIC

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

Page 92: Controlul Turatiei Mot CC Folosind PIC

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 SubEnd Class

92