How can I to implement the FFT using an ADC?

Discussion in 'Embedded Systems and Microcontrollers' started by reyes33d88, Feb 7, 2015.

  1. reyes33d88

    Thread Starter New Member

    Jan 10, 2015
    7
    1
    Hello guys, I need to convert one analog signal to digital signal, I done this point, but now I have to process this signal, I need to apply the FFT to this digital signal, but I don´t know how to do it?, does somebody could help me?, the code is shown next
    Code (Text):
    1. #include <p33FJ12GP202.h>
    2. _FOSC ( FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_XT );
    3. //#define _XTAL_FREQ 16000000
    4. #define fcy 16000000
    5.  
    6.  
    7. int main (void);
    8. void atraso_ms();
    9. void inicia_adc(void);
    10.  
    11. /////////////////INICIO DEL PROGRAMA////////////
    12. int main (void)
    13. {
    14.     TRISB=0X0000;
    15.     inicia_adc();
    16.     AD1CON1bits.ADON=1;        //SE HABILITA EL ADC
    17. while(1)
    18. {
    19.     AD1CON1bits.SAMP=1;///INICIA EL MUESTREO
    20.     atraso_ms(3);///TIEMPO EN EL QUE SE REALIZA EL MUESTREO
    21.     AD1CON1bits.SAMP=0;///RETIENE EL DATO
    22. while(!AD1CON1bits.DONE); //MIENTRAS SE REALIZE LA CONVERSIÓN, LOS DATOS SE GUARDAN EN EL PUERTO B
    23. PORTB=ADC1BUF0; // Datos se guardan en ADC1BUF0 y se envía al puerto B
    24.  
    25. }
    26. }
    27. void inicia_adc(void)
    28. {
    29. ///////DEFINIMOS LA ENTRADA (RA0), LOS BITS DEL ADC Y SE CONFIGURA SOLO ADCON 1/////////////
    30.     TRISA=0X0001;    //ENTRADA POR RA0
    31.     AD1PCFGL=0X0000;        //ENTRADAS ANALÓGICAS
    32.     AD1CON1bits.AD12B=1;//ADC DE 12 BITS}
    33.     //AD1CON1bits.ADSIDL=0;
    34.     //AD1CON1bits.FORM=0;
    35.     AD1CON1bits.ASAM=0;///EL MUESTRO INICIA DESPUÉS DE LA ÚLTIMA CONVERSIÓN
    36.     AD1CON1bits.SSRC=0b111;///TERMINA EL MUESTREO
    37.  
    38.  
    39. ////////////CONFIGURACIÓN AD1CON2//////////////
    40.     AD1CON2bits.VCFG=0b00;///VDD Y VSS
    41.     AD1CON2bits.CSCNA=0;//MUESTREO SECUENCIAL DESHABILITADO
    42.     AD1CON2bits.SMPI=0b111;//DETERMINA LA CANTIDAD DE MUESTRAS (EN ESTE CASO 16)7
    43.     AD1CON2bits.BUFM=0;//SIEMPRE SE LLENA EL BUFFER DESDE EL PRINCIPIO
    44.     AD1CON2bits.ALTS=0;//SIEMPRE SE UTILIZA LA ENTRADA DE CANAL, PARA EL MUESTREO A
    45. ////////////CONFIGURACIÓN AD1CON3//////////////
    46.  
    47.     AD1CON3bits.ADRC=1;//SE SELECCIONA EL RELOJ INTERNO
    48.     AD1CON3bits.ADRC=21;//TIEMPO DE CONVERSIÓN
    49.     AD1CON3bits.SAMC=0b11111;//BITS DE AUTO MUESTREO
    50.     AD1CON3bits.ADCS=0b11111;//TIEMPO DE CONVERSIÓN DE BITS ADC
    51. ////////////CONFIGURACIÓN AD1CHS0://////////////
    52.     AD1CHS0bits.CH0NA=0;//ENTRADA NEGATIVA POR VSS
    53.     AD1CHS0bits.CH0SA=0;//ENTRADA POSITIVA POR AN
    54. }
    55. /////////////CONFIGURACIÓN DEL RETARDO//////////////////////
    56. void atraso_ms(){
    57. T1CON= 0;
    58. TMR1=0;//INICIAMOS RESETEANDO EL TIMER 1
    59. IPC0bits.T1IP=0b101;//LA INTERRUPCIÓN TIENE UNA PRIORIDAD 5
    60.     /////////////OSCILADOR DE 20MHz///////////////////////////////////////////
    61.     ////////TCY=4/16MHz = 1/4us///////////////////////////////////////////////
    62.     //////PARA UN RETARDO DE 1s SE CARGA A PR1 CON  39062.5///////////////////
    63.     //////////////////////////////////////////////////////////////////////////
    64.     //////FCY=20MHz/2=10MHz, PREESCALAR DE 256////////////////////////////////
    65.     //////POR REGLA DE 3, PARA UN RETARDO DE 1ms, PR1=39.0625/////////////////
    66.     PR1=39.0625;
    67.     IFS0bits.T1IF=0;//LIMNPIA LA BANDERA DEL TIMER
    68.     IEC0bits.T1IE=0;//CUANDO OCURRE UNA INTERRUPCIÓN DESHABILITA EL TIMER
    69.     T1CON=0X8030;//CONFIGURA T1CON
    70. while(IFS0bits.T1IF==0);
    71. }
    72.  
     
  2. MrChips

    Moderator

    Oct 2, 2009
    12,437
    3,360
    Before you start to consider doing FFT, state your specifications.

    Number of bits =
    Sampling rate =
    Number of samples =

    FFT max frequency required =
    FFT resolution required =

    How much RAM is available on your MCU?
    How much flash (code) is available?

    Then you need code to perform the FFT. You can find this on the internet.
     
  3. reyes33d88

    Thread Starter New Member

    Jan 10, 2015
    7
    1
    thank you for replayit, I have some answers

    Number of bits = 32
    Sampling rate =100 KHz
    Number of samples = 56

    FFT max frequency required = xxx
    FFT resolution required =xxx

    do you have some example?
     
  4. MrChips

    Moderator

    Oct 2, 2009
    12,437
    3,360
    There is no 32-bit ADC that I am aware of.
    Number of samples should be a power of 2. For example, 64, 128 or 256.

    FFT code are available open source on the Internet.
     
  5. reyes33d88

    Thread Starter New Member

    Jan 10, 2015
    7
    1
    ok, so 12 bit ADC, numbertof samples 64, I know the code is in internet, but I´m looking for the web site, thank you
     
Loading...