TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: jeremylf en 12 de Septiembre de 2011, 01:21:45
-
Estoy usando un PIC12F683 a 20Mhz con su ADC a Fosc/32 para obtener el valor mas bajo del TAD (1.6us, segun datashet). Entonces, cada 1.6us obtengo un nuevo valor de la conversion ADC, esto significa que cada segundo tendria 1000000/1.6 = 625000 muestras, esto quiere decir que mi maxima frecuencia de muestreo seria de 625000 muestras por segundo??? O estoy mal?
GRacias!
-
Olvide decir que lo estoy usando a 8 bits, no 10 bits :P (supongo que con 8 bits ira un poco mas rapido no?)
-
Bueno a cabo de enterarme que el TAD es el tiempo de conversio de un solo bit. Entonces, si solo quiero una resolucion de 8 bits, entonces el tiempo para un byte sera de 8 x 1.6 = 12.8us. Entonces, mi frecuencia de muestreo sera de 1 000 000 / 12.8 = 78125 muestras por segundo, esta bien ? =/
-
para 8 bits probablemente sean 9TAD, por ejemplo para 10bit son 11TAD y para 12bit 14TAD. Ahora no te olvides de sumarle el TACQ (tiempo acquisicion) este tiempo para tu pic suele ser 1.4us minimo, lo normal es aumentarle algo para obtener buenas lecturas, y tambien depende de la impedancia de la fuente.
Quedaria 9Tad+2Tacq=11Tad= 17.6us total
-
Si el un solo canal, el tiempo de adquisición es para la primer muestra, después ya no. Acuérdense que la señal debe ser de banda limitada, y menor a la mitad de la frecuencia de muestreo máxima.
F= 1/ (~15us (9TAD) + tiempo en cargar el dato al buffer (buffer[k] o *Ptr++) + tiempo en controlar posición dentro del bucle (for, while, etc...) )
Saludos!
-
Mi aplicacion usa la audiofrecuencia (20khz maximo), en wikipedia he leido (http://es.wikipedia.org/wiki/Frecuencia_de_muestreo) que para esta frecuencia es mas que suficiente una frecuencia de muestreo de 40000 y creo que el 12f683 estaria llegando al rededor de 55000 aprox (con todos los calculos que has propuesto suky) o estoy haciendo algo mal ?
Gracias por la ayuda!
-
No, esta bien. Depende de lo que realices la frecuencia de muestreo debe ser bien establecida, en ese caso yo lo controlo con el timer2, por ejemplo.
Saludos!
-
Bueno, en este caso lo hago por polling solamente. Hago una captura de 79 datos (es la matriz mas grande que puedo crear de 8 bits en el CCS) y luego los proceso. Gracias por la ayuda.
-
porque es la matriz mas grande que puedes crear? Viene limitado? o estas limitado por la memoria del micro?
-
porque es la matriz mas grande que puedes crear? Viene limitado? o estas limitado por la memoria del micro?
Es un 12F ;-)
Saludos!
-
Claro, el 12F683 tiene 128 bytes de RAM. Entonces, a parte de los 4 bytes aprox. que ya tengo creados como locales (dentro del main), en el CCS solo me permite crear una matriz de bytes (int8) global de hasta 92 como maximo.
int8 Matriz[92];
void main (void)...
Con esto mi RAM esta en 80%; a esta matrix ya no le puedo poner mas de 92.
Por otro lado, aun puedo crear otra matriz global mas de hasta 25 bytes. con esto mi RAM si se va al 100%.
Entnoces, los 4 primeros locales, mas la matriz global de 92 bytes, mas la otra matriz global de 25 bytes, dan 121 bytes en total. No se que hara CCS con los otros 7 bytes que faltan (128 - 121), pero debe ser por que algunas variables son globales y otras son locales y quiza esto influya.
Tampoco se porque no puedo crear una sola matriz que tenga 117 (92+25) bytes, talves sea por la version quien sabe. Mi version CCS es la 4.112.
Bueno, salu2.
-
Además esta el tema de los bancos. 92 bytes son lo máximo consecutivos.
Saludos!
-
... 92 bytes son lo máximo consecutivos.
En que parte del datasheet esta eso? :lol:
-
eso depende, en el c18 se puede editar los bancos y ponerlos todos como 1 unico banco.
-
... 92 bytes son lo máximo consecutivos.
En que parte del datasheet esta eso? :lol:
En el mapa de memoria de datos.
Que para ese pic indica que es de 96 , y otro banco de 32 , en total 128 de RAM .
Saludos!
-
eso depende, en el c18 se puede editar los bancos y ponerlos todos como 1 unico banco.
Por favor, hay que saber diferenciar entre distintas arquitecturas, compiladores, etc... Esa mezcla que hiciste, mortal! :mrgreen:
Aquí lo que comento, que pasa en los 12F y 16F....
-
Aja! 96! Y por que el ccs solo me permite hacer una matriz de 92 bytes solamente? Tambien, el bendito ccs no puedo juntar de alguna forma los dos bancos para tener solo una matriz de 128 bytes o almenos 120 talves..??
Gracias a todos!
-
no has pensado en pasarte al 18f?
-
Aja! 96! Y por que el ccs solo me permite hacer una matriz de 92 bytes solamente? Tambien, el bendito ccs no puedo juntar de alguna forma los dos bancos para tener solo una matriz de 128 bytes o almenos 120 talves..??
Gracias a todos!
Seguramente crea variables de uso propio de CCS. CCS no permite crear un arreglo mayor al que permite el hardware, sé por comentacios de Richi que hay compiladores que solucionan esta discontinuidad (creo que entredí bien :mrgreen:), pero CCS no.
Saludos!
-
Vaya, Gracias suky.
NetLinz, mas que nada es creo por que quiero un pic de 8 pines solamente :lol:
-
Hola, un saludo a todos :) me gustaria preguntar un poco mas sobre la frecuncia de muestreo en un PIC. Estoy haciendo un proyecto con el PIC16F88 (soy nuevo en esto jeje). Se trata de leer una señal analogica por el ADC de 10-bits y despues enviarla a un dispositivo Bluetooth a traves del UART. Mi rpblema es que no he podido fijar a 1kHz la Frecuencia de muestreo del ADC estuve checando el datasheet pero no comprendo como fijarla, podrian ayudarme?? les adjunto mi codigo de MikroC para alguna sugerencia.
OSCCON = 0b01111110; //8MHz oscilador interno
ANSEL = 0;
TRISB = 0;
CMCON = 0x00;
TXSTA.SYNC= 1;
UART1_Init(19200); //inicializa UART
Delay_ms(100); //epera para UART se estanilice
ANSEL = 0b10000010; //Configure analog AN1 and inputs and Vref
do{
if ( UART1_Data_Ready() ) //Revisar si UART esta listo
{
in = UART1_read(); //Se lee el UART
if ( in == 'i' ) //Inico de tranmision de datos
{ while( in != 'p' ) //espera caracter de inicio de transmision
{ outADC = Adc_Read(1); //Captura de datos del ADC_1
Delay_us(900); // delay para cambiar la Fs = Hz
out = outADC 8 ; //pasa valor del ADC ala variable del UART
UART1_Write( out ); // Envio de datos via UART
in = UART1_read();
if ( in == 'p' ) //espera caracter de Fin de transmision de datos
{ UART1_Write_Text(FIN);}
}
}
}
}
while(1);
}
Gracias de ante mano
-
Podes usar un timer para fijar el periodo de inicio de conversión.
Saludos!
-
Hola Suky muchas gracias por atender :-/ ,
Si he escuchado que lo hacen con el timmer a traves de interrupciones, sin embargo no se como hacerlo podrias mostrarme algun ejemplo?? o alguna referencia de donde lo hagan??
Algo mas estuve leyendo que la velocidad de la comunicación serial PIC-Bluetooth cambiara mi frecuencias de muestreo de los datos recibidos en Bluetooth, esto es cierto??
Cuantas muestras por segundo podre enviar si uso 9600 baudios??
Gracias
-
Utiliza el buscador, debe existir infinidad de ejemplos del uso del timer ;-)
Saludos!
-
Hola Suky muchas gracias por atender :-/ ,
Si he escuchado que lo hacen con el timmer a traves de interrupciones, sin embargo no se como hacerlo podrias mostrarme algun ejemplo?? o alguna referencia de donde lo hagan??
Algo mas estuve leyendo que la velocidad de la comunicación serial PIC-Bluetooth cambiara mi frecuencias de muestreo de los datos recibidos en Bluetooth, esto es cierto??
Cuantas muestras por segundo podre enviar si uso 9600 baudios??
Gracias
suponiendo que para enviar el resultado del ADC utilices 2bytes, pues 600 muestras por segundo. El tema es que el USART tiene tambien algunos bits para control, como el bit start, end bit... Asi que serian algo menos, pero aproximado 600.
-
Cada bit demora: 1/9600 = 104.2us. Cada Byte enviado tiene 1 start + 1 stop, entonces por cada Byte el tiempo es 1.042ms. Despreciando el tiempo necesario para leer el buffer y cargar el dato a enviar, máximo podrás enviar 960 bytes por segundo, pero si cada muestra es de 10-bits entonces podrás enviar máximo 480 Muestras. Se puede aumentar mucho la velocidad de Uart hasta 115200.
Saludos!
-
Cada bit demora: 1/9600 = 104.2us. Cada Byte enviado tiene 1 start + 1 stop, entonces por cada Byte el tiempo es 1.042ms. Despreciando el tiempo necesario para leer el buffer y cargar el dato a enviar, máximo podrás enviar 960 bytes por segundo, pero si cada muestra es de 10-bits entonces podrás enviar máximo 480 Muestras. Se puede aumentar mucho la velocidad de Uart hasta 115200.
Saludos!
creo que si el UART es por hardware solo envia de 8 en 8 bits no? (9 si se pone control de paridad).
-
Gracias Suky y MerLiNZ,
Revisare en la pagina sobre las interrupciones y el timer. Y asi es el UART en el PIC16F88 es por hardware y solo tomo 8 bits de los 10 del ADC para enviarlos. aumentare la velocidad del UART a 19200 bauds, y checare haber que pasa, y si es que logro fijar la frec. de muestreo, y les cuento.
Gracias