Autor Tema: adquisicion de datos a velocidad  (Leído 2106 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado lepra85

  • PIC10
  • *
  • Mensajes: 11
adquisicion de datos a velocidad
« en: 16 de Agosto de 2011, 11:25:45 »
Hola a todos! es la primera vez que escribo.
Soy un novato en esto de los pics pero ya he hecho varios de los ejemplitos que aparecen en el foro.
Actualmente necesito hacer una placa para leer los datos de un sensor (adaptaado por un amplificador operacional) analogico lo mas rapido que pueda y almacenarlos para luego enviarlos a una PC.
utilizo CCS y el mejor pic que use fue el 16f877a pero puedo migrar a uno mejor. Basicamente necesito muestrear una entrada analogica lo mas rapido que pueda, la mayor cantidad de muestras que pueda.

Lo que se me ocurre es guardar cada muestra del conversor AD del PIC en la memoria RAM (¿la eeprom es mucho mas lenta que la ram no?) como una tabla. Luego (si se puede hacer en simultaneo seria genial), enviar esa tabla a la pc.

Esta bien guardar los datos en la ram? como hago una tabla en la ram(encontre todos ejemplos que usan la eeprom)?
se puede transmitir en simultaneo mientras guardo en la ram del micro?

desde ya, muchas gracias.
Romeo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: adquisicion de datos a velocidad
« Respuesta #1 en: 16 de Agosto de 2011, 12:17:16 »
Que seria lo más rápido posible? Alguna tasa de transferencia o ni idea? 8 o 10 bits de ADC? Con un PIC18F trabajando con puerto serial a 115200 podes llegar a mandar cerca de 10.000 muestras por segundo. Fue una cuenta rápida  :) Seria, muestrear y enviar.


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

Desconectado lepra85

  • PIC10
  • *
  • Mensajes: 11
Re: adquisicion de datos a velocidad
« Respuesta #2 en: 16 de Agosto de 2011, 13:15:53 »
Suky:
gracias por tu pronta respuesta.
con 8 bits de adc me alcanza.
entiendo que con un PIC18F puedo llegar a mandar 10.000 muestras por segundo como decis pero puedo muestrear la señal a esa velocidad?
mi principal "preocupacion" no es enviarle tan rapido a la PC sino que muestrear la señal a esa tasa (osea, tomar un valor del ADC cada 0,1ms).
Mi segunda preocupacion es donde lo guardo para no perder tiempo entre que guardo y sigo tomando muestras (entiendo que usando la eeprom no podria tomar muestras tan rapido).

resumiendo:
quiero leer el ADC del PIC y guardar en 0.1ms. ¿se puede?
y si se puede, ¿puedo al mismo tiempo estar enviando datos a la PC?
saludos!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: adquisicion de datos a velocidad
« Respuesta #3 en: 16 de Agosto de 2011, 13:59:56 »
Con un PIC18F podes llegar a muestrear cerca de los 90 kHz, capaz que en asm se pueda superar esa velocidad. Después si tomas una muestrea y envías, no te preocupa donde lo guardas, siempre estas trabajando con la ram.

La eeprom interna no sirve para este propósito, demora cerca de 5ms en guardar cada dato. En la RAM podes crear un buffer, arreglo de datos, el tamaño máximo dependerá del micro seleccionado.


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

Desconectado lepra85

  • PIC10
  • *
  • Mensajes: 11
Re: adquisicion de datos a velocidad
« Respuesta #4 en: 16 de Agosto de 2011, 14:51:21 »
Gracias por tus aclaraciones Suky, cuando tengo el codigo andando lo posteo aqui.

Desconectado lepra85

  • PIC10
  • *
  • Mensajes: 11
Re: adquisicion de datos a velocidad
« Respuesta #5 en: 18 de Agosto de 2011, 10:23:42 »
hola de vuelta a todos!
sigo buscando hacer una placa adquisidora para un sensor. Como tenia un 16f877 a mano empece con ese. Lo unico que hace el codigo por ahora es hacer una conversion AD y enviarla a la pc. En un principio solo hacia la conversion y cada vez que la hacia cambiaba el estado de una patita (PIN_A1). Hasta ahi estaba perfecto, hacia una conversion cada 80us segun proteus.
El problema aparecio cuando quiero transmitir a la PC, ahi aparece que paso por la conversion cada 1ms.
lo que no entiendo es por que me cambia esa sentencia del programa en cada cuanto paso por la interrupcion del AD.
Si la interrupcion del CAD se realizaba cada 80us,por que una sentencia en el main() hace que la interrupcion se de cada 1ms.

el codigo:

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#include <16f877.h>

#device adc=8 //hay que ponerlo?si

#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=8000000)
#use standard_io(b)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8,parity=n)
#use fixed_io(b_outputs=pin_b7)


int i,j;

#INT_AD
void ad_isr (void){
i=read_adc(adc_read_only);
j=1;
output_toggle(PIN_A1);

}

void main(){

j=0;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL|ADC_CLOCK_DIV_32);
set_adc_channel(0);
delay_us(30);
read_adc(ADC_START_ONLY);

enable_interrupts(GLOBAL);
enable_interrupts(INT_AD);

while(1){

if(j==1){
read_adc(ADC_START_ONLY);
j=0;
//putc(i); //la sentencia de la muerte!

}

}
}

---------------------------------------------------------------------------------------------------------------------------------------------------------------

si alguien me puede aclarar por que pasa esto y como lo corrijo para que haga la conversion mas rapido que cada 1ms se lo agradecere.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: adquisicion de datos a velocidad
« Respuesta #6 en: 18 de Agosto de 2011, 10:30:44 »
Yo te hago una consulta a vos. Si trabajas con la uart a 9600bd, cuanto demora en enviar un byte? Y viendo la aplicación, lo mejor es hacerlo todo dentro de un while y no usar interrupciones.


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

Desconectado lepra85

  • PIC10
  • *
  • Mensajes: 11
Re: adquisicion de datos a velocidad
« Respuesta #7 en: 18 de Agosto de 2011, 10:39:01 »
entiendo suky que en enviar un byte a 9600bd tarda 1ms.
Pero mi problema  no es cuanto tarda en enviarlo sino cada cuanto toma una muestra. si despues tardo 1ms por cada byte para enviar a la PC no me molesta, lo que no puedo es esperar 1ms para hacer la proxima conversion AD.
Ya lo probe sin usar interrupciones y pasa lo mismo. Es como si cuando esta transmitiendo la uart no puede hacer conversiones AD

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: adquisicion de datos a velocidad
« Respuesta #8 en: 18 de Agosto de 2011, 10:44:09 »
entiendo suky que en enviar un byte a 9600bd tarda 1ms.
Pero mi problema  no es cuanto tarda en enviarlo sino cada cuanto toma una muestra. si despues tardo 1ms por cada byte para enviar a la PC no me molesta, lo que no puedo es esperar 1ms para hacer la proxima conversion AD.

Claro, pero el read_adc(ADC_START_ONLY); lo colocas en el ciclo infinito, entonces para que se ejecute de nuevo debe esperar a que se envíe el dato, se entiende? Si quieres realizar varias conversiones, el read_adc(ADC_START_ONLY); colócalo después del toggle(PIN_A1) en la interrupción, PERO ten en cuenta que no enviaras todas las muestras que adquieres.


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

Desconectado lepra85

  • PIC10
  • *
  • Mensajes: 11
Re: adquisicion de datos a velocidad
« Respuesta #9 en: 18 de Agosto de 2011, 10:52:42 »
es verdad suky. muy buena tu sugerencia, ahora si hace conversiones en el tiempo que necesito. Voy a ver la posibilidad de guardar muchos datos en un buffer y despues enviar todos juntos.
¿mientras estoy usando la uart, puedo estar haciendo conversiones AD en paralelo(al mismo tiempo)?
mi idea es: tomar 100 muestras guardarlas en un array. mientras transmito esas 100 muestras ya estar tomando otras 100 en otro array.
es posible?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: adquisicion de datos a velocidad
« Respuesta #10 en: 18 de Agosto de 2011, 13:17:49 »
Si, es posible, pero siempre la velocidad con que se envían los datos debe ser mayor a la velocidad con que se llenan los buffer, sino no tiene sentido.


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

Desconectado lepra85

  • PIC10
  • *
  • Mensajes: 11
Re: adquisicion de datos a velocidad
« Respuesta #11 en: 19 de Agosto de 2011, 10:41:55 »
aca va el codigo de lo que logre que ande. como tengo un 16f877 a mano use ese. Muestreo cada unos 100us y luego tardo en enviarlos unos 30ms (son 30 bytes a 9600bds). andar anda, pero mientras estoy usando la uart pierdo muchos datos capturados por el CAD. Si la transmision fuese mas rapido que la velocidad de transmision que la de muestreo tendria todo solucionado, capaz un microcon USB sea la solucion.

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include <16f877.h>

#device adc=8 //hay que ponerlo?si

#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=8000000)
#use standard_io(b)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8,parity=n)
#use fixed_io(b_outputs=pin_b7)


int i=0,j;
int array[31];

#INT_AD
void ad_isr (void){
array=read_adc(adc_read_only);
delay_us(30);
j=1;
output_toggle(PIN_A1);//debug
read_adc(ADC_START_ONLY);
}

void main(){

j=0;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL|ADC_CLOCK_DIV_32);
set_adc_channel(0);
delay_us(30);
read_adc(ADC_START_ONLY);

enable_interrupts(GLOBAL);
enable_interrupts(INT_AD);

while(1){

if(j==1){
i++;
j=0;
}

if(i==30){

for(i=0;i<30;i++){
putc(array);
}
putc(13);

i=0;
}
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


 

anything