Autor Tema: Aqui tengo un voltimetro.. pero necesito ayuda..  (Leído 3489 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado _JaM_

  • PIC10
  • *
  • Mensajes: 26
Aqui tengo un voltimetro.. pero necesito ayuda..
« en: 24 de Mayo de 2005, 20:54:00 »
Hola un saludo a todos..

Modifique el programa de un voltimetro pero tengo un error, espero alguien me pueda ayudar..

Lo que pasa es que no me hace una lectura confiable..

Oscila el valor real hasta en 1 volt.. no me manda la medicion estable y correcta.. oscila demasiado por ejemplo me manda estos valores en menos de 1 seg (10,10.5,11,11.5)..
Estoy midiendo una fuente de 127, la reduzco a 3v rms.. y con operacionales la monto en una senal de directa y la ajusto a 5 volts (offset de 2.5)..

En otras palabras tengo una senal senoidal toda positiva  de 5 volts..

Alguien me podria decir como puedo hacer una lectura confiable???
Si aumento el numero de muestras me da una medicion mas confiable, pero al hacer eso, le tarda mas tiempo en mandar la informacion por el puerto serial..

Aqui esta el codigo si alguien me puede ayudar se los agradeceria mucho..




#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() {

   float voltaje,valor,rms,conver;
   long int muestras=1000;
   long i,x;

   setup_port_a( ALL_ANALOG );
   setup_adc( ADC_CLOCK_DIV_32);
   set_adc_channel( 0 );


   while(TRUE)

{
   voltaje=0;
   valor=0;

               for (i=0; i<muestras; i++)
                        {
                           valor = Read_ADC();
                           valor-=511.5;             se le resta el offset a 5 volts (2.5=511.5)
                           voltaje+=valor*valor;
                        }

    voltaje/=41861.16;    //convierte los bits a volts de 0 a 5

    rms =sqrt(voltaje/(muestras));

    rms*=71.842055; //Constante para convertir de 0 a 127 V

   printf("
%f",rms);   //muestra el voltaje RMS

  }
}



Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Aqui tengo un voltimetro.. pero necesito ayuda..
« Respuesta #1 en: 24 de Mayo de 2005, 23:57:00 »
No creo que tu problema esté en el programa, sino en el circuito. ¿Puedes subir el esquema y le echamos un vistazo?

Desconectado _JaM_

  • PIC10
  • *
  • Mensajes: 26
RE: Aqui tengo un voltimetro.. pero necesito ayuda..
« Respuesta #2 en: 25 de Mayo de 2005, 13:15:00 »
Lo tengo simulado en Proteus y me da las mismas variaciones...

Aqui esta el circuito en proteus y el HEX.... si alguien me dice como puedo subirlo.. con gusto lo hare..

A ver si alguien me puede ayudar a mejorarlo...

Desconectado _JaM_

  • PIC10
  • *
  • Mensajes: 26
RE: Aqui tengo un voltimetro.. pero necesito ayuda..
« Respuesta #3 en: 25 de Mayo de 2005, 13:26:00 »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Aqui tengo un voltimetro.. pero necesito ayuda..
« Respuesta #4 en: 25 de Mayo de 2005, 16:53:00 »
Pero si le metes una señal senoidal, ¿no es normal que oscile?, ¿o es que no he entendido tu problema?

Desconectado _JaM_

  • PIC10
  • *
  • Mensajes: 26
RE: Aqui tengo un voltimetro.. pero necesito ayuda..
« Respuesta #5 en: 26 de Mayo de 2005, 12:48:00 »
Claro que oscila pero lo que quiero es que no oscile demasiado que lo haga casi igual que un voltimetro real..

Lo que pasa es que la lectura se hace mas confiable y exacta al aumentar el numero de muestras.. pero con la desventaja de que le toma mas tiempo en realizar las operaciones al PIC y eso ocasiona que no pueda obtener una lectura en tiempo real, ya se que nunca la voy a obtener en tiempo real,... por que ademas la estoy sacando por el puerto serial..incluso le toma hasta 1 segundo enviarme el valor (mas exacto y confiable)...

Al modificar el programa cambie unas variables de float a int, otras a long int, como nunca habia usado C no se muy bien cuantos bits ocupa cada variable... cuantos decimales se pierden en el proceso, y el tiempo que les tarda en procesar variables de ese tipo..


Si alguien sabe como no usar tantas decimales para realizar las operaciones, o redondear el resultado al momento de desplegarlo, que por lo menos use 2 decimales se los agardeceria mucho...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Aqui tengo un voltimetro.. pero necesito ayuda..
« Respuesta #6 en: 26 de Mayo de 2005, 14:02:00 »
Seguramente es que estoy espeso pero no entiendo tu problema. He visto tu esquema Proteus y si en vez de meterle una señal senoidal se la meto DC no oscilada nada de nada, como por otra parte es lógico.

Con respecto a tu pregunta de los decimales, si imprimes un float con printf, puedes hacer esto:
printf("%3.2f",variable); // imprime 3 dígitos enteros y 2 decimales

Desconectado _JaM_

  • PIC10
  • *
  • Mensajes: 26
RE: Aqui tengo un voltimetro.. pero necesito ayuda..
« Respuesta #7 en: 27 de Mayo de 2005, 18:17:00 »
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..
   }
}
}


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Aqui tengo un voltimetro.. pero necesito ayuda..
« Respuesta #8 en: 28 de Mayo de 2005, 00:16:00 »
Ahora por fin sí entiendo tu problema, y me alegro que lo hayas resuelto.
A pesar de todo, veo algo en tu programa que podría dar dolor de cabeza. Se trata de la línea siguiente:
if (cruce>=511) //Busca la mitad de la senal

Si la variable cruce está aumentando porque está leyendo la parte del semiciclo ascendente, la condición se activará en el cruce por 0 en flanco ascendente.
Pero y si le pillas en cualquier parte del semiciclo positivo, no necesariamente en la parte ascendente, sino en cualquier otra. La condición se activaría aunque fuera por ejemplo, cruce = 900.

¿No crees que eso podría determinar una lectura falsa?

Desconectado _JaM_

  • PIC10
  • *
  • Mensajes: 26
RE: Aqui tengo un voltimetro.. pero necesito ayuda..
« Respuesta #9 en: 30 de Mayo de 2005, 17:30:00 »
Bueno lo que pasa eske hay algo muy extraño..
Se supone que no pasa nada.. porque el cilco for hara 157 iteraciones.. que corresponderian exactamente a 2 ciclos...
asi que puedo eliminar la variable de "cruce"... por que yo se que independientemente de donde obtenga el valor el convertidor, este se realizara 157 veces y me dara 2 ciclos...


Pero lo extraño esta al momento de quitar la variable cruce... ya no obtengo un valor fiable.. varia mucho.. no se si sea por eliminar esas instrucciones ahora tome menos tiempo en las operaciones y ya no sean necesarias las 157 iteraciones,, tal vez sean menos..

Y teninedo la variable cruce no hay ese error.. igual puede empezar de 900, o 1023 y dar una lectura confiable...


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Aqui tengo un voltimetro.. pero necesito ayuda..
« Respuesta #10 en: 31 de Mayo de 2005, 00:01:00 »
Si te oscila al quitar esa comparación será seguramente porque lo de 157=2 ciclos es impreciso.
¿Porqué no pruebas a meter una comprobación adicional para asegurarte que estás mirando el semiciclo creciente?


while(TRUE)

{
valor=0;
antcruce=cruce;
cruce = Read_ADC();
output_low(PIN_B7);

if ((cruce>=511) && (antcruce<cruce)) //Busca la mitad creciente de la senal

Desconectado _JaM_

  • PIC10
  • *
  • Mensajes: 26
RE: Aqui tengo un voltimetro.. pero necesito ayuda..
« Respuesta #11 en: 31 de Mayo de 2005, 22:04:00 »
ok. lo intentare a ver que pasa...
Lo que estoy haciendo ahora es promediar los valores obtenidos para obtener un valor mas estable...