![](/media/cache/profiles/740b339e4f5b8fc4937f9769f05cc202.jpg.50x50_q85.jpg)
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.
main.cpp@4:398325c79937, 2016-08-24 (annotated)
- Committer:
- flencina
- Date:
- Wed Aug 24 15:51:38 2016 +0000
- Revision:
- 4:398325c79937
- Parent:
- 3:ec85930e953c
K64F application using Serial interface, ADC data aquisition, LCD, SD-Card features and compute 4096 point FFT.
Who changed what in which revision?
User | Revision | Line number | New 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 |