Autor Tema: Frecuencia de muestreo usb Pic18f4550  (Leído 4623 veces)

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

Desconectado microcarsil

  • PIC10
  • *
  • Mensajes: 44
Frecuencia de muestreo usb Pic18f4550
« en: 09 de Diciembre de 2005, 13:29:00 »
Hola a todos los de este foro, he estado trabajando con el protocolo de comunicación usb con el pic18f4550 programandolo con el copilador ccs v3.236 y la interfaz con visual c++ 6.0, ahora estoy probando la adquisición de datos, pero la transferencia es muy lenta, el codigo del pic es el siguiente:

#include <18F4550.h>
#fuses HSPLL,NOWDT,PROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,CPB
#use delay(clock=48000000)

#use fast_io(B)
#use fast_io(D)

#DEFINE USB_HID_DEVICE     FALSE
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK  //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    64  //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE    64   //size to allocate for the rx endpoint 1 buffer

#include <pic18_usb.h>
#include <usb_desc_scope.h>   //USB Configuration and Device descriptors for this UBS device
#include <usb.c>           //handles usb setup tokens and get descriptor reports


void main(void)
{
   int out_data[64]; //solo es posible usar registros de 8 bit para usb
   int in_data[64];  // no se puede usar long int
   int z;

   set_tris_b(0);
   set_tris_d(0xff);

   usb_init();
   setup_adc_ports(AN0_TO_AN7);
   setup_adc(ADC_CLOCK_DIV_32);
   output_b(0);
   usb_wait_for_enumeration();
   while (TRUE)
   {
      if(usb_enumerated())
      {
            set_adc_channel(0);
            delay_us(20);
            out_data[0]=read_adc();
            set_adc_channel(1);
            delay_us(20);
            out_data[1]=read_adc();
            set_adc_channel(2);
            delay_us(20);
            out_data[2]=read_adc();
            set_adc_channel(3);
            delay_us(20);
            out_data[3]=read_adc();
            set_adc_channel(4);
            delay_us(20);
            out_data[4]=read_adc();
            set_adc_channel(5);
            delay_us(20);
            out_data[5]=read_adc();
            set_adc_channel(6);
            delay_us(20);
            out_data[6]=read_adc();
            set_adc_channel(7);
            delay_us(20);
            out_data[7]=read_adc();
            out_data[8]=input_d();
            for(z=9;z<64;z++)
               out_data[z]=z;
            usb_put_packet(1, out_data, 64, USB_DTS_TOGGLE);
            if (usb_kbhit(1))
            {
               usb_get_packet(1, in_data, 64);
               output_b(in_data[0]);
            }
      }
   }
}


Mi duda es la siguiente: como se calcula la velocidad de muestreo (en Hz)  para la adquisicion de datos por el usb, para las caracteristicas del programa anterior.

Microcarsil

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
RE: Frecuencia de muestreo usb Pic18f4550
« Respuesta #1 en: 09 de Diciembre de 2005, 16:30:00 »
Hola:

Mira aqui, te puede servir de ayuda:

http://miarroba.com/foros/ver.php?foroid=58527&temaid=4114317

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: Frecuencia de muestreo usb Pic18f4550
« Respuesta #2 en: 10 de Diciembre de 2005, 08:02:00 »
pues se me ocurre que podrías hacerlo sabiendo que los herzios son los pulsos por segundo, cuenta el número de pulsos en un segundo, y tendrás tu frecuencia.

Por otro lado, para que la transferencia sea mas rápida deberás bajar el delay_us lo máximo que puedas ya que ahi es donde tiene el mayor problema de retraso...

Saludos

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Frecuencia de muestreo usb Pic18f4550
« Respuesta #3 en: 10 de Diciembre de 2005, 08:42:00 »
Los delay creo que son necesarios porque es la carga/descarga del condensador de la adquisicion de conversor a/d, y ya con 20 uS creo recordar que iva justito Helado desde luego el modulo adc del pic no esta hecho para esto, si deseas velocidad necesitaras uno extreno.
Si juegas contra el mejor, pierdes como los demás.

Desconectado microcarsil

  • PIC10
  • *
  • Mensajes: 44
RE: Frecuencia de muestreo usb Pic18f4550
« Respuesta #4 en: 10 de Diciembre de 2005, 15:27:00 »
Bueno voy a probar bajando los delay_us, habia leeido que menos de 20 us no se obtenia el dato completo en el registro como dice radon, si bien mi aplicacion es para medir 8 sensores (temperatura, nivel, humedad, etc) y hacer la interfaz en visual c++ y labview creo que con 1kHz me es suficiente Muchas risas, por otro lado una pregunta que me surge es si tarda lo mismo en enviar los datos al definir USB_EP1_TX_SIZE 64 que USB_EP1_TX_SIZE 8, segun tengo entendido que la transferencia bulk la hace en 1 ms ya sea enviando 64 o bien 8 datos, bueno voy a probar eso del delay_us y les comentare cuales fueron las frecuencias que tome en labview con lo que me dijo j1M.
Microcarsil

Desconectado microcarsil

  • PIC10
  • *
  • Mensajes: 44
RE: Frecuencia de muestreo usb Pic18f4550
« Respuesta #5 en: 11 de Diciembre de 2005, 21:42:00 »
Pues bien las frecuencias por canal es de 230 Hz con delay_us(20) haciendo un total de 1.84 KHz de mustreo por los 8 canales, y 255 Hz con delay_us(10) haciendo un total  de 2.04 Khz; Otro de los aspectos que no se si influyan es que en labview para comunicarme con el dispositivo utilizo un CODE INTERFACE NODE (que es una interface para poder escribir el codigo en C y copilarlo a traves de visual c++ o algun otro copilador), el chiste de esto es que cada vez que quiera leer o escribir a través del usb, tengo que cargar la libreria mpusbapi.dll, después habrir los puertos de entrada y salida, después enviar o recibir el valor, después cerrar los puertos y por ultimo liberar la libreria; alguien sabe si todo este proceso desde cargar la libreria hasta liberarla sea la culpable de que la comunicación sea lenta.
Bueno voy a seguir probando haber si consigo mayor velocidad de muestreo y les contare como va esto...  Fumador
Microcarsil

Desconectado djps150

  • PIC10
  • *
  • Mensajes: 2
RE: Frecuencia de muestreo usb Pic18f4550
« Respuesta #6 en: 27 de Febrero de 2006, 07:20:00 »
Saludos, exactamente me uni al foro hoy en busca de ayuda, porque estoy trabajando con el pic 18f4550 y el usb 2.0, le explico: Estoy realizando la conversion analogica digital de una señal que entra poel canal AN0 del PIC 18F4550, y debo enviar esa informacion atraves del usb del pic al PC...
 le agradezco de antemano Enormemente su ayuda...

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Frecuencia de muestreo usb Pic18f4550
« Respuesta #7 en: 27 de Febrero de 2006, 07:30:00 »
Escrito originalmente por djps150
Saludos, exactamente me uni al foro hoy en busca de ayuda, porque estoy trabajando con el pic 18f4550 y el usb 2.0, le explico: Estoy realizando la conversion analogica digital de una señal que entra poel canal AN0 del PIC 18F4550, y debo enviar esa informacion atraves del usb del pic al PC...
 le agradezco de antemano Enormemente su ayuda...


Pues, ve a este hilo que trata el tema.
http://miarroba.com/foros/ver.php?foroid=58527&temaid=4114317
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Frecuencia de muestreo usb Pic18f4550
« Respuesta #8 en: 27 de Febrero de 2006, 07:34:00 »
Escrito originalmente por RaDoN
Los delay creo que son necesarios porque es la carga/descarga del condensador de la adquisicion de conversor a/d, y ya con 20 uS creo recordar que iva justito Helado desde luego el modulo adc del pic no esta hecho para esto, si deseas velocidad necesitaras uno extreno.


Si leen el datasheet ahí podrán ver que los tiempos de adquisición dependen directamente a la impedancia externa que le coloquemos.

20useg de muestreo es justo, yo lo aumentaría sin mas ya que si hacen los cálculos de la datasheet verán que estan bastante ajustados estos 20 useg.

De todas formas, si se pone un operacional , los cuales tienen una salida de baja impedancia y capacidad de entregar corriente de seguro podrán bajar un poquito estos tiempos.  Ahora bien, si encima se utilizan varios canales el diseño se hace algo caro, pero todo depende de la aplicación que uno quiera realizar.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)