Primera Prueba

Dependencies:   FastAnalogIn HSI2RGBW_PWM NVIC_set_all_priorities mbed-dsp mbed

Fork of Seniales-Final by Ricardo Soto

Committer:
griszAndy
Date:
Wed Nov 25 21:28:57 2015 +0000
Revision:
4:214f7d72f740
Parent:
3:6c9dabbb7261
FrstTest

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Soto 3:6c9dabbb7261 1 #include "mbed.h" //Librería default de mbed
Soto 3:6c9dabbb7261 2 #include "NVIC_set_all_priorities.h" //Librería para modificar todas las solicitudes de interrupciones al mismo tiempo
frankvnk 0:0c037aff5039 3 #include <ctype.h>
Soto 3:6c9dabbb7261 4 #include "arm_math.h" //Librería que contiene funciones de tranformada de fourier
frankvnk 2:035d551759a5 5 #include "arm_const_structs.h"
Soto 3:6c9dabbb7261 6 #include "FastAnalogIn.h" //Librería modificada basada en la función de AnalogIn que reduce el tiempo de procesamiento de las señales ADC
frankvnk 0:0c037aff5039 7
Soto 3:6c9dabbb7261 8 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)
Soto 3:6c9dabbb7261 9 FastAnalogIn segnal(PTC2); //Se declara el pin que recibirá la señal análoga del sensor
Soto 3:6c9dabbb7261 10
Soto 3:6c9dabbb7261 11 extern "C" void NMI_Handler() {
frankvnk 0:0c037aff5039 12 }
frankvnk 0:0c037aff5039 13
Soto 3:6c9dabbb7261 14 ////////////////////////////////////////////////////////////////////////////////
Soto 3:6c9dabbb7261 15 // CONFIGURACION
Soto 3:6c9dabbb7261 16 //Estos valores puedne modificarse para modificar los parametros de la transformada
Soto 3:6c9dabbb7261 17 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 18
Soto 3:6c9dabbb7261 19 int SAMPLE_RATE_HZ = 40000; // Frecuencian de muestreo en HZ del sistema
Soto 3:6c9dabbb7261 20 const int FFT_SIZE = 1024; // Número de valores para la transformada rápida
Soto 3:6c9dabbb7261 21 float freq = 40000.0/1024.0; // Frecuencia de activación de la interrupción de muestreo
Soto 3:6c9dabbb7261 22 float max[2]; // Arreglo que almacena la frecuencia y magnitud mayores del espectro de Fourier
frankvnk 0:0c037aff5039 23
frankvnk 0:0c037aff5039 24 ////////////////////////////////////////////////////////////////////////////////
Soto 3:6c9dabbb7261 25 // ESTADO INTERNO
Soto 3:6c9dabbb7261 26 // Configuraciones necesarias para el correcto funcionaiento del programa
Soto 3:6c9dabbb7261 27 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 28
Soto 3:6c9dabbb7261 29 const static arm_cfft_instance_f32 *S;
Soto 3:6c9dabbb7261 30 Ticker samplingTimer; //objeto creado para habilitar las interrupciones con lso métodos de ticker
Soto 3:6c9dabbb7261 31 float samples[FFT_SIZE*2]; //Arreglo en el que se almacenan las muestras del tomadas ADC
Soto 3:6c9dabbb7261 32 float magnitudes[FFT_SIZE]; //Arreglo donde se almacenan las magnitudes de la FFT
Soto 3:6c9dabbb7261 33 int sampleCounter = 0; //Contador del número de muestras tomadas
frankvnk 0:0c037aff5039 34
frankvnk 0:0c037aff5039 35 ////////////////////////////////////////////////////////////////////////////////
Soto 3:6c9dabbb7261 36 // FUNCIONES DE MUESTREO
frankvnk 0:0c037aff5039 37 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 38
Soto 3:6c9dabbb7261 39 //Esta función permite realizar el muestreo de datos, se realiza como interrupción para asegurar el tiempo de muestreo deseado
frankvnk 0:0c037aff5039 40 void samplingCallback()
frankvnk 0:0c037aff5039 41 {
Soto 3:6c9dabbb7261 42 // Lectura del ADC y almacenamiento del dato
Soto 3:6c9dabbb7261 43 samples[sampleCounter] = (1023 * segnal) - 511.0f; //Se ajusta el valor de un rango de 0-1 a 0-511
Soto 3:6c9dabbb7261 44 // La función que calcula la transformada requiere de un valor imaginario, en este caso se le asigna 0
Soto 3:6c9dabbb7261 45 // ya que los valores muestreados son solamente reales.
frankvnk 0:0c037aff5039 46 samples[sampleCounter+1] = 0.0;
Soto 3:6c9dabbb7261 47 // Se ajusta la posición en el arreglo para almacenar el siguiente valor real
frankvnk 0:0c037aff5039 48 sampleCounter += 2;
Soto 3:6c9dabbb7261 49 //En caso de que el valor de sample counter sobrepase el tamaño del arreglo de almacenamiento se retira la interrupción
Soto 3:6c9dabbb7261 50 //de muestreo del programa
frankvnk 0:0c037aff5039 51 if (sampleCounter >= FFT_SIZE*2) {
frankvnk 0:0c037aff5039 52 samplingTimer.detach();
frankvnk 0:0c037aff5039 53 }
frankvnk 0:0c037aff5039 54 }
frankvnk 0:0c037aff5039 55
Soto 3:6c9dabbb7261 56 //Esta función permite reiniciar el contador de muestras e insertar nuevamente la interrupción de muestreo
frankvnk 0:0c037aff5039 57 void samplingBegin()
frankvnk 0:0c037aff5039 58 {
Soto 3:6c9dabbb7261 59 sampleCounter = 0; //Se reinicia el contador de muestras
Soto 3:6c9dabbb7261 60 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
frankvnk 0:0c037aff5039 61 }
frankvnk 0:0c037aff5039 62
Soto 3:6c9dabbb7261 63 //Función booleana que funciona como bandera para indicar que el meustreo de datos ha sido finalizado
frankvnk 0:0c037aff5039 64 bool samplingIsDone()
frankvnk 0:0c037aff5039 65 {
frankvnk 0:0c037aff5039 66 return sampleCounter >= FFT_SIZE*2;
frankvnk 0:0c037aff5039 67 }
frankvnk 0:0c037aff5039 68
frankvnk 0:0c037aff5039 69 ////////////////////////////////////////////////////////////////////////////////
Soto 3:6c9dabbb7261 70 // MAIN DEL PROGRAMA
frankvnk 0:0c037aff5039 71 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 72
frankvnk 0:0c037aff5039 73 int main()
frankvnk 0:0c037aff5039 74 {
Soto 3:6c9dabbb7261 75 //Configuración de las solicitudes de interrupción
frankvnk 0:0c037aff5039 76 NVIC_set_all_irq_priorities(1);
Soto 3:6c9dabbb7261 77
Soto 3:6c9dabbb7261 78 //Configuración de la velocidad de la comunicación serial
Soto 3:6c9dabbb7261 79 pc.baud (38400); //Velocidad de la comunicación USB
frankvnk 0:0c037aff5039 80
Soto 3:6c9dabbb7261 81 // Se incerta la interrupción de muestreo del ADC
frankvnk 0:0c037aff5039 82 samplingBegin();
frankvnk 0:0c037aff5039 83
Soto 3:6c9dabbb7261 84 // Init arm_ccft_32 el registro cambiara dependiendo de la variable FFT_SIZE
frankvnk 2:035d551759a5 85 switch (FFT_SIZE)
frankvnk 2:035d551759a5 86 {
frankvnk 2:035d551759a5 87 case 512:
frankvnk 2:035d551759a5 88 S = & arm_cfft_sR_f32_len512;
frankvnk 2:035d551759a5 89 break;
frankvnk 2:035d551759a5 90 case 1024:
frankvnk 2:035d551759a5 91 S = & arm_cfft_sR_f32_len1024;
frankvnk 2:035d551759a5 92 break;
frankvnk 2:035d551759a5 93 case 2048:
frankvnk 2:035d551759a5 94 S = & arm_cfft_sR_f32_len2048;
frankvnk 2:035d551759a5 95 break;
frankvnk 2:035d551759a5 96 case 4096:
frankvnk 2:035d551759a5 97 S = & arm_cfft_sR_f32_len4096;
frankvnk 2:035d551759a5 98 break;
frankvnk 2:035d551759a5 99 }
frankvnk 2:035d551759a5 100
frankvnk 0:0c037aff5039 101 while(1) {
Soto 3:6c9dabbb7261 102 // Se calcula la FFT si se ha terminado el muestreo
frankvnk 0:0c037aff5039 103 if (samplingIsDone()) {
Soto 3:6c9dabbb7261 104
frankvnk 2:035d551759a5 105 arm_cfft_f32(S, samples, 0, 1);
frankvnk 0:0c037aff5039 106 arm_cmplx_mag_f32(samples, magnitudes, FFT_SIZE);
frankvnk 0:0c037aff5039 107
Soto 3:6c9dabbb7261 108 for (int i = 0; i < FFT_SIZE/2+1; ++i) {
Soto 3:6c9dabbb7261 109 // 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
Soto 3:6c9dabbb7261 110 //Sección de código que permite obtener el valor de frecuencia y magnitud mayor de los calculados
Soto 3:6c9dabbb7261 111 if (magnitudes[i]>max[1]){
Soto 3:6c9dabbb7261 112 max[0]=i*freq;
Soto 3:6c9dabbb7261 113 max[1]=magnitudes[i]; //Habilitar solo para debuggeo
Soto 3:6c9dabbb7261 114 }
Soto 3:6c9dabbb7261 115 }
Soto 3:6c9dabbb7261 116
Soto 3:6c9dabbb7261 117 //Dependiendo del valor de max[0], que representa la frecuencia natural, indicara la persona
Soto 3:6c9dabbb7261 118 //que esta chiflando y la silla ejecutara una rutina especifica
Soto 3:6c9dabbb7261 119 if(max[0]<=1600 && max[0]>=1350){
Soto 3:6c9dabbb7261 120
Soto 3:6c9dabbb7261 121 pc.printf("\n %f\n", max[0]);
Soto 3:6c9dabbb7261 122 pc.printf("\nChifla Jessi\n");
Soto 3:6c9dabbb7261 123 }
Soto 3:6c9dabbb7261 124 else if (max[0]<=3500 && max[0]>= 3000){
Soto 3:6c9dabbb7261 125
Soto 3:6c9dabbb7261 126 pc.printf("\n %f\n", max[0]);
Soto 3:6c9dabbb7261 127 pc.printf("\nChifla Soto\n");
Soto 3:6c9dabbb7261 128 }
Soto 3:6c9dabbb7261 129 else if (max[0]<=2200 && max[0]>= 2500){
Soto 3:6c9dabbb7261 130
Soto 3:6c9dabbb7261 131 pc.printf("\n %f\n", max[0]);
Soto 3:6c9dabbb7261 132 pc.printf("\nChifla Snais\n");
frankvnk 0:0c037aff5039 133 }
frankvnk 0:0c037aff5039 134
Soto 3:6c9dabbb7261 135 //Se reinician las variables máximas
Soto 3:6c9dabbb7261 136 max[0]=0;
Soto 3:6c9dabbb7261 137 max[1]=0;
Soto 3:6c9dabbb7261 138
Soto 3:6c9dabbb7261 139 // Se vuelve a incertar la interrupción de muestreo
frankvnk 0:0c037aff5039 140 samplingBegin();
frankvnk 0:0c037aff5039 141 }
frankvnk 0:0c037aff5039 142 }
Soto 3:6c9dabbb7261 143 }