ADC, PWM con AC en LCD

Este programa puede además de medir el voltaje de corriente alterna, puede variar el PWM generado por el PIC, el cual se puede ver su variación mediante el uso del osciloscopio.
Para poder medir la corriente alterna sin que se queme el PIC se emplea un circuito externo, para que pueda rectificar la corriente y poder bajarla a 5 volts, mediante un divisor de voltaje. Para el uso del PWM, el cual lo que hace es generar una señal cuadrada, la cual se puede variar para dejar en ciertos tiempos los ciclos de trabajo, ya sea en ON o en OFF.

  • Código:
#include <clase6.h>
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

#include <lcd.c>
#include <math.h>

float valor,max2,max=0,vol=0; 
float valorp,valorpw;
int i;

void main()
{
   setup_adc_ports(AN0_TO_AN1);
   setup_adc(ADC_CLOCK_INTERNAL|ADC_TAD_MUL_0);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);      //32.7 ms overflow
   setup_timer_2(T2_DIV_BY_16,249,1);      //2.0 ms overflow, 2.0 ms interrupt, frec. 500Hz

   setup_ccp1(CCP_PWM|CCP_SHUTDOWN_AC_L|CCP_SHUTDOWN_BD_L);
   //pulse width modulation, envia información de manera analogica
   set_pwm1_duty((int16)498); //configura el pwm, puede ser de 10bits (0-1023), en este caso hara de (0-996)
 
   lcd_init();
   lcd_gotoxy(13,1);
   lcd_putc('M');
   lcd_putc('S');
   lcd_putc('L');
   lcd_putc('A');

   while(TRUE)
   {
      set_adc_channel(0);
      delay_us(10);
                  
     //visualizacion del voltaje AC
     for (i=0;i<50;i++)
     {
       valor=read_adc();
       vol+=valor;
       delay_ms(20);
     }

      vol=vol/50; //para conversion VCA
      lcd_gotoxy(1,1);
      max2=(20*vol)/1023 ;
      printf(LCD_PUTC, "volts=%0.2g", max2); //voltaje
   
      lcd_gotoxy(1,2);
      set_adc_channel(1);
      delay_us(10);
   
    //visualizacion % del pwm
    for (i=0;i<50;i++)
     {
      valorpw=read_adc();
      //if(valorpw>max)
       max+=valorpw;
         delay_ms(20);
     }
          
      max=max/10; //para calculos del PWM
      valorp=((996*max)/1023);
    
      //printf(LCD_PUTC, "VAC=%0.3g ",max/10);
     
     
      set_pwm1_duty((int16)valorpw);
     
      printf(LCD_PUTC, "%%PWM=%0.2g",(valorp/50)-10.67); //PWM
      lcd_gotoxy(10,2);
     
      //printf(LCD_PUTC, "VA=%0.2g",max2); //Volt AC
      //max=0;
   
   }

}

  • Simulación en Proteus:


  • Armado y ejecución:


No hay comentarios:

Publicar un comentario

Ultima entrada ingresada

SISTEMA DE RIEGO AUTOMÁTICO CON MÚSICA

El objetivo era hacer un programa que pueda activar una bomba de agua en la noche, y que por las mañanas reproduzca música para las plantas....