You are on page 1of 12

FACULTATEA DE ELECTRONICA,TELECOMUNICATII SI TEHNOLOGIA INFORMATIEI

PROIECT LA MICROCONTROLERE Generarea PWM

Student: Luca Alexandru-Ioan, grupa 5402B

1. eliminarea zgomotelor și aplicații cu cost redus. care sa genereze periodic forma de unda complexa. >--------2s-------< >-------------3s-----------< >--------4s------< >------8s------< PWM (Pulse Width Modulation . 2 .modularea factorului de umplere al unui semnal) permite controlul circuitelor analogice din domeniul digital. un sistem cu microcontroler de tip PIC.Enunt: Sa se conceapa la nivel de program. Această modulație vine în sprijinul multor aplicații deoarece înseamnă consum mic. Un controller PWM este in esenta un convertor digital-analog (DAC) pe un singur bit.

Considerand o forma de unda dreptunghiulara f(t) cu o valoare minima ymin si o valoare maxima ymax si factorul de umplere D valoarea medie a formei de unda e data de relatia: Cum f(t) este o forma de unda dreptunghiulara valoarea sa maxima se atinge pentru 0<t<D*T. Pentru a implementa o asemenea facilitate ele se folosesc de un numărator care este incrementat periodic (conectat direct sau indirect la o unitate de ceas) si care este resetat la sfarsitul fiecărei perioade a PWM-ului.Principiul de functionare: Modularea foloseste variatia factorului de umplere a unei forme de unda dreptunghiulara pentru a genera la iesire o tensiune analogica. Majoritatea microcontrollerelor dispun de aceasta facilitate.2. Tipuri de PWM   Modulatie Delta Modulatie Delta-Sigma Multe circuite digitale pot genera semnale PWM. Cand valoarea 3 .

52088 18.56628 9. Pentru ca o panta are 1 secunda=> 1 punct corespunde a 100ms.932157 C 5 10 15 19 23 26 28 30 31 32 31 30 28 26 23 19 15 10 4 . 3. pentru a ingloba intr-o bucla intarzierea de 1secunda. pentru trapez. plecand de la acestea.B A 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 B 5.8421 14.87955 28. pentru a le rotunji.60243 31. si avem 10 puncte de cuantizare/panta=> ca 400ms va sta in fiecare punct al sinusului. Deasemenea fiecare punct are o variatie a factorului de umplere. am inmultit formula de generare a punctelor sinusului cu 32.52723 25. Valorile corespunzatoare celor 20 puncte in care vom cuantiza sinusul. valorile sinusului si.61841 25. Suplimentar.numaratorului este mai mare decat valoarea de referinta. generate intr-un tabel excel. le-am obtinut introducand urmatoarea formula in coloana B a documentului excel: =32*sin(A1*pi/20).50411 30. Astfel am aproximat in coloana C a fisierului excel.003386 9.4275 31.Referinte cod: Pentru triunghi si trapez am calculat panta crescatoare/descrescatoare in 10 puncte.883697 14.99999 31. asfel ca pentru 1 punct avem nevoie de 10 stari( i stari in 1 logic si N-i stari in 0 logic). Dupa cum am mai spus in coloana C sunt valorile rotunjite ale col. observam ca daca avem o intarziere tot de 10ms pentru fiecare tranzitie.65443 18. sunt numere reale.80088 22. Tinand cont de faptul ca punctele sinusului. Rezulta astfel ca pentru fiecare din cele 10 stari ale unui punct ii corespunde o intarziere de 10ms( de aceea am ales in cod o bucla de temporizare de 10ms). La dreptunghi am folosit un contor (n=4).44324 28.6104 30. mai avem o perioada de 1 secunda( baza mica trapez) in care semnalul sta in 1 logic. atunci obtinem perioada de aproximativ 4 secunde. rezultand asfel un semnal dreptunghiular cu durata de 4 secunde. cum panta crescatoare/descrescatoare o vom genera timp de 4 secunde. iesirea PWM (output-ul) trece din starea inalta in stare joasa (sau invers). La sinusoida.9095 22.

Subrutina val_crt o vom apela deci ori de cate ori vrem sa incarcam o anumita valoare pentru generarea unui punct al sinusului.cu ajutorul instructiunii RETLW.050965 5 0 Pentru generarea sinusului. pentru timpul care sta in 1 si variaza pana la N-i pentru timpul stat in 0 d1 equ 0x0e . d1.Codul: #include p16f84a. i variaza pana la valoarea maxima n.053718 0. Am ales sa transmit cele 4 forme de reprezentat pe pini diferiti ai portului B.in 1 logic p iteratii si in 0 logic pct-p iteratii. am incarcat in memoria de program aceste valori obtinute in coloana C.19 20 5.intarzierilor d3 equ 0x10 nr equ 0x11 .d3 sunt utilizati la contoarele d2 equ 0x0f . am ales microcontroller-ul PIC16F84 si un oscilator de 4MHZ(astfel incat 1 ciclu masina=1micro-secunda). N equ D'10' . 4. La pinii portului B am conectat led-uri in vederea observarii PWM-ului pentru cele 4 forme indicate mai sus.RP0 .reprezinta numarul de puncte in care am cuantificat panta . Pentru implementarea practica. pct reprezinta valoarea maxima pe care o ia .sinusul nostru. n reprezinta factorul de umplere al unui punct de . adica la 90 de grade. N este numarul de puncte cuantizate al unei pante pct equ d'32' .inc __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC n equ 0x0c .ne pozitionam in B1 5 . p pastreaza valorile sinusului returnate in program .crescatoare/descrescatoare a sinusului. Astfel se permite incarcarea cu valoarea corespunzatoare la fiecare pas cuantizat pe care trebuie sa-l generam in vederea obtinerii sinusului. Un punct de pe sinus sta .d2. astfel: -pe pinul 4 al portului B am generat PWM dreptunghiular -pe pinul 5 al portului B am generat PWM triunghiular -pe pinul 6 al portului B am generat PWM trapezoidal -pe pinul 7 al portului B am generat PWM sinusoidal Formele de unda sunt furnizate la sfarsitul codului.pe caracterostica unui semnal i equ 0x0d . nr se foloseste la generarea sinusului si . p equ 0x12 . val_crt va returna constanta data de PCL (program counter octetul de low) la care vom adauga numarul de ordine al punctului ce trebuie generat ( pastrat de registrul n). tocmai pentru ca ele sunt constante si ca pot fi incarcate usor in acumulator ori de cate ori avem nevoie de ele. org 0x00 goto main org 0x13 main bsf STATUS.

1 movf n. btfsc STATUS.Z goto loopn_c . sublw N.punem in 0 toate iesirile portului B .0 subwf i.umplere pentru urmatorul punct de pe panta crescatoare. doar ca generat in sens invers movlw d'1' movwf n clrf i loopn_d bcf PORTB. stai n*10ms in 1 logic incf i.0 subwf i.1 movf n.0.punct pe panta crescatoare si il pregatim pe urmatorul bcf PORTB.Z goto loopi_d 6 .5 loopi_c CALL delay10ms .Daca rezultatul este 0.movlw b'00001111' movwf TRISB bcf STATUS.0 sublw N btfss STATUS.0.5.1 movf n. aici obligatoriu i-ul trebuie sters pentru o noua . setam porturile 4. adica crestem factorul de . inseamna ca .generare panta descrescatoare.6.revenim in B0 .panta crescatoare.7 de OUT .este acelasi lucru ca pentru .5 loopi_d CALL delay10ms incf i. cand i-N este 0.5 CALL delay10ms incf i.RP0 clrf PORTB . inseamna ca am generat 1 . iar n-ul incrementat.1 goto loopi2_c endloopi_c .i-n=w btfss STATUS.Z .stam in 0 logic cat timp i-N e diferit de 0 goto endloopi_c. clrf i incf n.Z.trecem la generarea restului de N-i stari in 0 logic goto loopi_c loopi2_c movf i.0 .iteratie. i-n=w btfss STATUS.GENERAREA TRIUNGHIULUI-panta crescatoare movlw d'1' movwf n clrf i loopn_c bsf PORTB.

0.5 .Z goto loopi_c2 loopi2_c2 movf i.portului B.ca pot lasa bitul 5 al portului B in 0 logic deoarece nu mai am .Z goto loopn_d bcf PORTB.1 goto loopi2_c2 endloopi_c2 clrf i incf n.Z goto endloopi_c2 bcf PORTB.Z goto endloopi_d bsf PORTB.Acesta e generat pe pinul 6 al .6 CALL delay10ms incf i.1 movf n. btfsc STATUS.1 movf n. astfel .timp suplimentar in maxim.5 CALL delay10ms incf i. movlw d'1' movwf n clrf i loopn_c2 bsf PORTB.i-n=w btfss STATUS. i=1 sublw N.0 subwf i.6 loopi_c2 CALL delay10ms incf i. s-a incheiat generarea triunghiului.loopi2_d movf i.intentia de a genera altceva pe el .GENERARE TRAPEZ-asemanator cu triunghiul doar ca vom sta un .0 sublw N btfss STATUS.0 sublw N btfss STATUS.1 goto loopi2_d endloopi_d clrf i incf n.0 sublw N btfsc STATUS.1 movf n.Z goto loopn_c2 7 .0.

panta descrescatoare a trapezului movlw d'1' movwf n clrf i loopn_d2 bcf PORTB.Z goto loopi_d2 loopi2_d2 movf i.1 goto loopdrept bcf PORTB.1 movf n.revenim in 0 dupa cele 4ms.1 movf n. i-n=w btfss STATUS..0 sublw N btfss STATUS.va repeta bucla de 4 ori.1 goto loopi2_d2 endloopi_d2 clrf i incf n.il vom genera timp de 4s pe .pinul 4 al portului B movlw d'4' movwf n loopdrept .6 CALL delay1s bcf PORTB. Deosebirea fata de triunghi consta in aceasta secventa in care "punem" semnalul in 1 logic timp de 1s bsf PORTB.4 .descrescatoare .panta crescatoare 8 . lasam un delay de 10ms inainte de panta .GENERARE SEMNAL DREPTUNGHIULAR. 4*1ms=4ms bsf PORTB.0.4 CALL delay1s decfsz n.GENERARE SINUS.0 subwf i.6 loopi_d2 CALL delay10ms incf i.Z goto endloopi_d2 bsf PORTB.Z goto loopn_d2 bcf PORTB.6 CALL delay10ms .6 .6 CALL delay10ms incf i.0 sublw N btfsc STATUS. nop .

1 . din acumulator salvam aceasta valoare in p. loopnsin_c movf n.sinusului calculate aparte. n il punem in 0 astfel ca la primul apel al functie val_crt.parte.7 . genereaza un numar de 10 cuante pentru panta .de pe caracteristica sinusului bsf PORTB.1 goto loopisin2_c endloopisin_c movlw d'1' movwf i clrf p incf n.1 decfsz nr.Z .0 sublw pct btfsc STATUS.para) movlw d'9' movwf nr . stai p valori in 1 logic goto loopisin_c loopisin2_c movf i.GENERARE sinus. restul de 9 puncte de pe panta descrescatoare movlw d'1' movwf i loopnsin_d movf n.1 movf p. .0 call val_crt movwf p 9 . PCL+n sa ia prima valoare.0 .0 btfss STATUS.movlw d'10' movwf nr movlw d'1' movwf i movlw d'0' movwf n .facut la trapez/triunghi loopisin_c CALL delay10ms incf i.(sinusul e fct . doar ca valorile lui p sunt in oglinda.panta descrescatoare facuta analog cu prima .crescatoare goto loopnsin_c . de aici programul e asemanator cu ce am . movwf p .incarcat in acumulator valoarea n corespunzatoarea punctelor .pentru ca ea reprezinta tocmai factorul de umplere al punctului .w=0 call val_crt . la intoarcerea din acest apel el va avea . stai i-pct valori in 0 logic goto endloopisin_c bcf PORTB.Z .7 call delay10ms incf i.0 subwf i.

1 goto loopisin2_d endloopisin_d movlw d'1' movwf i clrf p incf n.bsf PORTB.Z goto endloopisin_d bcf PORTB. sinusului pentru o accesare . Intarzieri-ele nu sunt foarte precise si sunt facute doar .7 loopisin_d CALL delay10ms incf i.1 goto loopnsin_d bcf PORTB.1 decfsz nr. aici pastram pct.7 .pentru a evidentia comportarea unui semnal PWM 10 .0 subwf i.facila.Z goto loopisin_d loopisin2_d movf i.7 call delay10ms incf i.0 btfss STATUS.1 movf p.0 sublw pct btfsc STATUS. addwf PCL retlw d'5' retlw d'10' retlw d'15' retlw d'19' retlw d'23' retlw d'26' retlw d'28' retlw d'30' retlw d'31' retlw d'32' retlw d'31' retlw d'30' retlw d'28' retlw d'26' retlw d'23' retlw d'19' retlw d'15' retlw d'10' retlw d'5' retlw d'0' . dupa sinus stergem pinul 7 al portului B val_crt .

Formele de unda obtinute: 11 .delay1s movlw d'100' movwf d3 loopd3 CALL delay10ms decfsz d3.1 goto loopd1 RETURN nop END 5.1 goto loopd2 nop decfsz d1.1 goto loopd3 RETURN delay10ms movlw d'10' movwf d1 loopd1 movlw d'199' movwf d2 loopd2 nop nop decfsz d2.

12 .