Proiect uC
-
Upload
strau-petre -
Category
Documents
-
view
46 -
download
3
description
Transcript of Proiect uC
-
Facultatea de Inginerie Sibiu 2014
Student: Stru Petre Marcel
Specializarea: Electronic Aplicat
Grupa: 332/2
-
2
Curpins:
1. Introducere
2. Prezentare PIC12F675
3. Futaba 3003 Servo Prezentare
4. Timere
5. ntreruperi
6. Semnal PWM
7. ADC
8. Codul surs
-
3
Toate aplicaiile n care se utilizeaz microcontrolere fac parte din
categoria aa ziselor sisteme ncapsulate-integrate (embedded systems), la care
existena unui sistem de calcul incorporat este (aproape) transparent pentru
utilizator.
Printre multele domenii unde utilizarea lor este practic un standard
industrial se pot meniona: n industria de automobile (controlul
aprinderii/motorului, climatizare, diagnoz, sisteme de alarm, etc.), n aa zisa
electronic de consum (sisteme audio, televizoare, camere video i
videocasetofoane, telefonie mobil, GPS-uri, jocuri electronice etc.), n aparatura
electrocasnic (maini de splat, frigidere, cuptoare cu microunde, aspiratoare),
n controlul mediului i climatizare (sere, locuine, hale industriale), n industria
aerospaial, n mijloacele moderne de msurare - instrumentaie (aparate de
msur, senzori i traductoare inteligente), la realizarea de periferice pentru
calculatoare, n medicin.
Ca un exemplu din industria de automobile (automotive industry), unde
numai la nivelul anului 1999, un BMW seria 7 utiliza 65 de microcontrolere, iar
un Mercedes din clasa S utiliza 63 de microcontrolere. Practic, dei am prezentat
ca exemple concrete numai sisteme robotice i mecatronice, este foarte greu de
gsit un domeniu de aplicaii n care s nu se utilizeze microcontrolerele.
n cadrul acestui proiect vom trece n revist toi paii necesari conceperii
i nelegerii codului surs pentru controlul unui servomotor care s se roteasc
dup poteniometrul de pe placa de test a C-ului PIC12F675.
-
4
PIC12F675 este un C de nalt performan de tip RISC. Mai jos este prezentat
diagrama bloc a acestui C:
Figur 1 - Diagrama bloc PIC12F675
Specificaile din foaia de catalog. PIC12F675 prezint 6 pini de I/O, un convertor
A/D pe 10 bii, 1 comparator i 2 timere, unul pe 8 bii iar cellalt pe 16 bii, etc.
-
5
Figur 2 - Repartiie pini
Mai sus este reprezentat repartiia i ntrebuinarea fiecrui pin de I/O.
Servomotoarele sunt motoare electrice speciale, de curent continuu sau curent
alternativ cu vitez de rotaie reglabil ntr-o gam larg n ambele sensuri avnd
ca scop deplasarea ntr-un timp prescris a unui sistem mecanic (sarcina) de-a
lungul unei traiectorii date, realiznd totodat i poziionarea acestuia la sfritul
cursei cu o anumit precizie. Servovomotorul utilizat n acest proiect este
FUTABA s3003.
Acesta se poate rotii aproximativ 180 (90 n fiecare direcie) dar poate fi
modificat pentru rotaii complete (360). Tensiunea de alimentare poate varia ntre
4.8 V i 6 V iar comanda motorului se face utiliznd semnal PWM cu o
amplitudine ntre 3 i 5 V i o perioad de 20 milisecunde.
-
6
Timer-ele sunt sisteme integrate n microcontroler care au ca scop
msurarea unor intervale fixe de timp i de a genera ntreruperi la expirarea
intervalului msurat. Tot cu ajutorul timer-elor se pot genera trenuri de impulsuri
de o anumit frecven sau compararea a 2 intervale de timp. Timer-ele
funcioneaz independent de unitatea central a micrcontrolerului astfel
eliminndu-se momentele de timp n care microcontrolerul este blocat ntr-o bucl
de ateptare.
Timer-ele conin un numrtor liber central (NLC) care are rolul de a
numra fiecare impuls de tact. Acest NLC este de fapt un registru de 8 sau 16 bii
care la fiecare impuls este incrementat cu o unitate. Numrtorului i se poate da o
valoare de start cuprins ntre 00h/0000h i FFh/FFFFh. Dac NLC-ul are
valoarea FFh/FFFFh i primete un impuls el se reseteaz, noua valoare fiind
00h/0000h.Tot n momentul resetrii numrtorul trimite un semnal ctre sistemul
de ntreruperi.
Microcontrelerul PIC12F675 ofer 2 timere i anume: TIMER0 i
TIMER1.
Timer0 are urmtoarele specificaii:
Timer/numrtor pe 8 bii Poate fi scris/citit 8-bit prescaler programabil software Selectare de semnalde clock intern sau extern ntrerupere la depire de la 0xFF la 0x00 Selecia frontului pentru semnalul de clock extern
Figur 3 - Diagrama bloc Timer0
-
7
Registrul de lucru al Timer 0 este Option_Reg.
Figur 4 - Registrul Option_Reg
o PS0:PS2 reprezint biii pentru alegerea prescalrii. Se pot alege
urmtoarele combinaii:
PS0:PS2 Rata de prescalare
000 1:2
001 1:4
010 1:8
011 1:16
100 1:32
101 1:64
110 1:128
111 1:256
Acesta este folosit pentru generarea perioadei de 20 de ms a semnalului PWM.
Utiliznd generatorul de clock intern de 4 MHz, setarea biilor de control pentru
acest timer este urmtoarea:
T0CS=0; PSA=0; PS0:PS2=111; (am ales rata de prescalare de 1:256)
# OPTION_REG= 0b0000111; //Prescaler 1:256
Pentru a genera semnalul cu perioada de 20 de ms (frecvena de 50 de Hz), cu
setrile anterioare rezult un semnal de clock pentru Timer0 de 256 de s. Acesta
va trebui s numere
= , ori.
Pentru c rezultatul nu este un numr ntreg se va alege cea mai apropiat valoare
i anume 78. Durata rezultat nu vai fi fix 20 de ms ci puin mai mic tocmai din
cauza aproximrii precedente.
Dup cum tim Timer0 genereaz ntrerupere la depirea valorii maxime a
registrului, rezult ca acest n acest registru trebuie ncrcat valorea :
= + =
la fiecare iniializare a Timer0. Aceast valoare trebuie corectat avnd n vedere
i timpul necesar rutinei de tratare a ntreruperii provenite de la Timer0.
# TMR0 = 0xB2; //Iniializare TMR0
-
8
Timer1 are urmtoarele specificaii:
Timer/numrtor pe 16 bii Poate fi citit/scris Se poate selecta semnalul de clock intern sau extern Operare sincron sau asincron ntrerupere la depire de la 0xFFFF la 0x0000 Posibilitatea de utilizare a unui oscilator LP
Figur 5 - Diagrama bloc Timer1
Acesta este folosit pentru generarea duratei de la 1 ms la 2 ms a semnalului
PWM. Precizia de generare a acestei durate este de 1 s, ceea ce implic utlizarea
a 10 bii din cei 16 disponibili.
Registrul de lucru al Timer 1 este T1CON (prezentat n Figur 6). n acest
caz nu vom folosii prescaler.
Figur 6 - Registrul T1CON
# T1CON = 0x05; //Iniializare T1CON
TMR1ON=1 Timer1 Enabled T1SYNC=1 Nu se sincronizeaza cu semnalul de clock extern
-
9
ntreruperile ntr-un microcontroler sunt vzute ca nite evenimente speciale
generate de elementele periferice. Aceste evenimente pot fi reprezentate de
apsarea unui buton, atingerea unei valor a numrtorului, terminarea de citit a
unei valori a convertorului analog digital, etc.
Toate acestea sunt gestionate de un sistem intern numit sistem de ntreruperi ,
sistem care are rolul de a oferi procesorului informaii referitoare la natura
ntreruperii i de a opri funcionarea ciclic tratnd ntreruperea ntr-o rutin
special.
n cazul nostru registrul arat n felul urmtor:
Figur 7 - Registrul INCON
# INTCON= 0x60; //Iniializare INTCON
GIE=1 - Global Interrupt Enable Bit
PEIE=1 - Peripheral Interrupt Enable Bit
n cadrul proiectului am folosit ntreruperile pentru a genera semnalul
PWM necesar controlului servomotorului. Acest lucru a fost sintetizat cu ajutorul
functiei interrupt ISR : void interrupt ISR(void) prezentat mai jos.
-
10
Funcionarea acestei funcii este foarte simpl, ntreruperile sunt provocate
de cele 2 timere prezentate mai sus mai exact de depirea valorilor maxime pn
la care acestea sunt capabile s numere.
void interrupt ISR(void)
{
if((T0IE&T0IF)==1) //Intrerupere provocata de Timer0
{
readADC();
ADCval = readADC();
timerVal = timer1ms - ADCval;
TMR1H = timerVal>>8;
TMR1L = ((timerVal8);
PWM_Pin = 1; // Setare Iesire Pin pe 1
TMR1IE = 1; // Timer1 Interrupt Enable
T0IF = 0; // Timer0 Interrupt Flag
TMR0 = 0xB2; // Initializare Timer0
ADCON0 |= 0x01;
}
if ((TMR1IE&TMR1IF)==1) // Intrerupere provocata de Timer1
{
PWM_Pin = 0; // Setare Iesire Pin pe 0 (zero)
TMR1IF = 0; //T imer1 Interrupt Flag
}
}
PWM (Pulse Width Modulation) este o tehnic folosit pentru a varia n
mod controlat tensiunea dat unui dispozitiv electronic. Aceast metod schimb
foarte rapid tensiunea oferit dispozitivului respectiv din ON n OFF i invers.
Perioada de timp corespunztoare valorii ON dintr-un ciclu ON-OFF se
numete factor de umplere (duty cycle) i reprezint, in medie, ce tensiune va
primi dispozitivul electronic.
-
11
Astfel, se pot controla circuitele analogice din domeniul digital. Practic,
asta nseamn c un LED acionat astfel se va putea aprinde / stinge gradual, iar
n cazul unui motor acesta se va nvrti mai repede sau mai ncet.
Factorul de umplere se exprim n procente i reprezint ct la sut din
perioada unui semnal acesta va fi pe nivelul ON. Mai jos se pot observa semnale
PWM cu factori de umplere diferii ca exemple. Astfel, se poate deduce foarte
uor formula pentru a obine valoarea factorului de umplere (D):
=
( + ) 100 =
_
100
Astfel, tensiunea medie care ajunge la dispozitiv este dat de relaia:
=
Pentru proiectul nostru vom construi semnalul PWM cu ajutorul a 2 timere
TIMER0 respectiv TIMER1 i cu ajutorul ntreruperilor prezentate mai sus.
Semnalul PWM trebuie sa aib o perioad de 20 de ms.
-
12
Mai jos sunt prezentate 3 cazuri de semnal PWM i poziia servomotorului.
Figur 8 - Semnal PWM 1
Figur 9 - Semnal PWM 2
Figur 10 - Semnal PWM 3
Dup cum se poate observa pentru controlul servomotorului din poteniometru
este necesar s modificm factorul de umplere al semnalului PWM. Pentru aceasta
avem nevoie de un convertor A/D care este prezentat n capitolul urmtor.
-
13
Pentru a putea msura semnalele analogice ntr-un sistem de calcul digital,
acestea trebuie convertite n valori numerice discrete. Unconvertor analog
digital (ADC) este un circuit electronic care convertete o tensiune analogic de
la intrare ntr-o valoare digital.
O caracteristic important a unui ADC o constituie rezoluia acestuia.
Rezoluia indic numrul de valori discrete pe care convertorul poate s le
furnizeze la ieirea sa n intervalul de msur.
Deoarece rezultatele conversiei sunt stocate intern sub form binar, rezoluia
unui convertor analog-digital este exprimat n bii.
Figur 11 - Rezoluie
Rezoluia n cazul de fa (ADC pe 10 bii) :
1024
= 4,8
-
14
Figur 12 - Diagrama bloc ADC
Registrul de control al convertorului analog numeric este ADCON0
prezentat mai jos:
Figur 13 - ADCON0
#ADCON0 = 0b10001100; // Initializare convertor
Pentru a porni conversia se seteaz bitul GO_DONE pe 1. n regitrii ADRESL
i ADRESH se memoreaz valorile conversilor anterioare pe 10 bii, dup cum
se observ 6 bii din registrul ADRESH rmnnd nefolosii.
-
15
unsigned int readADC()
{ int MINIM=0,MAXIM=0;
GO_nDONE = 1; //Porneste conversia
if ((ADCON0 & 0x02)== 0x02) //Se verific dac bitul GO_nDone este setat pe 1
{
MINIM = ADRESL;
MAXIM = ADRESH;
MAXIM = MAXIM
-
16
#include
#include
#define _XTAL_FREQ 4000000
#define PWM_Signal GPIO2
// Declarare functii si variabile
void Initializare_PWM();
void interrupt ISR();
void Init();
unsigned int readADC();
unsigned aData;
int TMR_1MS = 0xFC18;
int ADC_Val;
int TMR_VAL;
void main()
{
Init();
Initializare_PWM(); // Initializare PWM
while(1)
{
}
}
void Init()
{
ANSEL = 0b00011000; // Setare ANS3 ca intrare analogica
TRISIO = 0x10; // Setare GP4 ca intrare
ADCON0 = 0b10001100 // Initializare convertor
-
17
CMCON = 0x07; // Comparatoare - Dezactivate
VRCON = 0x00; // Tensiunea de referinta dezactivata
GPIO = 0x00; // Setare tuturor pinilor pe 0
INTCON = 0x60; // Initializare Registru pentru intreruperi : 0b11000000
T1CON = 0x05; // Initializare Timer 1
OPTION_REG= 0b0000111; // Setare prescaler 1:256
}
void Initializare_PWM()
{
TMR0=0xB2; //Initializare Timer0
TMR1H=0xFC;
TMR1L=0x18;
TMR1IE=1; //Timer1 Interrupt Enable
T0IE=1; //Timer0 Interrupt Enable
GIE=1; //Global Interrupt Enable
T0IF=0; //Timer0 Interrupt Flag pe 0 (zero)
TMR1IF=0; //Timer1 Interrupt Flag pe 0 (zero)
return;
}
unsigned int readADC()
{ int MINIM=0,MAXIM=0;
GO_nDONE = 1; //Porneste conversia
If ((ADCON0 & 0x02)== 0x02)
{
MINIM = ADRESL;
MAXIM = ADRESH;
MAXIM = MAXIM
-
18
void interrupt isr(void)
{
if((T0IE&T0IF)==1) //Intrerupere provocata de Timer0
{
readADC();
ADC_Val=readADC();
TMR_VAL=TMR_1MS - ADC_Val;
TMR1H=TMR_VAL>>8;
TMR1L=((TMR_VAL8);
PWM_Signal=1;
TMR1IE=1; //Timer1 Interrupt Enable
T0IF=0; //Timer0 Interrupt Flag
TMR0=0xB2; //Initializare Timer0
ADCON0|=0x01;
}
if((TMR1IE&TMR1IF)==1) //Intrerupere provocata de Timer1
{
PWM_Signal=0; //Setare Iesire Pin pe 0 (zero)
TMR1IF=0; //Timer1 Interrupt Flag
}
}