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:
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:
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.
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:
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 = ' ';
// 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 = ' ';
// 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.
Este obra está licenciado com uma Licença Creative Commons Atribuição-NãoComercial 4.0 Internacional.