Cálculo por terminal. Test.
Dependencies: ADC
Revision 108:5a5126fe974e, committed 2020-01-31
- Comitter:
- luisquiroga
- Date:
- Fri Jan 31 13:29:52 2020 +0000
- Parent:
- 107:5c6c2ba54077
- Commit message:
- Calculo por terminal.
Changed in this revision
--- a/main.cpp Mon Dec 09 12:05:29 2019 +0000 +++ b/main.cpp Fri Jan 31 13:29:52 2020 +0000 @@ -1,35 +1,69 @@ -/* mbed Microcontroller Library - * Copyright (c) 2019 ARM Limited - * SPDX-License-Identifier: Apache-2.0 - */ +//Los comentarios son todos mios. Saqué los de Dani pero podés verlos en su código. Agunas cosas las dejé porque me sirvieron. -#include<mbed.h> +#include "mbed.h" +//#include "mi_lora.h" +#include "medir_frecuencia.h" + +#define MI_ADC_PERIODO_MS 2000 //cada 2 segundos tomo muestras +#define CLOCK 32 //frec del micro en MHZ -AnalogIn signal(GPIO0); -Serial pc(USBTX, USBRX); -Timer timer; +Serial pc(USBTX, USBRX); //115200 baud rate -int main() +uint16_t muestras[N_MUESTRAS]; + +void funcion_calcularFrec (void) { - //Declaro las variables - float Tension = 0; - unsigned short adcValor; - long previousTime = 0; - long currentTime = 0; - pc.baud(9600); //Baudrate - timer.start(); - - while (true) { - currentTime = timer.read_ms(); - if(currentTime - previousTime >= 1000){ - - adcValor = signal.read_u16(); - float flotante = signal.read(); - //Tension = (adcValor * 3.3/255); // Lo paso a valor de tension - - pc.printf("El valor del ADC %i y leido directo %.2f \r\n", adcValor, flotante); // Imprimo en terminal - previousTime = currentTime; + AnalogIn mi_adc(GPIO1); + unsigned int i, for_time, total_time, operation_time; + float tiempo_muestreo,frecuencia; + Timer timer; + + // calculo cuanto se demora en hacer el ciclo for. En realidad esto está al pedo y podría sacarse. + timer.reset(); + timer.start(); + for (i=0; i<N_MUESTRAS; i++); + for_time=timer.read_us(); + timer.stop(); + + while(1) + { + thread_sleep_for(MI_ADC_PERIODO_MS); //Cada cuánto tomo las muestras. + // primero tomo las muetras + timer.reset(); + timer.start(); + for(i=0;i<N_MUESTRAS;i++) + { + muestras[i]=(uint16_t) (ADC_RES_Cuentas*mi_adc.read()); } + total_time=timer.read_us(); + timer.stop(); + operation_time = total_time-for_time; + tiempo_muestreo=float(operation_time)/float(N_MUESTRAS); + //Este es el tiempo de muestreo que sale de lo que tarda en tomar una X cantidad de muestras. Para eso está el timer que está en el ciclo for. + imprimir_datos(muestras); + frecuencia=calcular_frecuencia(muestras,N_MUESTRAS,tiempo_muestreo); + printf("Frec=%f[Hz] \n\r\n",frecuencia); + } } + +int main(void) +{ + + Thread tarea_calcularFrec(osPriorityNormal,OS_STACK_SIZE,NULL,"ADC" ); //Le doy un hilo, una prioridad. + //Thread tarea_lora(osPriorityNormal,OS_STACK_SIZE,NULL,"LoRA" ); + //sem_leer_data.release(); + tarea_calcularFrec.start(funcion_calcularFrec); //se define el hilo a ejecutar (creo). + //tarea_lora.start(funcion_lora); + + pc.baud(115200); + printf("MAIN: Init OK\n\r"); // Esto es para chequear que está todo bien cuando reinicias el micro, lo puso dani. + + //funcion_lora(); + while(1) + { + thread_sleep_for(5000); + } + return 0; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/medir_frecuencia.h Fri Jan 31 13:29:52 2020 +0000 @@ -0,0 +1,60 @@ +//Comentarios para Damian +//Algunas cosas quedaron tal cual el código de Dani. No pude hacer andar el que él me pasaba. Quizás es porque él generaba la señal con otro micro +//mientras que nosotros la generamos con un generador de señal. No sabría porqué pero es lo que sucede. + +#include <stdio.h> +#include <stdlib.h> + + +#define N_MUESTRAS 2048 //El criterio es tomar una cantidad determinada de muestras y analizarla +//Defino umbrales para histéresis +#define UMBRAL_SUP 1300 +#define UMBRAL_INF 1000 +#define ADC_RES_bits 12 +#define ADC_RES_Cuentas ((1<<ADC_RES_bits)-1) //Esto es para hacer las cuentas, lo saqué del código de Daniel. Se podría mejorar o hacer de otra forma mas simple. + + +float calcular_frecuencia(uint16_t *muestras,int N_muestras,float ts); +void imprimir_datos(uint16_t *p); + + +float calcular_frecuencia(uint16_t *muestras,int N_muestras,float ts) +{ + float frecHZ; + int i; + int contador = 0; + int flag = 0; + float ventana = ts * (float)N_MUESTRAS; + + for(i = 0; i<N_MUESTRAS; i++) + { + if ((muestras[i] > UMBRAL_SUP) && (flag == 0)) + { + contador++; //Cuento los pasos por encima de la histeresis + flag = 1; // Activo flag + } + + //Para el margen de ruido + if ((muestras[i] < UMBRAL_SUP) && (muestras[i] < UMBRAL_INF)) + { + flag = 0; //Desactivo flag para + } + } + + contador = contador-1; + + frecHZ = 1000000*contador/ventana; //El por 1000000 es porque está en microsegundos y lo quiero expresar en Hz. + return frecHZ; +} + +void imprimir_datos(uint16_t *p) +{ + int i,j=0; + printf("\n"); + for(i=0;i<N_MUESTRAS;i++) + { + j++; + printf("%d, ",p[i]); //Eso, imprime los datos, lo dejé tal cual estaba en el de dani + } + printf("\n"); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/resources/ADC.lib Fri Jan 31 13:29:52 2020 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/teams/Damez/code/ADC/#5c6c2ba54077