I'm developing a system to measure the power factor between two waves and using a XOR to get the time between them.

The programming and the circuit seems fine but some times I get the power factor as 1 and I don't know from where it comes.

Below is the code that I developed and the proteus circuit.

#include <LiquidCrystal.h> // Adiciona a biblioteca para o display LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Define as pinagens nas quais o LCD será conectado
int sinal_4030 = 13; // Define o pino 13 como a entrada do sinal do CI 4030

float radianos = (180/PI); // Realiza a conversão de radianos para graus
double graus = 360; // Define como 360 o grau máximo para um período
double frequencia = 60; // Define a frequência do sistema
float periodo = (1/frequencia);// Define o período em microssegundos
int tensao = 220; // Define a tensão do sistema

float fp; // Define a variável fator de potência
float angulo; // Define a variável ângulo
int amostras; // Define uma variável de amostras
float duracao;
float duracao_ms;

void setup()
  pinMode(sinal_4030, INPUT); // Define o pino sinal_4030 como entrada
  lcd.begin(16,2); // Inicia o LCD 16x2
void loop()
 void medicao_fp()
for (amostras = 0; amostras <= 10000; amostras++); // Colhe 10000 amostras do sinal

// Realiza o cálculo para encontrar o ângulo com a seguinte fórmula
// angulo = ((duracao * 360)/(período))

duracao = pulseInLong(sinal_4030, HIGH,10000000); // Colhe a duração do pulso de entrada
duracao_ms = duracao/1000.0; // Realiza a conversão do pulso para milissegundos
angulo = (((duracao_ms*graus)/periodo)/1000.0); // Calcula o ângulo conforme a equação do ângulo descrito
fp = cos(angulo/radianos); // Calcula o fator de potência
delay(500); // Aguarda o tempo de 0,5 segundo para a próxima iteração do laço for
lcd.print("FP ="); // Imprime na tela do LCD "FP ="
lcd.setCursor(5,0); // Seleciona a posição 5,0 (col,lin) no LCD para imprimir "FP ="
lcd.print(fp); // Imprime a variável fp
lcd.setCursor(0,1); // Seleciona a posição 0,1 (col,1) no LCD para imprimir o valor do fp
lcd.print("Angulo ="); // Imprime na tela do LCD "Angulo ="
lcd.setCursor(9,1); // Seleciona a posição 9,1 (col,lin) no LCD para imprimir "Angulo ="
lcd.print(angulo); // Imprime a variável angulo

System working

Wrong value measured

  • 1. Please, post a version of your code that does compile. 2. This: for (amostras = 0; amostras <= 10000; amostras++); serves no useful purpose and will be optimized-out by the compiler. – Edgar Bonet May 18 at 16:35

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.