Funcional
Dependencies: FastAnalogIn HSI2RGBW_PWM NVIC_set_all_priorities mbed-dsp mbed TextLCD
Fork of Seniales-Tacometro by
main.cpp@7:6b8a1382b2ee, 2016-04-26 (annotated)
- Committer:
- griszAndy
- Date:
- Tue Apr 26 15:04:08 2016 +0000
- Revision:
- 7:6b8a1382b2ee
- Parent:
- 6:c77012d6086b
- Child:
- 8:4c2a5a2b2a80
VersionEmociones sin calibracion
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 |
griszAndy | 6:c77012d6086b | 7 | #include "TextLCD.h" |
griszAndy | 7:6b8a1382b2ee | 8 | |
griszAndy | 7:6b8a1382b2ee | 9 | |
griszAndy | 6:c77012d6086b | 10 | TextLCD lcd(PTA4, PTC8, PTA13, PTD5, PTD0, PTD2); // rs, e, d0, d1, d2, d3 |
griszAndy | 7:6b8a1382b2ee | 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 |
griszAndy | 7:6b8a1382b2ee | 16 | |
griszAndy | 6:c77012d6086b | 17 | extern "C" void NMI_Handler() |
griszAndy | 6:c77012d6086b | 18 | { |
frankvnk | 0:0c037aff5039 | 19 | } |
griszAndy | 7:6b8a1382b2ee | 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 | //////////////////////////////////////////////////////////////////////////////// |
griszAndy | 7:6b8a1382b2ee | 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 |
griszAndy | 7:6b8a1382b2ee | 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 | //////////////////////////////////////////////////////////////////////////////// |
griszAndy | 7:6b8a1382b2ee | 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 |
griszAndy | 7:6b8a1382b2ee | 41 | |
frankvnk | 0:0c037aff5039 | 42 | //////////////////////////////////////////////////////////////////////////////// |
Soto | 3:6c9dabbb7261 | 43 | // FUNCIONES DE MUESTREO |
frankvnk | 0:0c037aff5039 | 44 | //////////////////////////////////////////////////////////////////////////////// |
griszAndy | 7:6b8a1382b2ee | 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 | } |
griszAndy | 7:6b8a1382b2ee | 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 | } |
griszAndy | 7:6b8a1382b2ee | 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 | } |
griszAndy | 7:6b8a1382b2ee | 75 | |
frankvnk | 0:0c037aff5039 | 76 | //////////////////////////////////////////////////////////////////////////////// |
Soto | 3:6c9dabbb7261 | 77 | // MAIN DEL PROGRAMA |
frankvnk | 0:0c037aff5039 | 78 | //////////////////////////////////////////////////////////////////////////////// |
griszAndy | 7:6b8a1382b2ee | 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 | 7:6b8a1382b2ee | 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 |
griszAndy | 7:6b8a1382b2ee | 87 | |
Soto | 3:6c9dabbb7261 | 88 | // Se incerta la interrupción de muestreo del ADC |
frankvnk | 0:0c037aff5039 | 89 | samplingBegin(); |
griszAndy | 7:6b8a1382b2ee | 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 | } |
griszAndy | 7:6b8a1382b2ee | 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 | 7:6b8a1382b2ee | 110 | |
frankvnk | 2:035d551759a5 | 111 | arm_cfft_f32(S, samples, 0, 1); |
frankvnk | 0:0c037aff5039 | 112 | arm_cmplx_mag_f32(samples, magnitudes, FFT_SIZE); |
griszAndy | 7:6b8a1382b2ee | 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 | 7:6b8a1382b2ee | 122 | int test= (int) (max[0] + 0.5); |
griszAndy | 7:6b8a1382b2ee | 123 | printf("%i\r\n", test); |
griszAndy | 6:c77012d6086b | 124 | |
griszAndy | 6:c77012d6086b | 125 | if (25<max[0] && max[0]<260) { |
griszAndy | 6:c77012d6086b | 126 | x="04,000 RPM"; |
griszAndy | 6:c77012d6086b | 127 | } else if (260<max[0] && max[0]<325) { |
griszAndy | 6:c77012d6086b | 128 | x="05,000 RPM"; |
griszAndy | 6:c77012d6086b | 129 | } else if (600<max[0] && max[0]<780) { |
griszAndy | 6:c77012d6086b | 130 | x="05,000 RPM"; |
griszAndy | 6:c77012d6086b | 131 | } else if (1301<max[0] && max[0]<1500) { |
griszAndy | 6:c77012d6086b | 132 | x="05,000 RPM"; |
griszAndy | 6:c77012d6086b | 133 | } else if (326<max[0] && max[0]<392) { |
griszAndy | 6:c77012d6086b | 134 | x="06,000 RPM"; |
griszAndy | 6:c77012d6086b | 135 | } else if (780<max[0] && max[0]<900) { |
griszAndy | 6:c77012d6086b | 136 | x="06,000 RPM"; |
griszAndy | 6:c77012d6086b | 137 | } else if (2000<max[0] && max[0]<2800) { |
griszAndy | 6:c77012d6086b | 138 | x="06,000 RPM"; |
griszAndy | 6:c77012d6086b | 139 | } else if (393<max[0] && max[0]<450) { |
griszAndy | 6:c77012d6086b | 140 | x="07,000 RPM"; |
griszAndy | 6:c77012d6086b | 141 | } else if (900<max[0] && max[0]<1010) { |
griszAndy | 6:c77012d6086b | 142 | x="07,000 RPM"; |
griszAndy | 6:c77012d6086b | 143 | } else if (451<max[0] && max[0]<519) { |
griszAndy | 6:c77012d6086b | 144 | x="08,000 RPM"; |
griszAndy | 6:c77012d6086b | 145 | } else if (1010<max[0] && max[0]<1149) { |
griszAndy | 6:c77012d6086b | 146 | x="08,000 RPM"; |
griszAndy | 6:c77012d6086b | 147 | } else if (520<max[0] && max[0]<584) { |
griszAndy | 6:c77012d6086b | 148 | x="09,000 RPM"; |
griszAndy | 6:c77012d6086b | 149 | } else if (1150<max[0] && max[0]<1168) { |
griszAndy | 6:c77012d6086b | 150 | x="09,000 RPM"; |
griszAndy | 6:c77012d6086b | 151 | } else if (584<max[0] && max[0]<700) { |
griszAndy | 6:c77012d6086b | 152 | x="10,000 RPM"; |
griszAndy | 6:c77012d6086b | 153 | } else if (1168<max[0] && max[0]<1300) { |
griszAndy | 6:c77012d6086b | 154 | x="10,000 RPM"; |
griszAndy | 6:c77012d6086b | 155 | } else if (max[0]==0) { |
griszAndy | 6:c77012d6086b | 156 | x="00,000 RPM"; |
griszAndy | 6:c77012d6086b | 157 | } |
griszAndy | 6:c77012d6086b | 158 | lcd_count++; |
griszAndy | 6:c77012d6086b | 159 | if(lcd_count == 5){ |
griszAndy | 6:c77012d6086b | 160 | lcd.cls(); |
griszAndy | 6:c77012d6086b | 161 | int test= (int) (max[0] + 0.5); |
griszAndy | 6:c77012d6086b | 162 | lcd.locate(0,0); |
griszAndy | 6:c77012d6086b | 163 | lcd.printf("%s",x); |
griszAndy | 7:6b8a1382b2ee | 164 | //pc.printf("%s",x); |
griszAndy | 6:c77012d6086b | 165 | lcd.locate(0,1); |
griszAndy | 6:c77012d6086b | 166 | lcd.printf("%s","FFT: "); |
griszAndy | 7:6b8a1382b2ee | 167 | //pc.printf("%s","FFT: "); |
griszAndy | 6:c77012d6086b | 168 | lcd.printf("%i",test); |
griszAndy | 7:6b8a1382b2ee | 169 | //pc.printf("%i",test); |
griszAndy | 6:c77012d6086b | 170 | lcd_count = 0; |
griszAndy | 6:c77012d6086b | 171 | } |
griszAndy | 6:c77012d6086b | 172 | |
Soto | 3:6c9dabbb7261 | 173 | max[0]=0; |
Soto | 3:6c9dabbb7261 | 174 | max[1]=0; |
griszAndy | 7:6b8a1382b2ee | 175 | |
Soto | 3:6c9dabbb7261 | 176 | // Se vuelve a incertar la interrupción de muestreo |
frankvnk | 0:0c037aff5039 | 177 | samplingBegin(); |
frankvnk | 0:0c037aff5039 | 178 | } |
frankvnk | 0:0c037aff5039 | 179 | } |
Soto | 3:6c9dabbb7261 | 180 | } |