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:
#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