4.8 Ejemplo 6
Módulo CCP1 como generador de señal PWM
Este ejemplo muestra el uso del módulo CCP1 en modo PWM. Para hacer las cosas más interesantes, la duración de los pulsos en la salida P1A (PORTC,2) se puede cambiar por medio de los botones de presión simbólicamente denominados ‘OSCURO’ y ‘CLARO’. La duración ajustada se visualiza como una combinación binaria en el puerto PORTB. El funcionamiento de este módulo está bajo el control de las funciones pertenecientes a la librería especializada PWM. Aquí se utilizan las tres de ellas:
- PWM1_init tiene el prototipo:
sub procedure PWM1_Init(const freq as longint)
El parámetro freq ajusta la frecuencia de la señal PWM expresada en hercios. En este ejemplo equivale a 5kHz.
- PWM1_Start tiene el prototipo:
sub procedure PWM1_Start()
- PWM1_Set_Duty tiene el prototipo:
sub procedure PWM1_Set_Duty(dim duty_ratio as byte)
El parámetro duty_ratio ajusta la duración de pulsos en una secuencia de pulsos.
La librería PWM también contiene la función PWM_Stop utilizada para deshabilitar este modo. Su prototipo es:
sub procedurePWM1_Stop()

' Cabecera ******************************************************
program example_6 ' Nombre de programa
dim current_duty, old_duty, oldstate as byte ' Definir las variables current_duty
' old_duty y oldstate
main: ' Inicio del programa
ANSEL = 0 ' Todos los pines de E/S se confguran como digitales
ANSELH = 0
PORTA = 255 ' Estado inicial del puerto PORTA
TRISA = 255 ' Todos los pines del puerto PORTA se configuran como entradas
PORTB = 0 ' Estado inicial del puerto PORTB
TRISB = 0 ' Todos los pines del puerto PORTB se configuran como salidas
PORTC = 0 ' Estado inicial del puerto PORTC
TRISC = 0 ' Todos los pines del puerto PORTC se configuran como salidas
PWM1_Init(5000) ' Inicialización del módulo PWM (5 KHz)
current_duty = 16 ' Valor inicial de la variable current_duty
old_duty = 0 ' Reiniciar la variable old_duty
PWM1_Start() ' Inicialización del módulo PWM1
while 1 ' Bucle infinito
if oldstate and Button(PORTA, 0,1,1) then ' Si se presiona el botón conectado al RA0
current_duty = current_duty + 1 ' incrementar el valor de la variable current_duty
if Button(PORTA, 0, 1, 1) then
oldstate = 255
end if
end if
if oldstate and Button(PORTA, 1,1,1) then ' Si se presiona el botón conectado al RA1
current_duty = current_duty - 1 ' decrementar el valor de la variable current_duty
if Button(PORTA, 1, 1, 1) then
oldstate = 255
end if
end if
if old_duty <> current_duty then ' Si current_duty y old_duty no son iguales
PWM1_Set_Duty(current_duty) ' ajustar un nuevo valor a PWM,
old_duty = current_duty ' guardar el nuevo valor
PORTB = old_duty ' y visualizarlo en el puerto PORTB
end if
Delay_ms(200) ' Tiempo de retardo 200mS
wend
end. ' Final de programa
Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes librerías en la ventana Library Manager antes de compilar el programa: