Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
de Pulso)
El PWM (Modulación por Ancho de Pulso), 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
CCPcomo se puede apreciar en la siguiente figura, los cuales corresponden a los PINES 16
y 17 (Correspondientes al puerto C, RC1 y RC2).
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.
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 tabla:
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 Modulación por Ancho de Pulso 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 por Ancho de Pulso
(PWM) utilizando el módulo CCP.
Valor Máximo:
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:
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_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.
Obtenemos que el valor de X=249. (Recordando que X tiene que estar entre 0-255, por
eso se escoge un preescaler de 4)
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:
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%
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 PWMFrecuencia 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 PWMFrecuencia de
4Khz utilizando un cristal de 4000Mhz, ademas el valor cargado en Carga del Timer2 no
tiene que ser mayor a 25,9658 = 62,5 para obtener el máximo ancho de pulso para la
PWMFrecuencia de 4Khz, luego el máximo valor cargado en Carga del Timer2 para que la
PWMFrecuencia 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.
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.
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.
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).
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 (ISD) mientras que el control de esta corriente se obtiene aplicando una tensión sobre el
terminal Gate (respecto al terminal Source), conocida como VGS.
#include <16f887.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT,INTRC_IO
#use delay(clock=4000000)
int16 duty=0;
int Timer2,Poscaler;
void main() {
// Generemos una Señal cuadrada de 1 Khz
Timer2=249; //Se carga timer 2 con 249 como lo vimos en la pagina
//Preescaler=4; //Preescaler solo puede tomar valores de: 1 - 4 - 16
//Para el preescaler colocamos "t2_div_by_4"
Poscaler=1; //Preescaler solo puede tomar valores de: 1