PWM POR HARDWARE : Control de brillo de un LED.

Que tal amigos, en este post “PWM POR HARDWARE : Control de brillo de un LED.” aprenderemos a aplicar toda la teoría vista en nuestro post introductorio al PWM.

Recuerda que habíamos visto que existían dos formas de generar señales PWM y la mas conocida o difundida es la manera que utiliza el modulo CCP del PIC. A este modo le llamamos PWM por HARDWARE.

Recuerda también que el timer que se utiliza en este modo es el TIMER 2.

Si algo de esto no te quedo claro puedes revisar toda la teoría introductoria del PWM en este LINK:

INTRODUCCION AL PWM.

Veamos a continuación como aplicar las formulas del PWM.

PWM POR HARDWARE : APLICACION DE LAS FORMULAS.

Digamos que tenemos la siguiente situación:

Contamos un un PIC 16f628 y requerimos una salida PWM para controlar el brillo de un LED, el sistema contara con las siguientes características:

  • Usaremos el PIC 16f628 y un cristal de 4MHZ.
  • Usaremos el modulo CCP del PIC para controlar una salida PWM.
  • Requerimos una señal PWM de 1.2 kilo hertz.
  • El ciclo de trabajo deberá incrementarse y disminuirse automáticamente mediante 2 ciclos FOR dentro de la programación.

Comenzaremos por extraer los datos necesarios para la aplicación de la formula:

Al estar usando un cristal de 4 MHZ nuestro TOSC seria :

Luego con la frecuencia de 1.2 KHz PWM que se nos pide hallamos el periodo de la señal :

Ahora ya podemos aplicar nuestra formula del periodo del PWM la cual tiene como objetivo hallar el valor de PR2 y el Valor de PRESCALADOR del TIMER2.

Formula del periodo PWM

Ahora reemplazamos los valores de Periodo y TOSC que ya tenemos y probaremos con los 3 distintos valores que puede usar el prescalador : 1 , 4 o 16.

PWM Control de brillo de un LED.
Formulas de periodo

Como podemos ver tenemos 3 diferentes resultados con los distintos valores de prescalador, escogeremos finalmente el que cumpla estos 2 criterios:

  1. Seleccionar los valores de prescalador cuyo resultado PR2 estén dentro del rango de 0 y 255.
  2. De los valores que queden seleccionar finalmente el que tenga el mayor valor de PR2.

En nuestro ejemplo con el prescaler 4 y 16 tenemos un valor de PR2 cumplen con el primer criterio ya que ambos están entre 0 y 255.

Finalmente aplicando el segundo criterio tenemos que con el prescaler de 4 obtenemos un valor de PR2 de 206.5 el cual es el mayor valor y que para facilitar los cálculos podemos redondear a 206.

PR2 = 206

El objetivo de escoger el resultado de mayor PR2 es por que mientras mas alto el PR2 mas alta la resolución de PWM que se puede obtener.

Encontrando la resolución de la frecuencia PWM

Ahora que ya conocemos el valor que tomara nuestro registro PR2 aplicamos la formula para encontrar los bits de resolución que le corresponden. Recordemos la formula:

Remplazando el valor de PR2 en la primera formula obtenemos:

Finalmente con los bits de resolución podemos hallar la resolución final de nuestro PWM.

Podemos finalmente redondear la resolución:

RESOLUCION PWM = 832

Y listo ya tenemos todos los datos que requiere nuestro programa para controlar una salida PWM.

CODIGO DE PROGRAMACION DE UNA SALIDA PWM.

Finalmente veamos el código de nuestro programa PWM con los datos que hemos obtenido mediante la aplicación de las diferentes formulas:

#INCLUDE <16f628a.h>   // SI SE DEFINE SE DEBE COMENTAR EL OTRO INCLUIDE DEL PROYECTO SI NO SALE ERROR DE COMPILACION.

#FUSES NOWDT      // Es un fuse que resetea el pic si este se cuelga. Funciona con una rutina que evita que su contador llegue a 0. si el chip se cuelga la rutina tambien y el contador al llegar a 0 RESETA el CHIP  
#FUSES NOPROTECT  // Se usa para leer o evitar que lean el programa del PIC mediante un PROGRAMADOR como nuestro PICKIT
#FUSES NOLVP      // EL PIN RB4 en este pic se puede usar como pin de programacion, al desabilitarse el fuse con NOLVP el PIN queda con su configuracion normal de Entrada/Salida Digital.
#FUSES NOMCLR     // NOMCLR, el PIN RA5 se puede usar como INPUT. MCLR el PIN RA5 se usa como INPUT RESET debe llavar un R de 3k 0 10k a VDD y pulsador a GND para RESETEAR 

#FUSES INTRC_IO   // HABILITA el OSCILADOR INTERNO debe ir acompñado de #use delay(clock = X000000 , INTERNAL)
#USE DELAY(clock = 4000000, INTERNAL) // COMPLEMENTA EL FUSE INTRC_IO DEFINIENDO LA FRECUENCIA DEL RELOJ INTERNO.

# USE fast_io(A)        // SET RAPIDO DE PUERTO A TRABAJA CON SET_TRIS_A(0B0000000), SET_TRIS_A(0X00),SET_TRIS_A(0) y 
# USE fast_io(B)        // SET RAPIDO DE PUERTO B TRABAJA CON SET_TRIS_A(0B11111111), SET_TRIS_A(0XFF),SET_TRIS_A(1)

int16 i=0;             // SE DECLARA LA VARIABLE i PARA LA RESOLUCION DEL PWM

void main()
  {

  SET_TRIS_B(0b11110111);             // EL PIN CCP1 DEL PIC DEBE CONFIGURARSE COMO SALIDA PARA QUE FUNCIONE EL PWM
  setup_comparator(NC_NC_NC_NC);      // APAGAMOS TODOS LOS COMPARADORES ANALOGOS DEL PIC
  setup_ccp1(CCP_PWM);                // CONFIGURAMOS CCP1 EN MODO PWM
  setup_timer_2(t2_div_by_4,206,1);   // CONFIURACION DEL TIMER 2 CON PRESCALER, PR2 Y POSTSCALER
                
  

// RUTINA PARA VARIAR LOS VALORES DEL CICLO DE TRABAJO DEL PIC DESDE 0 A 315 Y VICEVERSA.
 while (1)
{
for (i=0;i<832;i++)
{
set_pwm1_duty(i);
delay_ms(1);
}

// BAJAR INTENCIDAD GRADUAL MENTE
for (i=832;i>0;i--)
{
set_pwm1_duty(i);
delay_ms(1);
}

}
}

Analicemos las principales lineas del codigo:

Revisemos las lineas principales del programa:

  • SET_TRIS_B(0b11110111);

El pin RB3 CCP1 debe configurarse como SALIDA para habilitar el PWM.

  • setup_ccp1(CCP_PWM);

Con esta sentencia configuramos el modulo CCP en modo PWM.

  • setup_timer_2(t2_div_by_4, 206, 1);

Esta es la linea principal del programa ya que contiene los valores del PRESCALER y del registro PR2 del PIC:

formula prescaler registro pr2  PWM

Finalmente analicemos uno de los ciclos FOR que controlan la resolución es decir los 832 distintos anchos de pulso que contendrá nuestra señal PWM de 1.2 khz:

formula prescaler registro pr2  PWM

Finalmente una captura de pantalla de como se ve la simulación de nuestro programa en PROTEUS:

PWM CONTROL DE BRILLO LED PR2 Y CICLO DE TRABAJO

y una foto del circuito:

pwm led control de brillo

A continuación te dejo los links para que puedas descargar la simulación y el código completo de nuestro programa:

CODIGO Y SIMULACION PWM

Si ahora deseas revisar como generar señales PWM por SOFTWARE puedes visitar el siguiente POST:

PWM por SOFTWARE : control de brillo de 4 leds.

Eso ha sido todo amigos en este post ” PWM POR HARDWARE : Control de brillo de un LED “ esperamos que esta info en algún momento te se a de utilidad.

Recuerda que una manera de ayudarnos es visitando los anuncios que aparecen a lo largo del post. Gracias!

Recuerda tambien que puedes visitar todo el contenido de nuestro blog en :

BLOG DE TECNOCIENCIA.

También puedes visitar nuestro canal de YouTube en :

CANAL DE YOUTUBE TECNOCIENCIA

https://www.tecnocienciaperu.com/blog/

https://www.youtube.com/c/MarcosAguilar_mks/videos?view_as=subscriber

Agregue un comentario

Su dirección de correo no se hará público. Los campos requeridos están marcados *