Desenvolvendo uma Fonte Simétrica com Arduino Nano

Fala galera tudo beleza? Hoje vamos aprender a desenvolver uma fonte simétrica com Arduino Nano! A fonte simétrica é muito utilizada quando se necessita de tensões positivas e negativas como na alimentação de circuitos com amplificadores operacionais, amplificadores de áudio de potência, comparadores de tensão e conversores Analógicos/Digitais, etc.

A fonte de alimentação simétrica pode ser, basicamente, composta por duas fontes de alimentação ligadas
entre si, sendo que um dos terminais de uma fonte é conectado ao terminal complementar da outra fonte. O terminal em comum na fonte de alimentação simétrica é conectado ao GND do sistema que formará a referência. Com esse arranjo da fonte de alimentação simétrica, obtêmse duas fontes com polaridades invertidas. Nesse caso, a tensão de alimentação precisar ser sempre maior que o dobro da tensão simétrica.

Projetando uma fonte com Arduino

Agora, vamos projetar uma fonte simétrica com nosso famoso Arduino Nano para fazer todo o
controle, nossa fonte terá:


• SAÍDA DE +5 e -5 VOLTS / 2.7A
• SAÍDA DE +12 e -12 VOLTS / 2.7A
• SAÍDA AJUSTÁVEL DE ATÉ 17.7 VOLTS / 3ª
• VENTILAÇÃO AUTOMÁTICA
• PROTEÇÃO CONTRA CORRENTE ELEVADA

Iniciamos o nosso projeto com utilização de 3 fontes, uma dica: utilize fonte de carregador de
notebooks, são fáceis de encontrar em sucata e tem uma excelente corrente além do tamanho
compacto, como mostra a figura 01.

Figura 01 – Carregadores de notebooks

Para obtermos tensões simétricas, vamos utilizar duas fontes, no nosso caso, duas fontes de
12V, de forma que teremos a conexão como visto na figura 02, para a simetria.

Figura 02 – Fonte simétrica a partir de duas fontes comuns

A terceira fonte, poderá ser de qualquer tensão, respeitando o limite dos componentes, no nosso caso, iremos utilizar uma fonte de 19V para a saída ajustável. Para o controle inicial da nossa fonte, todas as saídas contarão com um relé para o acionamento e desligamento, na fonte simétrica iremos utilizar um relé duplo e um relé comum para a saída ajustável.

Como temos duas fontes de 12V, já temos a nossa disposição a primeira saída de +12V |-12V, a próxima etapa consiste em usar reguladores da família 7805(5V positivos) e 7905(5V negativos), aplicando transistores darlington TIP121 e TIP127, como visto no datasheet dos componentes, chegamos a montagem da figura 03, esse é o exemplo para o regulador 7805.

Figura 03 – Sugestão de montagem para o 7805 com maior corrente de saída.

Circuito final

Para monitorar a corrente das nossas saídas, vamos utilizar o ACS712, um sensor de corrente
por efeito hall, para as saídas simétricas. Para a saída ajustável, iremos utilizar um resistor shunt. Agora,
o que precisamos fazer e finalizar toda a montagem do nosso circuito, na figura 04, temos o circuito final
no simulador.

Figura 04 – Circuito completo da fonte

Mergulhando no código

Nosso código faz o uso de uma biblioteca excelente para resolver o grande problema das entradas analógicas do Arduino: ruídos! Iremos utiliza a biblioteca ResponsiveAnalogRead, desenvolvida por Damien Clarke. Com ela, vamos evitar as oscilações e variações bruscas de leituras.


No código, também desenvolvemos a ventilação automática baseada da temperatura lida pelo lm35, além de controle para corrente elevadas, na qual, irá desabilitar as saídas caso isso ocorra, além dos botões para o usuário habilitar o desligar as saídas.

Este tutorial é uma parceira entre a Arduino Ômega e o Canal Engenharia Entendida, confira o tutorial completo no vídeo abaixo:

A seguir, temos o código completo:

//===========================================================Configurações iniciais====================================================//
#include <LiquidCrystal.h> //Biblioteca do display
#include <ResponsiveAnalogRead.h> //Biblioteca para leituras analógicas
LiquidCrystal lcd(3,2,9,10,11,12); //Configura os pinos do display
#define Read5V_Positivo A5 //Leitura corrente +5V
#define Read5V_Negativo A3 //Leitura corrente -5V
#define Read12V_Positivo A6 //Leitura corrente +12V
#define Read12V_Negativo A4 //Leitura corrente -12V
#define ReadAdj A2 //Leitura corrente da saída ajustável
#define ReadAdjVolt A1 //Leitura tensão da saída ajustável
#define Lm35 A7 //Pino do Lm35
#define Control0 7 //Relé para saídas ajustável
#define Control1 8 //Relé para saídas fixas
#define Fan 4 //Pino que aciona a ventilação
#define AdjON 6 //Botão para saída ajustável
#define FixedON 5 //Botão para saídas fixas
String AdjONStatus="OFF"; //Status do botão ADJ
String FixedONStatus="OFF"; //Status do botão Fixed
String FanStatus="OFF"; //Status do fan
float Current5V_Positivo=0; //Corrente em +5V
float Current5V_Negativo=0; //Corrente em -5V
float Current12V_Positivo=0; //Corrente em +12V
float Current12V_Negativo=0; //Corrente em -12V
float Current5V=0; //Corrente total nas saídas +5V e -5V
float Current12V=0; //Corrente total da saída de +12V e -12V
float CurrentAdj=0; //Corrente na saída ajustável
float VoltAdj=0; //Tensão na saída ajustáve
float Temp=0; //Variável para a temperatura interna
int CaseStatus = 0; //Variável para status do Switch adj
int g=0;
int CaseStatus1 = 0; //Variável para status do Switch fixed
ResponsiveAnalogRead analog0(Read5V_Positivo, true); //Objeto para +5V
ResponsiveAnalogRead analog1(Read5V_Negativo, true); //Objeto para -5V
ResponsiveAnalogRead analog3(Read12V_Positivo, true); //Objeto para +12V
ResponsiveAnalogRead analog2(Read12V_Negativo, true); //Objeto para -12V
ResponsiveAnalogRead analog4(ReadAdj, true); //Objeto para Adj current
ResponsiveAnalogRead analog5(ReadAdjVolt, true); //Objeto para Adj Volt
ResponsiveAnalogRead analog6(Lm35, true); //Objeto para lm35
byte SimboloOut[8]={0b00100,0b00100,0b11111,0b00100,0b00100,0b00000,0b11111,0b00000}; //Cria o cunjunto de byte que formará o caracter ±
byte TempSimb0[8]={0b01100,0b10010,0b10010,0b01100,0b00000,0b00000,0b00000,0b00000}; //Cria o cunjunto de byte que formará o caracter °
//===============================================================Setup==================================================================//
void setup() {
 lcd.begin(20,4); //Inicia o display
 lcd.createChar(1,SimboloOut); //Passa o parâmetro SimboloOut para 1.
 lcd.createChar(2,TempSimb0); //Passa o parâmetro TempSimb0 para 2.
 pinMode(Control0,OUTPUT); //Controle do relé para saídas ajustáveis
 pinMode(Control1,OUTPUT); //Controle do relé para saídas fixas
 pinMode(Fan,OUTPUT); //Controle do fan
 pinMode(AdjON,INPUT_PULLUP); //Botão que libera a saída ajustável
 pinMode(FixedON,INPUT_PULLUP); //Botão que libera as saídas fixas
 digitalWrite(Control1,LOW); //Matém o relé da saída ajustável desativado
 digitalWrite(Control0,LOW); //Matém o relé das saídas fixas desativado
 digitalWrite(Fan,LOW); //Matém o fan desligado
 delay(500); //Tempo de acomodação de 500mS
}
//===========================================================Loop principal=============================================================//
void loop() {
 analog0.update(); //Inicia o cálculo de leitura analógica A0
 analog1.update(); //Inicia o cálculo de leitura analógica A1
 analog2.update(); //Inicia o cálculo de leitura analógica A2
 analog3.update(); //Inicia o cálculo de leitura analógica A3
 analog4.update(); //Inicia o cálculo de leitura analógica A4
 analog5.update(); //Inicia o cálculo de leitura analógica A5
 analog6.update(); //Inicia o cálculo de leitura analógica A6
//===========================================================Saída fixas================================================================//
if(digitalRead(FixedON)==LOW && FixedONStatus=="OFF"){ //Verifica se o botão foi pressionado e se as saídas fixas estão desligadas
 CaseStatus1 = 1; //Variável para controle do switch case
 delay(420); //Espera 100mS para amenizar o efeito bouncing
 digitalWrite(Control0,HIGH); //Liga as saídas fixas
 FixedONStatus="ON"; //Altera o status para ON
 }
if(digitalRead(FixedON)==LOW && FixedONStatus=="ON"){ //Verifica se o botão foi pressionado e se as saídas fixas estão ligadas
 CaseStatus1 = 0; //Variável para controle do switch case
 delay(200); //Espera 100mS para amenizar o efeito bouncing
 digitalWrite(Control0,LOW); //Desliga as saídas fixas
 FixedONStatus="OFF"; //Altera o status para OFF
 }
//===========================================================Saída ajustável============================================================//
if(digitalRead(AdjON)==LOW && AdjONStatus=="OFF"){ //Verifica se o botão foi pressionado e se a saída ajustável está desligada
 CaseStatus = 1; //Variável para controle do switch case
 delay(420); //Espera 100mS para amenizar o efeito bouncing
 digitalWrite(Control1,HIGH); //Liga a saída
 AdjONStatus="ON"; //Altera o status para ON
 }
if(digitalRead(AdjON)==LOW && AdjONStatus=="ON"){ //Verifica se o botão foi pressionado e se a saída ajustável está ligada
 CaseStatus = 0; //Variável para controle do switch case
 delay(200); //Espera 100mS para amenizar o efeito bouncing
 digitalWrite(Control1,LOW); //Desliga a saída
 AdjONStatus="OFF"; //Altera o status para OFF
 }
//===========================================================Análise de status Adj======================================================//
switch (CaseStatus){ //Variável a ser analisada
 case 1: //Caso seja 1...
//===============================================================Adj tensão=============================================================//
 VoltAdj=analog5.getValue(); //Faz a leitura analógica já estável tensão Adj
 VoltAdj=map(VoltAdj,30.0,489,1.26,17.75); //Mapeia o valor de tensão ADJ
//===============================================================Adj corrente===========================================================//
 CurrentAdj=analog4.getValue(); //Faz a leitura analógica já estável current Adj
 CurrentAdj=map(CurrentAdj,0.000,300.0,0.000,3); //Mapeia o valor do ADC para os valores de corrente
 if(CurrentAdj<0){ //Se a corrente for <0...
 CurrentAdj=0; //Zera a corrent
 }
 VoltAdj=VoltAdj-(CurrentAdj*0.8); //Subtrai o valor de tensão no Shunt
 break; //Para
 case 0: //Caso seja 0...
 VoltAdj=0; //Tensão será 0
 CurrentAdj=0; //Corrente será 0
 break; //Para
}
//===========================================================Análise de status fixas===================================================//
switch (CaseStatus1){ //Variável a ser analisada
 case 1: //Caso seja 1...
 Current5V_Positivo=analog0.getValue(); //Faz a leitura analógica já estável +5
 Current5V_Negativo=analog1.getValue(); //Faz a leitura analógica já estável -5
 Current12V_Positivo=analog3.getValue(); //Faz a leitura analógica já estável +12
 Current12V_Negativo=analog2.getValue(); //Faz a leitura analógica já estável -12
 Current5V_Positivo=map(Current5V_Positivo,510.0,413.0,0.0,2.5); //Mapeia o valor do ADC para os valores de corrente +5V
 Current5V_Negativo=map(Current5V_Negativo,510.0,407.0,0.0,2.5); //Mapeia o valor do ADC para os valores de corrente -5V
 Current12V_Positivo=map(Current12V_Positivo,513.0,420.0,0.0,2.5); //Mapeia o valor do ADC para os valores de corrente +12V
 Current12V_Negativo=map(Current12V_Negativo,509.0,408.0,0.0,2.5); //Mapeia o valor do ADC para os valores de corrente -12V

//===========================================================Evitar valores < 0========================================================//
 if(Current5V_Positivo<0.05){ //Se tensão < 0, zera...
 Current5V_Positivo=0; //Zera a tensão
 }
 if(Current12V_Positivo<0.05){ //Se tensão < 0, zera...
 Current12V_Positivo=0; //Zera a tensão
 }
 if(Current5V_Negativo<0.05){ //Se tensão < 0, zera...
 Current5V_Negativo=0; //Zera a tensão
 }
 if(Current12V_Negativo<0.05){ //Se tensão < 0, zera...
 Current12V_Negativo=0; //Zera a tensão
 }
 Current5V=Current5V_Positivo+Current5V_Negativo; //Imprime a corrente total ±5V
 Current12V=Current12V_Positivo+Current12V_Negativo; //Imprime a corrente total ±12V
 break; //Para
 case 0: //Caso seja 0...
 Current5V=0; //Corrente será 0
 Current12V=0; //Corrente será 0
 break; //Para
}
//=================================================================Proteção==========================================================//
if(Current5V>2.7||Current12V>2.7||CurrentAdj>3.2){ //Se alguma corrente estiver acima de 3A...
 digitalWrite(Control0,LOW); //Desliga as saídas fixas
 digitalWrite(Control1,LOW); //Desliga a saída ajustável
 lcd.clear(); //Limpa o display
 lcd.setCursor(5,0); //Seta o cursor
 lcd.print("OUTPUT OFF"); //Printa o status
 AdjONStatus="OFF"; //Altera o status para OFF
 FixedONStatus="OFF"; //Status OFF
 lcd.setCursor(2,2); //Seta o cursor
 lcd.print("Corrente elevada!"); //Print para corrente acima de 3A
 VoltAdj=0; //Tensão será 0
 CurrentAdj=0; //Corrente será 0
 Current5V=0; //Corrente será 0
 Current12V=0; //Corrente será 0
 CaseStatus=0; //Muda o status para OFF
 CaseStatus1=0; //Muda o status para OFF
 delay(2000); //Espera 3 segundos
}
 delay(100); //Delay de 100mS
 print(); //Chama a função de print
}
//=======================================================Tela e temperatura============================================================//
void print(){ //Função de print
g++; //Tempo para atualizar o display
if(g>8){ //Se g maior que 8...
 Temp=analog6.getValue(); //Faz a leitura analógica já estável lm35
 Temp=Temp*0.5; //Converte para graus
 if(Temp>35){ //Se for maior que 35 °C...
 digitalWrite(Fan,HIGH); //Liga o fan
 FanStatus="ON"; //Status do fan
 }
 else{ //Caso não...
 digitalWrite(Fan,LOW); //Desliga o fan
 FanStatus="OFF"; //Status do fan
 }
g=0; //Zera a variáel g
 }
 lcd.clear(); //Limpa o display
//=======================================================Tratamento para A e mA ±5=====================================================//
 lcd.print("CH1|"); //Print do canal
 lcd.write(1); //Escreve o caracter especial ±
 lcd.print("5V:"); //Print da corrent+5V e -5V
 lcd.setCursor(11,0); //Seta o cursor
 if(Current5V<1){ //Se corrente for menos que 1A...
 Current5V=Current5V*1000; //Exibirá em mili.
 lcd.print(Current5V,0); //Imprime a tensão da saída ajustável
 lcd.print("mA"); //Em mA
 }
 else{ //Se não...
 lcd.print(Current5V,2); //Imprime a corrente da saída ajustável
 lcd.print("A"); //Em A
 }
//=====================================================Tratamento para A e mA ±12=====================================================//
 lcd.setCursor(0,1); //Seta o cursor
 lcd.print("CH2|"); //Print do canal
 lcd.write(1); //Escreve o caracter especial ±
 lcd.print("12V:"); //Print da corrent+5V e -5V
 lcd.setCursor(11,1); //Seta o cursor
 if(Current12V<1){ //Se corrente for menos que 1A...
 Current12V=Current12V*1000; //Exibirá em mili.
 lcd.print(Current12V,0); //Imprime a tensão da saída ajustável
 lcd.print("mA"); //Em mA
 }
 else{ //Se não...
 lcd.print(Current12V,2); //Imprime a corrente da saída ajustável
 lcd.print("A"); //Em A
 }
//===================================================Tratamento status e Tensão Adj===================================================//

lcd.setCursor(17,0); //Seta o cursor
lcd.print(FixedONStatus); //Exibe o status da saída fixa
lcd.setCursor(17,1); //Seta o cursor
lcd.print(FixedONStatus); //Exibe o status da saída fixa
lcd.setCursor(0,2); //Seta o cursor
lcd.print("Adj|"); //Print do canal
lcd.print(float(VoltAdj)+String ("V ")); //Imprime a tensão da saída ajustável
//=======================================================Tratamento para A e mA=======================================================//
lcd.setCursor(11,2); //Seta o cursor
 if(CurrentAdj<1){ //Se corrente for menos que 1A...
 CurrentAdj=CurrentAdj*1000; //Exibirá em mili.
 lcd.print(CurrentAdj,0); //Imprime a tensão da saída ajustável
 lcd.print("mA"); //Em mA
 }
 else{ //Se não...
 lcd.print(CurrentAdj,2); //Imprime a corrente da saída ajustável
 lcd.print("A"); //Em A
 }
lcd.setCursor(17,2); //Seta o cursor
lcd.print(AdjONStatus); //Exibe o status da saída ajustável
//=======================================================Tratamento para Temperatura==================================================//
lcd.setCursor(0,3); //Seta o cursor
lcd.print("T:"); //Imprime C
lcd.print(Temp,1); //Imprime temperatura
lcd.write(2); //Imprime o caracter °
lcd.print("C"); //Imprime C
lcd.setCursor(13,3); //Seta o cursor
lcd.print("FAN:"); //Imprime fan
lcd.print(FanStatus); //Imprime C
delay(200); //Delay de 200mS
}
//=========================================================Configura a função 'mapf"===================================================//
float map(float x, float in_min, float in_max, float out_min, float out_max){ //Range de valores mínimos e máximos
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; //Retorna os valores como float

Conclusão

Abaixo temos algumas fotos do nosso projeto concluído:

O que temos aqui é um pequeno resumo desse projeto, todas as etapas explicadas etapa por etapa, estão no nosso canal, onde temos o total de 6 vídeos passo a passo desse projeto, somos o canal Engenharia Entendida, e lá temos esse e outros projetos!


Confira o tutorial completo em vídeo: http://bit.ly/2MFaFzR!

Sobre Eng. Dhanuzio Alves 1 artigo
Eng. Dhanuzio Alves | Engenheiro de Controle e Automação | Técnico em Mecatrônica | Hobista DIY

Seja o primeiro a comentar

Deixe uma resposta

O seu endereço de email não será publicado.


*