final coss

Dependencies:   FastAnalogIn HSI2RGBW_PWM NVIC_set_all_priorities mbed-dsp mbed

Fork of Seniales-Final by Ricardo Soto

Committer:
yoryi02
Date:
Tue Nov 17 19:00:17 2015 +0000
Revision:
4:76ea7cc8fdbc
Parent:
3:6c9dabbb7261
final

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 //**********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 }