Encontre una mejoria, ahora solo oscila 0.3 Volts.. por lo menos es mas eficiente y exacto que el anterior
Lo que pasa es lo siguiente:
Quiero medir voltaje de alterna (Vac) con un PIC.. tengo una fuente regulable de 0 a 127 volts de alterna.
Tomo esa conexion de 127 V, lo reduzo con un transformador de 127V a 6V.. y obtengo tengo una senal senoidal pequena con semiciclos positivos y negativos..
Como el PIC solo analiza voltajes positivos y no mayores de 5 volts, hize un un sumador de nivel o de voltaje, con operacionales... quedandome una senal de 0 a 5 volts senoidal montada en una senal de corriente directa
Y con el programa que esta abajo hago la adquisicion en bits de la senal senoidal de 0 a 5 volts, despues hago una sumatoria para sacar el valor eficaz o rms (es el valor que obtenemos al medir con cualquier voltimetro normal) hago la conversion... y obtengo un valor rms en escala de 0 a 5.. depues lo multiplico por diversos factores para aumentarlo de escala y manejarlo de 0 a 127 volts.. y listo obtengo una medicion real de una fuente de 127 Volts que solo me varia por 0.3 volts...
Aqui les pongo el codigo, es lo mas que he podido hacer para mejorar el programa.. si alguien tiene una mejor idea con gusto la considerare...
AAAAAA y gracias nocturno por tus respuestas.. por lo menos ya no me sentia tan solo, con alguien que me quiso ayudar... GRACIAS!!
#if defined(__PCM__)
#include <16f874A.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#elif defined(__PCH__)
#include <16f874A.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#endif
#define <math.h>
#include <math.h>
#include <stdlib.h>
#include<stdio.h>
main() {
long int muestras=157;
long i,x,cruce;
float valor,voltaje,rms;
setup_port_a( ALL_ANALOG );
setup_adc( ADC_CLOCK_DIV_32);
set_adc_channel( 0 );
cruce=0;
while(TRUE)
{
valor=0;
cruce = Read_ADC();
output_low(PIN_B7);
if (cruce>=511) //Busca la mitad de la senal
{
for (i=0; i<muestras; i++) //Empieza a leer el convertidor 157 veces
{ // hize varias pruebas y obtuve que 157=2
valor = Read_ADC(); // ciclos,, le reste 512 para baja la senal a
valor-=512; //un offset 0,
voltaje+=valor*valor; // e hize la sumatoria
}
voltaje/=41861.16; //esta constante convierte el valor de 10 bits
// a 5 v.
rms =sqrt(voltaje/(muestras)); //teniendo el valor en volts saco el valor rms
printf("
%3.3f",rms*71.842055);// el valor obtenido lo multiplico por otra
// constante para escalar el valo de 0-5v a 0-127..
}
}
}