Proiect uC

18
Facultatea de Inginerie Sibiu 2014 Student: Străuţ Petre Marcel Specializarea: Electronică Aplicată Grupa: 332/2

description

Proiect uC.

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

    }

    }