Funcional

Dependencies:   FastAnalogIn HSI2RGBW_PWM NVIC_set_all_priorities mbed-dsp mbed TextLCD

Fork of Seniales-Tacometro by Grissell Esquivel

Committer:
griszAndy
Date:
Wed Dec 02 20:04:03 2015 +0000
Revision:
6:c77012d6086b
Parent:
5:cb7f0c71b5fd
Child:
7:6b8a1382b2ee
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
griszAndy 6:c77012d6086b 7 #include "TextLCD.h"
frankvnk 0:0c037aff5039 8
griszAndy 6:c77012d6086b 9
griszAndy 6:c77012d6086b 10 TextLCD lcd(PTA4, PTC8, PTA13, PTD5, PTD0, PTD2); // rs, e, d0, d1, d2, d3
griszAndy 6:c77012d6086b 11
griszAndy 6:c77012d6086b 12 char* x;
griszAndy 6:c77012d6086b 13 int lcd_count = 0;
Soto 3:6c9dabbb7261 14 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 15 FastAnalogIn segnal(PTC2); //Se declara el pin que recibirá la señal análoga del sensor
Soto 3:6c9dabbb7261 16
griszAndy 6:c77012d6086b 17 extern "C" void NMI_Handler()
griszAndy 6:c77012d6086b 18 {
frankvnk 0:0c037aff5039 19 }
frankvnk 0:0c037aff5039 20
Soto 3:6c9dabbb7261 21 ////////////////////////////////////////////////////////////////////////////////
Soto 3:6c9dabbb7261 22 // CONFIGURACION
Soto 3:6c9dabbb7261 23 //Estos valores puedne modificarse para modificar los parametros de la transformada
Soto 3:6c9dabbb7261 24 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 25
Soto 3:6c9dabbb7261 26 int SAMPLE_RATE_HZ = 40000; // Frecuencian de muestreo en HZ del sistema
Soto 3:6c9dabbb7261 27 const int FFT_SIZE = 1024; // Número de valores para la transformada rápida
Soto 3:6c9dabbb7261 28 float freq = 40000.0/1024.0; // Frecuencia de activación de la interrupción de muestreo
Soto 3:6c9dabbb7261 29 float max[2]; // Arreglo que almacena la frecuencia y magnitud mayores del espectro de Fourier
frankvnk 0:0c037aff5039 30
frankvnk 0:0c037aff5039 31 ////////////////////////////////////////////////////////////////////////////////
Soto 3:6c9dabbb7261 32 // ESTADO INTERNO
Soto 3:6c9dabbb7261 33 // Configuraciones necesarias para el correcto funcionaiento del programa
Soto 3:6c9dabbb7261 34 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 35
Soto 3:6c9dabbb7261 36 const static arm_cfft_instance_f32 *S;
Soto 3:6c9dabbb7261 37 Ticker samplingTimer; //objeto creado para habilitar las interrupciones con lso métodos de ticker
Soto 3:6c9dabbb7261 38 float samples[FFT_SIZE*2]; //Arreglo en el que se almacenan las muestras del tomadas ADC
Soto 3:6c9dabbb7261 39 float magnitudes[FFT_SIZE]; //Arreglo donde se almacenan las magnitudes de la FFT
Soto 3:6c9dabbb7261 40 int sampleCounter = 0; //Contador del número de muestras tomadas
frankvnk 0:0c037aff5039 41
frankvnk 0:0c037aff5039 42 ////////////////////////////////////////////////////////////////////////////////
Soto 3:6c9dabbb7261 43 // FUNCIONES DE MUESTREO
frankvnk 0:0c037aff5039 44 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 45
Soto 3:6c9dabbb7261 46 //Esta función permite realizar el muestreo de datos, se realiza como interrupción para asegurar el tiempo de muestreo deseado
frankvnk 0:0c037aff5039 47 void samplingCallback()
frankvnk 0:0c037aff5039 48 {
Soto 3:6c9dabbb7261 49 // Lectura del ADC y almacenamiento del dato
Soto 3:6c9dabbb7261 50 samples[sampleCounter] = (1023 * segnal) - 511.0f; //Se ajusta el valor de un rango de 0-1 a 0-511
griszAndy 6:c77012d6086b 51 // La función que calcula la transformada requiere de un valor imaginario, en este caso se le asigna 0
Soto 3:6c9dabbb7261 52 // ya que los valores muestreados son solamente reales.
frankvnk 0:0c037aff5039 53 samples[sampleCounter+1] = 0.0;
Soto 3:6c9dabbb7261 54 // Se ajusta la posición en el arreglo para almacenar el siguiente valor real
frankvnk 0:0c037aff5039 55 sampleCounter += 2;
Soto 3:6c9dabbb7261 56 //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 57 //de muestreo del programa
frankvnk 0:0c037aff5039 58 if (sampleCounter >= FFT_SIZE*2) {
frankvnk 0:0c037aff5039 59 samplingTimer.detach();
frankvnk 0:0c037aff5039 60 }
frankvnk 0:0c037aff5039 61 }
frankvnk 0:0c037aff5039 62
Soto 3:6c9dabbb7261 63 //Esta función permite reiniciar el contador de muestras e insertar nuevamente la interrupción de muestreo
frankvnk 0:0c037aff5039 64 void samplingBegin()
frankvnk 0:0c037aff5039 65 {
Soto 3:6c9dabbb7261 66 sampleCounter = 0; //Se reinicia el contador de muestras
Soto 3:6c9dabbb7261 67 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 68 }
frankvnk 0:0c037aff5039 69
Soto 3:6c9dabbb7261 70 //Función booleana que funciona como bandera para indicar que el meustreo de datos ha sido finalizado
frankvnk 0:0c037aff5039 71 bool samplingIsDone()
frankvnk 0:0c037aff5039 72 {
frankvnk 0:0c037aff5039 73 return sampleCounter >= FFT_SIZE*2;
frankvnk 0:0c037aff5039 74 }
frankvnk 0:0c037aff5039 75
frankvnk 0:0c037aff5039 76 ////////////////////////////////////////////////////////////////////////////////
Soto 3:6c9dabbb7261 77 // MAIN DEL PROGRAMA
frankvnk 0:0c037aff5039 78 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 79
frankvnk 0:0c037aff5039 80 int main()
frankvnk 0:0c037aff5039 81 {
Soto 3:6c9dabbb7261 82 //Configuración de las solicitudes de interrupción
frankvnk 0:0c037aff5039 83 NVIC_set_all_irq_priorities(1);
griszAndy 6:c77012d6086b 84
Soto 3:6c9dabbb7261 85 //Configuración de la velocidad de la comunicación serial
griszAndy 5:cb7f0c71b5fd 86 pc.baud (115200); //Velocidad de la comunicación USB
frankvnk 0:0c037aff5039 87
Soto 3:6c9dabbb7261 88 // Se incerta la interrupción de muestreo del ADC
frankvnk 0:0c037aff5039 89 samplingBegin();
frankvnk 0:0c037aff5039 90
Soto 3:6c9dabbb7261 91 // Init arm_ccft_32 el registro cambiara dependiendo de la variable FFT_SIZE
griszAndy 6:c77012d6086b 92 switch (FFT_SIZE) {
griszAndy 6:c77012d6086b 93 case 512:
griszAndy 6:c77012d6086b 94 S = & arm_cfft_sR_f32_len512;
griszAndy 6:c77012d6086b 95 break;
griszAndy 6:c77012d6086b 96 case 1024:
griszAndy 6:c77012d6086b 97 S = & arm_cfft_sR_f32_len1024;
griszAndy 6:c77012d6086b 98 break;
griszAndy 6:c77012d6086b 99 case 2048:
griszAndy 6:c77012d6086b 100 S = & arm_cfft_sR_f32_len2048;
griszAndy 6:c77012d6086b 101 break;
griszAndy 6:c77012d6086b 102 case 4096:
griszAndy 6:c77012d6086b 103 S = & arm_cfft_sR_f32_len4096;
griszAndy 6:c77012d6086b 104 break;
frankvnk 2:035d551759a5 105 }
frankvnk 2:035d551759a5 106
frankvnk 0:0c037aff5039 107 while(1) {
Soto 3:6c9dabbb7261 108 // Se calcula la FFT si se ha terminado el muestreo
frankvnk 0:0c037aff5039 109 if (samplingIsDone()) {
griszAndy 6:c77012d6086b 110
frankvnk 2:035d551759a5 111 arm_cfft_f32(S, samples, 0, 1);
frankvnk 0:0c037aff5039 112 arm_cmplx_mag_f32(samples, magnitudes, FFT_SIZE);
frankvnk 0:0c037aff5039 113
Soto 3:6c9dabbb7261 114 for (int i = 0; i < FFT_SIZE/2+1; ++i) {
griszAndy 6:c77012d6086b 115 // 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 116 //Sección de código que permite obtener el valor de frecuencia y magnitud mayor de los calculados
griszAndy 6:c77012d6086b 117 if (magnitudes[i]>max[1]) {
griszAndy 6:c77012d6086b 118 max[0]=i*freq;
griszAndy 6:c77012d6086b 119 max[1]=magnitudes[i]; //Habilitar solo para debuggeo
Soto 3:6c9dabbb7261 120 }
Soto 3:6c9dabbb7261 121 }
griszAndy 6:c77012d6086b 122
griszAndy 6:c77012d6086b 123 if (25<max[0] && max[0]<260) {
griszAndy 6:c77012d6086b 124 x="04,000 RPM";
griszAndy 6:c77012d6086b 125 } else if (260<max[0] && max[0]<325) {
griszAndy 6:c77012d6086b 126 x="05,000 RPM";
griszAndy 6:c77012d6086b 127 } else if (600<max[0] && max[0]<780) {
griszAndy 6:c77012d6086b 128 x="05,000 RPM";
griszAndy 6:c77012d6086b 129 } else if (1301<max[0] && max[0]<1500) {
griszAndy 6:c77012d6086b 130 x="05,000 RPM";
griszAndy 6:c77012d6086b 131 } else if (326<max[0] && max[0]<392) {
griszAndy 6:c77012d6086b 132 x="06,000 RPM";
griszAndy 6:c77012d6086b 133 } else if (780<max[0] && max[0]<900) {
griszAndy 6:c77012d6086b 134 x="06,000 RPM";
griszAndy 6:c77012d6086b 135 } else if (2000<max[0] && max[0]<2800) {
griszAndy 6:c77012d6086b 136 x="06,000 RPM";
griszAndy 6:c77012d6086b 137 } else if (393<max[0] && max[0]<450) {
griszAndy 6:c77012d6086b 138 x="07,000 RPM";
griszAndy 6:c77012d6086b 139 } else if (900<max[0] && max[0]<1010) {
griszAndy 6:c77012d6086b 140 x="07,000 RPM";
griszAndy 6:c77012d6086b 141 } else if (451<max[0] && max[0]<519) {
griszAndy 6:c77012d6086b 142 x="08,000 RPM";
griszAndy 6:c77012d6086b 143 } else if (1010<max[0] && max[0]<1149) {
griszAndy 6:c77012d6086b 144 x="08,000 RPM";
griszAndy 6:c77012d6086b 145 } else if (520<max[0] && max[0]<584) {
griszAndy 6:c77012d6086b 146 x="09,000 RPM";
griszAndy 6:c77012d6086b 147 } else if (1150<max[0] && max[0]<1168) {
griszAndy 6:c77012d6086b 148 x="09,000 RPM";
griszAndy 6:c77012d6086b 149 } else if (584<max[0] && max[0]<700) {
griszAndy 6:c77012d6086b 150 x="10,000 RPM";
griszAndy 6:c77012d6086b 151 } else if (1168<max[0] && max[0]<1300) {
griszAndy 6:c77012d6086b 152 x="10,000 RPM";
griszAndy 6:c77012d6086b 153 } else if (max[0]==0) {
griszAndy 6:c77012d6086b 154 x="00,000 RPM";
griszAndy 6:c77012d6086b 155 }
griszAndy 6:c77012d6086b 156 lcd_count++;
griszAndy 6:c77012d6086b 157 if(lcd_count == 5){
griszAndy 6:c77012d6086b 158 lcd.cls();
griszAndy 6:c77012d6086b 159 int test= (int) (max[0] + 0.5);
griszAndy 6:c77012d6086b 160 lcd.locate(0,0);
griszAndy 6:c77012d6086b 161 lcd.printf("%s",x);
griszAndy 6:c77012d6086b 162 lcd.locate(0,1);
griszAndy 6:c77012d6086b 163 lcd.printf("%s","FFT: ");
griszAndy 6:c77012d6086b 164 lcd.printf("%i",test);
griszAndy 6:c77012d6086b 165 lcd_count = 0;
griszAndy 6:c77012d6086b 166 }
griszAndy 6:c77012d6086b 167
Soto 3:6c9dabbb7261 168 max[0]=0;
Soto 3:6c9dabbb7261 169 max[1]=0;
griszAndy 6:c77012d6086b 170
Soto 3:6c9dabbb7261 171 // Se vuelve a incertar la interrupción de muestreo
frankvnk 0:0c037aff5039 172 samplingBegin();
frankvnk 0:0c037aff5039 173 }
frankvnk 0:0c037aff5039 174 }
Soto 3:6c9dabbb7261 175 }