Implementarea Unui Sistem de Autoreglare Pentru Mentinerea Echilibrului Sistemelor pe Doua Roti

LUCRARE DE DISERTAȚIE

Implementarea unui sistem de autoreglare pentru menținerea echilibrului sistemelor pe două roți

REZUMATUL PROIECTULUI

În această lucrare am realizat un robot ce este capabil să își mențină echilibrul chiar și atunci când asupra sa este acționată o forță. Este o implementare a problemei pendulului invers ce folosește ca soluție un sistem de autoreglare (PID) pentru menținerea stării de echilibru.

Robotul are un ax motorizat la capetele căruia se vor afla două roti, astfel încât ansamblul să se poată deplasa în față și în spate. Roțile, fiind acționate de motoare electrice, vor fi cele care vor corecta eventualele înclinații ale robotului, prin imprimarea de accelerație în sensul înclinării.

Pentru datele de intrare am folosit un giroscop și un accelerometru. Desi se poate realiza doar cu unul dintre acestea, precizia sistemului va fi mult îmbunătățită dacă se vor folosi cei doi senzori împreună. Fiecare dintre cei doi senzori au minusurile lor.

Problema giroscopului este că nu are setat un punct de referință absolut, iar la fiecare citire se adauga o eroare, care într-un final va genera o raportare mult deviată de la poziția efectiva a sistemului, acest lucru blocând intervenția motoarelor electrice pentru corectarea stării de echilibrului a robotului.

Problema accelerometrului este incapacitatea sa de a distinge accelerația gravitațională față de accelerația ce îi este imprimată din alte surse (deplasare sau vibrații).

Microcontroller-ul sistemului va fi un PIC16f887 ce va avea sarcina de a citi intrările de la cei doi senzori, și în urma implementării legilor de autoreglare, să controleze motoarele electrice pentru a menține echilibrul sistemului.

Termenii cheie: pendulul invers, lege de autoreglare, PID, PIC.

PROLOG

Lucrarea își dorește să proiecteze și să dezvolte un robot pe două roți, capabil să își mențină echilibrul folosind un microcontroler PIC. Acest proiect îmbină cunoștințe de mecanică, electronică și programare. Obiectivul acesteia este să investigheze și să analizeze caracteristicile senzorilor ce determină informația de intrare pentru a controla robotul. Acesta foloseste un microcontroler PIC ca și sistem de control al tuturor activităților desfășurate. Accelerometrul și giroscopul vor genera semnale către PIC iar apoi microcontrolerul va răspunde corespunzător acestor date. Răspunsul este de a merge înainte sau în spate, care este un semnal de ieșire către un circuit integrat ce va avea rolul de a controla motoarele sistemului. Când robotul va fi echilibrat, acesta își va păstra poziția pentru o perioadă de timp.

CUPRINSUL

1 INTRODUCERE

1.1 SCOPUL

1.2 MOTIVAȚIA

2 LITERATURA DE SPECIALITATE

2.1 INTRODUCERE

2.2 ROBOȚI CAPABILI DE ECHILIBRARE

2.3 SCOPUL ȘI BENEFICIILE ROBOȚILOR CU DOUĂ ROȚI CAPABILI DE ECHILIBRARE

3 PROIECTARE ȘI DEZVOLTARE

3.1 INTRODUCERE

3.2 STRUCTURA ROBOTULUI

3.2.1 Senzorii de inerție

3.2.1.1 Giroscopul

3.2.1.2 Accelerometrul

3.2.2 Microcontrolerul

3.2.3 Motorul electric

3.2.3.1 Puntea H

3.2.3.2 PWM

3.3 SISTEMUL DE CONTROL

3.4 SOFTWARE

3.5 ASAMBLAREA

4 CONCLUZII

5 BIBLIOGRAFIE

6 REFERINȚE WEB

A. CODUL SURSĂ

B. CD / DVD

INDEX

LISTA FIGURILOR

Figura 1 – Pendulul invers poziționat pe un căruț 4

Figura 2 – Giroscopul InvenSense MPU-6050 7

Figura 3 – Accelerometrul Freescale MMA7361 9

Figura 4 – Configurația pinilor accelerometrului 9

Figura 5 – Accelerometrul – diagrama bloc 9

Figura 6 – Accelerometrul – Accelerația dinamică 10

Figura 7 – Măsurarea unghiului de înclinare 11

Figura 8 – PIC16f887 pini 14

Figura 9 – PIC 16f887 diagrama bloc 15

Figura 10 – Asignarea pinilor 16

Figura 11 – cont. asignarea pinilor 17

Figura 12 – cont. asignarea pinilor 18

Figura 13 – Memoria CPU 19

Figura 14 – Conceptul memoriei ROM 20

Figura 15 – Registre 21

Figura 16 – Zone de memorie 23

Figura 17 – Zona 0 SRF 24

Figura 18 – Zona 1 SRF 25

Figura 19 – Zona 2 SRF 26

Figura 20 – Zona 3 SRF 26

Figura 21 – Întreruperile de sistem 27

Figura 22 – Motorul CC FA-130 29

Figura 23 – Puntea H 30

Figura 24 – Circuitul integrat L298n 31

Figura 25 – Schema de conectare a motoarelor cc la L298n 32

Figura 26 – Circuit simplificat pentru realizarea semnalului PWM 33

Figura 27 – Semnalul în raport cu cronometrul 33

Figura 28 – Structura unui SRA 38

Figura 29 – Schema simplificata 40

Figura 30 – Structura sistem SRA 41

Figura 31 – Aproximarea liniară a răspunsurilor liniare 42

Figura 32 – Accelerometrul 42

Figura 33 – Măsurarea înclinării 43

Figura 34 – Giroscopul citește pozitiv 43

Figura 35 – Giroscopul citește negativ 43

Figura 36 – Maparea senzorilor 45

Figura 37 – Maparea senzorilor; cea mai evidentă metodă 46

Figura 38 – Maparea senzorilor; o soluție rapidă dar ineficientă 46

Figura 39 – Maparea senzorilor; metoda unui singur senzor 47

Figura 40 – Maparea senzorilor; filtrul Kalman 48

Figura 41 – Maparea senzorilor; filtrul complementar 49

Figura 42 – Proiectare program 51

Figura 43 – Bucla de control 52

Figura 44 – Cutia de viteze dubla Tamiya 70168 53

Figura 45 – Roți Pololu 54

Figura 46 – Schema de conectare a componentelor electronice 55

Figura 47 – Robotul pe două roți 56

LISTA TABELELOR

Nu există tabele.

Introducere

Scopul

Scopul acestui proiect este de a realiza un robot ce este capabil să își mențină starea de echilibru, chair și atunci când asupra sa acționează o forță exterioară. Astfel, pentru realizarea acestui lucru se va avea în vedere construcția mecanică, electronică și software a sistemului.

Motivația

Am ales aceasta tema după ce am văzut un robot care era capabil să urmeze, în zbor, o traiectorie foarte precisă și să execute diferite manevre complexe. Am început să studiez mai mult problema, și printre primele lucruri pe care le-am întâlnit au fot sistemele de autoreglare care mi-au captat atenția și interesul încă de la început. Doresc să îmi aprofundez cunoștințele în aceste două domenii iar posibilitatea de a crea un robot pe două roți care să își mențină echilibrul mi se pare îmbinarea perfectă între cele două domenii, dar și între a învăța și a ma recrea.

Literatura de specialitate

Introducere

Această secțiune prezintă o perspectivă generală a literaturii de specialitate cu privire la tehnologia disponibilă pentru a construi un robot cu două roți capabil să se autoechilibreze. Ea pune de asemenea în lumină numeroase metode folosite de către cercetători pe această temă.

Roboți capabili de echilibrare

Conceptul de robot în echilibru se bazează pe modelul pendulului invers. Acest model a fost folosit de către cercetători pe scară largă în întreaga lume pentru a controla un sistem folosit nu numai în crearea unui robot pe roți dar și pentru alte tipuri de roboți cum ar fi roboții cu picioare. Cercetătorii de la Laboratorul Industrial de Electronică (Industrial Electronics Laboratory) au construit la Institutul Federal Elvețian pentru Tehnologie un prototip de robot cu două roți controlat de un procesor de semnal digital. Un controller liniar de stare ce folosește informații de la un giroscop și de la un encoder este implementat pentru a stabiliza acest sistem (Grasser et al.2002).

Alt robot pe două roți numit ‘SEGWAY HT’ este disponibil pentru comercializare (Dean Kamen, 2001). Este inventat de Dean Kamen care a creat peste 150 de sisteme în care sunt incluse sisteme de climatizare și de construire a elicopterelor. O caracteristică specială pe care o are acest robot este că este capabil de echilibru în timp ce utilizatorul stă deasupra și se plimba cu el. Cu toate acestea, acesta folosește cinci giroscoape și câțiva alți senzori de înclinare pentru a îl menține în echilibru.

Următorul este robotul de talie mică, Nbot care este asemanător cu JOE și este construit de David P. Anderson (Anderson, David P.) Acest robot folosește un senzor de inerție care se găsesște pe piață și folosește informația de la encoderul motorului pentru a echilibra sistemul. Acest robot a câștigat premiul de cel mai tare robot al saptămânii oferit de NASA în anul 2003.

Steven Hassenplug a folosit o abordare mai inovativă pentru a construi un robot ce își poate menține starea de echilibru (Steve Hassenplug, 2002). Șasiul corpului este construit folosind kitul robotic LEGO Mindstorms. Metoda de echilibrare prin care controlează sistemul este unică având doi senzori electro-optici de detectare a proximității și fiind folosită pentru a genera informația referiotare la unghiul de înclinare pentru controler. Această metodă elimină folosirea conventionala a giroscopului utilizat de ceilalti cercetători.

Louis Brennan, un inventator irlandezo-australian, a fost unul dintre primii brevetatori ai unui aparat cu stabilizare giroscopica. În 1903, Brennan a brevetat un sistem cu monoșină echilibrat giroscopic pe care l-a proiectat pentru uz militar; acesta a prezentat cu succes aparatul în 1909. Prin montarea unuia sau mai multor girostate (un giroscop modificat) de-a lungul corpului, monoșina s-a echilibrat singură atunci când a fost dezechilibrată. Brennan s-a temut ca monoșina să nu dea greș în utilizare, cuzând un eșec total al sistemului, prin urmare a împiedicat producția în masă a monoșinei.

Recent, un grup de la universitatea din Columbia a manufacturat o versiune modernizată a monoșinei lui Brennan. Din păcate, grupul nu a putut realiza un model care să funcționeze. Componenta electronică a modelului s-a supraîncălzit în mod continuu de-a lungul operațiunii ducând la arderea motorului. Segmentul electronic nu a fost modelat corespunzator și a dus la incapacitatea de funcționare a mecanismului.

Scopul și beneficiile roboților cu două roți capabili de echilibrare

Scopul roboților cu două roți este dificil de limitat la o sarcina anume, deoarece acestia pot să îndeplinească sarcini multiple, dacă au instalate echipamentele necesare. Unul dintre scopuri ar putea fi accesarea locurilor înguste, în care manevrarea vehiculelor cu mai multe roți ar fi imposibilă. Roboții nu au nevoie de concediu anual, pensie sau salariu. Costurile de întreținere nu sunt ridicate și reprezintă singura cheltuială după procurarea robotului. Aceste idei contribuie la beneficiile oricărui robot cu două roti.

Un robot poate îndeplini cu succes funcțiile unui monitor al anumitor funcții și configurat să declanșeze alarme dacă un incident are lorc sau dacă alți senzori adiționali sunt declanșați.

Unul din scopurile acestui proiect este acela de a reuși să facă un robot pe două roți să își revină în starea de echilibru după ce asupra sa s-a acționat cu o forță din exterior. Acest lucru ar putea fi făcut în lumea reală de către un adult sau copil care leșină și astfel se lasă peste robot. Acest fapt ar da ocazia robotului să își mențină stabilitatea în timp ce caută ajutor de la alți oameni, dupa ce a declanșat o alarmă. Ca o continuare a acestui proiect, în viitor, robotul va fi capabil să controleze singur traiectoria și să îndeplinească și funcții de interacțiune multimedia.

proiectare și Dezvoltare

Etapa de proiectare a unui proiect este fundamentală pentru evoluția ideilor, a necesităților și obiectivelor tuturor componentelor care se vor asambla împreună și vor forma robotul. Dezvoltarea și proiectarea atentă oferă inginerului abilitatea de a se asigura de viabilitatea conceptului pe măsură ce acesta progreseaza. Totodată oferă posibilitatea de a aduce îmbunătățiri continue, asigurându-se că problemele evidente și potențialele puncte slabe ale ansamblului sunt îndepărtate încă din faza de proiectare. Acest lucru economisește timp și resurse pe durata proiectului.

Introducere

Robotul cu două roți care își menține echilibrul reprezintă o problemă clasică de inginerie bazată pe pendulul invers și este foarte asemănătoare cu încercarea de a ține în echilibru o mătura pe vârful degetului. Această problemă provocatoare de robotică, electronică și control este baza studiului meu pentru acest proiect.

Figura 1 – Pendulul invers poziționat pe un căruțcontinue, asigurându-se că problemele evidente și potențialele puncte slabe ale ansamblului sunt îndepărtate încă din faza de proiectare. Acest lucru economisește timp și resurse pe durata proiectului.

Introducere

Robotul cu două roți care își menține echilibrul reprezintă o problemă clasică de inginerie bazată pe pendulul invers și este foarte asemănătoare cu încercarea de a ține în echilibru o mătura pe vârful degetului. Această problemă provocatoare de robotică, electronică și control este baza studiului meu pentru acest proiect.

Figura 1 – Pendulul invers poziționat pe un căruț

m – masa pendulului

M – masa căruțului

θ – unghiul de înclinare al pendulului

l – lungimea brațului pendulului

F – forța aplicată căruțului

Cuvântul “echilibru” înseamna că pendulul invers se află în stare de echilibru, adică poziția sa formează un unghi de 90 de grade când stă în picioare. Totuși, sistemul în sine nu este în echilibru ceea ce înseamnă ca acesta continuă să devieze de la axa sa verticală. De aceea, avem nevoie de un giroscop, pentru a realiza poziția unghiulară a pendulului invers sau a bazei robotului, și de un accelerometru pentru a depista forțele ce acționează asupra ansamblului, care să reprezinte intrări în microcontroler, facând ca programul în sine să fie un algoritm de echilibrare. Microcontrolerul va emite apoi semnal de tip feedback prin modulatorul de puls electric (PWM), către puntea H, pentru a întoarce motorul în sensul acelor de ceasornic sau în sens invers acelor de ceasornic, echilibrând astfel robotul.

Codul este scris în C și compilat pentru microcontrolerul MicroChip PIC 16f887 care comanda senzorii și motoarele. Principalul scop al microcontrolerului este să unească, ieșirile giroscopului și ale accelerometrului, să estimeze atitudinea platformei și să folosească aceste informații pentru a pune în mișcare roțile ansamblului într-o direcție care să permită menținerea poziției drepte și echilibrate a acestuia.

Ideea care stă la baza dinamicii robotului cu două roți care își menține echilibrul este destul de simplă: motorul trebuie mișcat într-o direcție care să contracareze direcția căderii. În practică, pentru a realiza acest lucru avem nevoie de doi senzori de feedback: un senzor de înclinare sau de unghi (giroscop) pentru a măsura înclinarea robotului în raport cu gravitația și un accelerometru pentru a calibra giroscopul, în felul acesta minimizând alunecarea. Avem nevoie de două elemente pentru a echilibra robotul. Acestea stunt:

unghiul de înclinare

prima lui derivată, viteza unghiulară.

Aceste două valori sunt însumate și transmise înapoi motorului care produce cuplul necesar îndreptării și echilibrării robotului.

Structura robotului

Robotul poate fi împărțit în următoarele părți:

Senzorii de inerție

Microcontroler

Motor

Senzorii de inerție

Giroscopul

“Un giroscop este un obiect sferic sau în formă de disc care se poate roți liber în orice direcție, întâmpinând o rezistență redusă din partea forțelor de frecare. Giroscoapele sunt folosite adesea pentru a ilustra legea de conservare a momentului cinetic sau legea inerției de rotație care ne învață că un obiect aflat în mișcare de rotație în jurul unei axe va continua să se rotească în jurul aceleiași axe până când din exterior se va interpune un vector forță care îi va schimba direcția de rotație. Giroscopul convențional care intră în compunerea sistemelor mecanice este format dintr-un rotor în formă de disc, montat pe un ax de rotație, care, la rândul său, este prins de o articulație cardanică. Există două articulații cardanice, cea internă – care susține rotorul și axul de rotație, și una exterioară, pe care este prinsă prima. Sistemul cardanic descris anterior este prins la rându-i de un cadru de susținere, întregul ansamblu minimizând orice acțiune exterioară asupra rotorului, astfel că orientarea acestuia rămâne fixă, indiferent de mișcarea platformei pe care giroscopul este montat.

Pământul este un minunat exemplu de giroscop. Planeta noastră se rotește în jurul propriei axe în timpul deplasării sale în jurul Soarelui și va continua să o facă neîncetat atâta timp cât nicio forță exterioară perturbatoare nu va acționa asupra sa. De asemenea, o jucărie faimoasă din copilăria noastră, titirezul, este un alt exemplu celebru de mecanism giroscopic. Antrenat într-o mișcare de rotație, titirezul va continua să se învârtă în jurul unei axe verticale până când frecarea dintre vârf și suprafața de contact va genera un vector forță suficient de puternic pentru a genera precesia titirezului. Precesia constă în deplasarea progresivă a axei de rotație, care descrie un con cu vârful într-un punct fix, con care are tendința de a se apropia de suprafața Pământului.

În afara mișcării balonului de rugbi, a gloanțelor, titirezului sau planetei Pământ, există și utilități practice ale giroscoapelor. Unele dintre ele, numite girocompase, girobusole sau girodirecționale, joacă un rol foarte important în sistemele de ghidaj și de navigație folosite la bordul avioanelor, navelor, rachetelor și proiectilelor. Girocompasul indică nordul geografic, iar legile inerției de rotație le fac instrumente mai de încredere decât busolele obișnuite care indică nordul magnetic și care pot da greș când sunt plasate în preajma echipamentelor electronice. Detectând orice deviere de la un curs prestabilit, girocompasul poate chiar transmite semnale către sistemele de navigație, fiind uneori folosit chiar la stabilizarea navelor în ape maritime și oceanice foarte agitate, prin măsurarea deviațiilor de la curs și compararea lor cu indicația girocompasului.

Pilotul automat cu care sunt dotate sistemele de navigație ale avioanelor folosesc nu unul, ci mai multe giroscoape pentru asistarea sistemelor de navigație la determinarea direcției de mers și a celei de urmat. Un set de giroscoape orientate vertical detectează schimbările de înălțime (orientarea sus-jos a nasului aparatului de zbor) sau de înclinație a aripilor avionului de la planul orizontal de deplasare, prin crearea a ceea ce se numește un orizont artificial. Orizontul artificial este o linie verticală la care sistemele de navigație se raportează. Un alt set de giroscoape determină direcția de deplasare a avionului, capul-compas în termeni aviatici. Giroscopul direcțional este similar girocompasului folosit pe multe aparate. Computerul care controlează setările pilotului automat știe să reacționeze la indicațiile giroscoapelor, făcând corecțiile de curs necesare.” –[SCI09]

Giroscopul folosit în acest proiect este un InvenSense MPU-6050.

Figura 2 – Giroscopul InvenSense MPU-6050

Accelerometrul

“Un accelerometru este un dispozitiv care măsoară accelerația corespunzătoare. Accelerația proprie măsurată de un accelerometru nu este neapărat accelerația coordonată (rata de schimbare a vitezei). În schimb, accelerometrul vede accelerația asociată cu fenomenul de greutate exprimat de către orice masă de test în repaus față de sistemul de referință al accelerometrului. De exemplu, un accelerometru în repaus pe suprafața pământului va măsura g = 9.81 m/s2 accelerație în sus, datorită greutății sale. Prin contrast, accelerometrul în cădere liberă sau în repaus în spațiul cosmic va măsura zero. Un alt termen pentru tipul de accelerație pe care accelerometrul o poate măsura este forța g de accelerație.

Accelerometrele au multiple aplicații în industrie și știință. Accelerometrele extrem de sensibile sunt componente de sisteme inerțiale de navigație pentru avioane și rachete. Accelerometre sunt folosite pentru a detecta și monitoriza vibrații în mașini rotative. Accelerometre sunt utilizate în tablete, telefoane, camere digitale, astfel încât imaginile de pe ecrane le sunt afișate întotdeauna în poziție verticală.

Modelele mono și multi-axa de accelerometre sunt disponibile pentru a detecta magnitudinea și direcția de accelerație corespunzătoare (sau forța g), ca o mărime vectorială, și pot fi folosite pentru a identifica orientarea (datorită modificărilor direcției greutății), accelerația de coordonate (atât timp cât produce forță g sau o schimbare de forță g), vibrații, șocuri, și căderea într-un mediu rezistiv (un caz în care accelerația corespunzătoare se modifică, deoarece aceasta începe de la zero, apoi crește). Accelerometrele microprelucrate sunt prezente tot mai mult în dispozitive electronice portabile și controlere de jocuri video, pentru a detecta poziția dispozitivului sau pentru controlul jocurilor.

Perechi de accelerometre coordonate peste o regiune pot fi folosite pentru a detecta diferențe (gradienți) în accelerațiile corespunzătoare de sisteme de referințe asociate cu aceste puncte. Astfel de perechi de accelerometre, în teorie, pot fi, de asemenea, folosite pentru a detecta undele gravitaționale.

Conceptual, un accelerometru se comportă ca o masă amortizată pe un arc. Când accelerometru cunoaște o accelerare, masa este deplasata până la punctul în care arcul este capabil de a accelera masa în același ritm ca și carcasa. Deplasarea este apoi măsurată pentru a da accelerația.

La dispozitivele comerciale, componente piezoelectrice, piezorezistive și capacitive sunt utilizate în mod obișnuit pentru a converti mișcare mecanică într-un semnal electric. Accelerometrele piezoelectrice se bazează pe piezoceramice (de exemplu, titanat-zirconat de plumb) sau cristale unice (de exemplu, cuarț, turmalina). Ele sunt de neegalat în ceea ce privește gama lor superioară de frecvență, greutate redusă și temperatură ridicată de funcționare. Accelerometrele piezorezistivie sunt preferate în aplicații de mare șoc. Accelerometre capacitive folosesc de obicei un micro-prelucrat senzor de siliciu. Performanța lor este superioară în intervalul de frecvență joasă și acestea pot opera în modul servo pentru a atinge stabilitate ridicată și liniaritate.

Accelerometre moderne sunt adesea sisteme micro electro-mecanice (MEMS), și sunt într-adevăr cele mai simple dispozitive MEMS, compuse din mai mult decât un fascicul consolă cu o masă seismică. Amortizarea se realizează prin intermediul gazului rezidual sigilat în dispozitiv. Atâta timp cât factorul Q nu este prea mic, amortizarea nu conduce la sensibilitate mai mică.” – [WP10]

Accelerometrul folosit în acest proiect este un Freescale MMA7361.

Figura 3 – Accelerometrul Freescale MMA7361

Figura 4 – Configurația pinilor accelerometrului

Figura 5 – Accelerometrul – diagrama bloc

Figura 6 – Accelerometrul – Accelerația dinamică

Un giroscop, alcătuit dintr-o roată care se învârte, este metoda clasică pentru realizarea unei referințe verticale. Din păcate, acestea sunt mari și greoaie, lucru nepotrivit pentru designul mic al giroscopului. Datorită progreselor în sistemele micro-electro-mecanice (MEMS), giroscopul a fost redus la un pachet incredibil de mic. Prin măsurarea acestei vibrații induse poți să-ți dai seama în ce direcție și cât de repede se rotește .

Din păcate, giroscoapele un sunt perfecte. Acestea au tendinta să raporteze o rată de rotație mică, chiar și în repaus. Giroscopul dezvoltă, de asemenea, o acumulare de eroare la înclinare din cauza integrării. De vreme ce senzorul raportează o viteză unghiulară, valoarea integrată ar trebui să rezulte într-o poziție. Totuși, aceasta nu este o estimare bună a poziției deoarece este relaționată cu momentul în care software-ul a început să se integreze.

Software-ul va combina măsuratoarea giroscopului cu cea a unui accelerometru pentru a deduce o estimare mai bună a poziției absolute.

Accelerometrul oferă o referință fizică pentru că este capabil să masoare forța statică gravitațională care îi permite acestuia să facă măsurători precise chiar și în repaus.

Un giroscop și un accelerometru au fost folosite pentru a efectua măsurătorile inerțiale. Giroscopul are o singură ieșire anlogică pentru rotația pe axa Y. Giroscopul este montat să se potrivească rotației robotului. Rata giroscopului măsoară viteza unghiulară și furnizează o tensiune Vg.

Vg= ω + f(T) + eg

Unde f(T) reprezintă efectul temperaturii și eg reprezintă eroarea care este necunoscută, deoarece giroscopul este sensibil la temperatură. De vreme ce eg nu este cunoscută aceasta un poate fi scăzută din semnal și în acest fel valoarea rămasă a vitezei unghiulare poate să un fie aceeasi cu viteza unghiulară reală ω.

Pe de altă parte, accelerometrul nu poate aluneca și un poate avea erori datorită integrării. Unghiul de înclinare se calculează măsurând accelerația pe directia X.

Figura 7 – Măsurarea unghiului de înclinare

Ax = g sin θ

Pentru o valoare mică a lui θ

Ax = g θ

θ = Ki*(Ax) ;

K: este constant

Aceasta aproximare este corectă doar pentru valori mici ale lui θ; considerând că înclinarea noastră este mică, ne continuam aproximarea de vreme ce funcțiile trigonometrice inverse ar dura foarte mult pentru un microcontroler de 8biti.

Microcontrolerul

“Microcontrolerul este un dispozitiv electronic complex care integrează, pe lângă unitatea centrală de procesare (microprocesor), memorie, linii de intrare/ieșire, comparatoare, numărătoare, comunicație serială, etc.

Funcție de complexitatea circuitului, microcontrolerul poate dispune de toate facilitățile de mai sus (și nu numai), dar poate avea și doar o mică parte din acestea.

Toate aparatele inteligente fabricate astăzi dispun de astfel de microcontrolere. Pot include aici televizoarele, mașinile de spălat, imprimantele, sistemele de alarmă, majoritatea aparatelor ce pot fi programate și care citesc anumiți parametri ce se modifică în timp.

Pentru a alege un microcontroler din marea varietate de microcontrolere existente pe piață trebuie ținut cont de câteva caracteristici importante ale acestora:

– prețul de achiziție și ușurința lucrului cu acesta; sculele de dezvoltare trebuie să poată fi cumpărate la un preț rezonabil;

– consumul de putere să poată fi redus acolo unde este necesar, adică la sistemele portabile ( să suporte stand-by sau sleep – moduri care limitează consumul de curent la câțiva miliamperi când un circuit este inactiv);

– microcontrolerul trebuie să existe și în varianta reprogramabilă (flash) și nu numai în varianta inscriptibil o singură dată (One Time Programming). Se pot folosi microcontrolere de tipul OTP doar în varianta finală, pentru producția de serie, deoarece sunt mai ieftine;

– testarea funcționării să se poată realiza și prin simulare software fără să necesite un modul special;

– sa dispuna de toate resursele de care avem nevoie pentru realizarea proiectului, evitand astfel utilizarea de circuite aditionale.

Scrierea programului se realizează de obicei într-un editor ce permite salvarea liniilor de comandă introduse. Există mai multe opțiuni pentru scrierea programului de control al aplicației și anume cod mașină, limbaj de asamblare, sau limbaj de nivel înalt, în funcție de viteza de execuție dorită, lungimea memoriei disponibile, etc. Comenzile recunoscute de microcontroler sunt cele binare (cod mașină). Limbajul de asamblare este mai evoluat, conține instrucțiuni ce sunt ușor de reținut, și pentru transformarea acestora în cod mașină avem nevoie de un compilator. De obicei compilatorul este oferit gratuit de producătorul microcontrolerelor. Limbajul de nivel înalt simplifică programarea emitând scrierea într-un rând sau în câteva rânduri a ceea ce ar necesita multe linii de program în limbaj de asamblare.

De asemenea se poate utiliza un limbaj ca C, Pascal, Basic pentru o gamă mai largă de microcontrolere, folosind aceleași instrucțiuni, în comparație cu limbajul de asamblare unde instrucțiunile pot fi diferite chiar pentru aceeași clasă de microcontrolere.

După scrierea programului este necesară testarea acestuia. Chiar dacă microcontrolerul este de tip flash și poate fi rescris în caz în care programul nu funcționează, este preferabilă eliminarea erorilor de programare înainte de conectarea lui în circuit. Instrumentele de testare sunt simulatoarele și emulatoarele.

Simulatorul este un soft care rulează pe un calculator personal și utilizează monitorul pentru a demonstra ce se poate întâmpla într-un microcontroler la rularea programului. Se pot vedea conținutul memoriei, starea liniilor de port, se poate rula programul pas cu pas și se pot vedea modificarile registrelor.

Emulatoarele sunt dispozitive hard care înlocuiesc microcontrolerul din dispozitivul de testat. Ca și simulatoarele permit controlul execuției programului și monitorizarea a ceea ce se întâmplă la fiecare pas al programului. Emulatoarele de microcontrolere sunt în general scumpe.

De ce am ales familia PIC?

Deoarece se găsește la majoritatea magazinelor de componente electronice, este ieftin, dispune de facilități ce mulțumesc orice electronist, fie el avansat sau începător (funcție de familia de microcontrolere PIC aleasă), poate fi programat ușor (scheme de programatoare se găsesc pe Internet) și firma producătoare (Microchip) asigură gratuit documentația, scheme cu aplicații și compilatorul pentru limbajul de asamblare. Trebuie amintit că numărul de instrucțiuni este redus (sub 40), ceea ce ușurează foarte mult munca de realizare a programului.” – [DM11]

Microcontrolerul PIC16F887

PIC16F887 este unul dintre cele mai noi produse de Microchip. Conține toate componentele unui mocrocontroler modern. Pentru prețul său scăzut, gama largă de utilizare, calitatea ridicată și disponibilitatea sa, aceasta este o soluție ideală în aplicații cum ar fi: controlul diferitelor procese în industrie, dispozitive de control a mașinilor, măsurarea diferitelor valori etc. Unele dintre principalele sale caracteristici sunt enumerate dedesubt.

RISC, arhitectura

Only 35 instructions to learn Doar 35 de instrucțiun

All single-cycle instructions except branches Toate mono ciclu de execuție, cu excepția salturilor

Operating frequency 0-20 MHz Frecvența de 0-20 MHz

Precision internal oscillator Oscilatorul intern de precizie

Factory calibratedSoftware selectable frequency range of 8MHz to 31KHz Frecvență selectabilă de la 8MHz la 31KHz

Power supply voltage 2.0-5.5V Tensiune de alimentare 2,0-5.5V

Consumption: 220uA (2.0V, 4MHz), 11uA (2.0 V, 32 KHz) 50nA (stand-by mode) Consum: 220uA (2.0V, 4MHz), 11uA (2,0 V, 32 kHz) 50nA (stand-by mode)

Power-Saving Sleep Mode Power-Saving modul sleep

Brown-out Reset (BOR) with software control option Brown-out Reset (BOR), cu opțiune de software de control

35 input/output pins 35 pini de intrare / ieșire

High current source/sink for direct LED drive software and individually programmable pull-up resistorSoftware și individual programabil trage în sus Rezistor

Interrupt-on-Change pin Întreruperea pe schimbare de adresă

8K ROM memory in FLASH technology 8k ROM de memorie în tehnologia FLASH

Chip can be reprogrammed up to 100.000 times Chipul poate fi reprogramat de până la 100,000 de ori

In-Circuit Serial Programming Option In-Circuit Serial Programming

Chip can be programmed even embedded in the target device Chip poate fi programat chiar încorporat în dispozitivul țintă

256 bytes EEPROM memory 256 octeți de memorie EEPROM

Data can be written more than 1.000.000 times Datele pot fi scrise de mai mult de 1.000.000 de ori

368 bytes RAM memory 368 octeți de memorie RAM

A/D converter: Convertor A / D:

14-channels 14-canale

10-bit resolution 10-bit Rezoluție

3 independent timers/counters 3 cronometre/contoare independente

Watch-dog timer Watch-dog timer

Analog comparator module with Comparator cu modul analogic

Two analog comparators Două comparatoare analogice

Fixed voltage reference (0.6V) Tensiune Fixă de referință de (0.6V) Programmable on-chip voltage reference

PWM output steering control PWM

Enhanced USART module Enhanced USART

Supports RS-485, RS-232 and LIN2.0 Suportă RS-485, RS-232 și LIN2.0

Auto-Baud Detect Auto-Detect baud

Master Synchronous Serial Port (MSSP) Master sincrone Serial Port (MSSP)

supports SPI and I2C mode Suportaă I2C și SPI mode

Figura 8 – PIC16f887 pini

Figura 9 – PIC 16f887 diagrama bloc

După cum se vede în imaginea de mai sus, cei mai mulți pin sunt multi-funcționali. De exemplu, RA3/AN3/Vref + / C1IN + pentru cel de-al cincea pin specifică următoarele funcții:

RA3 Port A al treilea port de intrare / ieșire digital

AN3 Al treilea port de intrare analogic

Vref + Tensiunea pozitivă de referință

C1IN + Comparator C1 intrare pozitivă

Acest mic truc este folosit adesea pentru că face ca microcontrolerul să inglobeze mai multe funcții, fără a afecta funcționalitatea. Aceste diverse funcții ale pinilor nu pot fi folosite concomitent, dar poate fi schimbate în orice moment în timpul funcționarii.

Figura 10 – Asignarea pinilor

Figura 11 – cont. asignarea pinilor

Figura 12 – cont. asignarea pinilor

Unitatea Centrală de Procesare (CPU)

Orice încercare de a explica în detaliu modul de funcționare a procesorului ar lua prea mult timp. Este totuși important de menționat că microcontrollerul are implementată o arhitectură de tip RISC. RISC înseamnă set redus de instrucțiuni de computare, care oferă PIC16F887 două mari avantaje:

Procesorul poate să recunoască și să execute doar 35 instrucțiuni simple (În scopul de a programa alte microcontrolere este necesar să se cunoască mai mult de 200 de instrucțiuni).

Timpul de execuție este aceeași pentru toate acestea și durează 4 cicluri de ceas (frecvența oscilatorului este stabilizată de către cristalul de cuarț). Singurele excepții sunt instrucțiuni de salt ai căror timpi de execuție sunt de două ori mai lungi. Aceasta înseamnă că, dacă viteza de operare a microcontrolerului este de 20MHz, timpul de execuție pentru fiecare instrucțiune va fi 200nS, și anume, programul va fi executat la viteza de 5 milioane de instrucțiuni pe secundă!

Acest microcontroler are trei tipuri de memorie ROM, RAM și EEPROM. Toate acestea vor fi discutate separat, deoarece fiecare are anumite funcții, caracteristici de organizare.

Figura 13 – Memoria CPU

Memoria ROM

Memoria ROM este folosită pentru a salva permanent programul executat. De aceea este deseori numită "memoria de program ". PIC16F887 are 8Kb de memorie ROM (în total 8192 de locații). Deoarece, în acest caz, memoria ROM este realizată cu tehnologia FLASH, conținutul său poate fi schimbat prin furnizarea de tensiune specială de programare (13V).

Oricum, nu este nevoie să se explice, în detaliu, deoarece acesta este efectuat în mod automat, prin intermediul unui program special de pe PC și un simplu dispozitiv electronic numit programator.

Figura 14 – Conceptul memoriei ROM

Memoria EEPROM

Similar cu memoria de program, conținutul EEPROM-ului este permanent salvat, chiar și atunci când tensiunea de alimentare se oprește. Cu toate acestea, spre deosebire de ROM, conținutul memoriei EEPROM poate fi schimbat în timpul operării. De aceea, această memorie (256 locatii) este perfectă pentru salvarea permanentă a rezultatelor din timpul operării.

Memoria RAM

Aceasta este cea de-a treia și cea mai complexă parte din memoria microcontrolerului. În acest caz, este alcătuită din două părți: registri cu scop general și registre speciale de funcții (SFR).

Chiar dacă ambele grupuri de registre sunt resetate atunci când tensiunea de alimentare este oprită, și chiar dacă acestea sunt fabricate în același mod și acționează în mod similar, funcțiilor lor nu au multe lucruri în comun.

Figura 15 – Registre

Registrele cu scop general sunt folosite pentru stocarea temporară a datelor și rezultatelor create în timpul operațiunii. De exemplu, în cazul în care programul efectuează o numărătoare (de exemplu, contabilizarea produselor de pe linia de montaj), este necesar a avea un registru care să îndeplinească funcțiile unui numărător. Având în vedere că un microcontroler nu este deloc creativ, este necesar să se specifice adresa unor registre de scop general și atribuită acestora o nouă funcție. Un program simplu de a incrementa valoarea acestui registru cu 1, după ce fiecare produs trece printr-un senzor, ar trebui să fie creat.

Prin urmare, microcontrolerul poate executa acel program, pentru că acum știe ce și unde este suma pe care trebuie să o incrementeze. Similar în acest exemplu simplu, fiecare variabilă din program trebuie să fie asignată în prealabil unui registru cu scop general.

Registrele cu funcții speciale (SFR) sunt de asemenea locații de memorie RAM, dar spre deosebire de registrele cu scop general, scopul lor este predeterminat pe parcursul procesului de fabricație și nu poate fi schimbat. Deoarece biții lor sunt fizic conectați la circuite speciale pe chip (Convertor A/D, modulul de comunicație serială, etc), orice modificare a conținutului lor afectează în mod direct funcționarea microcontrolerului sau unele dintre circuitele sale. De exemplu, prin schimbarea registrului TRISA, funcțiile fiecărui pin pot fi schimbate într-un mod care să determine pinul să funcționeze ca intrare sau ca ieșire. O altă caracteristică a acestor locații de memorie este că au numele lor (registre și biții lor), care facilitează considerabil scrierea programului. Deoarece programarea la nivel înalt poate folosi lista tuturor registrelor cu adresele lor exacte, este suficient să se specifice numle lor pentru a citi sau scrie conținutul lor.

Memoria de date este partiționată în patru bănci de memorie. Înainte de a accesa unele registre în timpul scrierii programelor (pentru a citi sau a modifica conținutul lor), este necesar să se selecteze banca ce conține acest registru. Doi biți din registrul de stare sunt utilizați pentru selectarea băncii. În scopul de a facilita operarea, cele mai frecvent utilizate SFR-uri au aceeași adresă în toate băncile care să le permită să fie ușor de accesat.

Figura 16 – Zone de memorie

Figura 17 – Zona 0 SRF

Figura 18 – Zona 1 SRF

Figura 19 – Zona 2 SRF

Figura 20 – Zona 3 SRF

O parte din memoria RAM este utilizată pentru stiva formată din opt registre de 13 biti. Înainte ca microcontrolerul să începă a executa o subrutină (instrucțiunea CALL) sau când apare o întrerupere, adresa primei instrucțiuni următoare este împinsă în stivă, și anume, pe unul din registrele sale. În acest fel, în cazul executării unei întreruperi, microcontrolerul stie de unde să reia execuția programului. Această adresă este golită la întoarcerea în programul principal, deoarece nu este nevoie să se mai salveze, și o locație din stivă este automat disponibilă pentru utilizarea ulterioară.

Este important de știut că de datele sunt împinse în mod continuu și circular spre stivă. Aceasta înseamnă că, după ce stiva a fost împinsă de opt ori, a noua împingere suprascrie valoarile care au fost stocate la prima împingere. A zecea împingere determină suprascrierea celei de-a doua și așa mai departe. Datele suprascrise în acest mod nu sunt recuperabile. În plus, programatorul nu poate accesa aceste registre pentru a scrie sau a citi și nu există niciun bit de stare pentru a indica stările de stack overflow sau stack underflow. Din acest motiv, ar trebui să se acorde o atenție specială acestui registru în timpul scrierii programului.

Primul lucru pe care un microcontroler îl face când apare o cerere de întrerupere este de a executa instrucțiunea curentă și apoi de a opri programul din execuție. Imediat după aceea, adresa de memorie curentă a programului este automat împinsă în stivă și adresa implicită (predefinită de către producător) este scrisă în numărătorul programului. Locația de la care programul își continuă execuția invocata de către vectorul de întreruperi. În ceea ce privește microcontroler PIC16F887, această adresă este 0004h. Locația ce conține vectorul de întreruperi este trecută în mod regulat în timpul execuției programului.

Partea programului ce este activată atunci când apare o întrerupere este denumită rutină de întrerupere. Prima instrucțiune este situată la vectorul întrerupere. Cât de lungă va fi această subrutină și cum va fi aceasta depinde de abilitățile programatorului cât și de sursa întreruperii în sine. Unele microcontrolere au mai multi vectori de întrerupere (fiecare întrerupere are propriul său vector), dar în acest caz nu există decât una singură. În consecință, prima parte a rutinei de întrerupere constă în recunoașterea sursei întreruperii.

Când sursa întreruperii este recunoscută și rutina întreruperii este executată, microcontrolerul ajunge la instrucțiunea RETFIE, scoate adresa din stivă și continuă de unde rămăsese execuția programului. – [ideile prezentate în acest subapitol sunt luate din [Milan08] ]

Figura 21 – Întreruperile de sistem

Motorul electric

Motorul electric de curent continuu a fost inventat în 1873 de Zénobe Gramme prin conectarea unui generator de curent continuu la un generator asemănător. Astfel, a putut observa că mașina se rotește, realizând conversia energiei electrice absorbite de la generator.

Dacă un rotor se învârte între doi poli magnetici staționari, curentul din rotor circulă într-o direcție pe parcursul unei jumătăți de rotație și în cealaltă pe parcursul celeilalte jumătăți. Pentru a produce o trecere constantă, într-o singură direcție a curentului dintr-un astfel de dispozitiv, este necesară furnizarea unui mijloc prin care curentul rezultat să aibă acelasi sens pe parcursul întregii rotații. La mașinile mai vechi aceasta este realizată cu ajutorul unor placuțe colectoare, un inel de metal împărtit în două, montat pe axul rotorului. Cele două jumătăți sunt izolate și sunt bornele bobinei. Perii fixe de metal sau carbon sunt ținute pe plăcuțele colectoare în timp ce acestea se rotesc, conectând electric bobina la fire exterioare. În timp ce rotorul se învârte, fiecare perie intră în contact alternativ cu plăcuțele colectoare, schimbându-și poziția în momentul când curentul din bobină își schimbă sensul. Astfel circuitul exterior la care generatorul este conectat este alimentat cu un curent continuu. Generatoarele de curent continuu sunt de obicei folosite la tensiuni mici pentru a evita scânteile dintre perii și plăcuțe care rezultă la tensiuni mari. Cel mai mare potențial obținut în general de astfel de generatoare este de 1500 de volți. În unele mașini mai noi această inversare se face folosind dispozitive electronice de mare putere, cum ar fi de exemplu diode redresoare.

În general, sunt similare în construcție cu generatoarele de curent continuu. Ele pot, de fapt să fie descrise ca generatoare care "funcționează invers". Când curentul trece prin rotorul unui motor, este generat un câmp magnetic care generează o forță electromagnetică, și ca rezultat rotorul se rotește. Acțiunea periilor colectoare și a plăcuțelor colectoare este exact aceiași ca la generator. Rotația rotorului induce un voltaj în bobinajul rotorului. Acest voltaj indus are sens opus voltajului exterior aplicat rotorului. În timp ce motorul se rotește mai rapid, voltajul rezultat este aproape egal cu cel indus. Curentul este mic, și viteza motorului va ramâne constantă atât timp cât asupra motorului nu acționează nicio sarcină, sau motorul nu efectuează alt lucru mecanic decât cel efectuat pentru învârtirea rotorului. Când asupra rotorului se aplică o sarcină, voltajul va fi redus și un curent mai mare va putea să treacă prin rotor. Astfel, motorul este capabil să primească mai mult curent de la sursa care îl alimentează, și astfel să efectueze mai mult lucru mecanic. Deoarece viteza rotației controlează trecerea curentului prin rotor, mecanisme speciale trebuie folosite pentru pornirea motoarelor cu curent continuu. Când rotorul se află în repaus, el, efectiv, nu are nicio rezistență, și dacă voltajul normal este aplicat, va trece un curent mare, ceea ce ar putea avaria periile colectoare sau motorul. Mijloacele obișnuite pentru prevenirea acestor accidente este folosirea în serie a unei rezistențe, la început, împreună cu rotorul, pentru a limita curentul până când motorul începe să dezvolte un curent suficient. Pe parcurs ce motorul prinde viteză, rezistența este redusă treptat, fie manual ori automat.

Motoarele folosite în acest proiect sunt motoare de curent continuu, cu perii tip FA-130.

Figura 22 – Motorul CC FA-130

Caracteristici generale ale motorului FA-130

Viteza de rotație în gol la 6V 11500 rpm

Curentul de alimentare la 6V 70mA

Curentul de blocare la 6V 800mA

Dacă dorim să pornim un motor de curent continuu într-un singur sens, atunci putem realiza acest lucru utilizând un tranzistor compus de tip Darlington NPN, care poate suporta curenți mari, de ordinul amperilor.

Comanda tranzistorului poate fi dată de către un circuit de comandă, cum ar fi un PC, sau cel mai adesea un microcontroler. Tranzistorul, dacă primește un semnal de 5V pe baza de la microcontroler, atunci va conduce și motorul va fi alimentat, rotindu-se într-un singur sens. Dacă la intrarea acestui circuit amplificator, numit și "driver", pe baza tranzistorului Darlington, va fi prezent un semnal de 0V, atunci motorul se va opri.

Deci, dacă dispunem de un circuit de comanda, de obicei realizat cu un microcontroler, alaturi de care este prezent și circuitul de amplificare cu un tranzistor, putem să comandam motorul doar într-un singur sens.

Puntea H

Dacă dorim să comandam motorul în ambele sensuri, atunci se poate folosi o punte H. “O punte H (eng. H Bridge) este un circuit electronic ce permite aplicarea unei tensiuni pe o sarcină în orice sens. Aceste circuite sunt adesea folosite în robotică și alte aplicații pentru a permite motoarelor de curent continuu să ruleze înainte și înapoi. Punțile H sunt disponibile ca circuite integrate sau pot fi construite din componente discrete, tranzistoare bipolare sau MOS. Puntea H are numele derivat de la modul obișnuit de desenare a circuitului. Aceasta este singura cale de tip solid state de a comanda motorul în ambele direcții.

Atunci când întrerupătoarele S1 și S4 (în conformitate cu Figura 23) sunt închise și S2 și S3 sunt deschise o tensiune pozitivă va fi aplicată la nivelul motorului. Prin deschiderea întrerupătoarelor S1 și S4 și închiderea întrerupătoarelor S2 și S3, această tensiune este inversată, astfel să permită funcționarea inversă a motorului.

Folosind nomenclatura de mai sus, întrerupătoarele S1 și S2 nu trebuie să fie închise în același timp, deoarece acest lucru ar provoca un scurt-circuit la sursa de tensiune (Vin). Același lucru se aplică și întrerupătoarelor S3 și S4. În practică întrerupătoarele S1, S2, S3, S4 sunt tranzistoare bipolare sau MOS-FET.” -[STE12]

Figura 23 – Puntea H

Pentru controlul motoarelor s-a folosit o punte H alcătuită dintr-un circuit integrat L298n capabil să controleze două motaoare independent.

Figura 24 – Circuitul integrat L298n

Figura 25 – Schema de conectare a motoarelor cc la L298n

PWM

Controlul turației motoarelor este realizat pe baza semnalului generat de către microcontroller prin intermediul PWM-ului. “Termenul de PWM vine din limba engleză de la Pulse Witdh Modulation și înseamnă că avem un semnal modulat în lățimea impulsurilor de comandă. Ca să fiu mai explicit putem spune că un astfel de semnal PWM constă în codarea informației în lățimea impulsului obținut. Factorul de umplere al unui semnal PWM se calculează cu relația D(fu)=Ti/T, unde Ti este durata impulsului și T perioada semnalului.

Deci, putem astfel să observăm că fiecare procent al unui astfel de semnal reprezintă o valoare importantă în aplicația pe care o dorim cu un astfel de semnal spre deosebire de semnalul TTL care poate să aibă doar două stari. (high, low).

Semnalele PWM sunt semnale de comandă a unor tranzistoare de putere, folosite în cadrul unor convertoare în comutatie. Un modulator PWM are rolul de a comanda un comutator și este o parte importantă și complexă a unui regulator de tensiune în comutație. Principiul de realizare a unui astfel de modulator PWM constă în alcătuirea unei scheme electronice care să conțină:

generator în dinte de fierăstrău

amplificator de eroare

comparator

O diagramă simplificată pentru realizarea semnalului PWM este prezentată în figura urmatoare.

Figura 26 – Circuit simplificat pentru realizarea semnalului PWM

Figura 27 – Semnalul în raport cu cronometrul

După cum se poate observa și în Figura 26 acest modulator PWM constă dintr-un generator în dinte de fierăstrău (saw-tooth generator), un amplificator de eroare și un comparator. Frecvența generatorului este setată de valoarea constantei de timp RC.

Amplificatorul de eroare compară tensiunea de referință și semnalul de reacție. Semnalul de reacție este obținut, de obicei, printr-o divizare a tensiunii de ieșire. Dacă consideram că Vf este semnalul de reacție și VRef este tensiunea de referință și Vf = βV0, deoarece Vf = VRef, V0 = VRef/β.

Tensiunea de la ieșirea amplificatorului de eroare este comparată cu valoarea semnalului în dinte de fierăstrău. Dacă ieșirea acestuia este mai mare decât valoarea dintelui de fierăstrău atunci la ieșirea comparatorului vom avea ‘1’ logic adică Ton. Dacă ieșirea amplificatorului este mai mică decât valoarea dintelui de fierăstrău atunci la ieșirea comparatorului vom avea ‘0’ logic adică Toff.

Dacă tensiunea de ieșire tinde să crească, atunci tensiunea de reacție va crește peste tensiunea de referință, astfel tensiunea de ieșire a amplificatorului de eroare va scădea rezultând astfel o durată mai mică pentru care la ieșirea comparatorului vom avea ‘1’ logic. Dacă tensiunea de ieșire scade atunci la ieșirea comparatorului vom avea o durată mai mare de ‘1’ logic. Această modificare a lățimii impulsurilor în funcție de tensiunea de ieșire este datorată factorului de umplere (duty-cicle).

În cazul în care tensiunea de ieșire este constantă aceasta este menținută de reacția negativă la valoarea dorită.” – [PWM11]

Sistemul de control

De-a lungul anilor au ajuns să se folosească numai două tipuri de control utilizate de către cercetători în controlarea unui sistem. Acestea sunt împărtite în: control liniar și neliniar. În anumite cazuri, controlul liniar este suficient pentru controlarea unui sistem. Unul dintre cele mai răspândite este controlerul proporțional-integral-derivativ sau controlerul PID (Rick Bickle, 2003). Toată lumea stie că, controlul liniar este mai popular decât controlul neliniar. Exista două motive pentru acest lucru. În toate situațiile, modelarea unui sistem necesită luarea în calcul și aplicarea multor parametri. De aceea, sistemul este complex. Totusi, câteva dintre valorile parametrilor necesari pentru modelarea sistemului sunt mici. De aceea majoritatea cercetătorilor preferă să-și modeleze aplicațiile într-o aproximare liniară, care este mai simplă și în anumite cazuri, mai eficientă.

Un sistem de reglare automată reprezintă un sistem de conducere care are drept scop anularea diferenței dintre mărimea impusă (referință) si mărimea de ieșire (reglată), indiferent de perturbațiile care acționează asupra sistemului. Acestei difernțe i se mai spune și eroarea sau abaterea sistemului de reglare automată.

Se poate spune că sistemele de reglare automată asigură menținerea automată în anumite limite a unor mărimi importante pentru buna desfășurare a procesului tehnologic, pentru economisirea de energie, de materii prime sau pentru creșterea productivității.

Sistemul de Reglare Automată (SRA) – un sistem în care, între mărimea de ieșire și mărimea de intrare, fără intervenția omului, se realizează automat o relație funcțională, care reflectă legea de conducere a unui proces.

Rolul SRA – asigură menținerea automată – fără intervenția omului – a unor mărimi tehnologice la o valoare prestabilită, de regim.

Obiectul SRA – înlocuirea omului în realizarea diverselor operații din procesul de producție.

Clasificarea sistemelor de reglare automată

În funcție de modificarea mărimii impuse se disting trei tipuri de sisteme de reglare automată:

a) sistem de stabilizare automată la care mărimea impusă este constantă pentru o anumită perioadă de timp sau eventual se poate modifica din când în când după anumite intervale de timp (exemple: sistem de reglare a temperaturii într-o încăpere, sistem de reglare a turației unui motor).

b) sisteme de reglare după program, sunt sistemele de reglare automată la care mărimea impusă se modifică după o lege cunoscută dinainte (mărimea impusă va avea o variație de timp bine determinată) (exemple: sisteme de reglare pentru tratamente termice și chimice,sisteme de reglare pentru acționarea mașinilor unelte și roboților industriali).

c) sistemele de urmărire reprezintă sistemele de reglare automată la care mărimea impusă este măsurabilă, dar se modifică după o lege necunoscută dinainte (exemple: sisteme de reglare a temperaturii dintr-o incintă care trebuie să realizeze o temperatură egală cu temperatura dintr-o altă incintă termică, sistem de reglare a poziției unui element în raport cu alt element).

În funcție de cunoașterea dinainte a evoluției subsistemului condus (procesului sau instalației tehnologice) sistemele de reglare automată se împart în:

a) sisteme de reglare automată la care informațiile despre evoluția procesului sunt complet cunoscute dinainte. În acest caz, subsistemul condus (procesul), are caracteristici invariabile în timp fiind complet definit;

b) sisteme de reglare automată la care informațiile despre evoluția procesului sunt incomplet cunoscute dinainte. La aceste sisteme de reglare automată, caracteristicile procesului sunt variabile în timp. Perturbațiile parametrice ce acționează asupra procesului modifică parametrii sau caracterisiticile de transfer și in acest caz echipamentul de automatizare (subsistemul conducător) va trebui să se adapteze continuu acestor modificări pentru ca procesul să evolueze conform cerințelor impuse. Aceste sisteme se mai numesc și sisteme adaptive. Structural, aceste sisteme, pe lângă circuitul de reacție negativă, conțin elemente funcționale care asigură identificarea continuă a procesului și elaborează strategia de modificare a algoritmului de conducere.

După relația funcțională dintre variabilele de intrare și cele de ieșire ale subsistemelor componente, sistemele de reglare automată se împart în:

a) sisteme de reglare automată liniară la care funcționarea tuturor subsistemelor este descrisă de funcții liniare.

b) sisteme de reglare automată neliniare, care au cel puțin un subsistem ce este descris de un model matematic neliniar.

După natura semnalelor preluate în cadrul sistemelor de reglare automată (variația lor în timp) se deosebesc:

a) sisteme de reglare automată continue, la care toate variabilele sistemului se modifică continuu în timp;

b) sisteme de reglare automată discrete când cel puțin una dintre variabilele sistemului are o evoluție discretă, discontinuă în timp

Sistemele discrete se împart la rândul lor în sisteme de reglare automată cu impulsuri modulate și sisteme automate numerice.

În funcție de de numarul variabilelor de intrare și /sau de ieșire ale sistemului de reglare automată, sistemele se împart în:

a) sisteme de reglare automată monovariabile la care exixtă câte o singură variabilă de intrare și ieșire;

b) sisteme de reglare automată multivariabile care au mai multe variabile de intrare și / sau ieșire;

După forma ecuațiilor ce descriu funcționarea sistemelor de reglare automată, există:

a) sisteme cu parametrii distribuiți descrise prin ecuații cu derivate parțiale ce conțin una sau mai multe variabile independente și derivate parțiale ale variabilelor independente și derivate parțial ale derivatelor dependente in raport cu variabilele independente. O ecuație cu derivate parțiale este reprezentată de ecuația difuziei termice:

unde: T = T(d,t) este variabila dependentă și reprezintă temperatura într-o bandă de cauciuc în timpul vulcanizării, la o anumită distanță d și la un anumit moment de timp t;

b) sisteme cu parametrii concentrați care sunt descrise prin ecuații diferențiale ordinare sau prin ecuații diferențiale finite.

După modul de exprimare a semnalelor (mărimilor de intrare, ieșire și stare) și a parametrilor există:

a) sisteme de reglare deterministe (toate sistemele de mai sus) la care în orice moment de timp orice variabilă (de intrare ieșire sau stare) și parametrii sunt bine determinați;

b) sisteme stochastice la care orice variabilă sau parametru sunt descrise într-o formă probabilistică și statiscă. Studiul acestor sisteme se bazează pe teoria probabilităților.

După modul de exprimare a semnalelor în timp al parametrilor ce descriu modelul matematic al sistemului de reglare sunt sistemele:

a) sisteme de reglare invariante in timp,care au parametrii constanti in timp;

b) sisteme de reglare variabile in timp, care au parametrii variabili in timp.

După modul de evoluție al sistemelor de reglare, în funcție de existența mărimilor de intrare, sunt:

a) sisteme de reglare omogene la care întreaga evoluție este determinată de condițiile sale inițiale (este descris de o ecuație diferențială omogenă neavând comenzi externe);

b) sisteme de reglare neomogene, la care, în evoluția lor, intervin acțiunea mărimilor de intrare (comenzi externe);

Structura și mărimile caracteristice ale unui S.R.A.

Sistemele de reglare automată (SRA) sunt organizate (realizate) ca sisteme cu circuit închis cu reacție negativă. Reacția negativă conferă unui sistem de reglare automată următoarele calități:

-creșterea preciziei reglării;

-reducerea sensibilatății sistemului la variațiile caracteristicilor elementelor sale și ale procesului (perturbațiilor);

-reducerea efectelor distorsiunilor de neliniaritate;

-creșterea benzii de frecvență în care sistemul se comportă satisfăcător.

Un sistem de reglare automată în cea mai simplă structură se compune din:

-procesul sau instalația tehnologică supusă automatizării P(IT);

-dispozitivul de automatizare DA.

Figura 28 – Structura unui SRA

În figura de mai sus s-au folosit următoarele notații:

– v – mărime de referință (prescrisă) sau de intrare;

– yr – mărime de reacție;

– – eroare (abaterea) obținută ca rezultat al comparației efectuate (prin diferență) de elementul de comparației EC;

În teoria modernă a sistemelor se utilizează variabila u ca mărime de intrare (comandă) a sistemului condus, iar mărimea de referință a sistemului (sau de intrare) va fi realizată prin variabilele v, y* sau yref.

-A – adaptorul (sau convertorul) transformă mărimea de comandă u electrică în una pneumatică dacă regulatorul este electric și elementul de execuție este pneumatic sau dintr-o mărime pneumatică în una electrică, dacă regulatorul este pneumatic iar elementul de execuție este electric. El furnizează la ieșiri o mărime u, compatibilă cu mărimea de intrare a elementului de execuție EE;

-EE – elementul de execuție realizează adaptarea în principal energetică dintre mărimea de comandă de la intrarea u (sau u1 când este necesar adaptorul A), și mărimea de ieșire (sau de execuție) m, care se aplică organului de reglare și care este de obicei o mărime mecanică (o forță sau un cuplu de forțe, etc.).

-OR – organul de reglare, dispozitiv prin intermediul caruia se transmit instalației tehnologice concluziile executate de elementul de execuție cu scopul de a influența funcționarea acesteia și a obține modificarea mărimii de ieșire din proces, y, în conformitate cu sarcinile sistemului de reglare, compensând efectul perturbațiilor;

-P(IT) – procesul sau instalația tehnologică supusă automatizării. Sunt caracterizate prin una sau mai multe mărimi măsurabile pentru care se realizează sistemul de reglare automată. Mărimea din proces pentru care se realizează sistemul de reglare automată se numește mărime de ieșire sau mărime reglată.

-Y – perturbația care reprezintă orice mărime aplicată din exterior, alta decât mărimea de intrare, unui element al sistemului de reglare sau procesului, care tinde să influențeze marimea de ieșire y, și care nu poate fi modificată de către operatorul uman. Cele mai importante perturbații sunt cele care influențează desfașurarea procesului si ele vor fi luate în considerare.

-N – reprezintă o parte sau totalitatea procesului P prin care perturbația z influențează mărimea de ieșire.

-yy – contribuția perturbației asupra mărimii de ieșire.

Observație: Perturbațiile care acționeză asupra unui sistem sunt perturbații aditive sau parametrice. Perturbațiile aditive notate cu Pa intervin asupra instalației de automatizare și efectul lor poate fi eliminat cu ajutorul reacției negative. Perturbațiile parametrice notate cu P modifică relațiile matematice intrare – ieșire ale instalației. Efectul lor nu poate fi eliminat prin utilizarea reacției negative și se impune utilizarea unor structuri de sisteme adaptive care elaborează variabilele de decizie sau de comandă ținând seama de modificările care apar în comportamentul procesului sub influența perturbațiilor parametrice.

-TR – traductorul de reacție convertește mărimea de la ieșirea sa, y, care reprezintă mărimea reglată a sistemului într-o mărime de reacție yr care e compatibilă cu natura și domeniul de variație al mărimii prescrise (precum și al altor semnale din echipamentul de automatizare). Mărimea prescrisă și mărimea de reacție pot fi exprimate în unități ale semnalului unificat, de exemplu 4 – 20 mA sau 0 – 10 V

Traductoarele de cele mai multe ori realizează operații de calcul, liniarizări, filtrări pentru determinarea mărimii de reacție care să aproximeze cât mai bine mărimea reglată.

În anumite situații traductorul este urmat de un convertor sau adaptor cu scopul de a asigura mărimii de reacție yr o anumită natură fizică și un anumit interval de variație cerute de caracteristicile regulatorului.

Considerând că organul de reglare și elementul de execuție alcătuiesc un singur element fizic, reprezentat de către elementul de execuție și că nu este necesară prezența adaptoarelor sau convertoarelor

Figura 29 – Schema simplificata

Dacă se ține cont de faptul că pentru a influența performanțele sistemului, proiectantul are foarte puține posibilități de a modifica parametrii elementului de execuție EE, ai instalației tehnologice (sau procesului) IT(P) și traductorului TR, în raport cu posibilitățile de a alege structura și parametrii regulatorului, atunci aceste trei elemente pot fi considerate ca parte fizică a sistemului și va fi notată cu F.

Figura 30 – Structura sistem SRA

Variabila ce reprezintă abaterea sau eroarea sistemului de reglare se obține prin comparație prin diferența variabilei de intrare y*v și a variabilei de ieșire y. În acest caz eroarea este dată de relațiile:

Analiza în domeniul timpului, a sistemelor de reglare automată liniare și invariante , își propune ca pentru un sistem dat, să se determine variația mărimii de ieșire (răspunsul sistemului) pentru o variație a mărimii de intrare sau a perturbației și evaluarea performanțelor acestuia atât în regim staționar cât și în regim tranzitoriu de funcționare.

Pentru determinarea răspunsului unui sistem de reglare automată se pot utiliza :

ecuațiile diferențiale ce descriu funcționarea sistemului ;

funcția de transfer a sistemului în circuit închis.

În ambele situații la intrarea sistemului se aplica semnale tip al căror mod de variație în timp să aproximeze cât mai exact situațiile reale din sistemele de reglare automată. Aceste semnale standardizate permit să se obțină răspunsuri tipice ale sistemelor de reglare automată și pe baza lor să se aprecieze calitatea reglării unui sistem automat.

Cu toate acestea, în majoritatea cazurilor, teoria controlului liniar nu se pliază pe situațiile reale de implementare care, de cele mai multe ori, prezintă un răspuns neliniar. Pentru rezultate mai bune se pot aplica niște aproximări neliniare). Figura de mai jos arată cum un răspuns neliniar poate fi aproximat la un răspuns liniar.

Figura 31 – Aproximarea liniară a răspunsurilor liniare

Într-o lucrare numită ‘Attitude Estimation Using Low Cost Accelerometer and gyroscope’ (Estimarea atitudinii folosind un accelerometru și un giroscop ieftin) prezentată de către Young Soo Suh este arătat faptul că cei doi senzori diferiți, accelerometrul și giroscopul, care prezintă rezultate slabe atunci când sunt folosiți separat pentru a determina atitudinea care este menționată ca unghiul de rulare sau unghiul de incidență (pitch and roll angle). Factorul care contribuie la devierea rezultatului dorit al giroscopului se datorează termenului de alunecare. De vreme ce alunecarea crește cu timpul, erorile în datele de ieșire vor crește de asemenea.

Unul dintre dezavantajele folosirii individuale a accelerometrului este acela că dispozitivul este sensibil la vibrație de vreme ce vibrația conține multe componente de accelerație.

Senzorii folosiți:

Figura 32 – Accelerometrul

Accelerometrul:

Măsoară “accelerația”, de fapt forța pe unitatea de masă. (F = ma, deci a = F/m)

Poate fi folosit pentru măsurarea forței gravitaționale. În desenul de deasupra, axa X citește 0g, axa Y citește -1g

Poate fi folosit pentru măsurarea înclinării:

Figura 33 – Măsurarea înclinării

X acum simte puțin gravitația.

X citește ușor pozitiv X citește ușor negativ

Y simte mai puțin gravitatia, fapt pentru care nu furnizează o informație folositoare deoarece este mult mai puțin sensibilă la schimbările mici de unghi decât X și nu depinde de direcția înclinării.

Giroscopul:

Măsoară rata unghiulara (viteza rotației)

Citește “zero” atunci când staționează

Citește pozitiv sau negativ atunci când se rotește

Citirea valorilor senzorilor:

Primul pas este citirea intrărilor analogice (prin intermediul convertorului analog digital, ADC) pentru fiecare senzor și transformarea în unități folositoare. Acest lucru presupune ajustări pentru deviație și scalare:

deviația este usor de aflat: se ia valoarea întreagă pe care o citește senzorul atunci când se află în poziție orizontală și/sau staționară. Dacă oscilează, se alege o valoare medie. Deviația ar trebui să fie o variabilă de tip signed int (sau constantă).

scalarea depinde de senzor. Este factorul cu care trebuie să se înmulțească pentru a obține unitățile dorite (grade sau radiani). Aceasta poate fi găsit în foaia de date a senzorilor sau prin experiment. Uneori este denumită constanta senzorului, câstig sau sensibilitate (the sensor constant, gain, or sensitivity). Scalarea ar trebui să fie o variabilă de tip float (sau constantă).

x_acc_ADC; tip signed int; 10-bit (0-1023); citește din ADC

giro_ADC; tip signed int; 10-bit (0-1023); citește din ADC

x_acc = (float)(x_acc_ADC – x_acc_deviatie) * x_acc_scala; x_acc – tip float

giro = (float)(giro_ADC – giro_deviatie) * giro_scala; giro – tip float

Dacă ar trebui să facem o estimare a unghiului pentru o rotație de 360º, ar fi folositor să avem măsura de pe axa Y, dar nu neaparat. Cu aceasta am putea folosi trigonometria pentru a afla tangenta inversă a citirii celor două axe și să calculăm unghiul. Fără aceasta, putem folosi în continuare sinusul sau cosinusul și doar axa X pentru a afla unghiul, de vreme ce cunostem magnitudinea gravitației (magnitude of gravity). Dar trigonometria omoara timpul procesorului și este neliniară așa că, dacă se poate, ar trebui evitată.

Pentru echilibrarea platformei cele mai importante unghiuri care trebuiesc măsurate sunt aproape verticale. Dacă platforma se apleacă mai mult de 30º în oricare direcție, este probabil ca microcontrolerul să nu poata face mare lucru în afară de a se deplasa cu viteză maximă pentru a încerca să prindă platforma. În această fereastră, putem folosi aproximarea unghiului mic și axa X pentru a ajuta procesorul să economisească timp și a ușura complexitatea procesului de codare (vezi Figura 30, prima reprezentare). Platforma este înclinată în față la un unghi θ, dar se afla în poziție staționară (nu accelerează pe plan orizontal). Axa X citește: (1g) x sin (θ); aproximarea unghiului mic: sin(θ) ≈ θ, în radiani, funcționează (în 5%) până la θ = ±π/6 = ±30º. Așa că în urmatoarea parte de cod, x_acc = (float) (x_acc_ADC – x_acc_deviatie) * x_acc_scala; x_acc va fi unghiul în radiani dacă x_acc_scala este setat să scaleze ieșirea la t0 1[g] unde axa X este îndreptată drept în jos. Pentru a obține unghiul în grade, x_acc_scala ar trebui înmulțit cu 180/π.

Pentru a controla platforma, ar trebui să cunoaștem atât unghiul cât și viteza unghiulară a platformei de baza. Asta ar purea constitui baza pentru un algoritm de control al unghiului PD (proportional/derivativ) care s-a dovedit că funcționează bine pentru acest tip de sistem. Exemplu:

Ieșire motor = Kp x (Unghi) + Kd x (Viteza unghiulară)

Ce face cu exactitate ieșirea motor este o altă poveste. Dar idea generală este că această setare de control poate fi modificată cu Kp și Kd pentru a oferi stabilitate și o performantă bună. Este mult mai puțin probabil să se depășească punctul orizontal decât în cazul folosirii unui controler proportional (dacă unghiul este pozitiv dar viteza unghiulară este negativă, ex. Se întoarce spre a fi orizontal, motoarele sunt încetinite dinainte).

Maparea senzorilor

Figura 36 – Maparea senzorilor

Care este cea mai buna variantă?

Figura 37 – Maparea senzorilor; cea mai evidentă metodă

Figura 38 – Maparea senzorilor; o soluție rapidă dar ineficientă

Ar putea fi la fel de simplu să se facă media pe valori: Unghi = (0.9)*(unghi) + (0.1)*(x_acc); 0.9 și 0.1 sunt valori luate ca exemplu. Acestea ar putea fi modificate penru a schimba constanta de timp a filtrului după bunul plac.

Figura 39 – Maparea senzorilor; metoda unui singur senzor

Distanța = viteză * timp; această formula transpusă în cod ar fi: unghi = unghi+giro*Δt. Pentru acest lucru este însă necesar a se cunoaște intervalele de timp dintre citiri (Δt).

Figura 40 – Maparea senzorilor; filtrul Kalman

Figura 41 – Maparea senzorilor; filtrul complementar

unghi = (0.99) * (unghi + giro * Δt) + (0.01) * (x_acc);

Integrarea: Este destul de ușor de înțeles. Situația este similară cu cea a unei mașini care merge cu o viteză cunoscută și programul este un ceas care ticăie o dată la câteva milisecunde. Pentru a adopta o poziție nouă la fiecare ticăitură, se ia poziția veche și se adaugă schimbarea de poziție. Schimbarea în poziție este fix viteza mașinii înmulțită cu timpul de la ultima ticăitură, care se poate obține de la cronometrul de pe microcontroler sau oricare alt cronometru cunoscut. În cod:

poziție += viteză * Δt;, sau pentru o platformă în echilibru, unghi += giro * Δt;

Filtrul Low-Pass: Scopul filtrului low-pass este doar acela de a lasa să treacă schimbările pe termen lung, filtrând fluctuațiile pe termen scurt. O modalitate de a face acest lucru este să se forțeze schimbările să se construiască puțin câte puțin în perioade subsecvente prin bucla programului. În cod: unghi = (0.99) * unghi + (0.01) * x_acc;

Dacă, de exemplu, unghiul începe la zero și citirea accelerometrului sare brusc la 10º, estimarea unghiului se schimbă în iterații subsecvente astfel:

Dacă senzorul rămâne la 10º, estimarea unghiului va creste până când egalează acea valoare. Timpul necesar pentru atingerea valorii întregi depinde atât de constantele filtrului (0.99 și 0.01) cât și de durata unui ciclu de program (Δt).

Filtrul High-Pass: Teoria acestui fitru este puțin mai greu de explicat decât teoria de la filtrul low-pass dar din punct de vedere conceptual face fix opusul lui: permite trecerea semnalelor de scurtă durată în timp ce filtrează semnalele care sunt stabile de-a lungul timpului. Acest lucru poate fi folosit pentru anularea deviației.

Perioada de execuție: Perioada de timp care trece între fiecare buclă a programului. Dacă viteza de operare este de 100 Hz, perioada de execuție este de 0.01 sec.

Constanta de timp: Constanta de timp a unui filtru reprezintă durata relativă a semnalului asupra căruia va acționa. Pentru un filtru low-pass semnalele care durează mai mult decât constanta de timp trec nemodificate în timp ce semnalele mai scurte decât constanta de timp sunt filtrate. Constanta de timp, τ, a unui filtru digital low-pass, y = (a) * (y) + (1-a) * (x);, care funcționează într-o buclă cu perioada de execuție, Δt, poate fi întâlnită astfel:

Așadar, dacă se cunoaște constanta de timp dorită și viteza de operare, se poate alege coeficientul filtrului.

Filtrul complementar: Acest lucru înseamnă doar că cele două parți ale filtrului se completează mereu astfel încât ieșirea să fie o estimare exactă, liniara în unități care au sens.

unghi = (0.99) * (unghi + giro * Δt) + (0.01) * (x_acc);

(unghi + giro * Δt) – integrare

(0.01) * (x_acc) – partea low-pass acționând asupra accelerometrului

(0.99) * (unghi + giro * Δt) – filtrul high-pass pentru estimarea unghiului giroscopului integrat

Dacă acest filtru ar fi funcționat într-o buclă care se execută de 100 de ori pe secundă, constanta de timp, atât pentru filtrul low-pass cât și pentru filtrul high-pass, ar fi:

Acest lucru arată unde este poziționată granița de încredere dintre giroscop și accelerometru. Pentru perioade de timp mai scurte de 0.99 secunde, integrarea giroscopului are prioritate și accelerațiile orizontale zgomotoase sunt filtrate. Pentru perioade de timp mai mari de 0.99 secunde media accelerometrului cântărește mai mult decât giroscopul, care poate să fi alunecat până în acest moment. În cele mai multe cazuri, construirea filtrului funcționează de obicei invers. Întâi se alege o constantă de timp și apoi se foloseste aceasta pentru a calcula coeficienții filtrului. Atunci când se alege constanta de timp este momentul în se poate manipula răspunsul. Dacă giroscopul alunecă în medie 2º pe secundă (probabil o estimare a celui mai rău caz), probabil constanta de timp trebuie să fie mai mică de o secundă în asa fel încât să existe garanția că nu va aluneca niciodată mai mult de două grade în fiecare directie. Dar cu cât constanta de timp este mai mică, cu atât i se va permite mai mult zgomotului accelerației orizontale să treacă. Ca în multe alte situații de control, există un compromis și singura cale de a optimiza procesul este să se experimenteze.

Software

Figura 42 – Proiectare program

Faza de programare a fost așteptată pentru a finaliza aplicația ce va controla sistemul. Programul microcontrolerului s-a concentrat în primul rând pe controlul ansamblului și astfel pe menținerea echilibrului acestuia. Acest lucru a fost realizat prin citirea diferitelor intrări analogice și asigurarea unui semnal de ieșire capabil să controleze motorul.

Prima încercare de programare a fost efectuată în limbaj de asamblare dar această încercare nu a reușit să obțină rezultate viabile într-un interval de timp rezonabil, moment în care am luat decizia de a scrie programul în limbajul C.

Programul software are trei părți principale:

Initializare() – scopul acestei secvențe este de a pregăti microcontrolerul pentru rularea programului; setează corespunzător fiecare componentă a microcontrolerului ce urmează a fi folosită în rularea programului

Setare_Constante() – scopul acestei secvențe este de a calcula kp, ki, kd

PID() – scopul acestei secvențe este de a implementa legea de autoreglare și astfel de a menține echilibrul sistemului

Figura 43 – Bucla de control

Asamblarea

După ce toate componentele funcționau independent pe breadboard a sosit momentul montării acestora pe șasiul robotului. Acesta era confectionat din plexiglas cu îmbinări metalice. Cutia de viteze dubla Tamiya 70168 si cele două roți Pololu au fost baza robotului si ceea ce i-a dat viață

Figura 44 – Cutia de viteze dubla Tamiya 70168

O etape destul de dificilă s-a dovedit a fi alegerea vitezei corespunzătoare care să fie îmbinarea perfectă dintre cuplu și viteza necesarăa pentru mișcarea sistemului. Acest lucru a necesitat atât dese modificări de natură mecanică dar și modificări software. Și roțile au avut un rol desul de important în succesul sistemului, acestea trebuind să fie sufcient de înalte încât să permită balansul robotului, dar nu foarte înalte pentru a nu pierde din cuplul motoarelor.

Figura 45 – Roți Pololu

O privire foarte simplificată asupra modului de îmbinare al elementelor electronice poate fi observată in Figura 43. Motoarele sunt alimentate separat de două baterii de 9 V legate în paralel astfel încât tensiunea livrată să rămâna tot 9 V, dar capacitatea ansamblului să fie dublu. O altă baterie de 9 V, se conectează la un regulator de tensiune 7805 pentru a oferi microcontrolerului si celorlalte componente electronice tensiunea nominală de alimentare de 5 V.

Figura 46 – Schema de conectare a componentelor electronice

Întregul efort a a condus la realizarea robotului pe două roți ce își menține echilibrul.

Figura 47 – Robotul pe două roți

Concluzii

Concluziile și recomandările sunt necesare pentru a oferi informații asupra fiecărui aspect abordat în proiect. Analiza și etapa de evaluarea au furnizat informații specifice care pot fi folosite pentru a stabili reușita câtorva domenii cheie ale performanței. Aceasta este apoi extinsă în mai multe recomandări pentru îmbunătățiri, adăugarea de capabilități suplimentare și zone viitoare de investigație. Aceasta oferă, de asemenea, posibilitatea de a împărtăși o conștientizare a problemelor întâmpinate care ar completa viitoarele recomandări de lucru.

Analiza datelor efectuată a fost inițiată pentru a oferi o evaluare rezonabilă și evaluarea capacității robotului de a îndeplini obiectivele sale. Revizuirea analizei efectuate au sugerat că procesul de pre-dezvoltare software ar fi putut fi îndeplinit cu mai mult succes dacă se implementa și o etapa de simulare.

Dificultati intampinate:

Dificultățile întâmpinate pe parcursul proiectului includ teoria, hardware, software și probleme legate de programare. Principala dificultate teoretică întâlnită a fost asociată cu înțelegerea funcționării și matematica din spatele tehnicii de filtrare. Acest lucru a fost necesar pentru punerea în aplicare a fuziunii dintre senzorii de inerție, în cadrul programului software. Acest aspect ar fi avut nevoie de timp substanțial pentru a corecta abordarea.

Înțelegerea aprofundată a sistemelor de autoreglare și implementarea lor a părut a dura destul de mult timp în faza incipială a proiectului.

Cutia de viteze a fost livrata din SUA, și a durat mai mult, ceea ce a dus la o întârziere a etapei de asamblare pentru o perioada. În acest moment nu este clar dacă motoarele, împreuna cu ansamblul reductor sunt alegerea potrivită pentru a derula și alte sarcini.

O altă dificultate a fost reprezentată de lipsa experienței în lucrul cu componente electronice, cum ar fi regulatoarele de tensiune 7805. Din cauza nesigurantei, acestea au fost și ultimele piese comandate pentru ansamblu.

Programarea microcontrolerului s-a dovedit a fi cea mai dificilă provocare a întregului proiect. Deși eram familiar cu limbajul de programare C, initializările hardware și algoritmii de control au cauzat consum excesiv de timp pentru proiect.

Construirea unui robot cu două roți a oferit un mod diferit și provocator de a manevra un robot. Menținerea echilibrului a fost în strânsă legatură cu distribuția greutății. Modificări legate de diametrul roților, distribuția greutății și dimensiunea bazei trebuie să fie abordate. Trebuie ținut cont de posibilitatea necesității de alte reductoare pentru asigurarea cuplului necesar deplasarii ansamblului.

O greseală de proiectare a fost decizia de a nu distribui uniform greutatea pe suprafața robotului. Deși inițial acest lucru a fost făcut intenționat, pentru a accentua posibilele rezultatele, aceasta idee s-a dovedit a fi generatoare de multe probleme care au costat timp.

Sistemele cu o singură axă capabile să își mențină echilibrul sunt capabile de acest lucru în anumite conditii. Una dintre cele mai importante limitări, folosind doar un accelerometru și un giroscop, a fost imposibilitatea de a face diferența între accelerația gravitațională și accelerația imprimată artificial sistemului. Există o mulțime de accelerații datorită deplasării sistemului, aparute în urma vibrațiilor ce sunt înregistrate de senzori. A mai contribuit la probleme și faptul că accelerometrele de la Freescale nu sunt printre cele mai precise. Pe viitor se poate implementa sistemul folosind encodere pe roti, astfel încât să se poata face distinctia clar între tipurile de accelerație ce acționează asupra ansamblului.

Sistemele cu o singură axă capabile să își mențină echilibrul sunt capabile de acest lucru în anumite conditii. Una dintre cele mai importante limitări, folosind doar un accelerometru și un giroscop, a fost imposibilitatea de a face diferența între accelerația gravitațională și accelerația imprimată artificial sistemului. Există o mulțime de accelerații datorită deplasării sistemului, aparute în urma vibrațiilor ce sunt înregistrate de senzori. A mai contribuit la probleme și faptul că accelerometrele de la Freescale nu sunt printre cele mai precise. Pe viitor se poate implementa sistemul folosind encodere pe roti, astfel încât să se poata face distinctia clar între tipurile de accelerație ce acționează asupra ansamblului.

La începutul proiectului, așteptările au fost destul de substanțiale. Scopul a fost de a dezvolta un robot care este capabil să își mențină echilibrul în timp ce primeste și indicații de deplasare de la utilizator. Dar pe măsură ce problemele și dificultățile au început să devină tot mai evidente în programare, așteptările s-au redus la a oferi pur și simplu un robot care ar putea să își mențină echilibrul. Proiectul în ansamblu a fost un succes în livrarea unui robot pe două roți capabil să își mențină echilibrul.

Îmbunătățiri aduse versiunii curente a robotului pot fi ușor de realizat prin programarea microcontrolerelor. Acest lucru ar oferi beneficii fundamentale în timpul de răspuns al sistemului și al eficienței calculelor, dar și al performanței globale. Implementarea unui encoder ar oferi o stabilitate mult îmbunătățită sistemului și ar petmite o menținere a stării de echilibru pentru o mai lungă perioadă de timp.

Bibliografie

[ANG07] – Fundamentals of Robotic Mechanical Systems, J. Angeles 2007, New York

[BER03] – Anatomy of a Robot, McGraw-Hill, C. Bergren, 2003, Sydney

[BIS02] – The Mechatronics Handbook, CRC Press, R. Bishop, 2002, London

[BRA06] – Embedded Robotics, T. Braunl, 2006, Springer, Perth

[IOV04] – PIC Robotics, J. Iovine, 2004, Sydney

[Milan08] – PIC Microcontrollers, Milan Verle, mikroElektronika; 2008

[STO07] – Intelligent Autonomous Robotics – A Robot Soccer Case Study, P. Stone, 2007, Austin

[XIE03] – Fundamentals of Robotics – Linking Perception to Action, World Scientific Publishing, M. Xie, 2003, London.

Referințe web

[DM11] – Despre microcontrolere, www.ppic.go.ro, 2011, disponibil la adresa http://www.ppic.go.ro/indexro.htm

[FS] – www.freescale.com

[FS08] – Specificațiile accelerometrului MMA7361, freescale.com, 2008, disponibil online la adresa http://www.freescale.com/files/sensors/doc/data_sheet/MMA7361L.pdf

[IS12] – Specificațiile tehnice ale giroscopului InvenSense MPU-6050, Invensense.com, Septembrie 2012, disponibil online la adresa http://www.invensense.com/mems/gyro/mpu6050.html

[MC] – www.microchip.com

[PWM11] – PWM, Universitatea Tehnică Cluj, 2011 disponibil online la adresa http://mce.utcluj.ro/lucrari/PWM.doc

[SCI09] – Cum funcționează giroscopul?, Scientia.ro, Ianuarie 2009, disponibil online la adresa http://www.scientia.ro/tehnologie/39-cum-functioneaza-lucrurile/177-cum-functioneaza-giroscopul.html

[SLRB] – www.solarobotics.com

[STE12] – Ce este Puntea H, Electronic Ștefan, Ianuarie 2012, disponibil online la adresa http://www.electronicstefan.ro/2012/01/ce-este-puntea-h/

[WP10] – Wikipedia.org, Accelerometrul, 2010, disponibil la adresa http://en.wikipedia.org/wiki/Accelerometer

Codul sursă

#include <pic.h>

#include <pic16f887.h>

#include <stdlib.h>

#include <math.h>

void Initializare();

void PID();

void Setare_Constante();

bit PID_adevatar;

signed char en3, en2, en1, en0, val1_char, val2_char, înclinare;

unsigned short int ki, kd, kp;

unsigned char temp_char;

short int temp_integer;

signed int SumaEroare_Min, SumaEroare_Max, SumaEroare, term_integrator, term_derivativ, un;

signed long Cn;

//***************************************************************************

//Main() – Secvența principală

//***************************************************************************

void main()

{

Initializare(); //Initializează microcontrolerul PIC16F887

Setare_Constante(); //Obține coeficienții PID ki, kp și kd

while(1) //Ciclează mereu

{

if(PID_adevatar){

PID();

}

}

}

//***************************************************************************

//Initializare – Secvență de inițializare

//***************************************************************************

void Initializare()

{

PORTA = 0;

TRISA = 0b00101101; // Setează RA4 și RA2 ca ieșiri

PORTC = 0;

TRISC = 0b00000011; // Seteaza RC0 și RC1 ca intrări, restul ca ieșiri

CMCON0 = 0x07; // Dezactivează comparatorul

IRCF0 = 1; // Folosit pentru a seta viteza oscilatorului intern la 8 MHz

IRCF1 = 1; // Folosit pentru a seta viteza oscilatorului intern la 8 MHz

IRCF2 = 1; // Folosit pentru a seta viteza oscilatorului intern la 8 MHz

CCP1CON = 0b01001100; // Full bridge PWM inainte

ECCPAS = 0; // Inchiderea automata este dezactivată momentan

PR2 = 0x3F; // Setează perioada PWM la 31.2 kHz

T2CON = 0; // TMR2 închis fără scalare

CCPR1L = 0; // Setează ciclul de lucru la zero

TMR2ON = 1; // Pornește timerul2

ANSEL = 0b00110101; // Configurează AN0,AN2,AN4 și AN5 ca pini analogici

VCFG = 0; // Folosește Vdd ca Ref

ADFM = 1; // Rezultatul A/D justificat corect

ADCS0 = 1; // 16 TOSC scalat

ADCS1 = 0;

ADCS2 = 1;

CHS0 = 0; // Selectarea canalului AN0

CHS1 = 0;

CHS2 = 0;

ADON = 1; //Pornește A/D

en0 = en1 = en2 = en3 = val1_char = val2_char =0;

ki = kd = 0;

kp = inclinare = 0;

temp_integer = term_integrator = term_derivativ = un =0;

SumaEroare_Max = 30000;

SumaEroare_Min = 1 – SumaEroare_Max;

PID_adevatar = 1; // Permite realizarea funcției PID

T0CS = 0; // Timerul0 ca timer

TMR0 = 10; // Preîncarcă valoare

PSA = 0; // Scalare la Timer0

PS0 = 0; // Scalare la 32 => 256 Hz

PS1 = 0;

PS2 = 1;

INTCON = 0;

PIE1 = 0;

T0IE = 1; // Activează int Timer0

GIE = 1;

return;

}

//***************************************************************************

//PID – Secvența de autoreglare

//***************************************************************************

void PID() // Formula PID este C(n) = K(E(n) + (Ts/Ti)SumaEroare + (Td/Ts)[E(n) – E(n-1)])

{

term_integrator = term_derivativ = 0;

// Calcularea termenului integrator

SumaEroare = SumaEroare + en0; // SumaEroare este suma termenilor de eroare

if(SumaEroare > SumaEroare_Max){ // Testează dacă suma este prea mare

SumaEroare = SumaEroare_Max;

}

if(SumaEroare < SumaEroare_Min){ // Testează dacă suma este prea mică

SumaEroare = SumaEroare_Min;

} // Termenul integral este (Ts/Ti)*SumaEroare unde Ti este Kp/Ki

// și Ts este perioada de probă

// Ecuația folosită pentru calcularea termenului integral este

// Ki*SumaEroare/(Kp*Fs*X) unde X este un factor de demultiplicare necunoscut

// și Fs este frecvența de probă

term_integrator = SumaEroare / 256; // Împarte cu frecvența folosită

term_integrator = term_integrator * ki; // Multiplică Ki

term_integrator = term_integrator / 16; // combinarea unui factor de demultiplicare și a Kp

// Calcularea termenului derivativ

term_derivativ = en0 – en3;

if(term_derivativ > 120){ // Testeaza dacă e prea mare

term_derivativ = 120;

}

if(term_derivativ < -120){ // testeaza dacă e prea mic

term_derivativ = -120;

} // Calculeaza termenul derivativ folosind (Td/Ts)[E(n) – E(n-1)]

// Unde Td este Kd/Kp

// Ecuatia folosită este Kd(en0-en3)/(Kp*X*3*Ts)

term_derivativ = term_derivativ * kd; // unde X este un factor de demultiplicare necunoscut

term_derivativ = term_derivativ >> 5; // împarte cu 32 Kp*X*3*Ts pre-calcultați

if(term_derivativ > 120){

term_derivativ = 120;

}

if(term_derivativ < -120){

term_derivativ = -120;

}

// C(n) = K(E(n) + (Ts/Ti)SumaEroare + (Td/Ts)[E(n) – E(n-1)])

Cn = en0 + term_integrator + term_derivativ; // adună termenii

Cn = Cn * kp / 1024; // înmultește cu Kp apoi scalează

if(Cn >= 1000) // folosit pentru limitarea ciclului de lucru

{

Cn = 1000;

}

if(Cn <= -1000)

{

Cn = -1000;

}

if(Cn == 0){ // Setează viteza PWM

DC1B1 = DC1B1 = 0;

CCPR1L = 0;

}

if(Cn > 0){ // Motorul ar trebui să mearga în față și să seteze ciclul de lucru pe Cn

P1M1 = 0; // Motorul merge în față

temp_char = Cn;

if(temp_char^0b00000001){

DC1B0 = 1;

}

else{

DC1B0 = 0;

}

if(temp_char^0b00000010){

DC1B1 = 1;

}

else{

DC1B1 = 0;

}

CCPR1L = Cn >> 2; // Folosit pentru a împiedica pendulul să se miste în continuu

inclinare = inclinare +1; // înclinarea este folosită pentru a ajusta unghiul pendulului făcându-l puțin

if(inclinare > 55){ // mai mare decat este de fapt

inclinare = 55;

}

}

else { // Motorul ar trebui să mearga înapoi și să seteze ciclul de lucru pe Cn

P1M1 = 1; // Motorul merge înapoi

temp_integer = abs(Cn); // Intoarce valoarea int absolută a Cn

temp_char = temp_integer; // Int to char pentru bitul cel mai puțin semnificativ

if(temp_char^0b00000001){

DC1B0 = 1;

}

else{

DC1B0 = 0;

}

if(temp_char^0b00000010){

DC1B1 = 1;

}

else{

DC1B1 = 0;

}

CCPR1L = temp_integer >> 2; // Folosit pentru a împiedica pendulul să se miste în continuu

inclinare = inclinare -1;

if(inclinare < -55){

inclinare = -55;

}

}

en3 = en2; // comutează semnalele de eroare

en2 = en1;

en1 = en0;

en0 = 0;

PID_adevatar = 0; // Gata

RA4 = 0; // Testează steagul pentru a măsura viteza

return;

}

//***************************************************************************

//Setare_Constante – Secvența de obținere a coeficienților PID ki, kp și kd

//***************************************************************************

void Setare_Constante()

{

ANS2 = 1; // Configurează AN2 ca analog

ANS4 = 1; // Configurează AN4 ca analog

ANS5 = 1; // Configurează AN5 ca analog

ADFM = 1; // Rezultatul A/D bine justificat

CHS0 = 0; // Selectează canalul AN4

CHS1 = 0;

CHS2 = 1;

temp_char = 200; // dă întârziere

while(temp_char){

temp_char–;

}

GODONE = 1;

while(GODONE);{

temp_char = 0; // Nu face nimic…..

}

ki = ADRESH << 8; // Înregistrează rezultatul A/D în ki

ki = ki + ADRESL;

CHS0 = 1; // seletează canalul AN5

CHS1 = 0;

CHS2 = 1;

temp_char = 200; // dă întârziere

while(temp_char){

temp_char–;

}

GODONE = 1;

while(GODONE);{

temp_char = 0; // nu face nimic…..

}

kd = ADRESH << 8; // Înregistrează rezultatul A/D în constanta kd

kd = kd + ADRESL;

CHS0 = 0; // Selectează canalul AN2

CHS1 = 1;

CHS2 = 0;

temp_char = 200; // Dă întârziere

while(temp_char){

temp_char–;

}

GODONE = 1;

while(GODONE);{

temp_char = 0; // Nu face nimic …..

}

kp = ADRESH << 8; // Înregistrează rezultatul A/D în kp

kp = kp + ADRESL;

CHS0 = 0; // Selectează canalul AN0

CHS1 = 0;

CHS2 = 0;

}

//***************************************************************************

//interrupt Isr() – Rutina de tratare a întreruperilor

//***************************************************************************

void interrupt Isr()

{

if(T0IF&&T0IE){

TMR0 = 10; // valoarea prestabilită

T0IF = 0; // Sterge steagul de inițializare

RA4 = 1;

temp_integer = 0;

temp_integer = ADRESH << 8; // Înregistrează rezultatul A/D cu deviație

temp_integer = temp_integer + ADRESL – 512;

en0 = temp_integer + inclinare/8; // Înregistreză funcția de eroare presupunand că nu există over-flow

PID_adevatar = 1; // Autorizat să efectueze funcția PID

GODONE = 1; // pornește următorul ciclu A/D

}

else

{

PIR1 = 0;

RAIF = 0;

INTF = 0;

}

if(temp_integer > 180){ //Verifică dacă eroarea este prea mare (pozitiv)

DC1B0 = DC1B1 = 0; // Stop PWM

CCPR1L = 0;

en0 = en1 = en2 = en3 = val1_char = val2_char = inclinare = 0; // Șterge toate constantele PID

Cn = term_integrator = term_derivativ = SumaEroare = RA4 = 0;

PID_adevatar = 0; // Încetează să facă PID

}

if(temp_integer < -180){ //Verifică dacă eroarea este prea mare (negativ)

DC1B0 = DC1B1 = 0; // Stop PWM

CCPR1L = 0;

en0 = en1 = en2 = en3 = val1_char = val2_char = inclinare = 0; // Sterge toate constantele PID

Cn = term_integrator = term_derivativ = SumaEroare = RA4 = 0;

PID_adevatar = 0; // Încetează să facă PID

}

}

CD / DVD

Autorul atașează în această anexă obligatorie, versiunea electronică a aplicației, a acestei lucrări, precum și prezentarea finală a tezei.

Index

B

Bibliografie 60

C

CUPRINSUL xi

L

LISTA FIGURILOR xii

LISTA TABELELOR xiv

R

Referințe web 61

Bibliografie

[ANG07] – Fundamentals of Robotic Mechanical Systems, J. Angeles 2007, New York

[BER03] – Anatomy of a Robot, McGraw-Hill, C. Bergren, 2003, Sydney

[BIS02] – The Mechatronics Handbook, CRC Press, R. Bishop, 2002, London

[BRA06] – Embedded Robotics, T. Braunl, 2006, Springer, Perth

[IOV04] – PIC Robotics, J. Iovine, 2004, Sydney

[Milan08] – PIC Microcontrollers, Milan Verle, mikroElektronika; 2008

[STO07] – Intelligent Autonomous Robotics – A Robot Soccer Case Study, P. Stone, 2007, Austin

[XIE03] – Fundamentals of Robotics – Linking Perception to Action, World Scientific Publishing, M. Xie, 2003, London.

Referințe web

[DM11] – Despre microcontrolere, www.ppic.go.ro, 2011, disponibil la adresa http://www.ppic.go.ro/indexro.htm

[FS] – www.freescale.com

[FS08] – Specificațiile accelerometrului MMA7361, freescale.com, 2008, disponibil online la adresa http://www.freescale.com/files/sensors/doc/data_sheet/MMA7361L.pdf

[IS12] – Specificațiile tehnice ale giroscopului InvenSense MPU-6050, Invensense.com, Septembrie 2012, disponibil online la adresa http://www.invensense.com/mems/gyro/mpu6050.html

[MC] – www.microchip.com

[PWM11] – PWM, Universitatea Tehnică Cluj, 2011 disponibil online la adresa http://mce.utcluj.ro/lucrari/PWM.doc

[SCI09] – Cum funcționează giroscopul?, Scientia.ro, Ianuarie 2009, disponibil online la adresa http://www.scientia.ro/tehnologie/39-cum-functioneaza-lucrurile/177-cum-functioneaza-giroscopul.html

[SLRB] – www.solarobotics.com

[STE12] – Ce este Puntea H, Electronic Ștefan, Ianuarie 2012, disponibil online la adresa http://www.electronicstefan.ro/2012/01/ce-este-puntea-h/

[WP10] – Wikipedia.org, Accelerometrul, 2010, disponibil la adresa http://en.wikipedia.org/wiki/Accelerometer

Codul sursă

#include <pic.h>

#include <pic16f887.h>

#include <stdlib.h>

#include <math.h>

void Initializare();

void PID();

void Setare_Constante();

bit PID_adevatar;

signed char en3, en2, en1, en0, val1_char, val2_char, înclinare;

unsigned short int ki, kd, kp;

unsigned char temp_char;

short int temp_integer;

signed int SumaEroare_Min, SumaEroare_Max, SumaEroare, term_integrator, term_derivativ, un;

signed long Cn;

//***************************************************************************

//Main() – Secvența principală

//***************************************************************************

void main()

{

Initializare(); //Initializează microcontrolerul PIC16F887

Setare_Constante(); //Obține coeficienții PID ki, kp și kd

while(1) //Ciclează mereu

{

if(PID_adevatar){

PID();

}

}

}

//***************************************************************************

//Initializare – Secvență de inițializare

//***************************************************************************

void Initializare()

{

PORTA = 0;

TRISA = 0b00101101; // Setează RA4 și RA2 ca ieșiri

PORTC = 0;

TRISC = 0b00000011; // Seteaza RC0 și RC1 ca intrări, restul ca ieșiri

CMCON0 = 0x07; // Dezactivează comparatorul

IRCF0 = 1; // Folosit pentru a seta viteza oscilatorului intern la 8 MHz

IRCF1 = 1; // Folosit pentru a seta viteza oscilatorului intern la 8 MHz

IRCF2 = 1; // Folosit pentru a seta viteza oscilatorului intern la 8 MHz

CCP1CON = 0b01001100; // Full bridge PWM inainte

ECCPAS = 0; // Inchiderea automata este dezactivată momentan

PR2 = 0x3F; // Setează perioada PWM la 31.2 kHz

T2CON = 0; // TMR2 închis fără scalare

CCPR1L = 0; // Setează ciclul de lucru la zero

TMR2ON = 1; // Pornește timerul2

ANSEL = 0b00110101; // Configurează AN0,AN2,AN4 și AN5 ca pini analogici

VCFG = 0; // Folosește Vdd ca Ref

ADFM = 1; // Rezultatul A/D justificat corect

ADCS0 = 1; // 16 TOSC scalat

ADCS1 = 0;

ADCS2 = 1;

CHS0 = 0; // Selectarea canalului AN0

CHS1 = 0;

CHS2 = 0;

ADON = 1; //Pornește A/D

en0 = en1 = en2 = en3 = val1_char = val2_char =0;

ki = kd = 0;

kp = inclinare = 0;

temp_integer = term_integrator = term_derivativ = un =0;

SumaEroare_Max = 30000;

SumaEroare_Min = 1 – SumaEroare_Max;

PID_adevatar = 1; // Permite realizarea funcției PID

T0CS = 0; // Timerul0 ca timer

TMR0 = 10; // Preîncarcă valoare

PSA = 0; // Scalare la Timer0

PS0 = 0; // Scalare la 32 => 256 Hz

PS1 = 0;

PS2 = 1;

INTCON = 0;

PIE1 = 0;

T0IE = 1; // Activează int Timer0

GIE = 1;

return;

}

//***************************************************************************

//PID – Secvența de autoreglare

//***************************************************************************

void PID() // Formula PID este C(n) = K(E(n) + (Ts/Ti)SumaEroare + (Td/Ts)[E(n) – E(n-1)])

{

term_integrator = term_derivativ = 0;

// Calcularea termenului integrator

SumaEroare = SumaEroare + en0; // SumaEroare este suma termenilor de eroare

if(SumaEroare > SumaEroare_Max){ // Testează dacă suma este prea mare

SumaEroare = SumaEroare_Max;

}

if(SumaEroare < SumaEroare_Min){ // Testează dacă suma este prea mică

SumaEroare = SumaEroare_Min;

} // Termenul integral este (Ts/Ti)*SumaEroare unde Ti este Kp/Ki

// și Ts este perioada de probă

// Ecuația folosită pentru calcularea termenului integral este

// Ki*SumaEroare/(Kp*Fs*X) unde X este un factor de demultiplicare necunoscut

// și Fs este frecvența de probă

term_integrator = SumaEroare / 256; // Împarte cu frecvența folosită

term_integrator = term_integrator * ki; // Multiplică Ki

term_integrator = term_integrator / 16; // combinarea unui factor de demultiplicare și a Kp

// Calcularea termenului derivativ

term_derivativ = en0 – en3;

if(term_derivativ > 120){ // Testeaza dacă e prea mare

term_derivativ = 120;

}

if(term_derivativ < -120){ // testeaza dacă e prea mic

term_derivativ = -120;

} // Calculeaza termenul derivativ folosind (Td/Ts)[E(n) – E(n-1)]

// Unde Td este Kd/Kp

// Ecuatia folosită este Kd(en0-en3)/(Kp*X*3*Ts)

term_derivativ = term_derivativ * kd; // unde X este un factor de demultiplicare necunoscut

term_derivativ = term_derivativ >> 5; // împarte cu 32 Kp*X*3*Ts pre-calcultați

if(term_derivativ > 120){

term_derivativ = 120;

}

if(term_derivativ < -120){

term_derivativ = -120;

}

// C(n) = K(E(n) + (Ts/Ti)SumaEroare + (Td/Ts)[E(n) – E(n-1)])

Cn = en0 + term_integrator + term_derivativ; // adună termenii

Cn = Cn * kp / 1024; // înmultește cu Kp apoi scalează

if(Cn >= 1000) // folosit pentru limitarea ciclului de lucru

{

Cn = 1000;

}

if(Cn <= -1000)

{

Cn = -1000;

}

if(Cn == 0){ // Setează viteza PWM

DC1B1 = DC1B1 = 0;

CCPR1L = 0;

}

if(Cn > 0){ // Motorul ar trebui să mearga în față și să seteze ciclul de lucru pe Cn

P1M1 = 0; // Motorul merge în față

temp_char = Cn;

if(temp_char^0b00000001){

DC1B0 = 1;

}

else{

DC1B0 = 0;

}

if(temp_char^0b00000010){

DC1B1 = 1;

}

else{

DC1B1 = 0;

}

CCPR1L = Cn >> 2; // Folosit pentru a împiedica pendulul să se miste în continuu

inclinare = inclinare +1; // înclinarea este folosită pentru a ajusta unghiul pendulului făcându-l puțin

if(inclinare > 55){ // mai mare decat este de fapt

inclinare = 55;

}

}

else { // Motorul ar trebui să mearga înapoi și să seteze ciclul de lucru pe Cn

P1M1 = 1; // Motorul merge înapoi

temp_integer = abs(Cn); // Intoarce valoarea int absolută a Cn

temp_char = temp_integer; // Int to char pentru bitul cel mai puțin semnificativ

if(temp_char^0b00000001){

DC1B0 = 1;

}

else{

DC1B0 = 0;

}

if(temp_char^0b00000010){

DC1B1 = 1;

}

else{

DC1B1 = 0;

}

CCPR1L = temp_integer >> 2; // Folosit pentru a împiedica pendulul să se miste în continuu

inclinare = inclinare -1;

if(inclinare < -55){

inclinare = -55;

}

}

en3 = en2; // comutează semnalele de eroare

en2 = en1;

en1 = en0;

en0 = 0;

PID_adevatar = 0; // Gata

RA4 = 0; // Testează steagul pentru a măsura viteza

return;

}

//***************************************************************************

//Setare_Constante – Secvența de obținere a coeficienților PID ki, kp și kd

//***************************************************************************

void Setare_Constante()

{

ANS2 = 1; // Configurează AN2 ca analog

ANS4 = 1; // Configurează AN4 ca analog

ANS5 = 1; // Configurează AN5 ca analog

ADFM = 1; // Rezultatul A/D bine justificat

CHS0 = 0; // Selectează canalul AN4

CHS1 = 0;

CHS2 = 1;

temp_char = 200; // dă întârziere

while(temp_char){

temp_char–;

}

GODONE = 1;

while(GODONE);{

temp_char = 0; // Nu face nimic…..

}

ki = ADRESH << 8; // Înregistrează rezultatul A/D în ki

ki = ki + ADRESL;

CHS0 = 1; // seletează canalul AN5

CHS1 = 0;

CHS2 = 1;

temp_char = 200; // dă întârziere

while(temp_char){

temp_char–;

}

GODONE = 1;

while(GODONE);{

temp_char = 0; // nu face nimic…..

}

kd = ADRESH << 8; // Înregistrează rezultatul A/D în constanta kd

kd = kd + ADRESL;

CHS0 = 0; // Selectează canalul AN2

CHS1 = 1;

CHS2 = 0;

temp_char = 200; // Dă întârziere

while(temp_char){

temp_char–;

}

GODONE = 1;

while(GODONE);{

temp_char = 0; // Nu face nimic …..

}

kp = ADRESH << 8; // Înregistrează rezultatul A/D în kp

kp = kp + ADRESL;

CHS0 = 0; // Selectează canalul AN0

CHS1 = 0;

CHS2 = 0;

}

//***************************************************************************

//interrupt Isr() – Rutina de tratare a întreruperilor

//***************************************************************************

void interrupt Isr()

{

if(T0IF&&T0IE){

TMR0 = 10; // valoarea prestabilită

T0IF = 0; // Sterge steagul de inițializare

RA4 = 1;

temp_integer = 0;

temp_integer = ADRESH << 8; // Înregistrează rezultatul A/D cu deviație

temp_integer = temp_integer + ADRESL – 512;

en0 = temp_integer + inclinare/8; // Înregistreză funcția de eroare presupunand că nu există over-flow

PID_adevatar = 1; // Autorizat să efectueze funcția PID

GODONE = 1; // pornește următorul ciclu A/D

}

else

{

PIR1 = 0;

RAIF = 0;

INTF = 0;

}

if(temp_integer > 180){ //Verifică dacă eroarea este prea mare (pozitiv)

DC1B0 = DC1B1 = 0; // Stop PWM

CCPR1L = 0;

en0 = en1 = en2 = en3 = val1_char = val2_char = inclinare = 0; // Șterge toate constantele PID

Cn = term_integrator = term_derivativ = SumaEroare = RA4 = 0;

PID_adevatar = 0; // Încetează să facă PID

}

if(temp_integer < -180){ //Verifică dacă eroarea este prea mare (negativ)

DC1B0 = DC1B1 = 0; // Stop PWM

CCPR1L = 0;

en0 = en1 = en2 = en3 = val1_char = val2_char = inclinare = 0; // Sterge toate constantele PID

Cn = term_integrator = term_derivativ = SumaEroare = RA4 = 0;

PID_adevatar = 0; // Încetează să facă PID

}

}

CD / DVD

Autorul atașează în această anexă obligatorie, versiunea electronică a aplicației, a acestei lucrări, precum și prezentarea finală a tezei.

Index

B

Bibliografie 60

C

CUPRINSUL xi

L

LISTA FIGURILOR xii

LISTA TABELELOR xiv

R

Referințe web 61

Similar Posts