Señal PWM «Modulación por ancho de pulso», Pic C Compiler
Por
/
En esta sección aprenderás a generar una señal PWM con el microcontrolador PIC. El objetivo es programar la señal PWM de una frecuencia deseada y modular el ancho de pulso con un potenciómetro, para finalmente controlar la potencia de iluminación del LED.
Señal PWM
La modulación por ancho de pulsos (PWM) de una señal o fuente de energía es una técnica en donde se modifica el ciclo de trabajo de una señal periódica, ya sea para transmitir información a través de un canal de comunicaciones o para controlar la cantidad de energía que se envía a una carga.
Circuito de conexión
Calcular PR2 para establecer la frecuencia de 60Hz
Código archivo .h
En el archivo .h se define el oscilador interno de 500Khz, este es necesario para que la frecuencia de la señal PWM sea la correcta.
#use delay(internal=500000)
Código archivo .c
Se habilita el timer2 y se define la frecuencia de la señal PWM de salida.
setup_timer_2(T2_DIV_BY_16,129,1);// señal de 60Hz o 16.66 ms
Se habilita el pin CCP1, por el cual saldrá la señal PWM.
setup_ccp1(CCP_PWM);//habilita el pin ccp1
Como se utilizara un potenciómetro para modificar el ciclo de trabajo se habilita el pin analógico 0 donde se conectara el potenciómetro.
setup_adc(ADC_CLOCK_INTERNAL);//conversion analogico digital
set_adc_channel(0);//lectura Vout del potenciometro en pin AN0
La siguiente instrucción guarda el valor del potenciómetro.
x=read_adc();//lectura del potenciometro
Se realiza una conversión de 0 a 1023 del potenciómetro por 0 a 520 del ciclo de trabajo.
dutyclicle=(x*520.0)/1023;//conversion de 0 a 1023 por 0 a 520
Finalmente se define la instrucción que modifica el ciclo de trabajo de la señal PWM girando el potenciómetro.
set_pwm1_duty((int16)dutyclicle);
Código completo
#FUSES NOMCLR
void main()
{
setup_timer_2(T2_DIV_BY_16,129,1);// señal de 60Hz o 16.66 ms
setup_ccp1(CCP_PWM);//habilita el pin ccp1
setup_adc(ADC_CLOCK_INTERNAL);//conversion analogico digital
set_adc_channel(0);//lectura Vout del potenciometro en pin AN0
float dutyclicle=0;
int16 x=0;
while(TRUE)
{
x=read_adc();//lectura del potenciometro
dutyclicle=(x*520.0)/1023;//conversion de 0 a 1023 por 0 a 520
set_pwm1_duty((int16)dutyclicle);
}
}