Señal PWM «Modulación por ancho de pulso», Pic C Compiler

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);

   }
}
Scroll al inicio