Autor Tema: Frecuencia de muestreo de PIC  (Leído 10671 veces)

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

Desconectado EduSky

  • PIC10
  • *
  • Mensajes: 37
Frecuencia de muestreo de PIC
« en: 13 de Mayo de 2012, 20:46:51 »
Buenas a toda la gente del foro. Tengo una pregunta sobre como muestrear una señal analogica con un PIC18F4550. Despues de ver el datasheet y el foro configure los registros del ADC.
Mi pregunta es sobre el registro ADCON2 donde se configura el tiempo de adquisicion y el reloj de conversion.
Si Fosc = 32MHz y elegimos el reloj de conversion Tad = Tosc*64 = 2us (mayor que el minimo necesario 0.7us). Despues haciendo el tiempo de adquisicion Tadq = 20*Tad = 40us.
Quiere decir que mi periodo de muestreo es 42us? Es decir, ¿la minima frecuencia de muestreo que puedo lograr con este PIC es de 24KHz (aproximadamente)?
Si la respuesta es NO, ¿que no estoy teniendo encuenta conceptualmente como para poder muestrear por ejemplo a 10 o 12KHz?
Espero alguien pueda aclarar los conceptos.
Saludos!!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Frecuencia de muestreo de PIC
« Respuesta #1 en: 13 de Mayo de 2012, 23:27:58 »
Tienes que colocar Tad cerca de 0.7us y el tiempo de adquisición en 2.45us mínimo (aquí tener en cuenta la resistencia de entrada). Si lo configuras de esa manera entonces tienes 11.Tad+Tadq= 11.0.7us+2.45us=10.15us.. Con eso tienes ~98kHz.

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

Desconectado EduSky

  • PIC10
  • *
  • Mensajes: 37
Re: Frecuencia de muestreo de PIC
« Respuesta #2 en: 13 de Mayo de 2012, 23:59:27 »
Tienes que colocar Tad cerca de 0.7us y el tiempo de adquisición en 2.45us mínimo (aquí tener en cuenta la resistencia de entrada). Si lo configuras de esa manera entonces tienes 11.Tad+Tadq= 11.0.7us+2.45us=10.15us.. Con eso tienes ~98kHz.

Saludos!

Suky, gracias por responder. Pido disculpas porque talvez no fui claro. La idea es poder muestrear priodicamente a una frecuencia de 10 KHz (100us) por ejemplo pero los numeros no me dan por eso preguntaba ¿como podria hacer para llegar a 100us? porque repito los numeros no me dan (42us). Tengo poco y nada de expriencia programando PIC's seguro hay algun truco como para poder configurar el ADC como quiero.
¿Que se hace en estos casos?
Saludos!!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Frecuencia de muestreo de PIC
« Respuesta #3 en: 14 de Mayo de 2012, 00:01:32 »
Coloca adquisición manual y lo muestreas utilizando un timer
No contesto mensajes privados, las consultas en el foro

Desconectado EduSky

  • PIC10
  • *
  • Mensajes: 37
Re: Frecuencia de muestreo de PIC
« Respuesta #4 en: 14 de Mayo de 2012, 00:23:45 »
Coloca adquisición manual y lo muestreas utilizando un timer

Suky, gracias por responder nuevamente y tan rapido. Viendo nuevamente el datasheet encontre una linea que dice que se puede hacer adquisicion manual seteando ACQT2:ACQT0 = 000. Entonces me queda entender el timer para poder hacer el muestreo.
Gracias!!
Saludos!

Desconectado EduSky

  • PIC10
  • *
  • Mensajes: 37
Re: Frecuencia de muestreo de PIC
« Respuesta #5 en: 20 de Mayo de 2012, 19:48:00 »
Buenas noches!. Estuve estuve leyendo el datasheet del PIC para poder hacer el muestreo con un timer. Este PIC tiene Timer0, 1, 2, y 3. Elegi el timer1, ¿la eleccion puede ser arbitraria?. La idea es que con la siguiente configuracion me de una frecuencia de muestreo determinada......intente con 8 KHz.
La confiuracion de ADC quedo:
ADCON0 = 0x01;      // Canal AN0, modulo conversor habilitado
ADCON1 = 0x0E;      // Voltage de referencia Vss y Vdd, AN0 entrada analogica
ADCON2 = 0x86;      // Fosc/64 (Fosc=32MHz), Justificacion derecha, tiempo de adquisicion manual

En cuanto al timer1:

T1CONbits.RD16 = 1;              // 8 bits
T1CONbits.T1RUN = 1;           //    
T1CONbits.T1OSCEN = 1;       // Habilita oscilador timer1
TMR1L = 0x4C;   
TMR1H = 0xFF;
T1CONbits.T1CKPS = 0b00;     // Prescaler 1:1
T1CONbits.TMR1CS = 0;         // Fosc/4
T1CONbits.TMR1ON = 1;        // Enciende el timer1

Despues de hacer varias pruebas para obtener los 125us (8 KHz) no conseguir hacerlo. Con la configuracion anterior que creia era la correcta estoy bastante lejos de los 125us.
¿Alguien podria por favor decirme en que le estoy errando?
Gracias!
Saludos.-

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Frecuencia de muestreo de PIC
« Respuesta #6 en: 21 de Mayo de 2012, 00:10:04 »
tienes que cargarle los valores a los registros del timer en cada interrupcion, si no solo haria una vez el tiempo que requieres
"Nada es imposible, no si puedes imaginarlo"

Desconectado EduSky

  • PIC10
  • *
  • Mensajes: 37
Re: Frecuencia de muestreo de PIC
« Respuesta #7 en: 21 de Mayo de 2012, 01:04:23 »
tienes que cargarle los valores a los registros del timer en cada interrupcion, si no solo haria una vez el tiempo que requieres

rivale, gracias por responder. Lo que mencionas sobre volver a cargarle los registros al timer con la interrupcion lo tuve encuenta. A pesar de eso, no consiguio la frecuencia de muestreo que quiero por eso preguntaba si en la porcion de codigo que se ve hay algo mal en la configuracion del ADC y del timer (estoy muy lejos de ser un experto en programacion de pic's).
¿Algun otro consejo? ¿hay alguna consideracion en especial que haya que hacer para elegir el timer del pic a utilizar?
Saludos!

Desconectado EduSky

  • PIC10
  • *
  • Mensajes: 37
Re: Frecuencia de muestreo de PIC
« Respuesta #8 en: 22 de Mayo de 2012, 13:33:32 »
Todavia sigo luchando con el timer. Evidentemente no entiendo como funciona. Alguien por favor podria decirme como poder configurarlo? o bien recomendar donde puedo leer al respecto?
Gracias!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Frecuencia de muestreo de PIC
« Respuesta #9 en: 22 de Mayo de 2012, 14:03:10 »
Pensando en que configuras para tener Fcy en 8 MHz (32MHz/4), tienes:

t_ciclo = 0.125 us. Entonces debes contar 1000 ciclos para obtener los 125 us. Configurando el timer 1:1 tendrias que pre-cargar el timer con 64536 = 0xFC18.


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

Desconectado EduSky

  • PIC10
  • *
  • Mensajes: 37
Re: Frecuencia de muestreo de PIC
« Respuesta #10 en: 22 de Mayo de 2012, 15:39:01 »
Pensando en que configuras para tener Fcy en 8 MHz (32MHz/4), tienes:

t_ciclo = 0.125 us. Entonces debes contar 1000 ciclos para obtener los 125 us. Configurando el timer 1:1 tendrias que pre-cargar el timer con 64536 = 0xFC18.


Saludos!

Suky, muchisimas gracias por responder. La verdad tu explicacion me aclaro bastante las ideas. Voy a hacer las pruebas correspondientes y posteare los resultados.
Saludos!

Desconectado EduSky

  • PIC10
  • *
  • Mensajes: 37
Re: Frecuencia de muestreo de PIC
« Respuesta #11 en: 23 de Mayo de 2012, 03:53:31 »
Bueno teniendo el timer con los valores que tiene que tener, intente tomar algunos valores del registro ADRES del A/D. El codigo cuando lo compilo con el C18 lo hace sin problemas, el problema es que usando el debugger veo que solo incrementa la variable "i" 5 veces y luego sale de la funcion sin que el timer haya llegado a la condicion de desbordamiento.
¿Podrian por favor mirar el codigo y decirme que me falta o me sobra?
Gracias.
Saludos!

Código: C
  1. #pragma interruptlow LowISR
  2. void LowISR(void)
  3. {
  4.   if(PIR1bits.TMR1IF = 1)
  5.   {
  6.    ADCON0bits.GO = 1;
  7.   while(ADCON0bits.GO)   // Conversión en progreso
  8.   {  
  9.    if(i < 100)
  10.    {  
  11.    valor[i] = ADRESL;
  12.    i = i + 1;
  13.    }
  14.   }
  15.   TMR1L = 0x4C;
  16.   TMR1H = 0xFF;
  17.   PIR1bits.TMR1IF = 0;
  18.   }
  19.   return;
  20. }
  21.  
  22. #pragma code lowVector=0x18
  23. void LowVector(void){_asm goto LowISR _endasm}
  24.  
  25. void adcinit(void);
  26.  
  27. void main(void)
  28. {
  29.  adcinit();
  30.  while(1)
  31.  {
  32.   LowISR();
  33.   i = 0;
  34.  }
  35. }
  36.  
  37. void adcinit(void)
  38. {
  39.  ADCON0 = 0x01;
  40.  ADCON1 = 0x0E;
  41.  ADCON2 = 0x86;  // Justificacion derecha, Fosc/64
  42.  //Timer 8 KHz
  43.  T1CONbits.RD16 = 1;  // 8 bits
  44.  T1CONbits.T1RUN = 0;
  45.  T1CONbits.T1OSCEN = 0; // Oscilador Timer1 deshabilitado
  46.  T1CONbits.T1CKPS1 = 0; // Prescaler 1:1
  47.  T1CONbits.T1CKPS0 = 0;
  48.  T1CONbits.TMR1CS = 0;    // Fosc/4
  49.  T1CONbits.TMR1ON = 1;    // Enciende Timer1
  50.  //Interrupcion
  51.  PIE1bits.ADIE = 0;
  52.  PIE1bits.TMR1IE = 1;   // Timer1
  53.  IPR1bits.TMR1IP = 0;   // Interrupción baja prioridad
  54.  RCONbits.IPEN = 1;             // Habilita prioridad de interrupcion
  55.  INTCONbits.GIEH = 1;
  56.  INTCONbits.GIEL = 1;
  57.  TMR1H = 0xFC;  // Pre-carga Timer
  58.  TMR1L = 0x18;
  59. }
« Última modificación: 23 de Mayo de 2012, 11:58:29 por Suky »

Desconectado EduSky

  • PIC10
  • *
  • Mensajes: 37
Re: Frecuencia de muestreo de PIC
« Respuesta #12 en: 23 de Mayo de 2012, 04:07:20 »
Algo que me di cuenta esta mal son los valores de TMR1L y TMR1H en la funcion LowISR. Los cambie para que cargue el timer nuevamente con TMR1L = 0x18 y TMR1H = 0xFC. Pero sigue sin funcionar.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Frecuencia de muestreo de PIC
« Respuesta #13 en: 23 de Mayo de 2012, 09:52:33 »
Perdón, pero inicias el proceso de conversión y después que haces?  :z)
No contesto mensajes privados, las consultas en el foro

Desconectado EduSky

  • PIC10
  • *
  • Mensajes: 37
Re: Frecuencia de muestreo de PIC
« Respuesta #14 en: 23 de Mayo de 2012, 11:29:00 »
Perdón, pero inicias el proceso de conversión y después que haces?  :z)

Suky, una vez que inicializo el A/D y configuro el timer la idea era poder tomar 100 muestras del resgitro ADRES (donde el conversor guada el resultado de la conversion) y ponerlas en un arreglo que en este caso se llama "valor" usando como contador la variable "i", que luego se resetea haciendola 0 para que empiece de nuevo. Pero la variable "i" solo se incremente 5 saliendo de la interrupcion.
¿Donde esta el error?
Gracias
Saludos!