Vous êtes sur la page 1sur 11

Instituto Tecnolgico de Quertaro.

Microcontroladores
PWM - Modulacin por Ancho de Pulso
_________________________________________________
Aguilar Hernandez Arturo.
Robles Robles Mario.
- Equipo Gris -









1 INFORME - PRACTICA DE LABORATORIO
Introduccin.

Por lo general, todo sistema que procesa informacin binaria para controlar un proceso
analgico requiere una etapa de entrada analgico digital y una etapa de salida digital
analgica (convertidores ADC y DAC). Para reducir costos en los diseos que no requieren
alta resolucin en la etapa de salida, es posible sustituir el DAC por un algoritmo de
Modulacin por Ancho de Pulsos (PWM - Pulse Width Modulation) que se implementa en el
microcontrolador. Una unidad PWM permite asignar cierta duracin de tiempo en alto o en
bajo a un dato digital de n bits que se considera salida de la etapa procesadora. Lo anterior se
logra mediante un contador y un circuito comparador internos.
La tcnica de PWM consiste en producir un pulso rectangular con un ciclo de trabajo
determinado, este ciclo de trabajo puede variar de 0 a 100%.

La salida PWM tiene un tiempo base (periodo) y un tiempo en el cual la salida permanece en
estado alto (ciclo de trabajo, duty cycle). La frecuencia de la salida PWM es el inverso del
periodo (1/periodo).

En las guras se muestran distintos ciclos de trabajo.






Figura 1.1 Duty Cycle o Ciclo de trabajo de 50%





Figura 1.2 Duty Cycle o Ciclo de trabajo de 10%
2 INFORME - PRACTICA DE LABORATORIO
Objetivo.
Utilizar la funcin especial Salida PWM del PIC16F877.
Manipular y variar los valores PWM para atenuar la iluminacin de un diodo emisor de luz.



Marco Terico.
El modo PWM (Pulse Width Modulation) o modulacin de ancho de pulso permite obtener
en los pines CCPx una seal periodica, en la que se puede modicar su ciclo de trabajo (Duty
Cycle). Puede variar en el tiempo en el cual la seal est en su nivel alto (TON) contra el
tiempo en nivel bajo (TOFF)

La tensin media aplicada es proporcional al TON, controlando as: velocidad de motores,
luminosidad de lamparas, etc.
El mdulo PWM del microcontrolador genera una onda cuadrada con una frecuencia dada
(tpicamente bastante alta, por ejemplo 10 KHz). Luego nosotros podemos ir cambiando el
ciclo de trabajo (% del periodo en ON) de la seal.
Si usamos un dispositivo externo con un ancho de banda suciente (por ejemplo un
osciloscopio) veremos la seal al completo, esto es, la modulacin rpida (o portadora) de 10
KHz y las variaciones ms lentas (seal a transmitir) del ciclo de trabajo.

3 INFORME - PRACTICA DE LABORATORIO
El parmetro fundamental de una modulacin PWM es la frecuencia (o su inverso el periodo)
de modulacin. En los PIC dicha frecuencia es programable (con ciertas limitaciones) en base
a varias variables:
La frecuencia del oscilador principal Fosc
El pre-scaler (PRE) o divisor previo del timer TMR2
El registro PR2 (0-255) asociado al timer TMR2

La frecuencia PWM responde a la frmula: #
F_pwm# =# F_osc / [4 x PRE x (PR2+1)]#

O lo que es lo mismo, el periodo del PWM ser el inverso de dicha frecuencia:
T_pwm =# [ (PR2+1) x 4 x PRE ] #x Tosc

El valor mximo del divisor previo PRE es 16 y el de (PR2+1) es 256. Por lo tanto la
frecuencia PWM ms baja posible ser Fosc/16384. Para un oscilador de 20 MHz tenemos
una Fpwm mnima de 1.22 KHz# (20000/16384).

Ntese que el mdulo PWM usa el timer TMR2, por lo que ste no podr usarse como
temporizador de propsito general mientras se est usando PWM. Si que es posible usarlo (y
ahorrarnos gastar otro timer) si queremos hacer saltar una interrupcin cada cierto tiempo.
El postscaler del TMR2 no tiene efecto sobre la frecuencia PWM, pero si inuye sobre
cuando salta (si est habilitada)# la correspondiente interrupcin (TMR2_ag). Si por ejemplo
el post-scaler# es 1:16 entonces la interrupcin del TMR2 saltar cada 16 periodos del PWM.

Lo primero que tenemos que hacer para usar el mdulo PWM es habilitarlo indicando que va
a usarse como generador de una onda PWM, ya que dicho mdulo es compartido con otras
funciones (Capture/Compare). La forma de hacerlo es poner a 11XX los 4 bits menos
signicativos del registro CCP1CON. Los PIC18 suelen tener 2 mdulos PWM por lo que
existe un segundo registro CCP2CON.

Podemos habilitar uno o los dos mdulos independientemente. Sin embargo, como ambos
usan el registro PR2 y el timer TMR0 como base de tiempos, la frecuencia programada ser
la misma en ambos mdulos.
4 INFORME - PRACTICA DE LABORATORIO

Lo que si es posible variar por separado es el ciclo de trabajo (duty cicle o DC) de cada
mdulo. El ciclo de trabajo se codica con un nmero de hasta 10 bits (0-1023) almacenado
de la siguiente forma:

CCPR1L : 8 bits ms signicativos del ciclo de trabajo.

CCP1CON.DC1B0 y DC1B1# (bits 5 y 6 de CCP1CON): Guardan los 2 bits menos
signicativos.
##
La programacin del % ON del segundo mdulo es similar pero usando los registros
CCP2CON y CCPR2L.

Con los 10 bits dados el ciclo de trabajo se podr especicar en principio con 1024 niveles (0
corresponde a 0% #y 1023 al 100%). Sin embargo, los valores vlidos pueden ser menores que
los 1024 posibles.

La razn es que el valor de DC (duty_cicle) determina el tiempo que la seal se mantiene alta
(ON) de la forma:
# # # # # # # # # # # # # # #T_on## #= #[ DC x PRE]# x# Tosc

Recordando que el tiempo total del periodo es:########
# # # # # # # # # # # # # # T_pwm =# [ (PR2+1) x 4 x PRE ]# x Tosc

Comparando ambas frmulas y siendo obvio que el tiempo total ON no puede exceder el
tiempo total del periodo tenemos que el valor mximo de DC es (PR2+1) x 4. Por lo tanto,
aunque podemos dar a DC cualquier valor entre 0 y 1023 est claro que en realidad debemos
limitarnos al rango [ 0, (PR2+1)x4 ]. Valores ms altos van a hacer que Ton > Tpwm, o lo
que es lo mismo, la seal PWM se mantiene alta todo el rato (100%).

En resumen, para mantener la mxima resolucin (10 bits) a la hora de especicar DC es
preciso usar PR2=255. Para#una cierta frecuencia del oscilador Fosc podemos optar por tres
frecuencias con la mxima resolucin:
5 INFORME - PRACTICA DE LABORATORIO

Registro PR2
PRE (divisor previo de TMR2)
F_pwm
Para Fosc = 20 MHz
255
1
Fosc / 1024
19.75 KHz
255
4
Fosc / 4096
4.88 KHz
255
16
Fosc / 16384
1,22 KHz

Frecuencias por debajo de Fosc/16384 no son posibles porque los valores de PR2 y PRE
estn ya en su mximo posible.

Frecuencias por encima de Fosc/1024 son posibles pero a costa de bajar PR2 y por lo tanto
disponer de menor resolucin para el ciclo de trabajo. Por ejemplo si aceptamos trabajar con
8 bits (valores de DC de 0 a 255) podemos llegar a una frecuencia de:
F_pwm# =# F_osc / [PRE x 4 x (PR2+1)] = Fosc/(1 x 256) = 78 KHz##

Para un oscilador de 20 MHz.

La razn por la que para frecuencias muy altas no podemos especicar con tanta precisin el
ciclo es que el periodo empieza a hacerse muy pequeo. En el caso anterior (Fpwm = Fosc/
256) es obvio que en un ciclo del PWM slo entran 256 ciclos del oscilador. Como es
imposible que el micro haga algo entre ciclos de reloj, est claro que slo puede bajar la lnea
del PWM en 256 puntos como mucho (esto es, con una resolucin de 8 bits).
6 INFORME - PRACTICA DE LABORATORIO

Valores de frecuencias intermedios son tambin posibles, pero de nuevo van a exigir
PR2<255. Por ejemplo para conseguir 10 KHz con un oscilador de 20 MHz

#Fosc / Fpwm =20000/10 = 2000 = 4 x PRE x (PR2+1) -> PRE x (PR2+1) = 500

lo que puedo conseguir con PRE=2 y PR2 = 249. Pero entonces el valor del ciclo de trabajo
(DC) tiene que moverse en el rango 0 a 4(PR2+1) = 1000. Con DC=1000 ya alcanzamos un
100% del ciclo de trabajo y valores superiores no tendrn ningn efecto extra.

En cuanto al pin de salida al que se manda la seal PWM, usualmente la salida PWM1 va al
pin RC2 y la del PWM2 al RC1 (notad el cambio 1-2). En algunos dispositivos (consultar
datasheet) es posible cambiar la salida de PWM2 a otro pin mediante un bit de conguracin.

# Las rutinas bsicas del compilador C18 para manejar los mdulos PWM son las siguientes
(las declaraciones se encuentran en pwm.h):

OpenPWM1(uint8 periodo) # # # # # : habilita el mdulo y hace PR2=periodo
SetDCPWM1(uint16 duty_cicle) # : establece ciclo de trabajo 0% -> 100%
ClosePWM1(); # # # # # # # # # # # # # : deshabilita modulo PWM

Notad que las rutinas anteriores no tocan el timer TMR2. Es responsabilidad del usuario
invocar a la rutina OpenTimer2 para jar el valor del divisor o prescaler y arrancar el
temporizador.









7 INFORME - PRACTICA DE LABORATORIO
Figura 1.3 Cdigo implementado en el PIC16F877A.
8 INFORME - PRACTICA DE LABORATORIO
PROCESSOR '16F876A'
INCLUDE <P16F876A.INC>

__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF & _LVP_OFF & _BODEN_OFF

CBLOCK 0x20
D1
D2
FADE_STATE ;IF = 0x00 INCREMENT CCPR1L ELSE DECREMENT CCPR1L
ENDC

ORG 0x0000
INIT:
;PWM PERIOD = [(PR2)+1] * 4 * TOSC * (TMR2 PRESCALE VALUE) ;PR2 = TMR2 PERIOD REGISTER, TOSC = PIC CLOCK PERIOD (FOSC = 1 /
TOSC)
;PWM DUTY CYCLE = (CCPR1L:CCP1CON<5:4>) * TOSC * (TMR2 PRESCALE VALUE)

;;;SET PWM FREQUENCY;;;
BSF STATUS, RP0 ;SELECT BANK 01
MOVLW D'128' ;SET PR2 TO 128 DECIMAL SO THE PWM PERIOD = 2064uS => PWM FREQUENCY = 484Hz
MOVWF PR2
BCF STATUS, RP0 ;SELECT BANK 00

;;;SET PWM STARTING DUTY CYCLE;;;
CLRF CCPR1L

MOVLW B'00001100' ;SET PWM MODE, BITS 5 AND 4 ARE THE TWO LSBs OF THE 10BIT DUTY CYCLE REGISTER (CCPR1L:CCP1CON<5:4>)
MOVWF CCP1CON

;;;SET PWM PIN TO OUTPUT MODE;;;
BSF STATUS, RP0 ;SELECT BANK 01
BCF TRISC, 2 ;SET RC2 AS OUTPUT, TO USE FOR PWM
BCF STATUS, RP0 ;SELECT BANK 00

;;;SET TIMER 2 PRESCALE VALUE;;;
;PRESCALE = 16 SO THE PWM PERIOD = 2064uS => PWM FREQUENCY = 484Hz
MOVLW B'00000010'
MOVWF T2CON

;;;CLEAR TIMER 2 MODULE;;;
CLRF TMR2

;;;ENABLE TIMER 2 MODULE;;;
BSF T2CON, TMR2ON

CLRF FADE_STATE

MAIN:
CALL DELAY
MOVLW 0x00
IORWF FADE_STATE, W

BTFSS STATUS, Z ;IF FADE_STATE == 0 GOTO INC_CCPR1L
GOTO DEC_CCPR1L ;ELSE GOTO DEC_CCPR1L

INC_CCPR1L:
INCFSZ CCPR1L ;INCREMENT CCPR1L
GOTO MAIN
GOTO CHANGE_STATE_0 ;IF WE HAVE AN OVERFLOW GOTO CHANGE_STATE

DEC_CCPR1L:
DECFSZ CCPR1L ;DECREMENT CCPR1L
GOTO MAIN
;IF WE HAVE AN OVERFLOW GOTO CHANGE_STATE

CHANGE_STATE:
COMF FADE_STATE, F ;TOGLE FADE_STATE BITS
INCFSZ CCPR1L
GOTO MAIN

CHANGE_STATE_0:
COMF FADE_STATE, F ;TOGLE FADE_STATE BITS
DECFSZ CCPR1L
GOTO MAIN

DELAY
;9993 CYCLES
MOVLW 0xCE
MOVWF D1
MOVLW 0x08
MOVWF D2
DELAY_0
DECFSZ D1, F
GOTO $ + 2
DECFSZ D2, F
GOTO DELAY_0

;3 CYCLES
GOTO $ + 1
NOP

;4 CYCLES (INCLUDING CALL)
RETURN

END

Desarrollo.
El montaje realizado corresponde a un circuito bsico de alimentacin del PIC16F877A. El
diagrama de circuito es el siguiente:

De esta manera se observara la implementacin de PWM a traves del bit RC2 ( PIN 17 ) del
microcontrolador, como una onda en el osciloscopio, y como el control de la intensidad de
iluminacin en el diodo LED colocado en el mismo PIN.








9 INFORME - PRACTICA DE LABORATORIO
Resultados.




Figura 1.5 Fotografas del montaje realizado y el comportamiento de la onda generada por
PWM en el osciloscopio digital de la simulacin del cdigo implementado.



10 INFORME - PRACTICA DE LABORATORIO
Conclusiones.

Los PWM son utilizados comnmente es utilizado para transmitir informacin por medio de
canales de comunicacin o para modular la cantidad de energa que se enva a una carga; por
medio del ajuste del ciclo de trabajo de la seal peridica.

Al trmino de ste trabajo se pudieron observar resultados muy favorables referentes a la
generacin del mltiples PWM mediante programacin por software en ensamblador.

Al nal de las pruebas experimentales los ciclos de trabajo operaban dentro de lo calculado
sin prdida alguna o retrasos al incrementar el nmero de seales.










Bibliografa.

Microcontrolador PIC16F877A - Manual Bsico
Raul Peralta Meza
11 INFORME - PRACTICA DE LABORATORIO

Vous aimerez peut-être aussi