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:
- Primer programa 16F876A ADC y PWM
- Arduino ejemplos: Lectura analógica y led PWM
- Raspberry Pi 3 ventilador PWM
Un saludo a todos y todas!!!
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.
ResponderEliminarosea 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.
Gracias por el aporte Juan Angel. Añadiré más información a este tema.
Eliminar