sábado, 10 de marzo de 2012

16F876A ADC y HPWM

Muy buenas a todos y todas!!!

Buscando como controlar las locomotoras de la maqueta encontré como configurar la instrucción HPWM que tiene internamente el 16F876A.

¿Qué es HPWM?

HPWM es una instrucción que hacia tiempo que quería probar pero siempre me había dado fallos, eso unido a mi poca paciencia y tiempo...

Al final junto con un ejemplo que encontré en Todo PIC y revisando la ayuda de Microcode Studio, hice este pequeño programa para controlar la intensidad de 2 leds con los conversores analógicos.

Una de las ventajas que tiene es que se ejecuta en segundo plano así que puedes hacer otras cosas mientras que se ejecuta hpwm.

Una de las desventajas es que utiliza pines específicos del PIC llamados CCP, en el caso del 16F876A son 2 y están situados en los pines 12 y 13 (CCP2 y CCP1 respectivamente).

Para activar el HPWM en PBP se utilizan los siguientes DEFINE'S en la configuración inicial del programa:

DEFINE CCP1_REG PORTC ' Hpwm 1 pin port
DEFINE CCP1_BIT 2 ' Hpwm 1 pin bit
DEFINE CCP2_REG PORTC ' Hpwm 2 pin port
DEFINE CCP2_BIT 1 ' Hpwm 2 pin bit

Con esto se habilita el HPWM, y la instrucción es así:


HPWM Channel, Dutycycle, Frequency

  • Channel: Es el canal del CCP que estemos usando, 1 para CCP1 y 2 para CCP2
  • Dutycycle: pondremos la variable o el número que queramos para los ciclos que especifica el encendido / apagado en relación a la Frecuencia (Frequency).
    Con una variable Byte, 0 es totalmente apagado, 127 es la mitad de la onda y 255 seria la onda completa, en el caso del led, este brillara a su máxima potencia.
  • Frequency: estoy utilizando el valor de 255 aunque no lo tengo muy claro asi que lo mejor es que lo consulteis en el datasheet del mismo 16F876A

Ejemplo para el uso de HPWM


' Control HPWM con la lectura ADC del microcontrolador 16F876A
' Lee los potenciómetros y ajusta la intensidad de los leds conectados
' a los puertos  CCP1 y CCP2


define LOADER_USED 1  ' Para usar el bootloader del 16F876A

DEFINE OSC 4          ' Define la velocidad de reloj del microcontrolador


define ADC_BITS 10     ' Conversión A/D a 10 bits
Define ADC_CLOCK 3   
DEFINE ADC_SAMPLEUS 50 ' Tiempo de muestreo
DEFINE CCP1_REG PORTC  ' Hpwm 1 pin port
DEFINE CCP1_BIT 2      ' Hpwm 1 pin bit
DEFINE CCP2_REG PORTC  ' Hpwm 2 pin port
DEFINE CCP2_BIT 1      ' Hpwm 2 pin bit

' Variables para el dato
Dato1 var word       
Dato2 var word
Dato3 var word

dato1 = 0
dato2 = 0
dato3 = 0

TRISA = %11111111
TRISC = %00000000
portc = %00000000   

ADCON1 =%10000000

Pause 1000

Inicio:

  adcin 0, dato1
  dato1 = (dato1 / 4)
  hpwm 1, dato1, 250


  adcin 1, dato2
  dato2 = ( dato2 / 4)
  hpwm 2, dato2, 250
goto inicio
end        


Imagen del montaje en Proteus:


Otros artículos sobre PWM en microcontroladores que te pueden interesar:


Un saludo a todos y todas!!!

2 comentarios :

  1. Amigo la frecuencia es la cantidad de ciclos de alto y bajo de tu pwm, un periodo es un ciclo completo sumando el tiempo en alto y el tiempo en bajo.
    osea que si colocas en frecuencia por ejemplo 1000, quiere decir que tu frecuencia es de 1 khz osea que tu programa ejecutara 1000 peiodos de encendido y pagado en un segundo.

    ResponderEliminar
    Respuestas
    1. Gracias por el aporte Juan Angel. Añadiré más información a este tema.

      Eliminar