Voltímetro miniatura com monitor de tensão da bateria

Exibição de voltímetro em miniatura baseado em AVR Attiny85 e indicador de nível de bateria
Fig. 1: Imagem mostrando a leitura de tensão no voltímetro miniatura baseado no AVR Attiny85 e no monitor de tensão da bateria
Na maioria das vezes, a medição em circuitos eletrônicos é feita medindo a tensão CC. Normalmente, colocaremos o multímetro no modo de tensão CC e verificaremos os níveis de tensão em vários pontos da PCB… Normalmente, colocaremos o multímetro no modo de tensão CC e verificaremos os níveis de tensão em vários pontos da PCB. Principalmente, nossa exigência está entre 5V e 15V DC. O circuito mostrado é simples, ocupa menos espaço e pode ser conectado diretamente à tensão CC para medição. Para minimizar o tamanho e o consumo de energia, MCU de 8 pinos e 0,96” OLED é usado no circuito.
O Voltímetro Miniatura possui dois modos de operação. No primeiro modo (modo bateria de 12V), pode ser conectado diretamente à bateria de 12V, para medir a tensão e monitorar o status da bateria. No segundo modo (modo voltímetro de 20 VCC), funciona como um voltímetro CC normal, que pode medir de 0,0 a 20,0 VCC.
Dois jumpers J1 e J2 foram fornecidos para escolher entre o modo 1 e o modo 2. Uma vez selecionado o modo, o Attiny85 MCU mede continuamente a tensão através de seu canal ADC, no pino 7 e converte-a em valor digital. O valor do ADC é convertido no valor de tensão correspondente usando um algoritmo no código. No modo bateria, dependendo do valor do ADC, diferentes status da bateria (BAIXA, Carregada, Sobrecarregada, etc.), juntamente com o nível de tensão atual da bateria, são exibidos no OLED. No modo voltímetro, o nível de tensão correspondente é exibido no OLED.
Lista de componentes: ATTINY85 – 1 não. OLED 0,96” – 1 não. LM7805 – 1 não. 1N4007 – 3 nºs. LEDs de 3 mm – 2 nós. 100uF 50V – 1 não. 10uF 16V – 1 não. Disco 0,1uF – 1 não. Trimpot 5K – 2 nós. Resistência de 10K 0,25W – 2 nós. Resistência de 4,7K 0,25W – 2 nós. Resistência de 8,6K 0,25W – 1 não. Resistência de 2,2K 0,25W – 1 não. Resistência 1K 0,25W – 1 não. Bateria de 9V – 1 não. Jumpers de 2,54 mm – 2 nós. Chave SPDT ou chave deslizante – 1 não. Diversos. = conectores, PCB, base IC, tira Berg etc. IC1 (7805) é um regulador de tensão de 5V usado para fonte de alimentação de IC2 e OLED. IC2 é um MCU de 8 pinos (ATTINY85) que é o coração do circuito. Um divisor de tensão é usado para fornecer entrada ao MCU. O controlador aceita no máximo 5 V como entrada no pino ADC. O divisor de tensão é usado para trazer a tensão abaixo de 5V. Módulo OLED (diodo emissor de luz orgânico) de display de 0,96” (com conexões de 4 pinos) é usado aqui para tornar o projeto total compacto. Apenas dois pinos (SDA e SCL) são usados ​​para transferência de dados para o display OLED e mais dois pinos para fonte de alimentação. A tela tem resolução de 128×64 pixels. O texto pequeno é exibido usando tamanho de fonte de 16X8 bits, enquanto a tensão medida é exibida como fonte de tamanho grande usando tamanho de fonte de 32×24 bits. Código Guia de programação –
Neste projeto, o ATtiny85 está programado para exibir o status de carregamento da bateria de 9V ou 12V (conforme o modo selecionado) medindo a tensão terminal da bateria. O MCU é codificado com C incorporado usando AVR Studio 4.
Constantes usado no código
#define F_CPU 1000000UL :- Constante usada para definir a frequência do clock do MCU
#define BLINKER 0b00000001 :- Constante usada para piscar o LED como indicação de que o MCU está funcionando corretamente.
#define BATT12V 0B00000010 :- Constante usada para definir o modo de bateria de 12V.
Variáveis usado no código
A: – Variável usada para armazenar leitura analógica do canal ADC de 10 bits
V: – Variável usada para converter a leitura ADC em tensão e indicar o status da bateria
Prev_mode: – Variável usada para indicar o modo de bateria anterior (modo de bateria de 12V ou 20V)
current_mode: – Variável usada para indicar o modo atual da bateria (modo bateria de 12V ou 20V)
dispstr(6)={'0′,'0′,'.','0′,'/',0} :- Matriz usada para definir o formato do OLED
Arquivos de cabeçalho e bibliotecas usado no código
#include : – Cabeçalho AVR padrão para entrada e saída
#include : – Cabeçalho AVR padrão para fornecer atrasos de tempo
#include Cabeçalho AVR padrão incluindo utilitários de espaço de programa
#include “OLED_LIB.C”: – Biblioteca de uso geral contendo funções para trabalhar com OLED de 0,96”. Esta biblioteca pode ser usada com qualquer microcontrolador AVR. Observe que OLED_LIB define o pino 2 como SDA e o pino 3 como SCL de ATtiny85.
#include “FONT_BASIC_16x8.H”: – Este arquivo de cabeçalho contém alfabeto, números e símbolos de tamanho 16 × 8 pixels (pequeno).
#include OLED_NUMS_32x24.H: – Este arquivo de cabeçalho contém apenas números de tamanho de 32 × 24 pixels (grande) para exibir o valor da tensão.
Funções usado no código
ADC_init : – função usada para inicializar o canal ADC.
readADC : – função usada para ler a tensão analógica do canal ADC 1
OLED_init : – função usada para iniciar a exibição OLED
OLED_floodfill : – função usada para exibir luz brilhante passando o parâmetro 0xFF ou limpar OLED passando o parâmetro 0x00.
Algoritmo –
1) Quando o circuito do voltímetro é ligado, em primeiro lugar, o OLED é inicializado e verificado exibindo uma luz brilhante. Em seguida, o display OLED é apagado e uma mensagem de boas-vindas – “Bem-vindo ao Voltímetro Miniatura” pisca nele. O MCU começa a piscar um LED para indicar que está funcionando corretamente. O MCU verifica o status do modo bateria (modo 12V ou 20V) verificando a entrada digital no pino 6 do Attiny85. Agora o controlador está pronto para fazer leituras de tensão.

DDRB = BLINKER;

OLED_init ; //começa a exibir OLED

_atraso_ms(10);

OLED_floodfill(0xFF); // exibe OLED com luz brilhante como autoteste

_atraso_ms(500);

ADC_init ; // inicializa o sistema ADC

OLED_floodfill(0x00); //exibição em branco do OLED

_atraso_ms(500);

OLED_show_str_16x8 ( ”BEM-VINDO A“,6,0); // uma mensagem de boas-vindas

OLED_show_str_16x8 ( ”MINIATURA“,11,3); //é exibido no OLED

OLED_show_str_16x8 ( ” VOLTÍMETRO “,6,6); // como autoteste de exibição de texto em OLED

_atraso_ms(1000);

OLED_floodfill(0x00); //exibição em branco do OLED

_atraso_ms(300);

2) O usuário pode fazer a leitura de tensão de uma fonte de tensão padrão (ou conhecida) e ajustar o respectivo potenciômetro (de acordo com o modo atual da bateria) para calibrar o voltímetro. Neste circuito, o voltímetro é calibrado usando uma fonte de tensão padrão de 12 V onde a leitura ADC é ajustada para 900 (para entrada de 12 V) no modo bateria de 12 V e 750 (para entrada de 12 V) no modo bateria de 20 V. Após a calibração, espera-se que o voltímetro em miniatura forneça leituras de tensão exatamente precisas.

3) O MCU detecta a tensão da bateria de 12 V ou 20 V no pino 7 (Canal ADC 1) usando a função readADC e armazena esse valor lido na variável A. O ATtiny85 possui canal ADC de 10 bits, então a leitura do ADC (armazenada em variável A) pode variar de 0 a 1023. Para comparação de tensão para indicar o status da bateria, a leitura ADC de 750 é equivalente a 12 V no caso do modo bateria de 20 V e a leitura ADC de 900 é equivalente a 12 V no caso do modo bateria de 12 V .
4) O valor armazenado em A é convertido em tensão e armazenado na variável V assumindo que o valor de A sendo 750 (no caso do modo bateria de 20V) ou 900 (no caso do modo bateria de 12V) é equivalente à tensão real de 12V. Observe que as condições para indicar o status da bateria são definidas no código de acordo. A suposição acima é derivada da calibração do voltímetro miniatura. No modo bateria de 20 V, usando tensão conhecida de 12 V, a leitura do ADC é calibrada para 750 usando o potenciômetro. Da mesma forma, no modo bateria de 12V, ao usar a tensão conhecida de 12V, a leitura do ADC é calibrada para 900 usando o respectivo potenciômetro. Observe que a conversão da leitura do ADC em tensão depende aqui da calibração. A fórmula padrão para conversão de terminação única (Vin = ADC*Vref/1024) não é usada no código, considerando o fato de que a tensão de repouso de baterias diferentes pode ser diferente e pode não se ajustar a uma equação de calibração padrão.
PORTB ^= BLINKER;                         // toggle blinker to indicate MCU is working
A = readAdc ( 1 );                               // read ADC value from channel no 1
curr_mode = (PINB & BATT12V);  // check the mode of operation by usage of jumper J2
// for 12V battery mode or 20VDC voltmeter
if ( prev_mode != curr_mode )
{
OLED_floodfill(0x00);
_delay_ms ( 50 );
}
if ( curr_mode>0 )
V = A/6;
else
V = A/5;
5) O valor de V é comparado em instruções else-if para indicar o status de carregamento da bateria conectada.
if ( curr_mode>0 )        // in case of 12V battery mode, appropriate status is diplayed on OLED
{
OLED_show_str_16x8 ( "12V BAT.METER",0, 0);
if ( V>150 )
OLED_show_str_16x8 ( "NOT 12V BAT  " , 0 ,6);
else if ( V>135 )
OLED_show_str_16x8 ( "OVER CHARG   " , 0 ,6);
else if ( V>120 )
OLED_show_str_16x8 ( "BATT. GOOD   " , 0 ,6);
else if ( V>100 )
OLED_show_str_16x8 ( "BATT. LOW    " , 0 ,6);
else if ( V>90 )
OLED_show_str_16x8 ( "BATT. WEAK   " , 0 ,6);
else if ( V>60 )
OLED_show_str_16x8 ( "BATT. DEAD   " , 0 ,6);
else //if ( V<30 )
OLED_show_str_16x8 ( "BATT.ABSENT  " , 0 ,6);
}
6) O valor de V é formatado em notação decimal e a tensão lida é mostrada no display OLED.
dispstr(0)=V/100+'0';
V=V%100;
dispstr(1)=V/10+'0';
dispstr(2)='.';
dispstr(3)=V%10+'0';
dispstr(4)='/';
dispstr(5)=0;
7) A leitura ADC armazenada em A é comparada com 1000 para verificar se a tensão excede a faixa designada.
if ( A>1000 )      // in case the ADC read value is out of range then display as OVERFLOW
{
OLED_show_str_16x8 ( " OVERFLOW  " , 0 ,0);
_delay_ms ( 150 );
OLED_show_str_16x8 ( "" , 0 ,0);
_delay_ms ( 100 );
}
Trabalhando: Configuração inicial:
Após montar o circuito em uma placa de circuito impresso, conecte a fonte de alimentação girando SW1 em direção à bateria de 9V. Em seguida, carregue/grave o arquivo miniVoltMeter.hex no MCU (ATTINY85) usando qualquer programador AVR.
Inicialmente, o OLED exibe todos os pixels (128×64) no modo ON, tornando a tela brilhante por um tempo. Em seguida, exibe uma mensagem de boas-vindas como BEM-VINDO AO MEDIDOR DE VOLTS MINIATURA. Em seguida, exibe a tensão aleatória, que ainda não foi calibrada.
Agora configure a placa para MODO BATERIA 12V, conectando o Jumper J1 e desconectando o Jumper J2. Em seguida, conecte uma fonte de tensão conhecida de cerca de 12 VCC ou uma bateria de 12 V aos terminais de sinal (ou conecte um multímetro paralelo aos terminais para saber a tensão de entrada exata). Agora, configure o trim-pot VR1, para mostrar no display a tensão correta no OLED.
Agora, configure a placa para VOLT METER MODE, desconectando o jumper J1 e conectando o jumper J2. Então, com a mesma fonte de tensão do sinal de entrada, ajuste o trim-pot VR2, para mostrar a tensão correta no OLED.
Agora, a calibração está concluída e o circuito está pronto para uso. Desconecte a entrada do sinal e configure a placa para um dos modos conforme a necessidade.
Existem dois modos de operação. 12V e 20V.
Para modo bateria de 12V, conecte o jumper J1 e desconecte o jumper J2. A tensão é lida pelo canal ADC do MCU e exibe a tensão da bateria no OLED em fonte grande. A linha superior do OLED é exibida como 12V BAT. METER e resultado final mostram o status da bateria como BATT.ABSENT / BATT.DEAD / BATT.WEAK / BATT.GOOD / OVER CHRG. etc.
Para modo voltímetro de 20 VCC, desconecte o jumper J1 e conecte o jumper J2. a tensão do sinal de entrada é lida pelo canal ADC do MCU e exibida em OLED com fonte grande no centro. Aqui, a linha superior do OLED mostra VOLT METER e a linha inferior mostra 20 DC VOLTS.
Em ambos os modos, se a tensão de entrada exceder o valor da tensão de entrada ADC (cerca de 5VDC), a linha superior piscará com a mensagem OVERFLOW. Caso, para ler sinais fracos ou tensões inferiores a 8VDC, o SW1 deve ser voltado para conexão da bateria de 9V. O circuito voltímetro em miniatura pode ser usado como voltímetro CC rápido para fins de mesa, monitor de tensão e status para carregadores de bateria, bancos de baterias, etc.

Código-fonte do projeto




/*
Filename : miniVoltMeter.C
author   : Fayaz Hassan
Date     : 15-02-2018
MCU      : ATtiny85 (A)
Display  : OLED (I2C)
*/
#define F_CPU 1000000UL
#include 
#include 
#include 
#include "OLED_LIB.C"
#define BLINKER 0b00000001  
#define BATT12V 0B00000010  

//========================================================================================

void ADC_init ( )
{

    ADCSRA  = ( (1 << ADPS2)   (1 << ADPS1)   (1 << ADPS0)   (1 << ADEN) ); 

}

//========================================================================================

int readAdc ( int channelno )

{

    ADMUX = (channelno%4);
    ADCSRA  = (1 << ADSC);
    while (ADCSRA & (1 << ADSC));
    return ADC;

}
//========================================================================================
int main ( )

{
    int V=0;
    int A=0;
    int prev_mode = -1;
    int curr_mode = 0;
    char dispstr(6)={'0','0','.','0','/',0};
    _delay_ms ( 500 );
    DDRB = BLINKER;
    OLED_init ;
    _delay_ms ( 10 );
    OLED_floodfill(0xFF);
    _delay_ms ( 500 );
    ADC_init ( );
    OLED_floodfill(0x00);
    _delay_ms ( 500 );
    OLED_show_str_16x8 ( " WELCOME TO ",6,0);
    OLED_show_str_16x8 ( " MINIATURE ",11,3); 
    OLED_show_str_16x8 ( " VOLT METER ",6,6); 
    _delay_ms ( 1000 );
    OLED_floodfill(0x00);
    _delay_ms ( 300 );
    readAdc ( 1 );
    readAdc ( 1 );
    while ( 1 )

{

    PORTB ^= BLINKER;
    A = readAdc ( 1 );
    curr_mode = (PINB & BATT12V);
    if ( prev_mode != curr_mode )

{

    OLED_floodfill(0x00);
    _delay_ms ( 50 );

}

    if ( curr_mode>0 )
    V = A/6;
    else
    V = A/5;
    if ( curr_mode>0 )
{

    OLED_show_str_16x8 ( "12V BAT.METER",0, 0);
    if ( V>150 )
    OLED_show_str_16x8 ( "NOT 12V BAT  " , 0 ,6);
    else if ( V>135 )
    OLED_show_str_16x8 ( "OVER CHARG   " , 0 ,6);
    else if ( V>120 )
    OLED_show_str_16x8 ( "BATT. GOOD   " , 0 ,6);
    else if ( V>100 )
    OLED_show_str_16x8 ( "BATT. LOW    " , 0 ,6);
    else if ( V>90 )
    OLED_show_str_16x8 ( "BATT. WEAK   " , 0 ,6);
    else if ( V>60 )
    LED_show_str_16x8 ( "BATT. DEAD   " , 0 ,6);
    else //if ( V<30 )
    OLED_show_str_16x8 ( "BATT.ABSENT  " , 0 ,6);
}

    else

{

    OLED_show_str_16x8 ( " VOLT METER " ,4, 0);
    OLED_show_str_16x8 ( "0-20 DC VOLTS" ,0 ,6);
}

    dispstr(0)=V/100+'0';
    V=V%100;
    dispstr(1)=V/10+'0';
    dispstr(2)='.';
    dispstr(3)=V%10+'0';
    dispstr(4)='/'; 
    dispstr(5)=0;
    if ( dispstr(0)=='0' )
    dispstr(0) = ':';
    OLED_show_str_32x24 ( dispstr , 5, 0,2);
    if ( A>1000 )

{

    OLED_show_str_16x8 ( " OVERFLOW  " , 0 ,0);
    _delay_ms ( 150 );
    OLED_show_str_16x8 ( "           " , 0 ,0);
    _delay_ms ( 100 );

}

prev_mode = curr_mode;

} 

return 0;

}

Diagramas de circuito

Circuito-Diagrama-MiniaturaVOLT-METER-cum-Battery-Tensão-Monitor

Vídeo do projeto

https://www.youtube.com/watch?v=U34_OSzjZhQ

Conteúdo Relacionado

Voltar para o blog

Deixe um comentário

Os comentários precisam ser aprovados antes da publicação.