Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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