Autor Tema: Problema con el ADC (Tiempo de Muestreo)  (Leído 4984 veces)

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

Desconectado lmezah

  • PIC10
  • *
  • Mensajes: 7
Problema con el ADC (Tiempo de Muestreo)
« en: 21 de Agosto de 2010, 13:25:57 »
Hola a todos!!...espero que esten bien...les escribo porque tengo un problema...estoy muestreando una señal de voltaje de 60Hz, con posibles perturbacioens de frecuencias de hasta 1Khz, pero cuando muestreo me produce un error... obviamente primero deseo muestrear bien la señal pura de 60Hz, y luego agregar el ruido y cambiar la frecuencia de muestreo, entonces para la señal de 60Hz tomo como minimo una frecuencia de muestreo de 120Hz, para esto tome un delay de 8ms aprox 120Hz... y ahora si lo muestreo a mas como por ejemplo 1Khz me da error, osea...cuando transmito serialmente con la PC y grafico el resultado se ve mal... se ve una curva mal muestreada... pero no entiendo muy bien porque.... soy novato aun usando microcontroladores y creo q no estoy tomando en cuenta el tiempo que se demora de escritura en la EEPROM, pero quisiera saber como deberia o que recomendaciones deberia tener en cuenta para por lo menos muestrear bien mi señal, porque he usar la interrupcion #INT_AD con el modulo CCP en comparador y nada... les adjunto el codigo y los resultados de tomar 120Hz y 1Khz como frecuencia de muestreo para que me puedan ayudar.... espero su respuesta...muchas gracias por su tiempo

Atte

LmezaH

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con el ADC (Tiempo de Muestreo)
« Respuesta #1 en: 21 de Agosto de 2010, 13:49:02 »
El teorema de Nyquist dice, que una señal debe ser muestreada con una frecuencia mínima de 2 veces el ancho de banda, para poder reconstruir la señal original. O sea establece un mínimo, pero si se quiere obtener algo coherente cuando realizas un gráfico lo mínimo me parece que ronda 10 veces el ancho de banda. Entonces para la señal de 60Hz, creo que una buena frecuencia de muestro va a ser 1kHz. Y para detectar alguna distorción de 1kHz, mínimo 10kHz   :?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: Problema con el ADC (Tiempo de Muestreo)
« Respuesta #2 en: 21 de Agosto de 2010, 14:18:29 »
Este es el código que me gusto, el otro no sirve porque no asegura la frecuencia de muestreo puede variar entre muestra y muestra.

Código: [Seleccionar]
#include <16F877A.h>
#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#define CRYSTAL 20000000
#use delay(clock=CRYSTAL)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

int16 q;
float p;
   
#INT_AD
   void ad_int(){
   q=read_adc(ADC_READ_ONLY);
   ccp_2=60536; //Para que a la hora del calculo de una toma de 1ms osea muestrea a 1Khz para detectar interferencias de 500Hz como maximo
   }


void main()
{
   disable_interrupts(global);
   
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(0);
   delay_us(25);
   setup_ccp2(CCP_COMPARE_RESET_TIMER);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
 
   set_timer1(0);
   ccp_2=60536;
   enable_interrupts(INT_AD);
   enable_interrupts(global);
   
    do
       {   
        //q=read_adc();
        p=5.0*q/1024.0;     
        prinft("%f",p);       
   }while(TRUE);
   
}

Pero tiene un error pequeño dentro del do{..... } comenta la sentencia  q=read_adc(); eso se hace por interrupción quien sabe a que velocidad estas muestreando ahora, quizás no le permita recuperarse al conversor. y también inicializa q=0 por las dudas.

Saludos!

LAS MALVINAS SON ARGENTINAS!

Desconectado lmezah

  • PIC10
  • *
  • Mensajes: 7
Re: Problema con el ADC (Tiempo de Muestreo)
« Respuesta #3 en: 21 de Agosto de 2010, 15:24:41 »
Hola de nuevo....muchas gracias por la respuesta cerebro..cuando llegue a casa voy a proceder a probar tu sugerencia..// suky bueno para completar la informacion inicial del tema aca adjunto una imagen cuando muestre con un delay de 8ms osea 120Hz me salio la grafica bien, aunq no satisfactoria... pero cuando muestree a 1Khz... no fue para nada bien...

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema con el ADC (Tiempo de Muestreo)
« Respuesta #4 en: 21 de Agosto de 2010, 17:51:54 »
En la muestra dos parece haber un batido de señales de distintas frecuencias.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: Problema con el ADC (Tiempo de Muestreo)
« Respuesta #5 en: 21 de Agosto de 2010, 18:39:35 »
bueno justamente de eso se trata el aliasing de confundir frecuencias altas con frecuencias bajas (aliasing), podes hacer la prueba y muestrear a 250 Hz, a 500 Hz, a 1 KHz, a 10 KHz y vas a ver como disminuye el efecto de aliasing.... es probable que tu señal sea esa mezcla de señales locas  :shock:.
O bien hay un error en el envío de los datos aunque me juego por la primera  :mrgreen:.

Saludos!
LAS MALVINAS SON ARGENTINAS!

Desconectado lmezah

  • PIC10
  • *
  • Mensajes: 7
Re: Problema con el ADC (Tiempo de Muestreo)
« Respuesta #6 en: 23 de Agosto de 2010, 12:49:08 »
Hola como estan??....bueno les contare que hice la prueba con el codigo y sigue igual....la señal que estoy muestreando es simplemente una fuente ideal AC de 60Hz en proteus, creo q lo mas probable es un posible error de transmision...y como dije cuando lo muestree a 250Hz salio algo bien... pero cuando vario el parametro de meustreo a 1Khz donde se supone que deberia ser mejor, sale mal... o quiza es un error en el tiempo que demora la transmision el cual no permite muestrear a esa frecuencia??...bueno agradezco sus comentarios.

Atte.

LmezaH

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con el ADC (Tiempo de Muestreo)
« Respuesta #7 en: 23 de Agosto de 2010, 13:00:07 »
Y a que velocidad envías los datos, y que cantidad? Es sencillo analizar ese tema, si trabajas por RS232 a 9600 baud, no podrás enviar a mas de ~900 muestras por segundo.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado lmezah

  • PIC10
  • *
  • Mensajes: 7
Re: Problema con el ADC (Tiempo de Muestreo)
« Respuesta #8 en: 23 de Agosto de 2010, 14:40:22 »
Bueno al inicio utilize una transmision de 9600 baudios, ahora estoy utilizando como velocidad de transmision 19200 baudios, y toy utilizando 4 bytes ya que la variable es que uso para transmitir es float osea 32bits y con 19200 baudios me permitiria aproximadamente 600 muestras por segundo, pero igual cuando transmitiendo a esa velocidad las muestras se superponen, pareceria como si estuviera muestreando muy lento, pero cuando disminuyo la frecuencia de muestreo deberia ser peor pero da bien... osea... al reves de lo predicho!!....bueno voy a seguir evaluando el codigo, o el tiempo de ejecucion de las setencias....muchas gracias por sus comentarios.

Atte
LmezaH

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Problema con el ADC (Tiempo de Muestreo)
« Respuesta #9 en: 23 de Agosto de 2010, 14:56:16 »
Si lo estás simulando en proteus, prueba enviar solamente el valor de la muestra en formato int16 o en formato int y no en float, y luego lo escalas con matlab, para ver si es problema de velocidad comunicación o tal vez la multiplicación en float te está llevando más de 1ms.
« Última modificación: 23 de Agosto de 2010, 14:59:36 por pablomanieri »

Desconectado lmezah

  • PIC10
  • *
  • Mensajes: 7
Re: Problema con el ADC (Tiempo de Muestreo)
« Respuesta #10 en: 28 de Agosto de 2010, 14:21:15 »
Hola como estan??...Bueno luego de varios intentos no encontraba bien la razon, a pesar que mejoro cuando tome variables int16 y todo el proceso de escalamiento lo hize con MATLAB, porque la multiplicacion en float en el pic toma demasiadas lineas y por eso malgastaba el tiempo... pero ueno supuse fuertemente que era el tiempo de transmision serial, lo que hize es enviarlo via USB con el PIC 18f4550 y me resulto mejor... aun estoy haciendo pruebas para ajustar la velocidad... pero mi pregunta es... influye mucho la transimision serial... osea... cuanto demora realmente la transmision?? muchas gracias por sus comentarios y por la ayuda brindada.

Atte.

Lmezah


 

anything