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.
final.cpp@6:33c61cd81626, 2018-12-20 (annotated)
- Committer:
- freind00
- Date:
- Thu Dec 20 13:14:11 2018 +0000
- Revision:
- 6:33c61cd81626
- Parent:
- plantilla_copy.cpp@5:c638ff4bd841
- Child:
- 7:e0452337a3d1
version semifinal;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
freind00 | 3:3620f948d5e0 | 1 | #include "mbed.h" |
freind00 | 3:3620f948d5e0 | 2 | #include "math.h" |
freind00 | 5:c638ff4bd841 | 3 | #include "TextLCD.h" |
freind00 | 5:c638ff4bd841 | 4 | |
freind00 | 5:c638ff4bd841 | 5 | #define datoTension 725.331071 |
freind00 | 5:c638ff4bd841 | 6 | #define datoIntensidad 29.4943123 |
freind00 | 3:3620f948d5e0 | 7 | #define constanteTension 1.4709e-06 |
freind00 | 3:3620f948d5e0 | 8 | #define constanteIntensidad 1.423595702690060e-09 |
freind00 | 4:c9f7e9a96324 | 9 | #define vectormuestras 100 |
freind00 | 5:c638ff4bd841 | 10 | #define offsetTension 0.50369472 |
freind00 | 5:c638ff4bd841 | 11 | #define offsetIntensidad 0.5040785 |
freind00 | 5:c638ff4bd841 | 12 | #define eps 2.220446049250313e-016 |
freind00 | 3:3620f948d5e0 | 13 | |
freind00 | 5:c638ff4bd841 | 14 | TextLCD lcd(D8, D9, D2, D3, D4, D5, TextLCD::LCD16x2); // rs, e, d4-d7 |
freind00 | 3:3620f948d5e0 | 15 | Serial pc(USBTX, USBRX); // tx, rx |
freind00 | 3:3620f948d5e0 | 16 | |
freind00 | 4:c9f7e9a96324 | 17 | InterruptIn button(PC_13); |
freind00 | 5:c638ff4bd841 | 18 | AnalogIn tension(A0); |
freind00 | 5:c638ff4bd841 | 19 | AnalogIn intensidad(A1); |
freind00 | 3:3620f948d5e0 | 20 | |
freind00 | 3:3620f948d5e0 | 21 | |
freind00 | 5:c638ff4bd841 | 22 | struct Vectores{ |
freind00 | 5:c638ff4bd841 | 23 | float vTensionA[vectormuestras]; |
freind00 | 5:c638ff4bd841 | 24 | float vTensionB[vectormuestras]; |
freind00 | 5:c638ff4bd841 | 25 | |
freind00 | 6:33c61cd81626 | 26 | float vIntensidadA[vectormuestras]; |
freind00 | 6:33c61cd81626 | 27 | float vIntensidadB[vectormuestras]; |
freind00 | 6:33c61cd81626 | 28 | }vectores; |
freind00 | 3:3620f948d5e0 | 29 | |
freind00 | 5:c638ff4bd841 | 30 | struct Medidas{ |
freind00 | 5:c638ff4bd841 | 31 | float medidaTension; |
freind00 | 5:c638ff4bd841 | 32 | float medidaIntensidad; |
freind00 | 6:33c61cd81626 | 33 | }medidas; |
freind00 | 3:3620f948d5e0 | 34 | |
freind00 | 3:3620f948d5e0 | 35 | int contador=0; |
freind00 | 3:3620f948d5e0 | 36 | int pulsador=0; |
freind00 | 3:3620f948d5e0 | 37 | int bufferActivo=0; |
freind00 | 3:3620f948d5e0 | 38 | int flag=0; |
freind00 | 3:3620f948d5e0 | 39 | int16_t measV=0; |
freind00 | 3:3620f948d5e0 | 40 | int16_t measI=0; |
freind00 | 3:3620f948d5e0 | 41 | int32_t producto=0; |
freind00 | 3:3620f948d5e0 | 42 | int64_t sumatorioV=0; |
freind00 | 3:3620f948d5e0 | 43 | int64_t sumatorioI=0; |
freind00 | 3:3620f948d5e0 | 44 | int64_t sumatorioPA=0; |
freind00 | 3:3620f948d5e0 | 45 | |
freind00 | 3:3620f948d5e0 | 46 | float VRMS=0; |
freind00 | 3:3620f948d5e0 | 47 | float IRMS=0; |
freind00 | 3:3620f948d5e0 | 48 | float P_activa=0; |
freind00 | 3:3620f948d5e0 | 49 | float P_reactiva=0; |
freind00 | 3:3620f948d5e0 | 50 | float P_aparente=0; |
freind00 | 3:3620f948d5e0 | 51 | float Consumo_Pact=0; |
freind00 | 3:3620f948d5e0 | 52 | float Consumo_Preact=0; |
freind00 | 3:3620f948d5e0 | 53 | float FP=0; |
freind00 | 3:3620f948d5e0 | 54 | |
freind00 | 3:3620f948d5e0 | 55 | //Captura de valores mediante muestreo |
freind00 | 3:3620f948d5e0 | 56 | void captura() //función muestreo |
freind00 | 3:3620f948d5e0 | 57 | { |
freind00 | 5:c638ff4bd841 | 58 | float medidaTension=tension.read(); |
freind00 | 5:c638ff4bd841 | 59 | medidaTension=medidaTension-offsetTension*datoTension; |
freind00 | 5:c638ff4bd841 | 60 | |
freind00 | 5:c638ff4bd841 | 61 | float medidaIntensidad=intensidad.read(); |
freind00 | 5:c638ff4bd841 | 62 | medidaIntensidad=medidaIntensidad-offsetIntensidad*datoIntensidad; |
freind00 | 5:c638ff4bd841 | 63 | |
freind00 | 5:c638ff4bd841 | 64 | if(bufferActivo==1) { |
freind00 | 6:33c61cd81626 | 65 | vectores.vTensionA[contador] = medidaTension; |
freind00 | 6:33c61cd81626 | 66 | vectores.vIntensidadA[contador] = medidaIntensidad; |
freind00 | 5:c638ff4bd841 | 67 | |
freind00 | 3:3620f948d5e0 | 68 | } else { |
freind00 | 6:33c61cd81626 | 69 | vectores.vTensionB[contador] = medidaTension; |
freind00 | 6:33c61cd81626 | 70 | vectores.vIntensidadB[contador] = medidaIntensidad; |
freind00 | 3:3620f948d5e0 | 71 | } |
freind00 | 3:3620f948d5e0 | 72 | |
freind00 | 3:3620f948d5e0 | 73 | contador++; |
freind00 | 3:3620f948d5e0 | 74 | if(contador==vectormuestras){ |
freind00 | 3:3620f948d5e0 | 75 | contador=0; |
freind00 | 3:3620f948d5e0 | 76 | bufferActivo=!bufferActivo; |
freind00 | 3:3620f948d5e0 | 77 | flag=1;//buffer lleno |
freind00 | 3:3620f948d5e0 | 78 | } |
freind00 | 3:3620f948d5e0 | 79 | } |
freind00 | 3:3620f948d5e0 | 80 | |
freind00 | 6:33c61cd81626 | 81 | //Visualización por pantalla |
freind00 | 6:33c61cd81626 | 82 | void visualizacion()//función mostrar |
freind00 | 3:3620f948d5e0 | 83 | { |
freind00 | 6:33c61cd81626 | 84 | lcd.cls(); |
freind00 | 6:33c61cd81626 | 85 | if(pulsador==0){ |
freind00 | 6:33c61cd81626 | 86 | lcd.printf("VRMS:\n %f", VRMS); |
freind00 | 6:33c61cd81626 | 87 | } |
freind00 | 6:33c61cd81626 | 88 | |
freind00 | 6:33c61cd81626 | 89 | else if (pulsador ==1) { |
freind00 | 6:33c61cd81626 | 90 | lcd.printf("IRMS:\n %f", IRMS); |
freind00 | 6:33c61cd81626 | 91 | } |
freind00 | 6:33c61cd81626 | 92 | |
freind00 | 6:33c61cd81626 | 93 | else if (pulsador ==2) { |
freind00 | 6:33c61cd81626 | 94 | lcd.printf("Pot. activa:\n %f", P_activa); |
freind00 | 6:33c61cd81626 | 95 | } |
freind00 | 6:33c61cd81626 | 96 | |
freind00 | 6:33c61cd81626 | 97 | else if (pulsador ==3) { |
freind00 | 6:33c61cd81626 | 98 | lcd.printf("Pot. reactiva:\n %f", P_reactiva); |
freind00 | 6:33c61cd81626 | 99 | } |
freind00 | 6:33c61cd81626 | 100 | |
freind00 | 6:33c61cd81626 | 101 | else if (pulsador ==4) { |
freind00 | 6:33c61cd81626 | 102 | lcd.printf("Pot. aparente:\n %f", P_aparente); |
freind00 | 6:33c61cd81626 | 103 | } |
freind00 | 6:33c61cd81626 | 104 | |
freind00 | 6:33c61cd81626 | 105 | else if (pulsador ==5) { |
freind00 | 6:33c61cd81626 | 106 | lcd.printf("Consumo Pot. A:\n %f", Consumo_Pact); |
freind00 | 6:33c61cd81626 | 107 | } |
freind00 | 6:33c61cd81626 | 108 | |
freind00 | 6:33c61cd81626 | 109 | else if (pulsador ==6) { |
freind00 | 6:33c61cd81626 | 110 | lcd.printf("Consumo Pot. R:\n %f", Consumo_Preact); |
freind00 | 6:33c61cd81626 | 111 | } |
freind00 | 6:33c61cd81626 | 112 | |
freind00 | 6:33c61cd81626 | 113 | else if (pulsador ==7) { |
freind00 | 6:33c61cd81626 | 114 | lcd.printf("Factor de potencia:\n\r %f", FP); |
freind00 | 6:33c61cd81626 | 115 | } |
freind00 | 6:33c61cd81626 | 116 | |
freind00 | 6:33c61cd81626 | 117 | } |
freind00 | 6:33c61cd81626 | 118 | |
freind00 | 6:33c61cd81626 | 119 | //Cambio de boton |
freind00 | 6:33c61cd81626 | 120 | void cambio_boton() |
freind00 | 6:33c61cd81626 | 121 | { |
freind00 | 6:33c61cd81626 | 122 | pulsador++; |
freind00 | 6:33c61cd81626 | 123 | if(pulsador>8) { |
freind00 | 6:33c61cd81626 | 124 | pulsador=0; |
freind00 | 6:33c61cd81626 | 125 | } |
freind00 | 6:33c61cd81626 | 126 | } |
freind00 | 6:33c61cd81626 | 127 | |
freind00 | 6:33c61cd81626 | 128 | int main() |
freind00 | 6:33c61cd81626 | 129 | { |
freind00 | 6:33c61cd81626 | 130 | Ticker timerCaptura; |
freind00 | 6:33c61cd81626 | 131 | Ticker timerVisualizacion; |
freind00 | 6:33c61cd81626 | 132 | timerCaptura.attach_us(&captura,200);//Hace que la función muestreo se ejecute cada 200us |
freind00 | 6:33c61cd81626 | 133 | timerVisualizacion.attach(&visualizacion,1.0);//Hace que la función mostrar se ejecute cada segundo |
freind00 | 6:33c61cd81626 | 134 | button.rise(&cambio_boton);//Hace que la función boton se ejecute cada vez que se pulse el botón |
freind00 | 6:33c61cd81626 | 135 | |
freind00 | 3:3620f948d5e0 | 136 | while(1) {//bucle para siempre |
freind00 | 3:3620f948d5e0 | 137 | if(flag) {//mira si el buffer esta lleno |
freind00 | 3:3620f948d5e0 | 138 | flag=0;//Borra la variable buffer lleno |
freind00 | 3:3620f948d5e0 | 139 | measV=0; |
freind00 | 3:3620f948d5e0 | 140 | measI=0; |
freind00 | 3:3620f948d5e0 | 141 | producto=0; |
freind00 | 3:3620f948d5e0 | 142 | sumatorioV=0; |
freind00 | 3:3620f948d5e0 | 143 | sumatorioI=0; |
freind00 | 3:3620f948d5e0 | 144 | sumatorioPA=0; |
freind00 | 3:3620f948d5e0 | 145 | |
freind00 | 6:33c61cd81626 | 146 | for (int b=0; b<vectormuestras; b++) {//VRMS |
freind00 | 3:3620f948d5e0 | 147 | if (!bufferActivo) { |
freind00 | 6:33c61cd81626 | 148 | measV=vectores.vTensionA[b]; |
freind00 | 6:33c61cd81626 | 149 | measI=vectores.vIntensidadA[b]; |
freind00 | 3:3620f948d5e0 | 150 | } else { |
freind00 | 6:33c61cd81626 | 151 | measV=vectores.vTensionB[b]; |
freind00 | 6:33c61cd81626 | 152 | measI=vectores.vIntensidadB[b]; |
freind00 | 3:3620f948d5e0 | 153 | } |
freind00 | 3:3620f948d5e0 | 154 | producto=measV*measV; |
freind00 | 3:3620f948d5e0 | 155 | sumatorioV+=producto;//calcula el valor VPP |
freind00 | 3:3620f948d5e0 | 156 | producto=measI*measI; |
freind00 | 3:3620f948d5e0 | 157 | sumatorioI+=producto; |
freind00 | 3:3620f948d5e0 | 158 | producto=measV*measI; |
freind00 | 3:3620f948d5e0 | 159 | sumatorioPA+=producto; |
freind00 | 3:3620f948d5e0 | 160 | } |
freind00 | 5:c638ff4bd841 | 161 | |
freind00 | 5:c638ff4bd841 | 162 | VRMS=sqrt(constanteTension*sumatorioV); |
freind00 | 5:c638ff4bd841 | 163 | IRMS=sqrt(constanteIntensidad*sumatorioI); |
freind00 | 5:c638ff4bd841 | 164 | P_activa=sqrt(constanteTension*constanteIntensidad)*sumatorioPA; |
freind00 | 5:c638ff4bd841 | 165 | P_aparente=VRMS*IRMS; |
freind00 | 5:c638ff4bd841 | 166 | P_reactiva=sqrt(P_aparente*P_aparente)-(P_aparente*P_aparente); |
freind00 | 5:c638ff4bd841 | 167 | Consumo_Pact=Consumo_Pact+P_activa*20e-3/(3600*1000); |
freind00 | 5:c638ff4bd841 | 168 | Consumo_Preact=Consumo_Preact+P_reactiva*20e-3/(3600*1000); |
freind00 | 5:c638ff4bd841 | 169 | FP=P_activa/(P_aparente+eps); |
freind00 | 5:c638ff4bd841 | 170 | } |
freind00 | 6:33c61cd81626 | 171 | } |
freind00 | 3:3620f948d5e0 | 172 | } |