TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: electrowolf en 11 de Septiembre de 2011, 12:15:28

Título: Frecuencia muestreo ADC PIC18f4550 USB
Publicado por: electrowolf en 11 de Septiembre de 2011, 12:15:28
Hola gente bonita

Espero que todos esten bien, y hablando de otras cosas, les traje algunas duditas que tengo y se que ustedes son muy buenos para estoy y les agradesco mucho su ayuda, les pongo una breve explicacion y la duda.

explicacion breve
Estoy intentando mandar señales analogicas a la PC mediante un PIC18f4550, el puerto USB y un programa hecho en Matlab, de hecho hice un tarjeta que funciona o al menos eso parece ya que si me captura las señales analogicas y se presentan en la pantalla, el detalle es que lo que se presenta en pantalla no se parece a la señal que se esta introduciendo, hice un barrido de señales y en algunas de ellas, la señal es muy parecida pero en otras, corta la señal bruscamente, aqui les pongo unas imagene para que se den una idea de lo que les comento.

(http://s3.subirimagenes.com:81/imagen/previo/thump_691105460hz.gif)
esta es la señal de 60Hz

(http://s3.subirimagenes.com:81/imagen/previo/thump_6911056100hz.gif)
Esta es la señal de 100Hz

(http://img59.imageshack.us/img59/5827/1khzq.jpg)
Esta es la señal de 1KHz

la configuracion del PIC es la siguiente:  cristal de 20MHz, ADC de 10bits, PLL5, clock de 48MHz y una frecuencia de muestreo a 1KHz, para los que quieran, aqui esta el codigo que toy utilizando

Código: [Seleccionar]
#include<18F4550.h>
#device ADC=10
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,MCLR,NOPBADEN
#use delay(clock=48000000)

#define USB_HID_DEVICE FALSE
#define USB_EPI_TX_ENABLE USB_ENABLE_BULK
#define USB_EPI_RX_ENABLE USB_ENABLE_BULK
#define USB_EPI_TX_SIZE 64
#define USB_EPI_RX_SIZE 64

#include<pic18_usb.h>
#include<usb_desc_scope.h>
#include<usb.c>

#define LEDR PIN_C6
#define LED_ON output_high
#define LED_OFF output_low

#BYTE TRISA = 0x0F92
#BYTE TRISB = 0x0F93
#BYTE PORTA = 0x0F80
#BYTE PORTB = 0x0F81
#BYTE ADCON1 = 0x0FC1
#BYTE CMCON = 0x0FB4

int8 dato[64];

void main(void){
int16 A,D;
int8 B,C,E,F,i;

setup_adc_ports(ALL_ANALOG);
setup_adc_ports(AN0|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_32);
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);

usb_init();
usb_task();
usb_wait_for_enumeration();

TRISA = 0x0FF;
TRISB = 0x00;
ADCON1 = 0x0F;
CMCON = 0x07;

while(TRUE)
{
   for(i=0; i<16; i++)
   {
      if(usb_enumerated())
      {
         set_timer0(0);
         LED_ON(LEDR);
         set_adc_channel(0);
         A=read_adc();
         delay_us(200);
         LED_OFF(LEDR);
         B=A>>8;

         prueba:if(A>=256)
         {
            A=A-256;
            goto prueba;
            }
           
            C=A;
            delay_us(200);
            LED_ON (LEDR);

         set_adc_channel(1);
         D=read_adc();
         delay_us(200);
         LED_ON(LEDR);
         E=D>>8;
         
         prueba1:if(D>=256)
         {
            D=D-256;
            goto prueba1;
            }
           
            F=D;

            dato[(i*4)+0]=B;
            dato[(i*4)+1]=C;
            dato[(i*4)+2]=E;
            dato[(i*4)+3]=F;
           
         while(get_timer0()<48);
         }
         }
         usb_put_packet(1,dato,64,USB_DTS_TOGGLE);
         }
         }

bueno despues de esta explicación (espero haya sido breve  :D) les comento que la señal que quiero meter es de un electrocardiograma, pero con el codigo anterior no se ve el electro (0.05Hz - 100Hz) y ya verifique que la señal este entrando bien al la tarjeta.

aunado a lo que les comento, igualmente quiero meter un fonocardiograma (sonidos del corazon 20Hz - 1000Hz) al mismo tiempo.

gracias por toda su ayuda, y si necesitan alguna de mi parte, con todo gusto en lo que pueda los ayudo.

Un Saludo
Título: Re: Frecuencia muestreo ADC PIC18f4550 USB
Publicado por: mtristan en 11 de Septiembre de 2011, 12:55:02
.


Según el teorema del muestreo, la frecuencia de muestreo debe ser al menos 2 veces mayor a la frecuencia máxima de la señal de entrada. Si tu señal no está acotada en frecuencia, es necesario hacerla pasar primero por un filtro pasa bajo, y así definir la frec. máxima. Pero para esas señales senoidales de 60 y 100Hz, el problema debe ser otro. Sinceramente nunca usé un ADC, así que no conozco los detalles de implementación :mrgreen:

Saludos.

Título: Re: Frecuencia muestreo ADC PIC18f4550 USB
Publicado por: MerLiNz en 11 de Septiembre de 2011, 14:35:44
creo que deberias usar un adc externo de mayor frecuencia, aun asi veo que no configuras el TAD.

Prueba a bajarle el FOSC/32 a 16, realmente desconozco como se configura el TAD en el css pero ajustando estos parametros mejorara, por probar no pierdes nada. Puede que la conversion te sea inestable, pero por probar.
Título: Re: Frecuencia muestreo ADC PIC18f4550 USB
Publicado por: Suky en 11 de Septiembre de 2011, 14:49:19
Para configurar correctamente el módulo ADC puede leer el siguiente articulo: El Modulo de conversión analógica a digital (http://www.micros-designs.com.ar/el-modulo-de-conversion-analogica-a-digital/). Para muestrear señales de 1kHz, vas a tener que aumentar la frecuencia de muestreo a mínimo 10kHz. Luego te recomiendo que en el microcontrolador solo te dediques a muestrear y enviar, que el trabajo de pesado lo haga la computadora.

Para que no tengas esos saltos en el muestreo, la adquisición vas a tener que realizarla en una interrupción por timer, de esa manera la interrupción por USB no te afecta la continuidad de los datos.


Saludos!
Título: Re: Frecuencia muestreo ADC PIC18f4550 USB
Publicado por: electrowolf en 14 de Septiembre de 2011, 10:35:51
Antes que nada gracias a todos por la ayuda en especial a ti Suky

pues bien, la vdd que no soy muy bueno programando y despues de este intento aqui les traigo los resultados y con ellos nuevos problemas que e intentado resolver y aun no he podido.

aqui les pongo el nuevo codigo que programe (espero este bien  :D)

Código: [Seleccionar]
#include<18F4550.h>
#device ADC=10
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,MCLR,NOPBADEN
#use delay(clock=48000000)

#define USB_HID_DEVICE FALSE
#define USB_EPI_TX_ENABLE USB_ENABLE_BULK
#define USB_EPI_RX_ENABLE USB_ENABLE_BULK
#define USB_EPI_TX_SIZE 64
#define USB_EPI_RX_SIZE 64

#include<pic18_usb.h>
#include<usb_desc_scope.h>
#include<usb.c>

#define LEDR PIN_C6
#define LED_ON output_high
#define LED_OFF output_low

#BYTE TRISA = 0xF92
#BYTE TRISB = 0xF93
#BYTE PORTA = 0xF80
#BYTE PORTB = 0xF81
#BYTE CMCON = 0xFB4
#BYTE ADCON0 = 0xFC2
#BYTE ADCON1 = 0xFC1
#BYTE ADCON2 = 0xFC0
#bit FADC = 0xFC2.1

int8 dato[64];
int8 bmes1,bmes2,bmas1,bmas2,i;
int16 lectura;

void main(void){

TRISA = 0xFF;
TRISB = 0x00;
CMCON = 0x07;
ADCON1 = 0x00;
ADCON2 = 0xAE;

usb_init();
usb_task();
usb_wait_for_enumeration();

while(TRUE)
{
   for(i=0; i<16; i++)
   {
      if(usb_enumerated())
      {
        LED_ON(LEDR);
        ADCON0 = 0X01;
while(!FADC==1){}
        lectura=read_adc();
        delay_us(100);
        LED_OFF(LEDR);
bmes1 = lectura;
bmas1 = lectura>>8;

delay_us(100);
LED_ON (LEDR);
        ADCON0 = 0X05;
while(!FADC==1){}
        lectura=read_adc();
        delay_us(100);
        LED_ON(LEDR);
bmes2 = lectura;
bmas2 = lectura>>8;

            dato[(i*4)+0]=bmas1;
            dato[(i*4)+1]=bmes1;
            dato[(i*4)+2]=bmas2;
            dato[(i*4)+3]=bmes2;
           
         }
         }
         usb_put_packet(1,dato,64,USB_DTS_TOGGLE);
         }
         }

creanme que lo he intentado probar, pero ahora me pasa algo curioso, programo el PIC, lo coloco en la tarjeta, conecto el USB y me lo detecta bien pero revizando el administrador de dispositivos, me sale el icono del usb con un simbolo de advertencia (simbolito amarillo con admiracion) y al darle dobleclic me dice que el dispositivo no puede arrancar, intente desintalar los controladores y al reinstalarlos, me dice Windows que encontro los controladores pero se produjo un error al instalarlos y me sigue saliendo que no puede arrancar.

nuevamente gracias a todos por su ayuda
Título: Re: Frecuencia muestreo ADC PIC18f4550 USB
Publicado por: Suky en 14 de Septiembre de 2011, 11:16:06
Creo que no entendiste, mi idea de implementación era mas o menos la siguiente:

Código: C
  1. #include <18F2550.h>
  2. #device adc=10
  3.  
  4. #use delay(clock=48000000)
  5.  
  6. int16 Buffers[2][32];
  7. int16 *Ptr=&buffers[0][0];
  8. int1 Seleccion=0,HayData=0;
  9. int8 Contador=0;
  10.  
  11.  
  12. #int_timer2
  13. void vISR_Adquisicion(void){
  14.  
  15.    *Ptr++=read_adc(ADC_READ_ONLY);
  16.    if(++Contador==32){
  17.       Contador=0;
  18.       Seleccion=!Seleccion;
  19.       Ptr=&Buffers[Seleccion][0];
  20.       HayData=1;
  21.    }
  22.    read_adc(ADC_START_ONLY);
  23.  
  24. }
  25.  
  26. void main(){
  27.  
  28.    setup_adc_ports(AN0|VSS_VDD);
  29.    setup_adc(ADC_CLOCK_DIV_32);
  30.    setup_timer_2(T2_DIV_BY_1,240,5);   // 100us
  31.  
  32.    usb_init();
  33.    usb_task();
  34.    usb_wait_for_enumeration();
  35.    
  36.    enable_interrupts(INT_TIMER2);
  37.    enable_interrupts(GLOBAL);  
  38.    read_adc(ADC_START_ONLY);
  39.    while(1){
  40.       if(HayData==1){
  41.          HayData=0;
  42.          if(usb_enumerated()){
  43.                  usb_put_packet(1,&Buffers[!Seleccion][0],64,USB_DTS_TOGGLE);
  44.              }
  45.       }
  46.       usb_task();
  47.    }
  48. }

Entonces por interrupción se capturan los datos, y se guardan en 2 buffers que se van alternando para no pisar los datos. USB debería de poder mandar los 64 bytes antes de tener otro buffer para enviar (3.2ms).

Los datos a la aplicación llegan sin ningún tratamiento, pero allí puedes trabajarlos, tienes la potencia de calculo necesaria  ;-)


Saludos!
Título: Re: Frecuencia muestreo ADC PIC18f4550 USB
Publicado por: electrowolf en 14 de Septiembre de 2011, 15:54:59
Gracias de nuevo Suky, le hechare una revisada al codigo que me enviaste a ver como funciona pa aprender, lo malo es que aun no logro hacer que la laptop me reconosca bien la tarjeta aun tengo el problema de que me la reconoce pero sale en el administrador de dispositivos con advertencia.
Título: Re: Frecuencia muestreo ADC PIC18f4550 USB
Publicado por: Suky en 14 de Septiembre de 2011, 17:34:30
... lo malo es que aun no logro hacer que la laptop me reconosca bien la tarjeta aun tengo el problema de que me la reconoce pero sale en el administrador de dispositivos con advertencia.

No veo la función usb_task();  :?
Título: Diseño e implementacion de tarjeta para la adquisición de la señal de voz
Publicado por: deivisrrivas en 20 de Febrero de 2016, 01:08:04
buenas saludos, no soy bueno en programación y le planteo mi problemática: realice el acondicionamiento de adquisición de voz desde (80hz a 4khz), de allí usando pic c compiler tengo que convertir esa señal analógica a digital usando un micro-controlador 18f4550 a su vez quiero tener dos frecuencia de muestreo, es decir ver las dos desde el micro controlador (11.025khz que son 88kbps y 22.050khz que son 166kbps), de allí procesar todo esto a través del protocolo rs232 y observar esas muestras en tiempo real en matlab? gracias por su atención espero me colaboren para finiquitar este proyecto lo mas pronto posible.
les mando la etapa en de acondiconamiento en proteus y lo poco que he echo en pic c compiler

aquí los archivos adjuntos

 - Tienes que ingresar para ver archivos adjuntos -

 - Tienes que ingresar para ver archivos adjuntos -