Autor Tema: Ayuda con ADC 12-bits gatillado por Timer3 en dsPIC30F3013  (Leído 3084 veces)

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

Desconectado yxpm

  • PIC10
  • *
  • Mensajes: 1
Ayuda con ADC 12-bits gatillado por Timer3 en dsPIC30F3013
« en: 12 de Abril de 2013, 18:49:37 »
Este es mi primer post en este foro y desde ya agradezco la ayuda que puedan brindarme. Mi problema es el siguiente:

Quiero muestrear una señal a 6400Hz con un dsPIC30F3013 y en este primer intento por hacer funcionar el módulo ADC de 12-bits me propuse iniciar la conversión a través del Timer3, generar una interrupción cada 16 muestras y en la ISR transmitir las 16 muestras del buffer por UART a un terminal, además de cambiar el estado de un pin para observar cómo funciona el módulo ADC.

Para probarlo utilicé una onda senoidal de 50Hz con un nivel de CC de 1,65V y una Vpp = 1,5V.

Mis problemas fueron los siguientes:

1) Al graficar los datos obtenidos en el terminal no obtengo una forma de onda senoidal, sino que parece la gráfica de una señal de ruido.
2) El pin que cambia de estado cada vez que ingresa a la ISR del módulo ADC, me muestra trenes de pulsos separados, lo cual no me convence. Cuál sería la explicación de esto? La señal que obtengo tiene esta forma:
  _   _   _   _   _   _                      _   _   _   _   _   _                      _   _   _   _   _   _
_| |_| |_| |_| |_| |_| |____________________| |_| |_| |_| |_| |_| |____________________| |_| |_| |_| |_| |_| |___________________

Al final copio el código en C30 a ver si me pueden dar una mano.

Saludos y gracias!

Yoel


Código: C
  1. #include <p30f3013.h>
  2. #include <uart.h>
  3.  
  4. _FOSC(CSW_FSCM_OFF & HS3_PLL16) //Fcy = 20e6*16/(3*4) = 26.6 MIPS - Tcy= 37.5 nanosegundos
  5. _FBORPOR(MCLR_EN & PWRT_OFF)
  6. _FWDT(WDT_OFF);
  7.  
  8. void InitADC(void);
  9. void PortsSetup(void);
  10. void __attribute__((__interrupt__)) _ADCInterrupt(void);
  11.  
  12. int main(void)
  13. {
  14.  
  15.  InitADC();
  16.  PortsSetup();
  17.  PORTDbits.RD9 = 1;
  18.  OpenUART2(UART_EN & UART_IDLE_CON & UART_EN_WAKE & UART_DIS_LOOPBACK & UART_NO_PAR_9BIT & UART_1STOPBIT,
  19.             UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_ENABLE & UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR,
  20.             12); //baud = 128000  
  21.  
  22.  while(1)                      
  23.    {
  24.    asm("clrwdt");   // espera un bucle infinito
  25.  
  26.     }
  27.  
  28. }
  29.  
  30. /*
  31.       Configuracion ADC:
  32.       1) 1 canal (no scan): AN2
  33.       2) Automatic Sample start
  34.       3) Automatic Stop Sampling and start converting
  35.       4) 16 muestras por interrupcion
  36.       5) Timer3 triggered                                            
  37. */
  38. void InitADC(void)
  39. {
  40.     //Muestreo automatico.
  41.    ADCON1bits.ASAM = 1;
  42.     //Timer3 triggered
  43.    ADCON1bits.SSRC = 2;
  44.     //Formato entero con signo
  45.    ADCON1bits.FORM = 1;
  46.    
  47.     //Interrupcion cada 16 muestras en buffer
  48.     ADCON2bits.SMPI = 15;
  49.  
  50.  
  51.    //Fs = 6400 Hz.
  52.    //Ts = 1/Fs = 1/6400 = 156us
  53.    //Siendo Tcy = 37.5ns
  54.    //Tad > 667ns
  55.    //Configuro el Timer del AD al maximo valor posible: ADCS = 63.
  56.    ADCON3bits.ADCS = 63;
  57.    //Tad = Tcy*(ADCS+1)/2 = 37.5ns *(63+1)/2 = 1.2 us
  58.    //14Tad por cada muestra (16,8us)
  59.  
  60.    //Configuro el Timer3 con un tiempo de interrupción de 156us para iniciar la conversion
  61.    //Calculo el periodo de interrupcion:
  62.    //Periodo interrupcion = Tcy * prescaler * PR3 = 156us (siendo el prescaler = 1);
  63.    //por lo que PR3 = 156us/ 37.5ns = 4167, para un periodo aproximadamente de 156.2625us (6399.49 Hz)
  64.  
  65.    TMR3 = 0x0000;
  66.    //Configuro prescaler
  67.    T3CONbits.TCKPS = 0;
  68.    //Configuro PR3
  69.    PR3 = 4167;
  70.    //Limpio flags
  71.    IFS0bits.T3IF = 0;
  72.    IEC0bits.T3IE = 0;
  73.    
  74.    //Conecto AN2 al canal CH0
  75.    ADCHS = 0x0002;
  76.  
  77.    //Escaneo deshabilitado.
  78.    ADCSSL = 0x0000;
  79.  
  80.    //RB2 analogico.
  81.    ADPCFG = 0xFFFB;
  82.    
  83.    //Limpio flag de interrupción
  84.    IFS0bits.ADIF = 0;
  85.  
  86.    //Habilito interrupción
  87.    IEC0bits.ADIE = 1;
  88.  
  89.    //Enciendo en conversor
  90.    ADCON1bits.ADON = 1;
  91.  
  92.    //Enciendo en Timer3
  93.    T3CONbits.TON = 1;
  94.  
  95. }
  96.  
  97. void __attribute__((interrupt, no_auto_psv)) _ADCInterrupt(void)
  98. {
  99.       IFS0bits.T3IF = 0;
  100.       IFS0bits.ADIF = 0;
  101.       if(PORTDbits.RD9 == 1)
  102.          PORTDbits.RD9 = 0;
  103.       else
  104.          PORTDbits.RD9 = 1;
  105.  
  106.         WriteUART2(ADCBUF0);
  107.         WriteUART2(ADCBUF1);
  108.         WriteUART2(ADCBUF2);
  109.         WriteUART2(ADCBUF3);
  110.         WriteUART2(ADCBUF4);
  111.         WriteUART2(ADCBUF5);
  112.         WriteUART2(ADCBUF6);
  113.         WriteUART2(ADCBUF7);
  114.         WriteUART2(ADCBUF8);
  115.         WriteUART2(ADCBUF9);
  116.         WriteUART2(ADCBUFA);
  117.         WriteUART2(ADCBUFB);
  118.         WriteUART2(ADCBUFC);
  119.         WriteUART2(ADCBUFD);
  120.         WriteUART2(ADCBUFE);
  121.         WriteUART2(ADCBUFF);
  122. }
  123.  
  124. void PortsSetup(void)
  125. {
  126.         TRISDbits.TRISD9 = 0;
  127.         PORTDbits.RD9 = 0;
  128. }

Desconectado seba85

  • PIC10
  • *
  • Mensajes: 28
Re: Ayuda con ADC 12-bits gatillado por Timer3 en dsPIC30F3013
« Respuesta #1 en: 17 de Octubre de 2013, 20:05:34 »
Hola!
Espero ayudarte de algo no se si estoy bien pero por lo que vi configuraste el conversor en entero con signo con tensión de referencia igual a la de alimentación: masa y Vcc. Entonces la entrada que es  una señal senoidal tiene que tener un offset de 2.5V por encima de este sería el ciclo positivo y por debajo el ciclo negativo para mantener la simetría.
Otra cosa limpias el bit de interrupción del TMR3 pero no usas nunca la interrupción que genera? No entiendo para que lo usas.