codigo sin probar
Dependencies: mbed CMSIS_DSP_5 TextLCD
main.cpp
- Committer:
- carmenron
- Date:
- 2018-12-11
- Revision:
- 6:84f33f8a9c9d
- Parent:
- 5:31e97b4ad087
- Child:
- 7:566a2dd5dddd
File content as of revision 6:84f33f8a9c9d:
#include "mbed.h" #include "arm_math.h" #include "TextLCD.h" Ticker timerCapturaMuestreo; Ticker timerMostrar; Serial pc(USBTX, USBRX); // tx, rx #define longitud 360 float Vrms; float Irms; float P; float Q; float S; float FDP; //BUFFERS DE VOLTAJE int16_t bufferA[longitud]; int16_t bufferB[longitud]; //BUFFERS DE INTENSIDAD int16_t bufferC [longitud]; int16_t bufferD [longitud]; // int contador=0 ; int nbuffer=1 ; int bufferlleno ; int mostrarDato=1 ; float rms ; float Vpp ; //punteros int16_t *pA ; int16_t *pB ; 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]=voltaje.read ()*197-325 ; //VOLTAJE bufferC[contador]=intensidad.read ()*8-14 ; //INTENSIDAD contador=contador+1 ; if (contador==longitud) { nbuffer=0 ; contador=0 ; bufferlleno=1; } } else { bufferB[contador]=voltaje.read ()*197-325 ; //VOLTAJE ; bufferD[contador]=intensidad.read ()*8-14 ; //INTENSIDAD ; contador=contador+1 ; if (contador==longitud) { nbuffer=1 ; contador=0 ; bufferlleno=1; } } } // vamos a programar un boton como una entrada digital que nos permita seleccionar // el tipo de dato que queremos visualizar en la lcd //primero definimos como digitales las entradas en las que estarán los pulsadores InterruptIn pulsador1(PC_13); InterruptIn pulsador2 (D2); void botonUP () { mostrarDato+=1; if (mostrarDato==9) { mostrarDato=1; } } void botonDOWN () { mostrarDato-=1; if (mostrarDato==0) { mostrarDato=8; } } void mostrar () { if (mostrarDato==1) { pc.printf("voltaje:\n%f",Vrms); } else if (mostrarDato==2) { pc.printf("intensidad:\n%f",Irms); } else if (mostrarDato==3) { pc.printf("potencia activa:\n%f",P); } else if (mostrarDato==4) { pc.printf("potencia reactiva:\n%f",Q); } else if (mostrarDato==5) { pc.printf("potencia aparente:\n%f",S); } else if (mostrarDato==6) { pc.printf("energia activa:\n%f",0); } else if (mostrarDato==7) { pc.printf("energia reactiva:\n%f",0); } else if (mostrarDato==8) { pc.printf("factor de potencia:\n%f",FDP); } } 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=5.035400390625000e-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++) { sumatorio+=sumatorio+datos1[N]*datos2[N]; } return datos1[N]*datos2[N]/N; } float calcular_potencia_reactiva_MAL(float Vrms,float Irms,float P,float S); float calcular_potencia_reactiva_MAL(float Vrms,float Irms,float P,float S) { float Q=sqrt(S-P); return Q; } float calcular_potencia_aparente(float Vrms,float Irms); float calcular_potencia_aparente(float Vrms,float Irms) { float S=Vrms*Irms; return S; } 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 0; } float fdp (float S,float P); float fdp (float S,float P) { float fdp=P/S; return fdp; } int main() { pulsador1.rise(&botonUP); pulsador2.rise(&botonDOWN); timerCapturaMuestreo.attach_us(&muestreo,200); timerMostrar.attach(&mostrar,1.0); while(1) { if (bufferlleno==1) { bufferlleno=0; if (nbuffer==0) { float Vrms=calcularRMS(bufferA,longitud); float Irms=calcularRMS(bufferC,longitud); float P=calcular_potencia_activa(bufferA,bufferC,longitud); } else { float Vrms=calcularRMS(bufferB,longitud); float Irms=calcularRMS(bufferD,longitud); float P=calcular_potencia_activa(bufferB,bufferD,longitud); } float S=calcular_potencia_aparente(Vrms,Irms); float Q=calcular_potencia_reactiva_MAL(Vrms,Irms,P,S); float FDP=fdp(S,P); } } }