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

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

Uma rede de sensores é incorporada em todos os...
O controlador do motor é um dos componentes mais...
ESP32-CAM é um módulo de câmera compacto que combina...
A evolução dos padrões USB foi fundamental para moldar...
A SCHURTER anuncia um aprimoramento para sua conhecida série...
A Sealevel Systems anuncia o lançamento da Interface Serial...
A STMicroelectronics introduziu Diodos retificadores Schottky de trincheira de...
Determinar uma localização precisa é necessário em várias indústrias...
O novo VIPerGaN50 da STMicroelectronics simplifica a construção de...
A Samsung Electronics, fornecedora de tecnologia de memória avançada,...
O mercado embarcado tem uma necessidade de soluções de...
Você provavelmente já se deparou com o termo 'arrastar'...
Você provavelmente tem um Isolador de suporte Se você...
Você provavelmente já viu permanecer um isolante sente-se em...
Você provavelmente já viu Isoladores de manilha entronizados em...
Você provavelmente já passou por situações em que o...
Torna al blog

Lascia un commento

Si prega di notare che, prima di essere pubblicati, i commenti devono essere approvati.