codigo sin probar
Dependencies: mbed CMSIS_DSP_5 TextLCD
Diff: main.cpp
- Revision:
- 3:bf56d25e3fda
- Parent:
- 2:f53019a5bd33
- Child:
- 4:bf6448061982
--- a/main.cpp Tue Dec 04 09:36:17 2018 +0000 +++ b/main.cpp Tue Dec 04 11:40:42 2018 +0000 @@ -1,52 +1,57 @@ #include "mbed.h" +#include "arm_math.h" + +Ticker timerCapturaMuestreo; +Ticker timerMostrar; + +#define longitud 360 + + //BUFFERS DE VOLTAJE -int16_t bufferA [360]; -int16_t bufferB [360]; +int16_t bufferA[longitud]; +int16_t bufferB[longitud]; //BUFFERS DE INTENSIDAD -int16_t bufferC [360]; -int16_t bufferD [360]; +int16_t bufferC [longitud]; +int16_t bufferD [longitud]; // int contador=0 ; -int nbuffer=0 ; +int nbuffer=1 ; int bufferlleno ; int mostrarDato=1 ; float rms ; float Vpp ; -//punteros +//punteros int32_t *pA ; int32_t *pB ; -AnalogIn (A0); //ENTRADA DE VOLTAJE -AnalogIn (A5); //ENTRADA DE INTENSIDAD +AnalogIn voltaje (A0); //ENTRADA DE VOLTAJE +AnalogIn intensidad (A5); //ENTRADA DE INTENSIDAD void muestreo () //hay que programar que se ejecute la funcion cada X tiempo (siendo X el tiempo de muestreo) -{ -if (nbuffer==1) //si nbuffer=1 entonces se guardan los datos en el buffer A, else buffer B { - bufferA[contador]=AnalogRead (A0) ; - bufferC[contador]=AnalogRead (A5) ; - contador=contador+1 ; - if (contador==len(bufferA)) - { - nbuffer=0 ; - contador=0 ; - } + if (nbuffer==1) { //si nbuffer=1 entonces se guardan los datos en el buffer A, else buffer B + bufferA[contador]=voltaje.read () ; + bufferC[contador]=intensidad.read () ; + contador=contador+1 ; + if (contador==longitud) { + nbuffer=0 ; + contador=0 ; + bufferlleno=1; + } + } else { + bufferB[contador]=voltaje.read () ; + bufferD[contador]=intensidad.read () ; + contador=contador+1 ; + if (contador==longitud) { + nbuffer=1 ; + contador=0 ; + bufferlleno=1; + } } -else -{ - bufferB(contador)=AnalogRead (A0) ; - bufferD(contador)=AnalogRead (A5) ; - contador=contador+1 ; - if (contador==len(bufferB)) - { - nbuffer=1 ; - contador=0 ; - } -} } @@ -55,65 +60,94 @@ //primero definimos como digitales las entradas en las que estarán los pulsadores -digitalIn (D1); -digitalIn (D2); +InterruptIn pulsador1(PC_13); +InterruptIn pulsador2 (D2); -void boton () +void botonUP () { - if (digitalRead(D1)==1) - mostrarDato=+1; - { - if (mostrarDato==9) - mostrarDato=1; - } - else - { - if (digitalRead(D2)==1) - mostrarDato=-1; - { - if (mostrarDato==0) - mostrarDato=8; - } - } + mostrarDato+=1; + if (mostrarDato==9) { + mostrarDato=1; + } } +void botonDOWN () +{ + mostrarDato-=1; + if (mostrarDato==0) { + mostrarDato=8; + } +} void mostrar () { - if (mostrarDato==1) - lcd.printf("voltaje:\n") - else + if (mostrarDato==1) { + printf("voltaje:\n"); + } else if (mostrarDato==2) { + printf("intensidad:\n"); + } else if (mostrarDato==3) { + printf("potencia activa:\n"); + } else if (mostrarDato==4) { + printf("potencia reactiva:\n"); + } else if (mostrarDato==5) { + printf("potencia aparente:\n"); + } else if (mostrarDato==6) { + printf("energia activa:\n"); + } else if (mostrarDato==7) { + printf("energia reactiva:\n"); + } else if (mostrarDato==8) { + printf("factor de potencia:\n"); + } + + +} + + +float calcularRMS(int16_t *datos, int N); //definicion del tipo de variable que devuelve la funcion +float calcularRMS(int16_t *datos, int N) // definicion de los estamentos de la funcion +{ + float32_t k=7.629394531250000e-05; + int64_t producto=0; + + for (int n=0; n<N; n++) { + producto+=datos[n]*datos[n]; + } + return sqrt((float(producto)/N))*k; + +} + +float calcular_potencia_activa(int16_t *datos1,int16_t *datos2, int N); +float calcular_potencia_activa(int16_t *datos1,int16_t *datos2, int N) +{ + int32_t sumatorio=0; + for (int16_t n=0; n<N; n++) { - if (mostrarDato==2) - lcd.printf("intensidad:\n") - else - { - if (mostrarDato==3) - lcd.printf("potencia activa:\n") - else - { - if (mostrarDato==4) - lcd.printf("potencia reactiva:\n") - else - { - if (mostrarDato==5) - lcd.printf("potencia aparente:\n") - else - { - if (mostrarDato==6) - lcd.printf("energía activa:\n") - else - { - if (mostrarDato==7) - lcd.printf("energía reactiva:\n") - else - { - if (mostrarDato==8) - lcd.printf("factor de potencia:\n") - } - } - } - } + sumatorio+=sumatorio+datos1[N]*datos2[N]; + } + return datos1[N]*datos2[N]/N; +} + +float calcular_potencia_reactiva(int16_t *datos1,int16_t *datos2, int N); +float calcular_potencia_reactiva(int16_t *datos1,int16_t *datos2, int N) +{ + return; +} + + + +int main() +{ + pulsador1.rise(&botonUP); + pulsador2.rise(&botonDOWN); + timerCapturaMuestreo.attach_us(&muestreo,20); + timerMostrar.attach(&mostrar,1.0); + while(1) { + if (bufferlleno==1) { + bufferlleno=0; + if (nbuffer==0) { + float Vrms=calcularRMS(bufferA,longitud); + } else { + float Vrms=calcularRMS(bufferB,longitud); } } }