final coss
Dependencies: FastAnalogIn HSI2RGBW_PWM NVIC_set_all_priorities mbed-dsp mbed
Fork of Seniales-Final by
main.cpp@4:76ea7cc8fdbc, 2015-11-17 (annotated)
- Committer:
- yoryi02
- Date:
- Tue Nov 17 19:00:17 2015 +0000
- Revision:
- 4:76ea7cc8fdbc
- Parent:
- 3:6c9dabbb7261
final
Who changed what in which revision?
User | Revision | Line number | New 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 | //**********Declaraciones devariables para la silla**************** |
frankvnk | 0:0c037aff5039 | 9 | |
yoryi02 | 4:76ea7cc8fdbc | 10 | DigitalOut menos(D2);//Salida que habilitara o deshabilitara el puente H de la llanta izquierda |
yoryi02 | 4:76ea7cc8fdbc | 11 | DigitalOut afinado(D3); |
yoryi02 | 4:76ea7cc8fdbc | 12 | DigitalOut mas(D4);//Salida que habilitara o deshabilitara el puente H de la llanta derecha |
frankvnk | 0:0c037aff5039 | 13 | |
Soto | 3:6c9dabbb7261 | 14 | //******************************************************* |
frankvnk | 0:0c037aff5039 | 15 | |
Soto | 3:6c9dabbb7261 | 16 | 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 | 17 | FastAnalogIn segnal(PTC2); //Se declara el pin que recibirá la señal análoga del sensor |
Soto | 3:6c9dabbb7261 | 18 | |
Soto | 3:6c9dabbb7261 | 19 | extern "C" void NMI_Handler() { |
frankvnk | 0:0c037aff5039 | 20 | } |
frankvnk | 0:0c037aff5039 | 21 | |
Soto | 3:6c9dabbb7261 | 22 | //////////////////////////////////////////////////////////////////////////////// |
Soto | 3:6c9dabbb7261 | 23 | // CONFIGURACION |
Soto | 3:6c9dabbb7261 | 24 | //Estos valores puedne modificarse para modificar los parametros de la transformada |
Soto | 3:6c9dabbb7261 | 25 | //////////////////////////////////////////////////////////////////////////////// |
frankvnk | 0:0c037aff5039 | 26 | |
yoryi02 | 4:76ea7cc8fdbc | 27 | int SAMPLE_RATE_HZ = 4000; // Frecuencian de muestreo en HZ del sistema |
Soto | 3:6c9dabbb7261 | 28 | const int FFT_SIZE = 1024; // Número de valores para la transformada rápida |
yoryi02 | 4:76ea7cc8fdbc | 29 | float freq = 4000.0/1024.0; // Frecuencia de activación de la interrupción de muestreo |
Soto | 3:6c9dabbb7261 | 30 | float max[2]; // Arreglo que almacena la frecuencia y magnitud mayores del espectro de Fourier |
Soto | 3:6c9dabbb7261 | 31 | char blue_freq=0; // Variable que almacena el valor que se envia por bluetooth de los BPM |
frankvnk | 0:0c037aff5039 | 32 | |
frankvnk | 0:0c037aff5039 | 33 | //////////////////////////////////////////////////////////////////////////////// |
Soto | 3:6c9dabbb7261 | 34 | // ESTADO INTERNO |
Soto | 3:6c9dabbb7261 | 35 | // Configuraciones necesarias para el correcto funcionaiento del programa |
Soto | 3:6c9dabbb7261 | 36 | //////////////////////////////////////////////////////////////////////////////// |
frankvnk | 0:0c037aff5039 | 37 | |
Soto | 3:6c9dabbb7261 | 38 | const static arm_cfft_instance_f32 *S; |
Soto | 3:6c9dabbb7261 | 39 | Ticker samplingTimer; //objeto creado para habilitar las interrupciones con lso métodos de ticker |
Soto | 3:6c9dabbb7261 | 40 | float samples[FFT_SIZE*2]; //Arreglo en el que se almacenan las muestras del tomadas ADC |
Soto | 3:6c9dabbb7261 | 41 | float magnitudes[FFT_SIZE]; //Arreglo donde se almacenan las magnitudes de la FFT |
Soto | 3:6c9dabbb7261 | 42 | int sampleCounter = 0; //Contador del número de muestras tomadas |
frankvnk | 0:0c037aff5039 | 43 | |
frankvnk | 0:0c037aff5039 | 44 | //////////////////////////////////////////////////////////////////////////////// |
Soto | 3:6c9dabbb7261 | 45 | // FUNCIONES DE MUESTREO |
frankvnk | 0:0c037aff5039 | 46 | //////////////////////////////////////////////////////////////////////////////// |
frankvnk | 0:0c037aff5039 | 47 | |
Soto | 3:6c9dabbb7261 | 48 | //Esta función permite realizar el muestreo de datos, se realiza como interrupción para asegurar el tiempo de muestreo deseado |
frankvnk | 0:0c037aff5039 | 49 | void samplingCallback() |
frankvnk | 0:0c037aff5039 | 50 | { |
Soto | 3:6c9dabbb7261 | 51 | // Lectura del ADC y almacenamiento del dato |
Soto | 3:6c9dabbb7261 | 52 | samples[sampleCounter] = (1023 * segnal) - 511.0f; //Se ajusta el valor de un rango de 0-1 a 0-511 |
Soto | 3:6c9dabbb7261 | 53 | // La función que calcula la transformada requiere de un valor imaginario, en este caso se le asigna 0 |
Soto | 3:6c9dabbb7261 | 54 | // ya que los valores muestreados son solamente reales. |
frankvnk | 0:0c037aff5039 | 55 | samples[sampleCounter+1] = 0.0; |
Soto | 3:6c9dabbb7261 | 56 | // Se ajusta la posición en el arreglo para almacenar el siguiente valor real |
frankvnk | 0:0c037aff5039 | 57 | sampleCounter += 2; |
Soto | 3:6c9dabbb7261 | 58 | //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 | 59 | //de muestreo del programa |
frankvnk | 0:0c037aff5039 | 60 | if (sampleCounter >= FFT_SIZE*2) { |
frankvnk | 0:0c037aff5039 | 61 | samplingTimer.detach(); |
frankvnk | 0:0c037aff5039 | 62 | } |
frankvnk | 0:0c037aff5039 | 63 | } |
frankvnk | 0:0c037aff5039 | 64 | |
Soto | 3:6c9dabbb7261 | 65 | //Esta función permite reiniciar el contador de muestras e insertar nuevamente la interrupción de muestreo |
frankvnk | 0:0c037aff5039 | 66 | void samplingBegin() |
frankvnk | 0:0c037aff5039 | 67 | { |
Soto | 3:6c9dabbb7261 | 68 | sampleCounter = 0; //Se reinicia el contador de muestras |
Soto | 3:6c9dabbb7261 | 69 | 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 | 70 | } |
frankvnk | 0:0c037aff5039 | 71 | |
Soto | 3:6c9dabbb7261 | 72 | //Función booleana que funciona como bandera para indicar que el meustreo de datos ha sido finalizado |
frankvnk | 0:0c037aff5039 | 73 | bool samplingIsDone() |
frankvnk | 0:0c037aff5039 | 74 | { |
frankvnk | 0:0c037aff5039 | 75 | return sampleCounter >= FFT_SIZE*2; |
frankvnk | 0:0c037aff5039 | 76 | } |
frankvnk | 0:0c037aff5039 | 77 | |
yoryi02 | 4:76ea7cc8fdbc | 78 | |
frankvnk | 0:0c037aff5039 | 79 | |
frankvnk | 0:0c037aff5039 | 80 | //////////////////////////////////////////////////////////////////////////////// |
Soto | 3:6c9dabbb7261 | 81 | // MAIN DEL PROGRAMA |
frankvnk | 0:0c037aff5039 | 82 | //////////////////////////////////////////////////////////////////////////////// |
frankvnk | 0:0c037aff5039 | 83 | |
frankvnk | 0:0c037aff5039 | 84 | int main() |
frankvnk | 0:0c037aff5039 | 85 | { |
Soto | 3:6c9dabbb7261 | 86 | //Configuración de las solicitudes de interrupción |
frankvnk | 0:0c037aff5039 | 87 | NVIC_set_all_irq_priorities(1); |
Soto | 3:6c9dabbb7261 | 88 | |
Soto | 3:6c9dabbb7261 | 89 | //Configuración de la velocidad de la comunicación serial |
Soto | 3:6c9dabbb7261 | 90 | pc.baud (38400); //Velocidad de la comunicación USB |
frankvnk | 0:0c037aff5039 | 91 | |
Soto | 3:6c9dabbb7261 | 92 | // Se incerta la interrupción de muestreo del ADC |
frankvnk | 0:0c037aff5039 | 93 | samplingBegin(); |
frankvnk | 0:0c037aff5039 | 94 | |
Soto | 3:6c9dabbb7261 | 95 | // Init arm_ccft_32 el registro cambiara dependiendo de la variable FFT_SIZE |
frankvnk | 2:035d551759a5 | 96 | switch (FFT_SIZE) |
frankvnk | 2:035d551759a5 | 97 | { |
frankvnk | 2:035d551759a5 | 98 | case 512: |
frankvnk | 2:035d551759a5 | 99 | S = & arm_cfft_sR_f32_len512; |
frankvnk | 2:035d551759a5 | 100 | break; |
frankvnk | 2:035d551759a5 | 101 | case 1024: |
frankvnk | 2:035d551759a5 | 102 | S = & arm_cfft_sR_f32_len1024; |
frankvnk | 2:035d551759a5 | 103 | break; |
frankvnk | 2:035d551759a5 | 104 | case 2048: |
frankvnk | 2:035d551759a5 | 105 | S = & arm_cfft_sR_f32_len2048; |
frankvnk | 2:035d551759a5 | 106 | break; |
frankvnk | 2:035d551759a5 | 107 | case 4096: |
frankvnk | 2:035d551759a5 | 108 | S = & arm_cfft_sR_f32_len4096; |
frankvnk | 2:035d551759a5 | 109 | break; |
frankvnk | 2:035d551759a5 | 110 | } |
yoryi02 | 4:76ea7cc8fdbc | 111 | pc.printf("hola"); |
frankvnk | 2:035d551759a5 | 112 | |
frankvnk | 0:0c037aff5039 | 113 | while(1) { |
yoryi02 | 4:76ea7cc8fdbc | 114 | |
Soto | 3:6c9dabbb7261 | 115 | // Se calcula la FFT si se ha terminado el muestreo |
frankvnk | 0:0c037aff5039 | 116 | if (samplingIsDone()) { |
Soto | 3:6c9dabbb7261 | 117 | |
frankvnk | 2:035d551759a5 | 118 | arm_cfft_f32(S, samples, 0, 1); |
frankvnk | 0:0c037aff5039 | 119 | arm_cmplx_mag_f32(samples, magnitudes, FFT_SIZE); |
frankvnk | 0:0c037aff5039 | 120 | |
yoryi02 | 4:76ea7cc8fdbc | 121 | for (int i = 1; i < FFT_SIZE/2+1; ++i) { |
yoryi02 | 4:76ea7cc8fdbc | 122 | //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 | 123 | //Sección de código que permite obtener el valor de frecuencia y magnitud mayor de los calculados |
Soto | 3:6c9dabbb7261 | 124 | if (magnitudes[i]>max[1]){ |
Soto | 3:6c9dabbb7261 | 125 | max[0]=i*freq; |
Soto | 3:6c9dabbb7261 | 126 | max[1]=magnitudes[i]; //Habilitar solo para debuggeo |
Soto | 3:6c9dabbb7261 | 127 | } |
Soto | 3:6c9dabbb7261 | 128 | } |
yoryi02 | 4:76ea7cc8fdbc | 129 | //pc.printf("%f, %f\r\n",max[0], max[1]); |
Soto | 3:6c9dabbb7261 | 130 | //Dependiendo del valor de max[0], que representa la frecuencia natural, indicara la persona |
Soto | 3:6c9dabbb7261 | 131 | //que esta chiflando y la silla ejecutara una rutina especifica |
yoryi02 | 4:76ea7cc8fdbc | 132 | if ((max[0]<=113 && max[0]>= 107) || (max[0]<=225 && max[0]>= 215) || (max[0]<=335 && max[0]>= 325)){ |
Soto | 3:6c9dabbb7261 | 133 | |
Soto | 3:6c9dabbb7261 | 134 | pc.printf("\n %f\n", max[0]); |
yoryi02 | 4:76ea7cc8fdbc | 135 | pc.printf("\nafinado\n"); |
yoryi02 | 4:76ea7cc8fdbc | 136 | afinado=1; |
Soto | 3:6c9dabbb7261 | 137 | wait(1); |
yoryi02 | 4:76ea7cc8fdbc | 138 | afinado=0; |
yoryi02 | 4:76ea7cc8fdbc | 139 | |
yoryi02 | 4:76ea7cc8fdbc | 140 | |
Soto | 3:6c9dabbb7261 | 141 | } |
yoryi02 | 4:76ea7cc8fdbc | 142 | else if ((max[0]<=106 && max[0]>= 86) || (max[0]<=215 && max[0]>= 175) || (max[0]<=325 && max[0]>= 265)){ |
Soto | 3:6c9dabbb7261 | 143 | |
yoryi02 | 4:76ea7cc8fdbc | 144 | pc.printf("\n %f\n", max[0]); |
yoryi02 | 4:76ea7cc8fdbc | 145 | pc.printf("\n abajo \n"); |
yoryi02 | 4:76ea7cc8fdbc | 146 | menos=1; |
yoryi02 | 4:76ea7cc8fdbc | 147 | wait(1); |
yoryi02 | 4:76ea7cc8fdbc | 148 | menos=0; |
frankvnk | 0:0c037aff5039 | 149 | } |
yoryi02 | 4:76ea7cc8fdbc | 150 | else if ((max[0]<=134 && max[0]>= 114) || (max[0]<=265 && max[0]>= 226) || (max[0]<=395 && max[0]>= 326)){ |
yoryi02 | 4:76ea7cc8fdbc | 151 | |
yoryi02 | 4:76ea7cc8fdbc | 152 | pc.printf("\n %f\n", max[0]); |
yoryi02 | 4:76ea7cc8fdbc | 153 | pc.printf("\n arriba \n"); |
yoryi02 | 4:76ea7cc8fdbc | 154 | mas=1; |
yoryi02 | 4:76ea7cc8fdbc | 155 | wait(1); |
yoryi02 | 4:76ea7cc8fdbc | 156 | mas=0; |
yoryi02 | 4:76ea7cc8fdbc | 157 | } |
yoryi02 | 4:76ea7cc8fdbc | 158 | |
frankvnk | 0:0c037aff5039 | 159 | |
Soto | 3:6c9dabbb7261 | 160 | //Se reinician las variables máximas |
Soto | 3:6c9dabbb7261 | 161 | max[0]=0; |
Soto | 3:6c9dabbb7261 | 162 | max[1]=0; |
Soto | 3:6c9dabbb7261 | 163 | |
Soto | 3:6c9dabbb7261 | 164 | // Se vuelve a incertar la interrupción de muestreo |
frankvnk | 0:0c037aff5039 | 165 | samplingBegin(); |
frankvnk | 0:0c037aff5039 | 166 | } |
frankvnk | 0:0c037aff5039 | 167 | } |
Soto | 3:6c9dabbb7261 | 168 | } |