Funcional
Dependencies: FastAnalogIn HSI2RGBW_PWM NVIC_set_all_priorities mbed-dsp mbed TextLCD
Fork of Seniales-Tacometro by
Diff: main.cpp
- Revision:
- 7:6b8a1382b2ee
- Parent:
- 6:c77012d6086b
- Child:
- 8:4c2a5a2b2a80
diff -r c77012d6086b -r 6b8a1382b2ee main.cpp --- a/main.cpp Wed Dec 02 20:04:03 2015 +0000 +++ b/main.cpp Tue Apr 26 15:04:08 2016 +0000 @@ -5,44 +5,44 @@ #include "arm_const_structs.h" #include "FastAnalogIn.h" //Librería modificada basada en la función de AnalogIn que reduce el tiempo de procesamiento de las señales ADC #include "TextLCD.h" - - + + TextLCD lcd(PTA4, PTC8, PTA13, PTD5, PTD0, PTD2); // rs, e, d0, d1, d2, d3 - + char* x; int lcd_count = 0; Serial pc(USBTX, USBRX); //Se declaran los pines que se utilizarán para la comunicación serial mediante USB para debuggeo (PTA1 - RX, PTA2 - TX) FastAnalogIn segnal(PTC2); //Se declara el pin que recibirá la señal análoga del sensor - + extern "C" void NMI_Handler() { } - + //////////////////////////////////////////////////////////////////////////////// // CONFIGURACION //Estos valores puedne modificarse para modificar los parametros de la transformada //////////////////////////////////////////////////////////////////////////////// - + int SAMPLE_RATE_HZ = 40000; // Frecuencian de muestreo en HZ del sistema const int FFT_SIZE = 1024; // Número de valores para la transformada rápida float freq = 40000.0/1024.0; // Frecuencia de activación de la interrupción de muestreo float max[2]; // Arreglo que almacena la frecuencia y magnitud mayores del espectro de Fourier - + //////////////////////////////////////////////////////////////////////////////// // ESTADO INTERNO // Configuraciones necesarias para el correcto funcionaiento del programa //////////////////////////////////////////////////////////////////////////////// - + const static arm_cfft_instance_f32 *S; Ticker samplingTimer; //objeto creado para habilitar las interrupciones con lso métodos de ticker float samples[FFT_SIZE*2]; //Arreglo en el que se almacenan las muestras del tomadas ADC float magnitudes[FFT_SIZE]; //Arreglo donde se almacenan las magnitudes de la FFT int sampleCounter = 0; //Contador del número de muestras tomadas - + //////////////////////////////////////////////////////////////////////////////// // FUNCIONES DE MUESTREO //////////////////////////////////////////////////////////////////////////////// - + //Esta función permite realizar el muestreo de datos, se realiza como interrupción para asegurar el tiempo de muestreo deseado void samplingCallback() { @@ -59,35 +59,35 @@ samplingTimer.detach(); } } - + //Esta función permite reiniciar el contador de muestras e insertar nuevamente la interrupción de muestreo void samplingBegin() { sampleCounter = 0; //Se reinicia el contador de muestras samplingTimer.attach_us(&samplingCallback, 1000000/SAMPLE_RATE_HZ); //Se incertala interrupción de muestreo la cual es llamada con la frecuencia de Sample_rate_hz } - + //Función booleana que funciona como bandera para indicar que el meustreo de datos ha sido finalizado bool samplingIsDone() { return sampleCounter >= FFT_SIZE*2; } - + //////////////////////////////////////////////////////////////////////////////// // MAIN DEL PROGRAMA //////////////////////////////////////////////////////////////////////////////// - + int main() { //Configuración de las solicitudes de interrupción NVIC_set_all_irq_priorities(1); - + //Configuración de la velocidad de la comunicación serial pc.baud (115200); //Velocidad de la comunicación USB - + // Se incerta la interrupción de muestreo del ADC samplingBegin(); - + // Init arm_ccft_32 el registro cambiara dependiendo de la variable FFT_SIZE switch (FFT_SIZE) { case 512: @@ -103,14 +103,14 @@ S = & arm_cfft_sR_f32_len4096; break; } - + while(1) { // Se calcula la FFT si se ha terminado el muestreo if (samplingIsDone()) { - + arm_cfft_f32(S, samples, 0, 1); arm_cmplx_mag_f32(samples, magnitudes, FFT_SIZE); - + for (int i = 0; i < FFT_SIZE/2+1; ++i) { // pc.printf("%f, %f\r\n", i*freq, magnitudes[i]); //Esta línea se activa solo si se desea conocer la magnitudes generada por la FFT //Sección de código que permite obtener el valor de frecuencia y magnitud mayor de los calculados @@ -119,6 +119,8 @@ max[1]=magnitudes[i]; //Habilitar solo para debuggeo } } + int test= (int) (max[0] + 0.5); + printf("%i\r\n", test); if (25<max[0] && max[0]<260) { x="04,000 RPM"; @@ -159,15 +161,18 @@ int test= (int) (max[0] + 0.5); lcd.locate(0,0); lcd.printf("%s",x); + //pc.printf("%s",x); lcd.locate(0,1); lcd.printf("%s","FFT: "); + //pc.printf("%s","FFT: "); lcd.printf("%i",test); + //pc.printf("%i",test); lcd_count = 0; } max[0]=0; max[1]=0; - + // Se vuelve a incertar la interrupción de muestreo samplingBegin(); }