
Primer cambio codigo 20/01/2020
main.cpp
- Committer:
- javicas95
- Date:
- 2020-01-20
- Revision:
- 0:0a17318c9c22
- Child:
- 1:873f8f9b7f69
File content as of revision 0:0a17318c9c22:
void visualizar(); #include "mbed.h" #define buffer_length 2000 Ticker tMuestrear; Ticker tVisualizar; #include "TextLCD.h" //PARA LA PLACA LCD InterruptIn button(PC_13); //Inicializas el interruptor TextLCD lcd(D8, D9, D2, D3, D4, D5, TextLCD::LCD16x2); // rs, e, d4-d7 Serial pc(USBTX, USBRX); // tx, rx esto es para que vaya más rápido, para que procese más rápido Serial bluetooth(PC_0, PC_1); //ESTA SE QUITA // tx, rx esto es para inicializar los pines para conectar el bluetooth AnalogIn adc_in(A0); //datos de tensión AnalogIn adc_in_in(A2); //datos de intensidad AnalogIn adc_in_dos(A1); //datos de continua (la salida del LM 358) void muestrear(); void visualizar(); int flag=0; int contador=0; int contador_boton=0; bool buffer_activo=0; struct buffer { int16_t vA[buffer_length]; int16_t iA[buffer_length]; int16_t vB[buffer_length]; int16_t iB[buffer_length]; }; buffer buffers; struct estr_medidas { float vrms; float irms; float pot_activa; float pot_reactiva; float pot_aparente; float en_consumida; float fact_potencia; }; estr_medidas medidas; void proces(int16_t *datosV, int16_t *datosI, int longi, estr_medidas *medidas) { int64_t b=0.0; int64_t c=0; int64_t d=0; for(int j=0;j<longi;j++) { b = b + datosV[j]*datosV[j]; //calcula el sumatorio de v^2 c = c + datosI[j]*datosI[j]; //calcula el sumatorio de i^2 d = d + datosV[j]*datosI[j]; //calcula el sumatorio de v*i } //el puntero *medidas apunta la dirección de los distitntos vectores de la estructura //guardamos los resultados en la dirección de memoria que apunta *medidas para cada uno de los resultados medidas->vrms=0.011812328729925*sqrt(((float)b)/longi); medidas->irms=0.000842270393376366*sqrt(((float)c)/longi); medidas->pot_activa=(9.949174801697868320688107085e-6*d)/longi; medidas->pot_aparente=medidas->vrms*medidas->irms; medidas->pot_reactiva=sqrt((medidas->pot_aparente*medidas->pot_aparente)-(medidas->pot_activa*medidas->pot_activa)); medidas->fact_potencia=((float)medidas->pot_activa)/medidas->pot_aparente; medidas->en_consumida+=0.001*medidas->pot_activa*longi; // Se lleva la cuenta,mediante un contador, del número de veces que se ha //pulsado el pulsador para saber qué dato se deberá visualizar. Una vez que el //contador llegue al número máximo de datos, éste vuelve a cero y comienza de //nuevo la cuenta. } void flip() { contador_boton++; if (contador_boton==8) { contador_boton=0; } } int main() { pc.baud(115200); bluetooth.baud(9600); //ESTA SE QUITA tMuestrear.attach_us(&muestrear, 200); tVisualizar.attach(&visualizar, 1); button.rise(&flip); // attach the address of the flip function to the rising edge while(1) { if(flag==1) { // pc.printf("1"); flag=0; if(buffer_activo) { procesado((int16_t *) buffers.vA, (int16_t *)buffers.iA, buffer_length, &medidas); } else { procesado((int16_t *)buffers.vB,(int16_t *)buffers.iB, buffer_length, &medidas); } } //wait_us(1); } } void muestrear() { int16_t datov=(int16_t)(adc_in.read_u16()^0x8000); int16_t datoi=(int16_t)(adc_in_in.read_u16()^0x8000); int16_t continua=(int16_t)(adc_in_dos.read_u16()^0x8000); if (bufferActivo==0) { buffers.vA[contador]=datov-continua; buffers.iA[contador]=datoi-continua; } else { buffers.vB[contador]=datov-continua; buffers.iB[contador]=datoi-continua; } contador++; if(contador==buffer_length) { //pc.printf("2"); contador=0; flag=1; buffer_activo=!buffer_activo; } } void visualizar(){ //printf("**** Datos calculados en %d us ****\n",timer.read_us()); pc.printf("**** El valor Vrms es %f ****\n",medidas.vrms); pc.printf("**** El valor Irms es %f ****\n",medidas.irms); pc.printf("**** La potencia activa es %f ****\n",medidas.pot_activa); pc.printf("**** La potencia reactiva es %f ****\n",medidas.pot_reactiva); pc.printf("**** La potencia aparente es %f ****\n",medidas.pot_aparente); pc.printf("**** La energia consumida es %f ****\n",medidas.en_consumida); pc.printf("**** El factor de potencia es es %f ****\n\n",medidas.fact_potencia); switch (contador_boton){ case 1: lcd.cls(); lcd.printf("Vrms:\n%3.4f V\n", medidas.vrms); break; case 2: lcd.cls(); lcd.printf("Irms:\n%3.2f A\n", medidas.irms); break; case 3: lcd.cls(); lcd.printf("Pot activa\n%3.2f W\n", medidas.pot_activa); break; case 4: lcd.cls(); lcd.printf("Pot reactiva\n%3.2f VAr\n", medidas.pot_reactiva); break; case 5: lcd.cls(); lcd.printf("Pot aparente\n%3.2f VA\n", medidas.pot_aparente); break; case 6: lcd.cls(); lcd.printf("E. consumida\n%3.2f kW\n", medidas.en_consumida); break; case 7: lcd.cls(); lcd.printf("Factor potencia\n%3.2f\n", medidas.fact_potencia); break; default: lcd.cls(); lcd.printf("Pulsa el boton"); } bluetooth.printf("%3.2f|%3.2f|%3.2f|%3.2f|%3.2f|%3.2f|%3.2f|\n",medidas.vrms, medidas.irms,medidas.potenciaActiva,medidas.potenciaReactiva, medidas.potenciaAparente,medidas.energiaConsumida,medidas.factorDePotencia); } // TODO ESTO SE QUITA