TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: fram_22 en 27 de Enero de 2008, 17:17:38
-
Hola:
Estoy aprendiendo a realizar la fft usando un dspic 30f3011, estoy partiendo del ejemplo que provee microchip, donde la señal que se utiliza ya fue muestreada y los valores simplemente son cargdos en el pic, lo que estoy tratando de hacer modificar el mismo ejemplo para muestrear una señal de ADC, sin embargo al compilar el C30 me marca el siguiente erro:
fft.c: In function `ReadAdc':
fft.c:27: error: incompatible types in return
El ADC ya lo he configurado para que lea los valores en formato fraccional pero al momento de querer cargarlos en el arreglo de muestras me da este error pero no sè a que se deba, acon tinuaciòn les agrego el codigo con las peuqeñas modificaciones que he realizado en el momento:
#include <p30F3011.h>
#include <dsp.h>
#include "fft.h"
/* Device configuration register macros for building the hex file */
_FOSC(CSW_FSCM_OFF & XT_PLL8); /* XT with 8xPLL oscillator, Failsafe clock off */
_FWDT(WDT_OFF); /* Watchdog timer disabled */
_FBORPOR(PBOR_OFF & MCLR_EN); /* Brown-out reset disabled, MCLR reset enabled */
_FGS(CODE_PROT_OFF); /* Code protect disabled */
Esta funcione s para iniciarl el ADC:
void InitAdc() {
ADPCFG = 0x1FEF;
TRISBbits.TRISB4 = 1;
ADCHS = 4; //
ADCSSL = 0; //
ADCON3 = 0x1F3F; //
ADCON2 = 0; //
ADCON1 = 0x83E0; // ADC ON, fractional result
}
ESTA SIGUIENTE FUNCION ES DONDE TENGO EL PROBLEA ES LA FUNCION QUE SE UTILIZA PARA CARGAR EL VALOR DE ADC, SIN EMBARGO ME DA EL ERROR QUE LES MOSTRÉ AL INICIO DLE PROGRAMA, PERO EN REALIDAD NO SE A QUE SE DEBA.
fractcomplex ReadAdc() {
ADCON1bits.SAMP = 1; // Start AD conversion
while (ADCON1bits.DONE == 0) // Wait for ADC to finish
asm ("nop");
return ADCBUF0; // Get ADC value
}
EN ESTA SIGUIENTE PARTE SE DEFIENE EL ARREGLO DONDE TRATO DE ALMACENAR LAS LECTURAS DEL ADC, AQUI ES DONDE NO ESTOY PUDIENDO CARGAR LOS VALORES:
fractcomplex sigCmpx[FFT_BLOCK_LENGTH] /* Typically, the input signal to an FFT */
__attribute__ ((section (".ydata, data, ymemory"), /* routine is a complex array containing samples */
aligned (FFT_BLOCK_LENGTH * 2 *2))); /* of an input signal. For this example, */
/* we will provide the input signal in an */
/* array declared in Y-data space. */
/* Global Definitions */
#ifndef FFTTWIDCOEFFS_IN_PROGMEM
fractcomplex twiddleFactors[FFT_BLOCK_LENGTH/2] /* Declare Twiddle Factor array in X-space*/
__attribute__ ((section (".xbss, bss, xmemory"), aligned (FFT_BLOCK_LENGTH*2)));
#else
extern const fractcomplex twiddleFactors[FFT_BLOCK_LENGTH/2] /* Twiddle Factor array in Program memory */
__attribute__ ((space(auto_psv), aligned (FFT_BLOCK_LENGTH*2)));
#endif
int peakFrequencyBin = 0; /* Declare post-FFT variables to compute the */
unsigned long peakFrequency = 0; /* frequency of the largest spectral component */
void SampleInput() {
int i = 0;
while (i <= 255) {
sigCmpx = ReadAdc(); // Re
i++;
// sigCmpx[i++] = 0; // Im
}
// "Samples" now contains 128 pairs of <Re, Im> samples
}//~
int main(void)
{
InitAdc();
SampleInput();
int i = 0;
fractional *p_real = &sigCmpx[0].real ;
fractcomplex *p_cmpx = &sigCmpx[0] ;
#ifndef FFTTWIDCOEFFS_IN_PROGMEM /* Generate TwiddleFactor Coefficients */
TwidFactorInit (LOG2_BLOCK_LENGTH, &twiddleFactors[0], 0); /* We need to do this only once at start-up */
#endif
for ( i = 0; i < FFT_BLOCK_LENGTH; i++ )/* The FFT function requires input data */
{ /* to be in the fractional fixed-point range [-0.5, +0.5]*/
*p_real = *p_real >>1 ; /* So, we shift all data samples by 1 bit to the right. */
*p_real++; /* Should you desire to optimize this process, perform */
} /* data scaling when first obtaining the time samples */
/* Or within the BitReverseComplex function source code */
p_real = &sigCmpx[(FFT_BLOCK_LENGTH/2)-1].real ; /* Set up pointers to convert real array */
p_cmpx = &sigCmpx[FFT_BLOCK_LENGTH-1] ; /* to a complex array. The input array initially has all */
/* the real input samples followed by a series of zeros */
for ( i = FFT_BLOCK_LENGTH; i > 0; i-- ) /* Convert the Real input sample array */
{ /* to a Complex input sample array */
(*p_cmpx).real = (*p_real--); /* We will simpy zero out the imaginary */
(*p_cmpx--).imag = 0x0000; /* part of each data sample */
}
/* Perform FFT operation */
#ifndef FFTTWIDCOEFFS_IN_PROGMEM
FFTComplexIP (LOG2_BLOCK_LENGTH, &sigCmpx[0], &twiddleFactors[0], COEFFS_IN_DATA);
#else
FFTComplexIP (LOG2_BLOCK_LENGTH, &sigCmpx[0], (fractcomplex *) __builtin_psvoffset(&twiddleFactors[0]), (int) __builtin_psvpage(&twiddleFactors[0]));
#endif
/* Store output samples in bit-reversed order of their addresses */
BitReverseComplex (LOG2_BLOCK_LENGTH, &sigCmpx[0]);
/* Compute the square magnitude of the complex FFT output array so we have a Real output vetor */
SquareMagnitudeCplx(FFT_BLOCK_LENGTH, &sigCmpx[0], &sigCmpx[0].real);
/* Find the frequency Bin ( = index into the SigCmpx[] array) that has the largest energy*/
/* i.e., the largest spectral component */
VectorMax(FFT_BLOCK_LENGTH/2, &sigCmpx[0].real, &peakFrequencyBin);
/* Compute the frequency (in Hz) of the largest spectral component */
peakFrequency = peakFrequencyBin*(SAMPLING_RATE/FFT_BLOCK_LENGTH);
while (1); /* Place a breakpoint here and observe the watch window variables */
}
mUCHAS GRACIAS POR SU TIEMPO
-
El código se hace difícil de leer,fram.
Usa la herramienta code.
No encuentro la definición de ADCBUF0,ni la de fractcomplex.
Estaría bien que nos las enseñaras.
-
OK aqui estan las partes del còdigo por las que me pregunTaste:
ESTA FUNCION ES PARA INICIAL EL ADC:
void InitAdc() {
ADPCFG = 0x1FEF;
TRISBbits.TRISB4 = 1;
ADCHS = 4; //
ADCSSL = 0; //
ADCON3 = 0x1F3F; //
ADCON2 = 0; //
ADCON1 = 0x83E0; // ADC ON, fractional result
}
AQUI SE LLAMA A LA FUNCION DE LECTURA PARA ASI CARGAR EL VALOR EN EL ARREGLO
void SampleInput() {
int i = 0;
while (i <= 255) {
sigCmpx = ReadAdc(); // Re
i++;
}
ESTA SIGUIENTE FUNCION ES DONDE TENGO EL PROBLEMA ES LA FUNCION QUE SE UTILIZA PARA LEER EL VALOR DE ADC, ES DONDE SE CARGA EL VALOR DEL ADCBUF0, ESTA FUNCION ES LLAMADA PARA PONER EL VALOR DEL ADC EN EL ARREGLO
fractcomplex ReadAdc() {
ADCON1bits.SAMP = 1; // Start AD conversion
while (ADCON1bits.DONE == 0) // Wait for ADC to finish
asm ("nop");
[color=red]return ADCBUF0;[/color] // Get ADC value
}
EN ESTA SIGUIENTE PARTE SE DEFINE EL ARREGLO DONDE TRATO DE ALMACENAR LAS LECTURAS DEL ADC, AQUI ES DONDE NO ESTOY PUDIENDO CARGAR LOS VALORES:
[
fractcomplex sigCmpx[FFT_BLOCK_LENGTH]__attribute__ ((section (".ydata, data, ymemory"), aligned (FFT_BLOCK_LENGTH * 2 *2)));
/code]
-
A lo que me refiero es a la definición de ADCBUF0 (seguramente definido en el fichero p30F3011.h como una dirección de memoria del micro o como algún tipo de estructura) y a la definición del tipo fractcomplex (tendrás que buscar donde está definido).
Parece,por el error que te da, que los tipos de estos dos elementos no cuadran
-
hola, te has olvidado de definir en la cabecera esto #include <ADC.h>
prueba a ver como te va.