Circuito divisor de tensão em Javascript

Circuito divisor resistivo

Há algum tempo adicionei uma página no site da Wantronics com um script para ajudar no projeto, e utilização de circuitos divisores de tensão com resistores. De forma a melhorar a calculadora já existente no site, compartilhar novos conhecimentos, e adicionar mais funcionalidades ao script, estou escrevendo este post onde mostro código que fiz e caso o leitor tenha sugestão de melhorias, ou uma forma melhor de implementar a calculadora, se possível faça um comentário com o código, ou pontos a melhorar para enriquecer o blog ainda mais.

Saber programar é um habilidade muito importante para os engenheiros eletrônicos, mas saber programar não é apenas dominar uma linguagem de programação específica. Um bom programador possui conhecimentos de algoritmos, lógica, matemática, e como encontrar a melhor forma de solucionar um problema.

Antes de começar a criar a nossa calculadora de circuito divisor de tensão em Javascript, vamos fazer uma análise do circuito divisor de tensão, seu funcionamento e manipular as equações.

Circuito divisor de tensão resistivo

Inicialmente vamos analisar um circuito divisor de tensão como o mostrado na figura a seguir:

Circuito divisor de tensão resistivo

Quando aplicamos uma tensão na entrada do circuito em VIn, circula uma corrente através dos resistores R1 e R2, e essa corrente é igual nos dois resistores, e pode ser encontrada facilmente pela equação abaixo:

Equação para encontrar a corrente em um circuito divisor resistivo

Com o valor da corrente calculado, agora é possível encontrar o valor da tensão em R2, que será a mesma tensão de saída do circuito divisor resistivo.

Encontrando o valor da tensão de saída

Foram feitos dois passos para encontrar o valor da tensão de saída, e isso seria duas instruções a mais em nosso código. Nesse caso, executar essas duas instruções a mais não é um problema, mas imagine uma situação que envolva uma quantidade de maior de cálculos e operações de decisão. Para melhorar o nosso código, vamos otimizar a equação.

Analisando as duas equações, podemos observar na equação da tensão de saída que é utilizado o valor da corrente, e já sabemos como encontrar a corrente do nosso circuito, que foi mostrado na primeira equação. Vamos trocar o valor da corrente ‘I’ na segunda equação, pela primeira equação, e assim obtemos a equação do circuito divisor de tensão resistivo:

Equação do circuito divisor de tensão

A manipulação algébrica acima pode ser encontrada em livros de análise circuito, mas é muito importante ter esses conhecimentos na hora de escrever um código, pois podemos obter um resultado melhor aplicando essas otimizações, e até mesmo executar a mesma tarefa com uma quantidade menor de instruções. Isso é válido para qualquer linguagem de programação.

Programando nossa calculadora de circuito divisor de tensão em Javascript

Inicialmente preciso informar que a calculadora está funcionando e tem uma página no blog onde é possível testar os valores e usar sem nenhum problema, mas o código não foi escrito da melhor forma, e também existem várias maneiras de se obter o mesmo resultado, ou como na análise algébrica acima, é possível criar a mesma calculadora com as mesmas funcionalidades com um código mais limpo.

Além disso, a calculadora conta com outros recursos e outros cálculos que não foram mostrados na primeira parte do post. Abaixo é mostrado o código do Javascipt da calculadora de circuito divisor de tensão.

<style>
h2 {
  color: black;
}
h5 {
  color: blue;
}
h6 {
  color: black;
}

</style>

<h5>VIn</h5>
<input id="Vin">
<h5>R1</h5>
<input id="R1">
<h5>R2</h5>
<input id="R2"> 
<br><br>

<button type="buttom" onclick="calculaDivisor();" style="margin-bottom:15px;">Calcular</button>
<br><br>
<h5 id="resultadoVIn">VIn = 0</h5>

<h5 id="resultadoVOut">VOut = 0</h5>

<h5 id="resultadoI">I = 0</h5>

<h5 id="resultadoR1">R1 = 0</h5>

<h5 id="resultadoR2">R2 = 0</h5>

<h5 id="resultadoPotR1">Potência de R1 = 0</h5>

<h5 id="resultadoPotR2">Potência de R2 = 0</h5>

<script>
  function calculaDivisor() {
     var Vin = document.getElementById ("Vin");
     var resUm = document.getElementById ("R1");
     var resDois = document.getElementById ("R2");
     var corrente;
     var VOut;
     var potR1;
     var potR2;
     
     if ((resUm.value == "") || (resDois.value == "") || (Vin.value == "")) {
          document.getElementById("resultadoVIn").innerHTML = "Preencha com todos os valores";
          document.getElementById("resultadoVOut").innerHTML = "";
          document.getElementById("resultadoI").innerHTML = "";
          document.getElementById("resultadoR1").innerHTML = "";
          document.getElementById("resultadoR2").innerHTML = "";
          document.getElementById("resultadoPotR1").innerHTML = "";
          document.getElementById("resultadoPotR2").innerHTML = "";

          document.getElementById("Vin").value = "";
          document.getElementById("R1").value= "";
          document.getElementById("R2").value= "";
}

else if ((Number(resDois.value) < 0) || (Number(resUm.value < 0))) {
          document.getElementById("resultadoVIn").innerHTML = "Os valores dos resistores devem ser maior do que 0";
          document.getElementById("resultadoVOut").innerHTML = "";
          document.getElementById("resultadoI").innerHTML = "";
          document.getElementById("resultadoR1").innerHTML = "";
          document.getElementById("resultadoR2").innerHTML = "";
          document.getElementById("resultadoPotR1").innerHTML = "";
          document.getElementById("resultadoPotR2").innerHTML = "";

          document.getElementById("Vin").value = "";
          document.getElementById("R1").value= "";
          document.getElementById("R2").value= "";
      }
   else{
          VOut =  Vin.value * (parseFloat(resDois.value) / (parseFloat(resUm.value )+ parseFloat(resDois.value))); // Vin * (R2) / (R1 + R2)
          corrente = Vin.value / (parseFloat(resUm.value )+ parseFloat(resDois.value));
          potR1 = parseFloat(resUm.value) * corrente * corrente;
          potR2 = parseFloat(resDois.value) * corrente * corrente;
          
          VOut = engNotation(VOut);
          corrente = engNotation(corrente);
          potR1 = engNotation(potR1);
          potR2 = engNotation(potR2);
          Vin.value = engNotation(Vin.value);
          resUm.value = engNotation(resUm.value);
          resDois.value = engNotation(resDois.value);

          
          document.getElementById("resultadoVIn").innerHTML = "VIn = " + Vin.value + " V";
          document.getElementById("resultadoVOut").innerHTML = "Vout = " + VOut + " V";
          document.getElementById("resultadoR1").innerHTML = "R1 = " + resUm.value + " Ω";
          document.getElementById("resultadoR2").innerHTML = "R2 = " + resDois.value + " Ω";
          document.getElementById("resultadoI").innerHTML = "I = " + corrente + " A";
          document.getElementById("resultadoPotR1").innerHTML = "Potência de R1 = " + potR1 + " W";
          document.getElementById("resultadoPotR2").innerHTML = "Potência de R2 = " + potR2 + " W";


          document.getElementById("Vin").value = "";
          document.getElementById("R1").value= "";
          document.getElementById("R2").value= "";
}

function engNotation(number) {
    var space = '&thinsp;';

    // Giga
    if(number >= 1e10)
        return (number / 1e9).toFixed(3) + space + 'G';
    else if(number >= 1e9)
        return (number / 1e8).toFixed(3) / 10 + space + 'G';

    // Mega
    else if(number >= 1e7)
        return (number / 1e6).toFixed(3) + space + 'M';
    else if(number >= 1e6)
        return (number / 1e5).toFixed(3) / 10 + space + 'M';

    // Kilo
    else if(number >= 1e4)
        return (number / 1e3).toFixed(3) + space + 'k';
    else if(number >= 1e3)
        return (number / 1e2).toFixed(3) / 10 + space + 'k';
		
	else if(number >= 1)
        return (number / 1e0).toFixed(3) + space + '';
		
//-----------------------------------------------------------------
	//pico
	// nano
	else if(number <= 1e-12)
        return (number * 1e12).toFixed(3) + space + 'p';
    else if(number <= 1e-11)
        return (number * 1e12).toFixed(3) + space + 'p';
	else if(number <= 1e-10)
        return (number * 1e12).toFixed(3) + space + 'p';
	
	// nano
	else if(number <= 1e-9)
        return (number * 1e9).toFixed(3) + space + 'n';
    else if(number <= 1e-8)
        return (number * 1e9).toFixed(3) + space + 'n';
	else if(number <= 1e-7)
        return (number * 1e9).toFixed(3) + space + 'n';
		
	// micro
	else if(number <= 1e-6)
        return (number * 1e6).toFixed(3) + space + 'μ';
    else if(number <= 1e-5)
        return (number * 1e6).toFixed(3) + space + 'μ';
	else if(number <= 1e-4)
        return (number * 1e6).toFixed(3) + space + 'μ';
 	
	// mili
	else if (number <= 1e-3)
	    return (number * 1e3).toFixed(3) + space + 'm';
	else if (number <= 1e-2)
	    return (number * 1e3).toFixed(3) + space + 'm';
	else if (number <= 1e-1)
	    return (number * 1e3).toFixed(3) + space + 'm';	

	else
        return (number / 1e-1).toFixed(3) / 10 + space + '';    
}

}
</script>

O código acima é uma mistura de HTML, CSS e Javascript. O código calcula a tensão de saída, a corrente e a potência dissipada nos dois resistores. Além disso possui uma função que adiciona a notações de engenharia nos resultados finais.

Abaixo é possível fazer o teste da calculadora:

VIn
R1
R2




VIn = 0
VOut = 0
I = 0
R1 = 0
R2 = 0
Potência de R1 = 0
Potência de R2 = 0

As vezes, quando trabalhamos com circuitos divisores de tensão, queremos saber os valores dos resistores, e temos o valor da tensão de entrada, o valor da tensão de saída, e qual a corrente máxima que o circuito pode consumir. Para isso, fiz o código a seguir:

<style>
h2 {
  color: black;
}
h5 {
  color: blue;
}
h6 {
  color: black;
}
</style>

<h5>VIn</h5>
<input id="Vin_C2">
<h5>VOut</h5>
<input id="VOut_C2">
<h5>I</h5>
<input id="Iin_C2"> 
<br><br>

<button type="buttom" onclick="calculaResistores();" style="margin-bottom:15px;">Calcular</button>
<br><br>
<h5 id="resultadoVIn_C2">VIn = 0</h5>

<h5 id="resultadoVOut_C2">VOut = 0</h5>

<h5 id="resultadoI_C2">I = 0</h5>

<h5 id="resultadoR1_C2">R1 = 0</h5>

<h5 id="resultadoR2_C2">R2 = 0</h5>

<h5 id="resultadoPotR1_C2">Potência de R1 = 0</h5>

<h5 id="resultadoPotR2_C2">Potência de R2 = 0</h5>

<script>
  function calculaResistores() {
     var VIn_C2 = document.getElementById ("Vin_C2");
     var Vout_C2 = document.getElementById ("VOut_C2");
     var Corrente_C2 = document.getElementById ("Iin_C2");
     var resistorA_C2;
     var resistorB_C2;
     var potR1_C2;
     var potR2_C2;

       if ((VIn_C2.value == "") || (Vout_C2.value == "") || (Corrente_C2.value == "")) {
          document.getElementById("resultadoVIn_C2").innerHTML = "Preencha com todos os valores";
          document.getElementById("resultadoVOut_C2").innerHTML = "";
          document.getElementById("resultadoI_C2").innerHTML = "";
          document.getElementById("resultadoR1_C2").innerHTML = "";
          document.getElementById("resultadoR2_C2").innerHTML = "";
          document.getElementById("resultadoPotR1_C2").innerHTML = "";
          document.getElementById("resultadoPotR2_C2").innerHTML = "";
          
          document.getElementById("Vin_C2").value = "";
          document.getElementById("VOut_C2").value= "";
          document.getElementById("Iin_C2").value= "";
         
}
   else if (parseFloat(VIn_C2.value) < parseFloat(Vout_C2.value)) {
          document.getElementById("resultadoVIn_C2").innerHTML = "A tensão de entrada deve ser maior que a tensão de saída";
          document.getElementById("resultadoVOut_C2").innerHTML = "";
          document.getElementById("resultadoI_C2").innerHTML = "";
          document.getElementById("resultadoR1_C2").innerHTML = "";
          document.getElementById("resultadoR2_C2").innerHTML = "";
          document.getElementById("resultadoPotR1_C2").innerHTML = "";
          document.getElementById("resultadoPotR2_C2").innerHTML = "";

          document.getElementById("Vin_C2").value = "";
          document.getElementById("VOut_C2").value= "";
          document.getElementById("Iin_C2").value= "";
}
    else if (parseFloat(Corrente_C2.value) == 0) {
          document.getElementById("resultadoVIn_C2").innerHTML = "A corrente deve ser diferente de 0";
          document.getElementById("resultadoVOut_C2").innerHTML = "";
          document.getElementById("resultadoI_C2").innerHTML = "";
          document.getElementById("resultadoR1_C2").innerHTML = "";
          document.getElementById("resultadoR2_C2").innerHTML = "";
          document.getElementById("resultadoPotR1_C2").innerHTML = "";
          document.getElementById("resultadoPotR2_C2").innerHTML = "";

          document.getElementById("Vin_C2").value = "";
          document.getElementById("VOut_C2").value= "";
          document.getElementById("Iin_C2").value= "";
}
   else  {
      
          resistorA_C2 = (VIn_C2.value - Vout_C2.value) / Corrente_C2.value;
          resistorB_C2 = Vout_C2.value / Corrente_C2.value;
          potR1_C2 = resistorA_C2 * Corrente_C2.value * Corrente_C2.value;
          potR2_C2 = resistorB_C2 * Corrente_C2.value * Corrente_C2.value;
          
          resistorA_C2 = engNotation(resistorA_C2);
          resistorB_C2 = engNotation(resistorB_C2);
          potR1_C2 = engNotation(potR1_C2);
          potR2_C2 = engNotation(potR2_C2);
          VIn_C2.value = engNotation(VIn_C2.value);
          VOut_C2.value = engNotation(VOut_C2.value);
          Corrente_C2.value = engNotation(Corrente_C2.value);

          document.getElementById("resultadoVIn_C2").innerHTML = "VIn = " + VIn_C2.value + " V";
          document.getElementById("resultadoVOut_C2").innerHTML = "VOut = " + Vout_C2.value + " V";
          document.getElementById("resultadoI_C2").innerHTML = "I = " + Corrente_C2.value + " A";
          document.getElementById("resultadoR1_C2").innerHTML = "R1 = " + resistorA_C2 + " Ω";
          document.getElementById("resultadoR2_C2").innerHTML = "R2 = " + resistorB_C2 + " Ω";
          document.getElementById("resultadoPotR1_C2").innerHTML = "Potência de R1 = " + potR1_C2 + " W";
          document.getElementById("resultadoPotR2_C2").innerHTML = "Potência de R2 = " + potR2_C2 + " W";
}

          document.getElementById("Vin_C2").value = "";
          document.getElementById("VOut_C2").value= "";
          document.getElementById("Iin_C2").value= "";

}


function engNotation(number) {
    var space = '&thinsp;';

    // Giga
    if(number >= 1e10)
        return (number / 1e9).toFixed(3) + space + 'G';
    else if(number >= 1e9)
        return (number / 1e8).toFixed(3) / 10 + space + 'G';

    // Mega
    else if(number >= 1e7)
        return (number / 1e6).toFixed(3) + space + 'M';
    else if(number >= 1e6)
        return (number / 1e5).toFixed(3) / 10 + space + 'M';

    // Kilo
    else if(number >= 1e4)
        return (number / 1e3).toFixed(3) + space + 'k';
    else if(number >= 1e3)
        return (number / 1e2).toFixed(3) / 10 + space + 'k';
		
	else if(number >= 1)
        return (number / 1e0).toFixed(3) + space + '';
		
//-----------------------------------------------------------------
	//pico
	// nano
	else if(number <= 1e-12)
        return (number * 1e12).toFixed(3) + space + 'p';
    else if(number <= 1e-11)
        return (number * 1e12).toFixed(3) + space + 'p';
	else if(number <= 1e-10)
        return (number * 1e12).toFixed(3) + space + 'p';
	
	// nano
	else if(number <= 1e-9)
        return (number * 1e9).toFixed(3) + space + 'n';
    else if(number <= 1e-8)
        return (number * 1e9).toFixed(3) + space + 'n';
	else if(number <= 1e-7)
        return (number * 1e9).toFixed(3) + space + 'n';
		
	// micro
	else if(number <= 1e-6)
        return (number * 1e6).toFixed(3) + space + 'μ';
    else if(number <= 1e-5)
        return (number * 1e6).toFixed(3) + space + 'μ';
	else if(number <= 1e-4)
        return (number * 1e6).toFixed(3) + space + 'μ';
 	
	// mili
	else if (number <= 1e-3)
	    return (number * 1e3).toFixed(3) + space + 'm';
	else if (number <= 1e-2)
	    return (number * 1e3).toFixed(3) + space + 'm';
	else if (number <= 1e-1)
	    return (number * 1e3).toFixed(3) + space + 'm';	

	else
        return (number / 1e-1).toFixed(3) / 10 + space + '';    
}

</script>

E abaixo é possível fazer o teste da calculadora:

VIn
VOut
I




VIn = 0
VOut = 0
I = 0
R1 = 0
R2 = 0
Potência de R1 = 0
Potência de R2 = 0

Ainda existem muitas melhorias tanto nas funcionalidades, quanto na forma como o código foi escrito, que podem ser feitas nas duas calculadoras. Além disso podem ser adicionadas novas funcionalidades, ou ser criadas outras calculadoras para outros problemas, e podem ser utilizadas outras linguagens de programação.

Abaixo segue o link para página das calculadoras da Wantronics.

E abaixo o link para calculadora para circuitos divisores de tensão feito em Javascript.

Licença Creative Commons
Este obra está licenciado com uma Licença Creative Commons Atribuição-NãoComercial 4.0 Internacional.