
a
main.cpp@0:ebc3999f6ef4, 2019-11-29 (annotated)
- Committer:
- alexmar97
- Date:
- Fri Nov 29 12:52:32 2019 +0000
- Revision:
- 0:ebc3999f6ef4
- Child:
- 1:b1d6185f85c8
proyecto; ;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
alexmar97 | 0:ebc3999f6ef4 | 1 | #include "mbed.h" |
alexmar97 | 0:ebc3999f6ef4 | 2 | #define bufferLength 500 |
alexmar97 | 0:ebc3999f6ef4 | 3 | #include "math.h" |
alexmar97 | 0:ebc3999f6ef4 | 4 | #include "TextLCD.h" |
alexmar97 | 0:ebc3999f6ef4 | 5 | |
alexmar97 | 0:ebc3999f6ef4 | 6 | #define muestras 100 |
alexmar97 | 0:ebc3999f6ef4 | 7 | TextLCD lcd(D8, D9, D2, D3, D4, D5, TextLCD::LCD16x2); // rs, e, d4-d7 |
alexmar97 | 0:ebc3999f6ef4 | 8 | Serial pc(USBTX, USBRX); // tx, rx |
alexmar97 | 0:ebc3999f6ef4 | 9 | struct eResultados { |
alexmar97 | 0:ebc3999f6ef4 | 10 | float Vrms; |
alexmar97 | 0:ebc3999f6ef4 | 11 | float Vmax; |
alexmar97 | 0:ebc3999f6ef4 | 12 | float Vmin; |
alexmar97 | 0:ebc3999f6ef4 | 13 | }; |
alexmar97 | 0:ebc3999f6ef4 | 14 | struct estructuraMedidas |
alexmar97 | 0:ebc3999f6ef4 | 15 | { |
alexmar97 | 0:ebc3999f6ef4 | 16 | float vrms; |
alexmar97 | 0:ebc3999f6ef4 | 17 | float irms; |
alexmar97 | 0:ebc3999f6ef4 | 18 | float potenciaActiva; |
alexmar97 | 0:ebc3999f6ef4 | 19 | float potenciaReactiva; |
alexmar97 | 0:ebc3999f6ef4 | 20 | float potenciaAparente; |
alexmar97 | 0:ebc3999f6ef4 | 21 | float energiaConsumida; |
alexmar97 | 0:ebc3999f6ef4 | 22 | float factorDePotencia; |
alexmar97 | 0:ebc3999f6ef4 | 23 | }; |
alexmar97 | 0:ebc3999f6ef4 | 24 | //struct Vectores{ |
alexmar97 | 0:ebc3999f6ef4 | 25 | // float vTensionA[muestras]; |
alexmar97 | 0:ebc3999f6ef4 | 26 | //float vTensionB[muestras]; |
alexmar97 | 0:ebc3999f6ef4 | 27 | // float vIntensidadA[muestras]; |
alexmar97 | 0:ebc3999f6ef4 | 28 | // float vIntensidadB[muestras]; |
alexmar97 | 0:ebc3999f6ef4 | 29 | }vectores; |
alexmar97 | 0:ebc3999f6ef4 | 30 | AnalogIn adc_in(A0); |
alexmar97 | 0:ebc3999f6ef4 | 31 | AnalogIn int_in(A1); |
alexmar97 | 0:ebc3999f6ef4 | 32 | AnalogOut dac_out(A2); |
alexmar97 | 0:ebc3999f6ef4 | 33 | AnalogOut int_out(A3); |
alexmar97 | 0:ebc3999f6ef4 | 34 | InterruptIn boton(USER_BUTTON); |
alexmar97 | 0:ebc3999f6ef4 | 35 | |
alexmar97 | 0:ebc3999f6ef4 | 36 | Ticker tMuestrea; |
alexmar97 | 0:ebc3999f6ef4 | 37 | Ticker tVisualiza; |
alexmar97 | 0:ebc3999f6ef4 | 38 | void visualiza(); |
alexmar97 | 0:ebc3999f6ef4 | 39 | void procesado(int length, uint16_t *entrada, uint16_t *entrada2); |
alexmar97 | 0:ebc3999f6ef4 | 40 | void calcularRMS(uint16_t *buffer, int longitud,eResultados *resul); |
alexmar97 | 0:ebc3999f6ef4 | 41 | int flag=0; |
alexmar97 | 0:ebc3999f6ef4 | 42 | int contador=0; |
alexmar97 | 0:ebc3999f6ef4 | 43 | int bufferActivo=0; |
alexmar97 | 0:ebc3999f6ef4 | 44 | |
alexmar97 | 0:ebc3999f6ef4 | 45 | struct buffers { |
alexmar97 | 0:ebc3999f6ef4 | 46 | uint16_t 1A[muestras]; |
alexmar97 | 0:ebc3999f6ef4 | 47 | uint16_t 1B[muestras]; |
alexmar97 | 0:ebc3999f6ef4 | 48 | uint16_t 2A[muestras]; |
alexmar97 | 0:ebc3999f6ef4 | 49 | uint16_t 2B[muestras]; |
alexmar97 | 0:ebc3999f6ef4 | 50 | }; |
alexmar97 | 0:ebc3999f6ef4 | 51 | |
alexmar97 | 0:ebc3999f6ef4 | 52 | bool bufferActivo=0; |
alexmar97 | 0:ebc3999f6ef4 | 53 | void muestrea(); |
alexmar97 | 0:ebc3999f6ef4 | 54 | |
alexmar97 | 0:ebc3999f6ef4 | 55 | buffers bufferEntrada; |
alexmar97 | 0:ebc3999f6ef4 | 56 | buffers bufferSalida; |
alexmar97 | 0:ebc3999f6ef4 | 57 | |
alexmar97 | 0:ebc3999f6ef4 | 58 | eResultados resultados; |
alexmar97 | 0:ebc3999f6ef4 | 59 | |
alexmar97 | 0:ebc3999f6ef4 | 60 | int main() |
alexmar97 | 0:ebc3999f6ef4 | 61 | { |
alexmar97 | 0:ebc3999f6ef4 | 62 | |
alexmar97 | 0:ebc3999f6ef4 | 63 | tMuestrea.attach_us(&muestrea, 100); |
alexmar97 | 0:ebc3999f6ef4 | 64 | tVisualiza.attach(&visualiza, 5); |
alexmar97 | 0:ebc3999f6ef4 | 65 | |
alexmar97 | 0:ebc3999f6ef4 | 66 | while(1) { |
alexmar97 | 0:ebc3999f6ef4 | 67 | if (flag) { |
alexmar97 | 0:ebc3999f6ef4 | 68 | flag=0; |
alexmar97 | 0:ebc3999f6ef4 | 69 | if(bufferActivo==1) { |
alexmar97 | 0:ebc3999f6ef4 | 70 | procesado(muestras,(uint16_t *)&bufferEntrada.1A,(uint16_t *)&bufferEntrada.2A); |
alexmar97 | 0:ebc3999f6ef4 | 71 | } else { |
alexmar97 | 0:ebc3999f6ef4 | 72 | procesado(muestras,(uint16_t *)&bufferEntrada.1B,(uint16_t *)&bufferEntrada.2B); |
alexmar97 | 0:ebc3999f6ef4 | 73 | } |
alexmar97 | 0:ebc3999f6ef4 | 74 | |
alexmar97 | 0:ebc3999f6ef4 | 75 | |
alexmar97 | 0:ebc3999f6ef4 | 76 | } |
alexmar97 | 0:ebc3999f6ef4 | 77 | |
alexmar97 | 0:ebc3999f6ef4 | 78 | |
alexmar97 | 0:ebc3999f6ef4 | 79 | wait_us(1); |
alexmar97 | 0:ebc3999f6ef4 | 80 | } |
alexmar97 | 0:ebc3999f6ef4 | 81 | } |
alexmar97 | 0:ebc3999f6ef4 | 82 | |
alexmar97 | 0:ebc3999f6ef4 | 83 | void muestrea() |
alexmar97 | 0:ebc3999f6ef4 | 84 | { |
alexmar97 | 0:ebc3999f6ef4 | 85 | uint16_t dato=adc_in.read_u16(); |
alexmar97 | 0:ebc3999f6ef4 | 86 | uint16_t dato2=int_in.read_u16(); |
alexmar97 | 0:ebc3999f6ef4 | 87 | if (bufferActivo==0) { |
alexmar97 | 0:ebc3999f6ef4 | 88 | |
alexmar97 | 0:ebc3999f6ef4 | 89 | bufferEntrada.1A[contador]=dato; |
alexmar97 | 0:ebc3999f6ef4 | 90 | |
alexmar97 | 0:ebc3999f6ef4 | 91 | bufferEntrada.2A[contador]=dato2; |
alexmar97 | 0:ebc3999f6ef4 | 92 | |
alexmar97 | 0:ebc3999f6ef4 | 93 | } |
alexmar97 | 0:ebc3999f6ef4 | 94 | |
alexmar97 | 0:ebc3999f6ef4 | 95 | else { |
alexmar97 | 0:ebc3999f6ef4 | 96 | |
alexmar97 | 0:ebc3999f6ef4 | 97 | bufferEntrada.1B[contador]=dato; |
alexmar97 | 0:ebc3999f6ef4 | 98 | |
alexmar97 | 0:ebc3999f6ef4 | 99 | bufferEntrada.2B[contador]=dato2; |
alexmar97 | 0:ebc3999f6ef4 | 100 | |
alexmar97 | 0:ebc3999f6ef4 | 101 | } |
alexmar97 | 0:ebc3999f6ef4 | 102 | |
alexmar97 | 0:ebc3999f6ef4 | 103 | contador++; |
alexmar97 | 0:ebc3999f6ef4 | 104 | if(contador==muestras) { |
alexmar97 | 0:ebc3999f6ef4 | 105 | bufferActivo=!bufferActivo; |
alexmar97 | 0:ebc3999f6ef4 | 106 | contador=0; |
alexmar97 | 0:ebc3999f6ef4 | 107 | flag=1; |
alexmar97 | 0:ebc3999f6ef4 | 108 | } |
alexmar97 | 0:ebc3999f6ef4 | 109 | |
alexmar97 | 0:ebc3999f6ef4 | 110 | } |
alexmar97 | 0:ebc3999f6ef4 | 111 | void procesado(int length, uint16_t *entrada, uint16_t *entrada2) |
alexmar97 | 0:ebc3999f6ef4 | 112 | //{ |
alexmar97 | 0:ebc3999f6ef4 | 113 | // for (int i=0; i<length; i++) { |
alexmar97 | 0:ebc3999f6ef4 | 114 | // salida[i]=entrada[i]; |
alexmar97 | 0:ebc3999f6ef4 | 115 | //} |
alexmar97 | 0:ebc3999f6ef4 | 116 | |
alexmar97 | 0:ebc3999f6ef4 | 117 | // calcularRMS(entrada,length,&resultados); |
alexmar97 | 0:ebc3999f6ef4 | 118 | void calcularDatos(int16_t *entrada, int16_t *entrada2, int longitud, estructuraMedidas *medidas); |
alexmar97 | 0:ebc3999f6ef4 | 119 | |
alexmar97 | 0:ebc3999f6ef4 | 120 | |
alexmar97 | 0:ebc3999f6ef4 | 121 | } |
alexmar97 | 0:ebc3999f6ef4 | 122 | void calcularRMS(uint16_t *buffer, int longitud,eResultados *resul) |
alexmar97 | 0:ebc3999f6ef4 | 123 | { |
alexmar97 | 0:ebc3999f6ef4 | 124 | float cons=0.00005035400390625; |
alexmar97 | 0:ebc3999f6ef4 | 125 | float cons1=1.007080078125e-4; |
alexmar97 | 0:ebc3999f6ef4 | 126 | float cons2=cons*cons; |
alexmar97 | 0:ebc3999f6ef4 | 127 | |
alexmar97 | 0:ebc3999f6ef4 | 128 | float res; |
alexmar97 | 0:ebc3999f6ef4 | 129 | float Vmax=0; |
alexmar97 | 0:ebc3999f6ef4 | 130 | float Vmin=65535; |
alexmar97 | 0:ebc3999f6ef4 | 131 | |
alexmar97 | 0:ebc3999f6ef4 | 132 | uint64_t suma=0; |
alexmar97 | 0:ebc3999f6ef4 | 133 | |
alexmar97 | 0:ebc3999f6ef4 | 134 | |
alexmar97 | 0:ebc3999f6ef4 | 135 | |
alexmar97 | 0:ebc3999f6ef4 | 136 | for (int i=0; i<longitud; i++) { |
alexmar97 | 0:ebc3999f6ef4 | 137 | |
alexmar97 | 0:ebc3999f6ef4 | 138 | suma+=buffer[i]*buffer[i]; |
alexmar97 | 0:ebc3999f6ef4 | 139 | if (Vmax<buffer[i]) { |
alexmar97 | 0:ebc3999f6ef4 | 140 | Vmax=buffer[i]; |
alexmar97 | 0:ebc3999f6ef4 | 141 | } |
alexmar97 | 0:ebc3999f6ef4 | 142 | if (Vmin>buffer[i]) { |
alexmar97 | 0:ebc3999f6ef4 | 143 | Vmin=buffer[i]; |
alexmar97 | 0:ebc3999f6ef4 | 144 | } |
alexmar97 | 0:ebc3999f6ef4 | 145 | } |
alexmar97 | 0:ebc3999f6ef4 | 146 | |
alexmar97 | 0:ebc3999f6ef4 | 147 | |
alexmar97 | 0:ebc3999f6ef4 | 148 | res=cons1*sqrt(((float)suma)/longitud); |
alexmar97 | 0:ebc3999f6ef4 | 149 | resul->Vrms=res; |
alexmar97 | 0:ebc3999f6ef4 | 150 | resul->Vmax=Vmax*cons; |
alexmar97 | 0:ebc3999f6ef4 | 151 | resul->Vmin=Vmin*cons; |
alexmar97 | 0:ebc3999f6ef4 | 152 | } |
alexmar97 | 0:ebc3999f6ef4 | 153 | |
alexmar97 | 0:ebc3999f6ef4 | 154 | void visualiza(){ |
alexmar97 | 0:ebc3999f6ef4 | 155 | printf ("El valor maxima es %f\n",resultados.Vmax); |
alexmar97 | 0:ebc3999f6ef4 | 156 | printf ("El valor minimo es %f\n",resultados.Vmin); |
alexmar97 | 0:ebc3999f6ef4 | 157 | printf ("El valor RMS es %f\n\n",resultados.Vrms); |
alexmar97 | 0:ebc3999f6ef4 | 158 | |
alexmar97 | 0:ebc3999f6ef4 | 159 | } |
alexmar97 | 0:ebc3999f6ef4 | 160 | void calcularDatos(int16_t *datosV, int16_t *datosI, int longitud, estructuraMedidas *medidas) |
alexmar97 | 0:ebc3999f6ef4 | 161 | { |
alexmar97 | 0:ebc3999f6ef4 | 162 | float cons=1.007080078125e-4; |
alexmar97 | 0:ebc3999f6ef4 | 163 | float cons2=cons*cons; |
alexmar97 | 0:ebc3999f6ef4 | 164 | |
alexmar97 | 0:ebc3999f6ef4 | 165 | int64_t sumaV=0; |
alexmar97 | 0:ebc3999f6ef4 | 166 | int64_t sumaI=0; |
alexmar97 | 0:ebc3999f6ef4 | 167 | int64_t sumaP=0; |
alexmar97 | 0:ebc3999f6ef4 | 168 | |
alexmar97 | 0:ebc3999f6ef4 | 169 | |
alexmar97 | 0:ebc3999f6ef4 | 170 | |
alexmar97 | 0:ebc3999f6ef4 | 171 | float datoV; |
alexmar97 | 0:ebc3999f6ef4 | 172 | float datoI; |
alexmar97 | 0:ebc3999f6ef4 | 173 | float datoP; |
alexmar97 | 0:ebc3999f6ef4 | 174 | float datoS; |
alexmar97 | 0:ebc3999f6ef4 | 175 | float datoQ; |
alexmar97 | 0:ebc3999f6ef4 | 176 | |
alexmar97 | 0:ebc3999f6ef4 | 177 | |
alexmar97 | 0:ebc3999f6ef4 | 178 | for (int i=0; i<longitud; i++) { |
alexmar97 | 0:ebc3999f6ef4 | 179 | |
alexmar97 | 0:ebc3999f6ef4 | 180 | sumaV+=datosV[i]*datosV[i]; |
alexmar97 | 0:ebc3999f6ef4 | 181 | sumaI+=datosI[i]*datosI[i]; |
alexmar97 | 0:ebc3999f6ef4 | 182 | sumaP+=datosV[i]*datosI[i]; |
alexmar97 | 0:ebc3999f6ef4 | 183 | } |
alexmar97 | 0:ebc3999f6ef4 | 184 | |
alexmar97 | 0:ebc3999f6ef4 | 185 | datoV = cons*sqrt(((float)sumaV)/longitud); |
alexmar97 | 0:ebc3999f6ef4 | 186 | datoI = cons*sqrt(((float)sumaI)/longitud); |
alexmar97 | 0:ebc3999f6ef4 | 187 | datoP = cons2*((float)sumaP)/longitud; |
alexmar97 | 0:ebc3999f6ef4 | 188 | datoS=datoV*datoI; |
alexmar97 | 0:ebc3999f6ef4 | 189 | datoQ = sqrt((datoS*datoS)-(datoP*datoP)); |
alexmar97 | 0:ebc3999f6ef4 | 190 | |
alexmar97 | 0:ebc3999f6ef4 | 191 | (*medidas).energiaConsumida = datoP/datoI; |
alexmar97 | 0:ebc3999f6ef4 | 192 | (*medidas).factorDePotencia = datoP/datoS; |
alexmar97 | 0:ebc3999f6ef4 | 193 | (*medidas).potenciaAparente = datoS; |
alexmar97 | 0:ebc3999f6ef4 | 194 | (*medidas).potenciaActiva = datoP; |
alexmar97 | 0:ebc3999f6ef4 | 195 | (*medidas).potenciaReactiva = datoQ; |
alexmar97 | 0:ebc3999f6ef4 | 196 | (*medidas).vrms = datoV; |
alexmar97 | 0:ebc3999f6ef4 | 197 | (*medidas).irms = datoI; |
alexmar97 | 0:ebc3999f6ef4 | 198 | (*medidas).factorDePotencia = datoP/datoS; |
alexmar97 | 0:ebc3999f6ef4 | 199 | } |