Go Down

### Topic: Smooth para un float (Read 152 times)previous topic - next topic

#### Armagedon13

##### Mar 21, 2019, 07:45 pm
Hola buenos días, tengo un programa para leer el desfase de corriente:

Tengo conectada una pantalla lcd liquid crystal:

Code: [Select]
`#include <LiquidCrystal.h>#include <math.h>LiquidCrystal lcd(12, 11, 5, 4, 3, 2);int pin = 13;const int capacitor = 6;float rads = 57.29577951; // 1 radian = approx 57 deg.float degree = 360;float frequency = 50;float nano = 1 * pow (10,-6); // Multiplication factor to convert nano seconds into seconds// Define floats to contain calculationsfloat pf;float angle;float pf_max = 0;float angle_max = 0;int ctr;//float positivo;void setup(){ pinMode(pin, INPUT); pinMode(capacitor, OUTPUT); lcd.begin(16, 2);}void loop(){  for (ctr = 0; ctr <= 10; ctr++) // Perform 4 measurements then reset  {  // 1st line calculates the phase angle in degrees from differentiated time pulse  // Function COS uses radians not Degree's hence conversion made by dividing angle / 57.2958   angle = ((((pulseIn(pin, HIGH)) * nano)* degree)* frequency);   pf = cos(angle / rads);       if (angle > angle_max) // Test if the angle is maximum angle     {      angle_max = angle; // If maximum record in variable "angle_max"      pf_max = cos(angle_max / rads); // Calc PF from "angle_max"     }   }   //if (angle_max > 360) // If the calculation is higher than 360 do following...   if (angle_max > 360)   {    angle_max = 0; // assign the 0 to "angle_max"    pf_max = 1; // Assign the Unity PF to "pf_max"   }   if (angle_max == 0) // If the calculation is higher than 360 do following...   {    angle_max = 0; // assign the 0 to "angle_max"    pf_max = 1; // Assign the Unity PF to "pf_max"   }   /*if(pf_max<=0){    pf_max=0;   }*/    /*if((pf_max>=0.82) && (pf_max <= 0.83)){       digitalWrite(capacitor, HIGH);             }    else{       digitalWrite(capacitor, LOW);        }*/    if((pf_max>=0.92) && (pf_max <= 0.99)){       digitalWrite(capacitor, LOW);             }    else{       digitalWrite(capacitor, HIGH);        }       //positivo = pf_max;   /*Serial.print(angle_max, 2); // Print the result   Serial.print(",");   Serial.println(pf_max, 2);   Serial.println(fabs(caca));*/     lcd.clear();   lcd.setCursor(0,0);   lcd.print("PF=");   lcd.setCursor(4,0);   lcd.print(pf_max);   lcd.print(" ");   lcd.setCursor(0,1);   lcd.print("Ph-Shift=");   lcd.setCursor(10,1);   lcd.print(angle_max);   lcd.print(" ");      delay(1000); //tiempo de escaneo   angle = 0; // Reset variables for next test   angle_max = 0;}`

Estoy intentando poner un smoothing o averange para "PF_max" que es el factor de potencia para que no cambie tan bruscamente, pero no puedo hacer que haga uno con float, ya que todos los ejemplos o librerías son con enteros o directamente lo leen desde los pines analógicos.

Hay alguno para floats?

#### surbyte

#1
##### Mar 21, 2019, 08:40 pm
Antes que nada, comprobaste la salida de la compuerta con un Osciloscopio?

Ambas señales hacen un cruce por cero y eso pasa por la XOR, verifica que tienes un pulso de un ancho proporcional al desfaseje Tension-Corriente.

#### Armagedon13

#2
##### Mar 21, 2019, 08:47 pm
Antes que nada, comprobaste la salida de la compuerta con un Osciloscopio?

Ambas señales hacen un cruce por cero y eso pasa por la XOR, verifica que tienes un pulso de un ancho proporcional al desfaseje Tensión-Corriente.
Si, funciona todo bien, lo tengo probando con una luz led, con una de bajo consumo y una resistiva.
Quiero ponerle un smoothing para que los valores no cambien tan rapidos y para que se muevan mas suave, la verdad es que no sabia si iba a funcionar este proyecto pero termino siendo bastante preciso.

#### surbyte

#3
##### Mar 21, 2019, 08:50 pm
Si claro que lo es.

Y el resultado de pulsein cual es.. puedes poner un listado de valores leidos. No el promedio.. solo lo que pulsein devuelve.

Go Up