Serial Communication/ Analog Read/ FFT compute / LCD Text / Write on SD Card / read and write RTC application. K64F app developed for Electrical Engineering undergraduate final project at Ulbra university.

Dependencies:   SDFileSystem TextLCD mbed

Serial, LCD 20x4, RTC, SD-Card, ADC features application. Included 5-key keyboard using AN0 channel, RTC update via serial, compute FFT and storage in SD-Card.

Committer:
flencina
Date:
Wed Aug 24 15:36:59 2016 +0000
Revision:
3:ec85930e953c
Parent:
2:03e1399ed9eb
Revis?o para TCC - controle PGA e RTC.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
flencina 3:ec85930e953c 1 /*
flencina 3:ec85930e953c 2 --------------------------------------------------------------
flencina 3:ec85930e953c 3 Universidade Luterana do Brasil
flencina 3:ec85930e953c 4 Departamento de Engenharia Elétrica
flencina 3:ec85930e953c 5 Trabalho de Conclusão de Curso de Engenharia Elétrica
flencina 3:ec85930e953c 6 MCSA - Motor Current Signature Analysis - Diagnóstico por Análise Espectral de Corrente de Motor
flencina 3:ec85930e953c 7 Aluno: Flávio Dutra Lencina
flencina 3:ec85930e953c 8 Orientador: Prof. Eng. Eletricista João Daniel de Oliveira Klein
flencina 3:ec85930e953c 9 Data: 20/03/2016
flencina 3:ec85930e953c 10 Dispositivo de Coleta e envio de dados espectrais de Corrente
flencina 3:ec85930e953c 11 Desenvolvido para plataforma NXP FRDM-K64F co processador ARM Cortex-M4 MK64FN1M0VLL12 MCU
flencina 3:ec85930e953c 12 utilizando Kinetis Devlopment Studio da NXP
flencina 3:ec85930e953c 13 ADC0 :coleta de dados de corrente
flencina 3:ec85930e953c 14 FFT para análise em frequência dos 4096 pontos
flencina 3:ec85930e953c 15 Envio dos dados de |FFT| x freq[k] pela serial em 115200bps
flencina 3:ec85930e953c 16 Grava dados no SD card \sd\Estreito\EE_Coletaxx.csv ou \sd\Estreito\EA_Coletaxx.csv
flencina 3:ec85930e953c 17 ou envia para serial
flencina 3:ec85930e953c 18 Leitura da AN0 para o teclado.
flencina 3:ec85930e953c 19 Teste com LCD 20x4
MikamiUitOpen 0:5bed9d6dc43b 20
flencina 3:ec85930e953c 21 -------------------------------------------------------------- */
flencina 3:ec85930e953c 22
flencina 3:ec85930e953c 23 // 15-04-2016:
flencina 3:ec85930e953c 24 // Mudança de estratégia de interrupções para utilização do teclado com LCD Shield do Arduino.
flencina 3:ec85930e953c 25 // Colocar Interrupção para a porta serial e retirar das teclas SW2 e SW3. Utilização do teclado do Shield.
flencina 3:ec85930e953c 26 // 15-06-2016:
flencina 3:ec85930e953c 27 // Revisado para AN2 - Coleta a 4096 SPS e AN1 - 512 SPS
flencina 3:ec85930e953c 28 // 03-08-2016: Revisão para adicionar PGA com CD4066 e controle com CD4028 BCD para decimal
flencina 3:ec85930e953c 29 // 21-08-2016: Ajuste de RTC.
MikamiUitOpen 0:5bed9d6dc43b 30
MikamiUitOpen 0:5bed9d6dc43b 31 #include "mbed.h"
flencina 3:ec85930e953c 32 #include "SDFileSystem.h"
flencina 3:ec85930e953c 33 #include "math.h"
flencina 3:ec85930e953c 34 #include "mbed_debug.h"
flencina 3:ec85930e953c 35 #include "TextLCD.h"
flencina 3:ec85930e953c 36 #include <complex>
MikamiUitOpen 0:5bed9d6dc43b 37
flencina 3:ec85930e953c 38 #define ZRef 0.5 // Eleva para metade
flencina 3:ec85930e953c 39 #define Ts 244.14062 //4096Hz
flencina 3:ec85930e953c 40
flencina 3:ec85930e953c 41 // SD-CARD Interface
flencina 3:ec85930e953c 42 #define SD_MOSI PTE3
flencina 3:ec85930e953c 43 #define SD_MISO PTE1
flencina 3:ec85930e953c 44 #define SD_SCLK PTE2
flencina 3:ec85930e953c 45 #define SD_CS PTE4
flencina 3:ec85930e953c 46 #define SD_DETECT PTE6
flencina 3:ec85930e953c 47
flencina 3:ec85930e953c 48 // Interface LCD 20x04 - 4bits de dados
flencina 3:ec85930e953c 49 #define RS PTC12 //D8 // instead PTA0 pin 34, we have to use PTC12 - pin 84
flencina 3:ec85930e953c 50 //#define RW GND-3
flencina 3:ec85930e953c 51 #define EN PTC4 //D9
flencina 3:ec85930e953c 52 #define DB7 PTC3 //D7
flencina 3:ec85930e953c 53 #define DB6 PTC2 //D6
flencina 3:ec85930e953c 54 #define DB5 PTA2 //D5
flencina 3:ec85930e953c 55 #define DB4 PTB23 //D4
flencina 3:ec85930e953c 56
flencina 3:ec85930e953c 57 // Teclas do Teclado Shield
flencina 3:ec85930e953c 58 #define btn1 1
flencina 3:ec85930e953c 59 #define btn2 2
flencina 3:ec85930e953c 60 #define btn3 3
flencina 3:ec85930e953c 61 #define btn4 4
flencina 3:ec85930e953c 62 #define btn5 5
flencina 3:ec85930e953c 63 #define btnNONE 0
flencina 3:ec85930e953c 64
flencina 3:ec85930e953c 65
flencina 3:ec85930e953c 66 // modos de envio de dados
flencina 3:ec85930e953c 67
flencina 3:ec85930e953c 68 #define SERIAL 01
flencina 3:ec85930e953c 69 #define SDCARD 02
flencina 3:ec85930e953c 70
flencina 3:ec85930e953c 71 // Canais analógicos
flencina 3:ec85930e953c 72 AnalogIn kbd(A0); // Teclado funcional
flencina 3:ec85930e953c 73 AnalogIn ainc(A1); // Entrada analógica espectro curto
flencina 3:ec85930e953c 74 AnalogIn ainl(A2); // Entrada analógica espectro longo
flencina 3:ec85930e953c 75 DigitalIn SD_OK(SD_DETECT,PullDown); // Card Detect
flencina 3:ec85930e953c 76 //Saídas Digitais
flencina 3:ec85930e953c 77 DigitalOut GV0(PTA1); //A
flencina 3:ec85930e953c 78 DigitalOut GV1(PTB9); //B
flencina 3:ec85930e953c 79 DigitalOut GV2(PTC17); //C
flencina 3:ec85930e953c 80
flencina 3:ec85930e953c 81 // Tipo Complexo
flencina 3:ec85930e953c 82 typedef complex<float> Complex;
flencina 3:ec85930e953c 83
flencina 3:ec85930e953c 84 // Protótipos de Funções
flencina 3:ec85930e953c 85 void Coleta(uint8_t mult);
flencina 3:ec85930e953c 86 uint16_t reverse(uint16_t x);
flencina 3:ec85930e953c 87 void fft(uint16_t N_FFT_);
flencina 3:ec85930e953c 88 void gravar(uint8_t mult);
flencina 3:ec85930e953c 89 uint16_t Countfile(uint8_t n);
flencina 3:ec85930e953c 90 uint8_t le_teclado(void);
flencina 3:ec85930e953c 91
flencina 3:ec85930e953c 92 // Inicializa SD card
flencina 3:ec85930e953c 93 SDFileSystem sd(SD_MOSI, SD_MISO, SD_SCLK, SD_CS, "sd");
flencina 3:ec85930e953c 94 // Inicializa LCD
flencina 3:ec85930e953c 95 TextLCD lcd(RS, EN, DB4, DB5, DB6, DB7,TextLCD::LCD20x4); // rs, e, d4-d7
flencina 3:ec85930e953c 96 // Inicializa Serial
flencina 3:ec85930e953c 97 Serial pc(USBTX, USBRX); // tx, rx
flencina 3:ec85930e953c 98
flencina 3:ec85930e953c 99 // Variáveis
flencina 3:ec85930e953c 100 const long N=4096;
flencina 3:ec85930e953c 101 const unsigned int m = 12;
flencina 3:ec85930e953c 102 //float t[N]
flencina 3:ec85930e953c 103 float f[N/2+1];
flencina 3:ec85930e953c 104 double x0[N];
flencina 3:ec85930e953c 105 Complex y2[N/2+1];
flencina 3:ec85930e953c 106 bool sdsel=false;
flencina 3:ec85930e953c 107 bool conectado = true;//false;
flencina 3:ec85930e953c 108 char buffer[32]; // para o rtc
flencina 3:ec85930e953c 109 // Interrupção de leitura da serial
flencina 3:ec85930e953c 110 void SerialRecInt(void)
flencina 3:ec85930e953c 111 {
flencina 3:ec85930e953c 112
flencina 3:ec85930e953c 113 if (sdsel==false)
flencina 3:ec85930e953c 114 {
flencina 3:ec85930e953c 115 unsigned char msg;
flencina 3:ec85930e953c 116 uint32_t tempo=0;
flencina 3:ec85930e953c 117 char UTS[11];
flencina 3:ec85930e953c 118 time_t seconds = time(NULL);
flencina 3:ec85930e953c 119 strftime(buffer,32,"%d/%m/%Y %H:%M:%S\n",localtime(&seconds));
flencina 3:ec85930e953c 120 msg=pc.getc();
flencina 3:ec85930e953c 121 while(!pc.writeable()){}
flencina 3:ec85930e953c 122 switch (msg){
flencina 3:ec85930e953c 123 case 'C':// Iniciar conexão
flencina 3:ec85930e953c 124 {
flencina 3:ec85930e953c 125 pc.printf("OK\n");
flencina 3:ec85930e953c 126 conectado = true;
flencina 3:ec85930e953c 127 break;
flencina 3:ec85930e953c 128 }
flencina 3:ec85930e953c 129 case 'D':// Terminar conexão
flencina 3:ec85930e953c 130 {
flencina 3:ec85930e953c 131 pc.printf("OK\n");
flencina 3:ec85930e953c 132 conectado = false;
flencina 3:ec85930e953c 133 break;
flencina 3:ec85930e953c 134 }
flencina 3:ec85930e953c 135 case 'E': // Espectro Estreito
flencina 3:ec85930e953c 136 {
flencina 3:ec85930e953c 137 // Envia espectro Curto via Serial.
flencina 3:ec85930e953c 138 if (conectado)
flencina 3:ec85930e953c 139 {
flencina 3:ec85930e953c 140 Coleta(4);
flencina 3:ec85930e953c 141 for(int n=0;n<N/2;n++)
flencina 3:ec85930e953c 142 pc.printf("%8.4f;%8.4f\n",f[n],x0[n]);
flencina 3:ec85930e953c 143 }
flencina 3:ec85930e953c 144 break;
flencina 3:ec85930e953c 145 }
flencina 3:ec85930e953c 146 case 'L': // Espectro Longo
flencina 3:ec85930e953c 147 {
flencina 3:ec85930e953c 148 // Envia espectro Amplo via Serial.
flencina 3:ec85930e953c 149 if (conectado)
flencina 3:ec85930e953c 150 {
flencina 3:ec85930e953c 151 Coleta(1);
flencina 3:ec85930e953c 152 for(int n=0;n<N/2;n++)
flencina 3:ec85930e953c 153 pc.printf("%8.4f;%8.4f\n",f[n],x0[n]);
flencina 3:ec85930e953c 154 }
flencina 3:ec85930e953c 155 break;
flencina 3:ec85930e953c 156 }
flencina 3:ec85930e953c 157 case 'R': // Relógio
flencina 3:ec85930e953c 158 {
flencina 3:ec85930e953c 159 pc.gets(UTS,11); // Recebe o valor de Timestamp
flencina 3:ec85930e953c 160 for(int n=0;n<10;n++)
flencina 3:ec85930e953c 161 {
flencina 3:ec85930e953c 162 tempo = tempo * 10 + (UTS[n] -48);
flencina 3:ec85930e953c 163
flencina 3:ec85930e953c 164 }
flencina 3:ec85930e953c 165 set_time(tempo);
flencina 3:ec85930e953c 166 pc.printf("%s",buffer);
flencina 3:ec85930e953c 167 break;
flencina 3:ec85930e953c 168 }
flencina 3:ec85930e953c 169 case 'T': // Teste
flencina 3:ec85930e953c 170 {
flencina 3:ec85930e953c 171 pc.printf("%s",buffer);
flencina 3:ec85930e953c 172 if (SD_OK.read())
flencina 3:ec85930e953c 173 debug("Cartao SD Ok-> %d\n",SD_OK.read());
flencina 3:ec85930e953c 174 else
flencina 3:ec85930e953c 175 debug("Cartao SD NOk-> %d\n",SD_OK.read());
flencina 3:ec85930e953c 176 break;
flencina 3:ec85930e953c 177 }
flencina 3:ec85930e953c 178 default:
flencina 3:ec85930e953c 179 break;
flencina 3:ec85930e953c 180 }
flencina 3:ec85930e953c 181 //tm.start();
flencina 3:ec85930e953c 182 }
flencina 3:ec85930e953c 183
flencina 3:ec85930e953c 184 //msg = ' ';
flencina 3:ec85930e953c 185 }
flencina 3:ec85930e953c 186 // Leitura do teclado
flencina 3:ec85930e953c 187 uint8_t le_teclado(void)
flencina 3:ec85930e953c 188 {
flencina 3:ec85930e953c 189 uint16_t tecla = kbd.read_u16();
flencina 3:ec85930e953c 190 if (tecla > 60000) return btnNONE; //sem tecla
flencina 3:ec85930e953c 191 if (tecla > 40000) return btn5;
flencina 3:ec85930e953c 192 if (tecla > 30000) return btn4;
flencina 3:ec85930e953c 193 if (tecla > 15000) return btn3;
flencina 3:ec85930e953c 194 if (tecla > 5000) return btn2;
flencina 3:ec85930e953c 195 if (tecla >= 0) return btn1;
flencina 3:ec85930e953c 196 return btnNONE;
flencina 3:ec85930e953c 197 }
MikamiUitOpen 0:5bed9d6dc43b 198
MikamiUitOpen 0:5bed9d6dc43b 199 int main()
MikamiUitOpen 0:5bed9d6dc43b 200 {
flencina 3:ec85930e953c 201 //Timer tm0;
flencina 3:ec85930e953c 202 uint8_t tecla;
flencina 3:ec85930e953c 203 pc.baud(115200);
flencina 3:ec85930e953c 204 pc.attach(&SerialRecInt,pc.RxIrq); // Chamada de IRQ para Serial
flencina 3:ec85930e953c 205 lcd.cls();
flencina 3:ec85930e953c 206 lcd.printf("TCC - MCSA - ULBRA\n"); // linha 0
flencina 3:ec85930e953c 207 // debug("MCSA - Aquisição de Motor.\n\r");
flencina 3:ec85930e953c 208 // tm0.start();
flencina 3:ec85930e953c 209 while(1) {
flencina 3:ec85930e953c 210 // Comando via teclado
flencina 3:ec85930e953c 211 tecla=le_teclado();
flencina 3:ec85930e953c 212 lcd.locate(0,3); // aponta para linha 3
flencina 3:ec85930e953c 213 lcd.printf("1- Amplo / 2- Curto");
flencina 3:ec85930e953c 214 //lcd.printf("%d",tecla); // tecla pressionada
flencina 3:ec85930e953c 215 switch(tecla){
flencina 3:ec85930e953c 216 case btn1: // Espectro Longo
flencina 3:ec85930e953c 217 {
flencina 3:ec85930e953c 218 sdsel=true;
flencina 3:ec85930e953c 219 Coleta(1);
flencina 3:ec85930e953c 220 gravar(1);
flencina 3:ec85930e953c 221 sdsel=false;
flencina 3:ec85930e953c 222 break;
flencina 3:ec85930e953c 223 }
flencina 3:ec85930e953c 224 case btn2: // Espectro Curto
flencina 3:ec85930e953c 225 {
flencina 3:ec85930e953c 226 sdsel=true;
flencina 3:ec85930e953c 227 Coleta(4);
flencina 3:ec85930e953c 228 gravar(4);
flencina 3:ec85930e953c 229 sdsel=false;
flencina 3:ec85930e953c 230 break;
flencina 3:ec85930e953c 231 }
flencina 3:ec85930e953c 232 case btn3: // Limpa comando
flencina 3:ec85930e953c 233 {
flencina 3:ec85930e953c 234 lcd.locate(0,1);
flencina 3:ec85930e953c 235 lcd.printf(" ");
flencina 3:ec85930e953c 236 break;
flencina 3:ec85930e953c 237 }
flencina 3:ec85930e953c 238 case btn4: // Créditos
flencina 3:ec85930e953c 239 {
flencina 3:ec85930e953c 240 lcd.cls();
flencina 3:ec85930e953c 241 lcd.printf("ULBRA ENG. ELETRICA\n");
flencina 3:ec85930e953c 242 lcd.printf(" TCC - MCSA \n ");
flencina 3:ec85930e953c 243 lcd.printf("Flavio Dutra Lencina\n");
flencina 3:ec85930e953c 244 lcd.printf("Prof. Joao D. Klein \n");
flencina 3:ec85930e953c 245 while(1)
flencina 3:ec85930e953c 246 {
flencina 3:ec85930e953c 247 tecla=le_teclado();
flencina 3:ec85930e953c 248 if tecla(<> btnNONE)
flencina 3:ec85930e953c 249 break;
flencina 3:ec85930e953c 250 wait_ms(200);
flencina 3:ec85930e953c 251 }
flencina 3:ec85930e953c 252 lcd.cls();
flencina 3:ec85930e953c 253 lcd.printf("TCC - MCSA - ULBRA\n"); // linha 0
flencina 3:ec85930e953c 254 break;
flencina 3:ec85930e953c 255 }
flencina 3:ec85930e953c 256 default:
flencina 3:ec85930e953c 257 break;
flencina 3:ec85930e953c 258 }
flencina 3:ec85930e953c 259 wait_ms(300);
flencina 3:ec85930e953c 260 // tm0.reset();
flencina 3:ec85930e953c 261 // while(tm0.read_ms()<500);
flencina 3:ec85930e953c 262 lcd.locate(0,2);
flencina 3:ec85930e953c 263 // Verifica se há cartão SD
flencina 3:ec85930e953c 264 if (SD_OK.read())
flencina 3:ec85930e953c 265 lcd.printf(" ");
flencina 3:ec85930e953c 266 else
flencina 3:ec85930e953c 267 lcd.printf(" Insira o Cartao SD");
flencina 3:ec85930e953c 268
flencina 3:ec85930e953c 269 }
flencina 3:ec85930e953c 270 }
flencina 3:ec85930e953c 271 // Coleta de dados
flencina 3:ec85930e953c 272 void Coleta(uint8_t mult)
flencina 3:ec85930e953c 273 {
flencina 3:ec85930e953c 274 Timer tm;
flencina 3:ec85930e953c 275 tm.stop();
flencina 3:ec85930e953c 276 double max,z;
flencina 3:ec85930e953c 277 uint8_t Ganho =0;
flencina 3:ec85930e953c 278 float fs,df;//,dt;
flencina 3:ec85930e953c 279 // multiplicador
flencina 3:ec85930e953c 280 if(mult<1)
flencina 3:ec85930e953c 281 mult=1;
flencina 3:ec85930e953c 282 else
flencina 3:ec85930e953c 283 mult=4;
flencina 3:ec85930e953c 284
flencina 3:ec85930e953c 285 // Informações para LCD
flencina 3:ec85930e953c 286
flencina 3:ec85930e953c 287 lcd.locate(0,1);
flencina 3:ec85930e953c 288 lcd.printf(" ");
flencina 3:ec85930e953c 289 lcd.locate(0,1);
flencina 3:ec85930e953c 290 lcd.printf("Ajustando Ganho...");
flencina 3:ec85930e953c 291
flencina 3:ec85930e953c 292 // Fazer Ajuste de ganho
flencina 3:ec85930e953c 293
flencina 3:ec85930e953c 294 tm.start(); // Ativa Timer
flencina 3:ec85930e953c 295 while(1)//Ganho < 5) // de 0 até 5
flencina 3:ec85930e953c 296 {
flencina 3:ec85930e953c 297 tm.reset();
flencina 3:ec85930e953c 298 max = ainl.read();
flencina 3:ec85930e953c 299 for (int n=1;n<137;n++)
flencina 3:ec85930e953c 300 {
flencina 3:ec85930e953c 301 while (tm.read_us()<(Ts));
flencina 3:ec85930e953c 302 tm.reset();
flencina 3:ec85930e953c 303 z=ainl.read();
flencina 3:ec85930e953c 304 if (max < z) max=z;
flencina 3:ec85930e953c 305 }
flencina 3:ec85930e953c 306 // tm.stop();
flencina 3:ec85930e953c 307 //debug
flencina 3:ec85930e953c 308 lcd.locate(0,2);
flencina 3:ec85930e953c 309 lcd.printf("Max: %4.2f",max);
flencina 3:ec85930e953c 310 if (max < 0.632)
flencina 3:ec85930e953c 311 {
flencina 3:ec85930e953c 312 Ganho++;
flencina 3:ec85930e953c 313 if (Ganho > 5) // Ganho máx
flencina 3:ec85930e953c 314 {
flencina 3:ec85930e953c 315 Ganho = 5;
flencina 3:ec85930e953c 316 break;
flencina 3:ec85930e953c 317 }
flencina 3:ec85930e953c 318 ///Saidas para PGA
flencina 3:ec85930e953c 319 GV0 = Ganho & 0x01;
flencina 3:ec85930e953c 320 GV1 = (Ganho & 0x02)>>1;
flencina 3:ec85930e953c 321 GV2 = (Ganho & 0x04)>>2;
flencina 3:ec85930e953c 322 //debug
flencina 3:ec85930e953c 323 lcd.printf("%d %d %d\n", (uint8_t)GV0,(uint8_t)GV1,(uint8_t)GV2);
flencina 3:ec85930e953c 324 }
flencina 3:ec85930e953c 325 else
flencina 3:ec85930e953c 326 break;
flencina 3:ec85930e953c 327 // tm.start();
flencina 3:ec85930e953c 328 }
flencina 3:ec85930e953c 329 tm.stop();
flencina 3:ec85930e953c 330 lcd.locate(0,1);
flencina 3:ec85930e953c 331 lcd.printf("Coletando dados...");
flencina 3:ec85930e953c 332 // Cálculo de espectro de frequência
flencina 3:ec85930e953c 333 fs= (float)1000/(Ts*mult); // frequência de amostragem 4098kHz~4096
flencina 3:ec85930e953c 334 df= 1000*(fs/N); // delta de frequência
flencina 3:ec85930e953c 335 f[0]=0.0001;
flencina 3:ec85930e953c 336 for (int n=1;n<N/2;n++)
flencina 3:ec85930e953c 337 f[n]= f[n-1]+df;
flencina 3:ec85930e953c 338 tm.start(); // Retiva Timer
flencina 3:ec85930e953c 339 for (long int n=0;n<N;n++){
flencina 3:ec85930e953c 340 tm.reset();
flencina 3:ec85930e953c 341 // Por enquanto Espectro longo e curto no mesmo
flencina 3:ec85930e953c 342 //if (mult==1)
flencina 3:ec85930e953c 343 x0[n]= ainl.read(); // espetro longo
flencina 3:ec85930e953c 344 // else
flencina 3:ec85930e953c 345 // x0[n]= ainc.read(); // espectro curto
flencina 3:ec85930e953c 346 while (tm.read_us()<(Ts*mult)); // freq de amostragem: 4096 Hz ou 512 Hz
flencina 3:ec85930e953c 347 for (int i=0;i<mult;i++)
flencina 3:ec85930e953c 348 { __NOP();
flencina 3:ec85930e953c 349 __NOP();
flencina 3:ec85930e953c 350 __NOP();
flencina 3:ec85930e953c 351 //__NOP();
flencina 3:ec85930e953c 352 }
flencina 3:ec85930e953c 353 }
flencina 3:ec85930e953c 354 tm.stop(); // Para o Timer
flencina 3:ec85930e953c 355 // Reseta Ganho
flencina 3:ec85930e953c 356 GV0=0;
flencina 3:ec85930e953c 357 GV1=0;
flencina 3:ec85930e953c 358 GV2=0;
flencina 3:ec85930e953c 359 // Ajuste de zero
flencina 3:ec85930e953c 360 for (long int n=0;n<N;n++){
MikamiUitOpen 0:5bed9d6dc43b 361
flencina 3:ec85930e953c 362 x0[n]=x0[n]-ZRef;
flencina 3:ec85930e953c 363 }
flencina 3:ec85930e953c 364 //debug("Foi ate o N:%d\n ",N);
flencina 3:ec85930e953c 365
flencina 3:ec85930e953c 366
flencina 3:ec85930e953c 367 fft(N);
flencina 3:ec85930e953c 368 // Módulo da FFT
flencina 3:ec85930e953c 369 for(long int n=0;n<N/2;n++)
flencina 3:ec85930e953c 370 x0[n]=(double)sqrt(y2[n].real()*y2[n].real()+y2[n].imag()*y2[n].imag());
flencina 3:ec85930e953c 371 // encontra maior valor
flencina 3:ec85930e953c 372 max=x0[0];
flencina 3:ec85930e953c 373 for (int n=1;n<N/2;n++)
flencina 3:ec85930e953c 374 if (x0[n] > max) max =x0[n];
flencina 3:ec85930e953c 375 // Normaliza valores a 1 máx (linear)
flencina 3:ec85930e953c 376 // for (int n=0;n<N/2;n++){
flencina 3:ec85930e953c 377 // x0[n]= x0[n]/max;
flencina 3:ec85930e953c 378 // }
flencina 3:ec85930e953c 379
flencina 3:ec85930e953c 380
flencina 3:ec85930e953c 381
flencina 3:ec85930e953c 382 // Normaliza valores
flencina 3:ec85930e953c 383 for (int n=0;n<N/2;n++){
flencina 3:ec85930e953c 384 x0[n]= 20* log10(x0[n]/max);
flencina 3:ec85930e953c 385 }
flencina 3:ec85930e953c 386 lcd.locate(0,1);
flencina 3:ec85930e953c 387 lcd.printf(" ");
flencina 3:ec85930e953c 388
flencina 3:ec85930e953c 389 }
flencina 3:ec85930e953c 390
flencina 3:ec85930e953c 391 // A FFT por decimação de frequência
flencina 3:ec85930e953c 392 void fft(uint16_t N_FFT_)
flencina 3:ec85930e953c 393 {
flencina 3:ec85930e953c 394 Complex u_[N_FFT_],wTable_[N_FFT_];
flencina 3:ec85930e953c 395 Complex uTmp;
flencina 3:ec85930e953c 396 uint16_t bTable_[N_FFT_];
flencina 3:ec85930e953c 397 uint16_t nHalf = N_FFT_/2;
flencina 3:ec85930e953c 398 Complex arg = Complex(0, -6.283185f/N_FFT_);
MikamiUitOpen 0:5bed9d6dc43b 399
flencina 3:ec85930e953c 400 uint16_t nShift = __clz(N_FFT_) + 1; // Apenas no mbed
flencina 3:ec85930e953c 401 for (uint16_t k=0; k<N_FFT_; k++){
flencina 3:ec85930e953c 402 wTable_[k] = exp(arg*(float)k);
flencina 3:ec85930e953c 403 bTable_[k] = __rbit(k) >> nShift; // Apenas no mbed
flencina 3:ec85930e953c 404 //bTable_[k] = reverse(k);
flencina 3:ec85930e953c 405 u_[k]=x0[k];
flencina 3:ec85930e953c 406 //debug("%d ",k);
flencina 3:ec85930e953c 407 }
flencina 3:ec85930e953c 408 for (uint16_t stg=1; stg<N_FFT_/2; stg*=2)
flencina 3:ec85930e953c 409 {
flencina 3:ec85930e953c 410 uint16_t nHalf2 = nHalf*2;
flencina 3:ec85930e953c 411 for (uint16_t kp=0; kp<N_FFT_; kp+=nHalf2)
flencina 3:ec85930e953c 412 {
flencina 3:ec85930e953c 413 uint16_t kx = 0;
flencina 3:ec85930e953c 414 for (uint16_t k=kp; k<kp+nHalf; k++)
flencina 3:ec85930e953c 415 {
flencina 3:ec85930e953c 416 // Butterfly operation
flencina 3:ec85930e953c 417 Complex uTmp = u_[k+nHalf];
flencina 3:ec85930e953c 418 u_[k+nHalf] = (u_[k] - uTmp)*wTable_[kx];
flencina 3:ec85930e953c 419 u_[k] = u_[k] + uTmp;
flencina 3:ec85930e953c 420 kx = kx + stg;
flencina 3:ec85930e953c 421 }
flencina 3:ec85930e953c 422 }
flencina 3:ec85930e953c 423 nHalf = nHalf/2;
flencina 3:ec85930e953c 424 }
flencina 3:ec85930e953c 425 // Last stage
flencina 3:ec85930e953c 426 y2[0] = u_[0] + u_[1];
flencina 3:ec85930e953c 427 y2[0] = u_[0] + u_[1];
flencina 3:ec85930e953c 428 y2[N_FFT_/2] = u_[0] - u_[1];
flencina 3:ec85930e953c 429 for (uint16_t k=2; k<N_FFT_; k+=2)
flencina 3:ec85930e953c 430 u_[k] = u_[k] + u_[k+1];
flencina 3:ec85930e953c 431 // Reorder to bit reversal
flencina 3:ec85930e953c 432 for (uint16_t k=1; k<N_FFT_/2; k++)
flencina 3:ec85930e953c 433 y2[k] = u_[bTable_[k]];
flencina 3:ec85930e953c 434 }
flencina 3:ec85930e953c 435 // Bit reverso
flencina 3:ec85930e953c 436 uint16_t reverse(uint16_t x)
flencina 3:ec85930e953c 437 {
flencina 3:ec85930e953c 438 uint16_t NO_OF_BITS = sizeof(x) * 8;
flencina 3:ec85930e953c 439 uint16_t reverse_num = 0;
flencina 3:ec85930e953c 440 for (uint16_t i = 0; i < NO_OF_BITS; i++)
flencina 3:ec85930e953c 441 {
flencina 3:ec85930e953c 442 if((x & (1 << i)))
flencina 3:ec85930e953c 443 reverse_num |= 1 << ((NO_OF_BITS - 1) - i);
flencina 3:ec85930e953c 444 }
flencina 3:ec85930e953c 445 return (reverse_num >> (NO_OF_BITS-m));
MikamiUitOpen 0:5bed9d6dc43b 446 }
flencina 3:ec85930e953c 447 // Grava em SD Card
flencina 3:ec85930e953c 448 void gravar(uint8_t x)
flencina 3:ec85930e953c 449 {
flencina 3:ec85930e953c 450 char arquivo[64];
flencina 3:ec85930e953c 451 if (SD_OK.read())
flencina 3:ec85930e953c 452 {
flencina 3:ec85930e953c 453 // debug("Gravando em cartao SD\n\r");
flencina 3:ec85930e953c 454 lcd.locate(0,1);
flencina 3:ec85930e953c 455 lcd.printf("Gravando dados...");
flencina 3:ec85930e953c 456 if (x==1) // Amplo
flencina 3:ec85930e953c 457 {
flencina 3:ec85930e953c 458 mkdir("/sd/Amplo", 0777);
flencina 3:ec85930e953c 459 sprintf(arquivo, "/sd/Amplo/EA_Coleta%03d.csv", Countfile(1));
flencina 3:ec85930e953c 460 // pc.printf("Arquivo: %s\n\r",arquivo);
flencina 3:ec85930e953c 461 }
flencina 3:ec85930e953c 462 else // Estreito
flencina 3:ec85930e953c 463 {
flencina 3:ec85930e953c 464 mkdir("/sd/Estreito", 0777);
flencina 3:ec85930e953c 465 sprintf(arquivo, "/sd/Estreito/EE_Coleta%03d.csv", Countfile(2));
flencina 3:ec85930e953c 466 }
flencina 3:ec85930e953c 467 FILE *fp =fopen(arquivo,"w");
flencina 3:ec85930e953c 468 fprintf(fp,"Freq[Hz];Amplitude[dB]\r\n");
flencina 3:ec85930e953c 469
flencina 3:ec85930e953c 470 for(int n=0;n<N/2;n++){
flencina 3:ec85930e953c 471 //fputc(0x0A,fp);
flencina 3:ec85930e953c 472 //
flencina 3:ec85930e953c 473 fprintf(fp,"%8.4f;%8.4f\r\n",f[n],x0[n]);
flencina 3:ec85930e953c 474 }
flencina 3:ec85930e953c 475
flencina 3:ec85930e953c 476 //fputc(0x0D,fp);
flencina 3:ec85930e953c 477 fclose(fp);
flencina 3:ec85930e953c 478 lcd.locate(0,1);// (0,1);
flencina 3:ec85930e953c 479 lcd.printf(" ");
flencina 3:ec85930e953c 480 }
flencina 3:ec85930e953c 481 else
flencina 3:ec85930e953c 482 {
flencina 3:ec85930e953c 483 //debug("Sem cartao SD.\n\r");
flencina 3:ec85930e953c 484 lcd.locate(0,1);
flencina 3:ec85930e953c 485 lcd.printf("Sem cartao SD.\n");
flencina 3:ec85930e953c 486 }
flencina 3:ec85930e953c 487 //tm.start();
flencina 3:ec85930e953c 488 }
flencina 3:ec85930e953c 489 // Manipulação de arquivos
flencina 3:ec85930e953c 490 uint16_t Countfile(uint8_t n)
flencina 3:ec85930e953c 491 {
flencina 3:ec85930e953c 492 struct dirent *p;
flencina 3:ec85930e953c 493 uint16_t numFiles = 0;
flencina 3:ec85930e953c 494 DIR * sdDir;
flencina 3:ec85930e953c 495 if (n==1){
flencina 3:ec85930e953c 496 sdDir = opendir("/sd/Amplo");
flencina 3:ec85930e953c 497 }
flencina 3:ec85930e953c 498 else
flencina 3:ec85930e953c 499 sdDir = opendir("/sd/Estreito");
flencina 3:ec85930e953c 500 while ((p = readdir( sdDir )) != NULL)
flencina 3:ec85930e953c 501 numFiles++;
flencina 3:ec85930e953c 502 closedir(sdDir);
flencina 3:ec85930e953c 503 return numFiles;
flencina 3:ec85930e953c 504 }
flencina 3:ec85930e953c 505
flencina 3:ec85930e953c 506
flencina 3:ec85930e953c 507
flencina 3:ec85930e953c 508
flencina 3:ec85930e953c 509