Está en la página 1de 11

15.

PWM – (Ancho por Modulación de Pulso)


 Sergio C
 octubre 10, 2015
 Microcontroladores (PIC)
 18 comentarios

15. PWM – (Ancho por Modulación de Pulso)


4.6 (91.11%) 9 votes
El PWM, es una de las señales más utilizadas para realizar control con nuestros
microcontroladores.

Para poder generar esta señal con nuestro PIC, se hace uso de los módulos CCP
(Comparador, Captura y PWM). Dicho módulo permite realizar tres funciones básicas.

Comparar: Compara el valor del temporizador con el valor de un registro y provoca una
acción en el PIC.

Captura: Obtiene el valor del temporizador en un momento dado, fijado por la acción de
un terminal del PIC.

PWM: Genera una señal modulada por ancho de pulso.

En esta entrada, nos vamos a centrar en esta ultima, en el PWM. Para nuestro caso en
especifico, como estamos usando el PIC16F887, dicho microcontrolador tiene 2 modulos
CCP como se puede apreciar en la siguiente figura, los cuales corresponden a los PINES
16 y 17 (Correspondientes al puerto C, RC1 y RC2).
Distribución de los Pines del PIC16F887
El módulo PWM (Pulse With Modulation), permite obtener de los pines CCP1 (Pin 17) y
CCP2 (Pin 16) una señal periódica (Es decir que se repite en el tiempo) la cual podemos
modificar su ciclo de trabajo ( Duty Cycle en ingles). Dicho PWM puede tener una
resolución máxima de 10 BITS. En otras palabras. Como sabemos que el PIC trabaja con
voltajes binarios (0V o +5V), podemos configurar el PWM para que trabaje un determinado
tiempo en +5V (Ton) frente al tiempo que está en nivel bajo 0V (Toff), tal y como lo
podemos apreciar en la siguiente figura.
De esta manera, la tensión media aplicada a la carga, es proporcional al tiempo en que la
señal estuvo en +5V (Ton) y asi podemos por ejemplo controlar la luminosidad de
lamparas, o la velocidad de un motor.

La resolución de salida del modulo CCP es de 10 bits, y para que funcione correctamente,
no debemos olvidar configurarlo como salida en el TRIS C.

MODULO CCP EN C

El compilador nos suministra dos instrucciones basicas para el manejo del PWM.

Para configurar el módulo CCP:

setup_ccpx(modo);

1 setup_ccpx(modo);

Donde modo hace referencia a los bits CCPxM3:CPxM0 del registro CCPxCON y en PIC C
puede ser configurado según la siguiente tabal:
El ciclo de trabajo para el PWM se define como:

set_pw mx_duty(valor);

1 set_pwmx_duty(valor);
donde el x hace alusion al modulo CCP a utilizar, en el caso del PIC16F887 solo tiene CCP1
y CCP2, así que si queremos usar el PWM del PIN 17 ponemos set_pwm1_duty(valor); y si
queremos usar el PWM del PIN 16 ponemos set_pwm2_duty(valor);

Valor es un dato de 10 bits que determina el ciclo de trabajo o ancho de pulso, es decir
ese valor va a determinar el porcentaje (En bytes) en que la señal de PWM se va a
mantener encendida. Este valor junto con el valor del preescaler del TMR2 definen el ciclo
de trabajo. En la configuración del TIMER 2 el postcaler debe valer 1.

Como comenté anteriormente el ancho de Pulso ó Ciclo de trabajo para el modulo CCP
del PIC puede tener como máximo un valor de 10 bits, eso si, ésta resolución depende
exclusivamente del periodo del PWM que nosotros queramos implementar.

Como uso estas instrucciones?

Para generar una señal de PWM con el PIC, tenemos que utilizar el TIMER 2, el cual es un
Timer de 8 Bits.

Internamente el PIC, usa el TIMER 2 como base de tiempo para la modulación del PWM
utilizando el módulo CCP.
Con la siguiente formula podemos calcular la frecuencia de salida

El Prescaler del TIMER 2 Puede ser 1, 4 o 16.

La carga del Timer 2 (conocido como PR2), también podría ser llamada como el Periodo
de la Señal y puede tomar valores entre 0 y 255, debido a que es un registro de 8 bits.

Considerando que vamos a utilizar un cristal de cuarzo de 4000Mhz, calculemos cual seria
la frecuencia mínima para dicho cristal.
Valor mínimo:

Valor Máximo:

Recordando claro, que éstos son valores teóricos.

Listo, ya sabemos que lo primero que debemos encontrar es el valor de carga del timer 2
(PR2) y que éste depende del tipo de cristal que estamos usando y depende de los
valores de preescaler que nosotros seleccionemos (1,4 o 16).

Ahora vamos a calcular la Resolución que vamos a usar en nuestro PWM. Para eso,
sabemos que la máxima resolución del PWM es 10 bits o 1024 bytes. Si observamos la
ecuación de frecuencia del PWM en su denominador los dos
parámetros hacen referencia a la resolución que se puede
alcanzar con el PWM, note que si la carga del timer2 fuera su valor máximo (255) el
resultado de esa operación nos daría 1024 ( ). Entonces para saber
cuantos bits tenemos en una señal PWM a la frecuencia que nosotros deseamos,
podriamos representar ese termino como ,
donde n es el numero de bits que como máximo sería 10 bits.

Así, podriamos reescribir la ecuación de la frecuencia del PWM como:

Y como lo que queremos es determinar la resolución, simplemente despejamos n de la


ecuación anterior aplicando logaritmos a ambos lados de la igualdad:

Con ese valor de resolución de ancho de pulso (n) sabremos cuanto es el BYTE que
debemos colocar en la variable valor de la instrucción que habíamos comentado en la
parte de arriba:

set_pw mx_duty(valor);

1 set_pwmx_duty(valor);

donde:

NOTA IMPORTANTE

El valor de la Carga del Timer 2 NUNCA puede ser mayor que el ancho de pulso (Variable
valor).
Vamos ahora a configurar el PIC utilizando un ejemplo Práctico.

Ejemplo 1

Vamos a generar una señal cuadrada de 1Khz utilizando el TIMER 2 y el módulo CCP1 del PIC usando
nuestro compilador CCS C.
Solución:
Para generar una señal cuadrada de 1Khz es necesario calcular primero el periodo (Inverso de la
frecuencia) f=1Khz=1000hz.

Periodo de 1mS (Mili segundo) o 0,001 segundos donde T=Periodo.

Ahora necesitamos calcular el desbordamiento del TIMER 2 con la siguiente formula.

Reemplzando valores tenemos que:

Obtenemos que el valor de X=249. (Recordando que X tiene que estar entre 0-255, por eso se escoge un
preescaler de 4)

El Timer 2 quedaría así:


setup_timer_2(T2_DIV_BY_4,24

1 setup_timer_2(T2_DIV_BY_4,249,1);

Ahora solo nos falta determinar el valor de resolución para saber cuanto es lo máximo que podremos
variar el ancho de pulso, aplicando la formula de resolución tenemos:

Así, el máximo ancho de pulso lo voy a obtener colocando la variable valor:

El duty cycle es configurado entonces por la siguiente instrucción:


set_pwm1_duty(valor);

1 set_pwm1_duty(valor);

Donde si valor vale 0, tendre un ciclo de trabajo del 0%, si valor vale 1000, tendré un ciclo de trabajo de
100%, si valor vale 500, tendré un ciclo de trabajo de 50%

Ejemplo 2

Si se necesita una frecuencia de la señal PWM de 4Khz, y se utiliza con el microcontrolador PIC con un
oscilador o cristal de 4000Mhz, se tendrían que realizar los siguientes cálculos:
Primero se calculará la resolución para ver si se cuentan con suficientes bits para todo el ancho de pulso
o ciclo de trabajo de la señal que se quiere obtener con el módulo CCP PIC modo PWM, la resolución
no tiene que tener más de 10 bits, si en el cálculo salen mas de 10 bits hay que elegir otra frecuencia
para la señal PWM, o un oscilador o cristal con una frecuencia diferente de tal forma que la resolución
no sea mayor a los 10 bits, también hay que elegir el prescaler que se utilizará con el timer2 para obtener
la PWM Frecuencia buscada, por ejemplo si se elige un prescaler de 16 en este caso para la resolución se tendrá:

Lo que es menor a los 10bits máximos, eso indica que es posible obtener una PWM Frecuencia de 4Khz
utilizando un cristal de 4000Mhz, ademas el valor cargado en Carga del Timer2 no tiene que ser mayor
a2 5,9658
= 62,5 para obtener el máximo ancho de pulso para la PWM Frecuencia de 4Khz, luego el máximo valor
cargado en Carga del Timer2 para que la PWM Frecuencia sea de 4Khz tiene que ser a lo mucho 63, de lo
contrario la señal obtenida en el pin CCPx utilizado mediante el módulo CCP PIC modo PWM no será
de los 4khz que se quieren.

El duty cycle es configurado entonces por la siguiente instrucción:


set_pwm1_duty(valor);

1 set_pwm1_duty(valor);

Donde si valor vale 0, tendre un ciclo de trabajo del 0%, si valor vale 63, tendré un ciclo de trabajo de
100%, si valor vale 32, tendré un ciclo de trabajo de 50%

Para generar una señal cuadrada de 4Khz es necesario calcular primero el periodo (Inverso de la
frecuencia) f=4Khz=4000hz.
Periodo de 0,250mS (Mili segundo) donde T=Periodo.

Ahora necesitamos calcular el desbordamiento del TIMER 2 con la siguiente formula.

Reemplzando valores tenemos que:

Obtenemos que el valor de X=14,625. (Recordando que X tiene que estar entre 0-63 para no ser mayor
que el ancho de pulso, por eso se escoge un preescaler de 16). Así como necesitamos un valor entero,
redondeamos X=15.

El Timer 2 quedaría así:


Código de Implementación

Vamos a llevar a la practica el concepto del PWM del PIC:

EJEMPLO
Existen muchos procesos electrónicos o industriales donde necesitamos controlar la velocidad de un
Motor DC. Una manera simple de lograr este objetivo es utilizar un control por PWM. Para esto vamos a
diseñar el siguiente circuito y el código del microcontrolador por medio del compilador CCS C con el fin
de poder regular la velocidad de un Motor DC por medio de un potenciometro conectado al Terminal
RA0 (Para esto sera necesario utilizar el concepto de conversión análogo digital visto en el Post
anterior). En el post de interrupciones el Ejemplo 2 es una mejora de esta práctica donde además de
regular la velocidad del motor, se mide la velocidad del mismo a través de un encoder. (Click aqui para
ir al post de Interrupciones).
Para poder controlar el motor de 12 V necesitamos utilizar un Mosfet.

Los mosfets de potencia (power mosfets) son componentes electrónicos que nos permiten de controlar
corrientes muy elevadas. Como en el caso del los mosfets comunes, tienen tres terminales de salida que
se llaman: Drain, Source y Gate (D, S y G). La corriente principal pasa entre Source y Drain (I )
SD

mientras que el control de esta corriente se obtiene aplicando una tensión sobre el terminal Gate
(respecto al terminal Source), conocida como V .
GS

Código de Implementación:

A continuación se presenta el código para que lo copies y lo pegues en tu compilador y puedas


reproducirlo. Recuerda que para ver el código debes compartir o darle me gusta al contenido de este post
para que más personas se beneficien de esta información.

También podría gustarte