TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: microcarsil 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.
-
Hola:
Mira aqui, te puede servir de ayuda:
http://miarroba.com/foros/ver.php?foroid=58527&temaid=4114317
-
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
-
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
desde luego el modulo adc del pic no esta hecho para esto, si deseas velocidad necesitaras uno extreno.
-
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
, 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.
-
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...
-
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...
-
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
-
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
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