Ao medir tensão e corrente com multímetro, as pontas de prova devem ser alteradas com cuidado. Existe a probabilidade de danificar o multímetro se a tensão for medida por engano no modo de alta corrente. Caso a tensão e a corrente sejam medidas ao mesmo tempo, temos que usar dois multímetros e deve-se tomar cuidado ao conectar ambos os multímetros.
O medidor de IVA é uma combinação de voltímetro, amperímetro e termômetro. Ele pode medir tensão e corrente simultaneamente junto com a temperatura.
O projeto é construído em ATMega8. Portanto, o leitor deve ter conhecimento de como iniciar com AVR e fazer a interface do LCD com AVR. Ele usou o sensor de corrente ACS-712 para medir a corrente e a tensão é medida pelo terminal ACD. Existem dois sensores de temperatura usados no circuito que podem medir a temperatura de dois locais diferentes, como transformador, regulador de tensão ou qualquer componente de aquecimento. Todos os dados podem ser observados em um display LCD 16×2.
Este projeto pode medir e exibir tensão máxima de até 50Volts DC e corrente máxima de até 20Amps DC. Quando a tensão excede 45 VCC ou a corrente excede 15 A ou a temperatura excede 70 graus, o display pisca o parâmetro próximo ao valor específico e um sinal sonoro é gerado.
Componentes necessários –
Diagrama de bloco –
Fig. 1: Diagrama de blocos de MEDIDOR DE IVA usando ATMega8
Conexões de Circuito –
Este dispositivo é baseado no AVR ATMega8. ATMega8 é um microcontrolador de 8 bits que pode operar até 16 MIPS de taxa de transferência com clock de 16 MHz. Aqui estamos usando o oscilador RC interno do ATMega8, que fornece clock fixo de 1,0 2,0 4,0 ou 8,0 MHz, então defina seu oscilador RC interno ATMega8 para 1 MHz.
ATMega8 tem interface com LCD 16×2, L M35 e ACS712 para fazer o dispositivo. Existe um Trimpot (mostrado como VR1 no diagrama de circuito) que é usado para ajustar o contraste do LCD. Há um LED amarelo com interface paralela a todo o circuito que é usado para indicar que a fonte de alimentação do circuito está funcionando corretamente. Há um pisca-pisca conectado no bit 0 da porta D do ATMega8 que indica que o MCU está funcionando.
Dois sensores de temperatura LM35 são usados para obter o estado da temperatura em dois locais diferentes. Ambos os LM35 estão conectados nos bits 1, 2 da porta C do ATMega8, que são os pinos 1 e 2 do ADC.
O sensor de corrente ACS712 é utilizado para medir a corrente através de uma ligação em série com uma fonte de alimentação CC. O pino OUT do ACS712 está conectado ao bit 0 da porta C do ATMega8 que é o pino 0 do ADC. A tensão é medida pelo bit 3 da porta C do ATMega8 que é o pino 3 do ADC. diagrama) que é usado para calibrar a tensão.
O transistor BC548 é usado para acionar a campainha. A base do transistor está conectada ao bit 1 da porta D do ATMega8. O coletor do transistor está conectado à campainha e o emissor está conectado ao terra.
AREF ou 21º pino do ATMega8 é conectado ao 5v via indutor de 10mH e também há um capacitor de 0,1uf conectado entre o terra e o AREF. Todo o circuito opera em 5V DC que pode ser obtido de um banco de energia de 5V ou bateria de 9V com fonte de alimentação regulada de 5V usando 7805 IC. O oscilador RC interno (1 MHz) usado com ATMega8, portanto não há necessidade de adicionar oscilador externo.
Como funciona o circuito –
Após a montagem do circuito, a porta ISP do ATmega8 deve ser conectada a qualquer programador AVR e o arquivo VATmeter.hex deve ser atualizado no microcontrolador. Em seguida, desconecte o circuito do programador AVR. Agora o dispositivo está pronto para operação.
Quando o dispositivo é ligado, o LED piscante começa a piscar e o LED exibe “Bem-vindo ao VAT METER”. Após alguns segundos, o LCD entra em estado estável que exibe a tensão, ampere e temperatura de ambos os sensores e atualiza os dados conforme a atualização na entrada do sensor.
Enquanto conectamos a fonte de alimentação DC em série com o sensor de corrente ACS712 conforme mostrado no diagrama do circuito. O LCD mostra a tensão e a corrente da bateria. Certifique-se de que a Carga está ligada em série com a bateria e o sensor de corrente ACS712 para que a corrente possa ser medida através da Carga. O sensor de temperatura pode ser colocado próximo ao componente de aquecimento para medir a temperatura.
Se a temperatura exceder 70 graus centígrados ou a tensão exceder 45 VCC ou a corrente exceder 15 ACC, o display piscará o parâmetro próximo ao valor específico e um sinal sonoro será gerado por meio de uma campainha.
Fig.1: Imagem mostrando o funcionamento do MEDIDOR DE IVA
Guia de programação –
Este dispositivo é baseado em AVR ATMega8 e é programado com C embarcado usando AVR Studio 4. Outras ferramentas de programação como Atmel Studio ou Notepad++ também podem ser usadas para escrever e compilar o código. O ATMega8 está programado para medir Tensão, Corrente e temperatura ao mesmo tempo em um único display. Este projeto pode medir tensão de até 50Volts DC e corrente máxima de até 20Amps DC.
Constantes usadas no código –
#define F_CPU 1000000L :- Constante usada para definir a frequência do clock do MCU
#define BLINKER 0b00000001 :- define o LED piscante para o bit 0 da porta D
#define ALARM 0b00000010 :- define buzzer conectado no bit 1 da porta D
#define LCD_DP PORTB: – Porta B definida como porta de controle de dados LCD
#define LCD_CP PORTD: – A porta D é definida como porta de controle do LCD
#define LCD_EN 0b10000000 : – O pino EN do LCD está conectado em 7 bits da porta D
#define LCD_RS 0b01000000 : – O pino RS do LCD está conectado em 6 bits da porta D
Variável usada no código –
AMPFADOR longo = 488; : – Para calcular o valor do ampere para o valor ADC
interno VOLTS=0; : – Para armazenar o valor da tensão
AMPS longo = 0L; : – Para armazenar o valor atual
intTEMP1=0; :- Para armazenar a temperatura do primeiro sensor
int TEMP2 = 0; :- Para armazenar a temperatura do segundo sensor
char DST(8); :- Para exibir o valor no LCD
longo A=0; : – Para armazenar inicialmente o valor ADC
loop interno = 0; :- Para controlar o piscar do parâmetro no LED
alarme interno = 0; : – Para controlar a campainha
int temparray1(5)={25,25,25,25,25}; : – Para armazenar 5 valores de temperatura para temperatura média
int temporray1pos=0; :- Para selecionar o valor da matriz de temperatura
int temparray2(5)={25,25,25,25,25}; : – Para armazenar 5 valores de temperatura para temperatura média
int temporray2pos=0; :- Para selecionar o valor da matriz de temperatura
Arquivo de cabeçalho e bibliotecas usadas no código –
#include
: – Cabeçalho AVR padrão para entrada/saída
#include : – Cabeçalho AVR padrão para fornecer atrasos de tempo
Função usada no código –
initPorts: – Para inicializar a porta como entrada ou putput
LCD_enable: – Para controlar o pino EN do LCD
LCD_WriteCmd: – comando de gravação para LCD
LCD_init: – Para inicializar o LCD no início
LCD_RowCol: – Para definir a posição do cursor
LCD_ClrScr: – Para limpar o display LCD
LCD_writeCh: – Escreve caractere no display LCD
LCD_writeStr: – Grava String no display LCD
ADC_init: – Para inicializar o ADC
ADC_read: – Leia o valor ADC
showValue: – Mostrar valor em formato específico
_delay_ms: – Para atraso de tempo
Algoritmo –
O código para este MEDIDOR de IVA usando ATMega8 funciona da seguinte maneira.
Quando o circuito do medidor de IVA é ligado, em primeiro lugar, é inicializada a porta que define a porta B e a porta D como saída. a porta C definida como entrada.
void portas de inicialização ( )
{
DDRB = 0xFF;
DDRD = 0xFF;
DRC = 0x00;
}
Após a inicialização da porta, o LED piscante foi colocado em High por algum atraso e depois invertido (definido em LOW). Além disso, o LCD é inicializado.
PORTD = BLINKER;
_atraso_ms (2000);
LCD_init ;
_atraso_ms(100);
PORTD &= (~BLINKER);
Em primeiro lugar, o LCD é limpo para remover qualquer tipo de valor lixo. Em seguida, defina o cursor para imprimir a massagem “Bem-vindo a” na primeira linha e “VAT METER” na segunda linha.
LCD_ClrScr ;
LCD_RowCol (1, 1);
LCD_writeStr(“Bem-vindo a”);
LCD_RowCol (2, 7);
LCD_writeStr(“MEDIDOR DE IVA”);
Agora o ADC está inicializado e lendo todos os valores do canal ADC. Em seguida, o LCD foi apagado para remover a massagem de boas-vindas.
ADC_init ;
_atraso_ms (2000);
para (int i=0; i<10; i++ )
{
ADC_leitura (i/2);
}
LCD_ClrScr ;
Entramos no loop while, aqui a variável do loop usada que pisca o parâmetro no LCD a cada ciclo enquanto qualquer valor excede o valor definido. alarme definido como BAIXO. LED pisca-pisca definido para piscar a cada ciclo, o que indica que o MCU está funcionando.
se (loop==0)
laço = 1;
outro
ciclo = 0;
alarme = 0;
PORTD ^= PISCA;
Leia o valor ACD do canal 3 e armazene-o na variável A. Valor ADC dividido por 2 para manter a faixa máxima aproximada de 50 volts. Cursor do LCD colocado em sua posição para imprimir o valor em formato específico. Se o valor de tensão for excedido a faixa de 45 Volts, o parâmetro “V” no LCD piscará e a campainha emitirá um bipe.
UMA = ADC_leitura(3);
_atraso_ms(5);
LCD_RowCol(1, 1);
VOLTS=A/2;
mostrarValor(VOLTS);
se (VOLTS>450 && loop==0)
{
LCD_writeStr(””);
alarme = 1;
}
outro
LCD_writeStr(“V”);
Agora defina A como zero para ler outro valor ADC do canal 0. Alguns cálculos exigem a conversão do valor ADC em valor Ampere. assim que obtivermos o valor do ampere, basta imprimir no LCD. Quando a corrente excede a faixa definida de 15 A, o parâmetro pisca no LCD e a campainha emite um bipe.
UMA = 0;
ADC_leitura(0);
_atraso_ms(5);
para (int i=0; i<10; i++ )
{
A = A + leitura_ADC ( 0 );
_atraso_ms(5);
}
A = 5110-A;
AMPS = (A * FATOR AM) /10000L;
LCD_RowCol(2, 1);
mostrarValor (AMPS);
if ((AMPS>150 AMPS<-150) && loop==0)
{
LCD_writeStr(””);
alarme = 1;
}
outro
LCD_writeStr(“A”);
Defina A como zero e leia o valor do canal ADC 1. Aqui, 5 valores de temperatura são obtidos para cada ciclo para obter o valor médio da temperatura. Quando o valor da temperatura excede 70 graus, o parâmetro pisca no LCD e a campainha emite um bipe.
UMA = 0;
ADC_leitura(1);
_atraso_ms(5);
para (int i=0; i<10; i++ )
{
A = A + ADC_read(1);
_atraso_ms(5);
}
TEMP1 = A/2;
temparray1(temparray1pos++) = TEMP1;
TEMP1 = (temparray1(0) + temparray1(1) + temparray1(2) + temparray1(3) + temparray1(4) )/5;
se (temparray1pos>4)
temparray1pos = 0;
LCD_RowCol (1, 9);
mostrarValor(TEMP1);
se (TEMP1>700 && loop==0)
{
LCD_writeStr(””);
alarme = 1;
}
outro
{
LCD_writeCh(223);
LCD_writeCh('C');
}
Defina A como zero e leia o valor do canal 2 do ADC. Aqui, 5 valores de temperatura são obtidos para cada ciclo para obter o valor médio da temperatura. Quando o valor da temperatura excede 70 graus, o parâmetro pisca no LCD e a campainha emite um bipe.
UMA = 0;
ADC_leitura(2);
_atraso_ms(5);
para (int i=0; i<10; i++ )
{
A = A + ADC_read(2);
_atraso_ms(5);
}
TEMP2 = A/2;
temparray2(temparray2pos++) = TEMP2;
TEMP2 = (temparray2(0) + temparray2(1) + temparray2(2) + temparray2(3) + temparray2(4) )/5;
if (temparray2pos>4)
temparray2pos = 0;
LCD_RowCol (2, 9);
mostrarValor(TEMP2);
se (TEMP2>700 && loop==0)
{
LCD_writeStr(””);
alarme = 1;
}
outro
{
LCD_writeCh(223);
LCD_writeCh('C');
}
Se a variável de alarme estiver alta, emita um sinal sonoro através do pino 1 da porta D.
se (alarme)
PORTD = ALARME;
_atraso_ms(150);
PORTD &= (~ALARME);
_atraso_ms(60);
Confira o código completo e comece rapidamente a construir este projeto interessante.
Código fonte do projeto
###
//Program to
/*
filename : VATmeter.C
author : f.hassan
date : 10-03-2018
MCU : ATmeaga8
display : LCD 16x2
*/
#define F_CPU 1000000L
#define BLINKER 0b00000001
#define ALARM 0b00000010
//=================================================================================
#include
#include
#define LCD_DP PORTB
#define LCD_CP PORTD
#define LCD_EN 0b10000000
#define LCD_RS 0b01000000
long AMPFACTOR = 488; // for 20A
int VOLTS=0;
long AMPS=0L;
int TEMP1=0;
int TEMP2 = 0;
char DST(8);
//=============================================================================
void initPorts ( )
{
DDRB = 0xFF;
DDRD = 0xFF;
DDRC = 0x00;
}
//=============================================================================
void LCD_enable ( )
{
LCD_CP = LCD_EN;
_delay_us(50);
LCD_CP &= (~LCD_EN );
_delay_us(30);
}
//===========================================================================
void LCD_WriteCmd ( unsigned char cmd )
{
LCD_CP &= (~LCD_RS );
LCD_DP = cmd;
LCD_enable ( );
}
//=============================================================================
void LCD_init( )
{
unsigned char initval = 0x30;
_delay_ms ( 50 );
LCD_WriteCmd ( 0x30 );
_delay_ms ( 20 );
LCD_WriteCmd ( 0x30 );
_delay_us ( 200 );
LCD_WriteCmd ( 0x30 );
_delay_ms ( 100 );
initval = 0b00001000;
initval = 0b00000100;
LCD_WriteCmd ( initval );
_delay_ms ( 25 );
LCD_WriteCmd ( 0x0C );
_delay_ms ( 25 );
LCD_WriteCmd ( 0x06 );
_delay_ms ( 50 );
}
//=============================================================================
void LCD_RowCol ( unsigned char R, unsigned char C )
{
switch (R)
{
case 2: LCD_WriteCmd ( 0xC0 + C-1 ); break;
case 1:
default: LCD_WriteCmd ( 0x80 + C-1 ); break;
}
_delay_ms ( 3 );
}
//=============================================================================
void LCD_ClrScr ( )
{
LCD_WriteCmd ( 0x01 );
_delay_ms(3);
}
//=============================================================================
void LCD_writeCh ( unsigned char ch )
{
LCD_CP = LCD_RS;
LCD_DP = ch;
LCD_enable ( );
}
//=============================================================================
void LCD_writeStr ( char s )
{
for (int i=0; s(i)!=0; i++)
{
LCD_writeCh ( s(i) );
_delay_us ( 20 );
}
}
//========================================================================================
void ADC_init ( )
{
ADCSRA = ( (1 << ADPS2) (1 << ADPS1) (1 << ADPS0) (1 << ADEN) );
}
//========================================================================================
int ADC_read ( int cno )
{
ADMUX = (cno%4);
ADCSRA = (1 << ADSC);
while (ADCSRA & (1 << ADSC));
return ADC;
}
//========================================================================================
void showValue ( int vin )
{
int V = vin;
if ( V < 0 )
{
DST(0)= '-';
V = V * -1;
}
else
{
DST(0)= ' ';
}
DST(1)=V/1000 + '0';
V=V%1000;
DST(2)=V/100 + '0';
V=V%100;
DST(3)=V/10 + '0';
DST(4)='.';
DST(5)=V%10 + '0';
DST(6)=0;
if (DST(1) == '0' && DST(2) == '0')
{
DST(1) = ' ';
DST(2) = ' ';
}
if (DST(1) == '0' )
DST(1) = ' ';
LCD_writeStr ( DST );
}
//========================================================================================
int main ( )
{
long A=0;
int loop = 0;
int alarm = 0;
int temparray1(5)={25,25,25,25,25};
int temparray1pos=0;
int temparray2(5)={25,25,25,25,25};
int temparray2pos=0;
_delay_ms ( 100 );
initPorts ( );
PORTD = BLINKER;
_delay_ms ( 2000 );
LCD_init ( );
_delay_ms ( 100 );
PORTD &= (~BLINKER);
LCD_ClrScr ;
LCD_RowCol ( 1, 1 );
LCD_writeStr ( "Welcome to" );
LCD_RowCol ( 2, 7 );
LCD_writeStr ( "VAT METER" );
ADC_init ( );
_delay_ms ( 2000 );
for ( int i=0; i<10; i++ )
{
ADC_read ( i/2 );
}
LCD_ClrScr ;
while ( 1 )
{
if (loop==0)
loop = 1;
else
loop = 0;
alarm = 0;
PORTD ^= BLINKER;
A = ADC_read(3);
_delay_ms ( 5 );
LCD_RowCol ( 1, 1 );
VOLTS = A / 2;
showValue ( VOLTS );
if (VOLTS>450 && loop==0)
{
LCD_writeStr ( " " );
alarm = 1;
}
else
LCD_writeStr ( "V " );
A = 0;
ADC_read ( 0 );
_delay_ms ( 5 );
for ( int i=0; i<10; i++ )
{
A = A + ADC_read ( 0 );
_delay_ms ( 5 );
}
A = 5110-A;
AMPS = (A * AMPFACTOR) /10000L;
LCD_RowCol ( 2, 1 );
showValue ( AMPS );
if ( (AMPS>150 AMPS<-150) && loop==0)
{
LCD_writeStr ( " " );
alarm = 1;
}
else
LCD_writeStr ( "A " );
A = 0;
ADC_read(1);
_delay_ms ( 5 );
for ( int i=0; i<10; i++ )
{
A = A + ADC_read ( 1 );
_delay_ms ( 5 );
}
TEMP1 = A/2;
temparray1(temparray1pos++) = TEMP1;
TEMP1 = (temparray1(0) + temparray1(1) + temparray1(2) + temparray1(3) + temparray1(4) )/5;
if (temparray1pos>4)
temparray1pos = 0;
LCD_RowCol ( 1, 9 );
showValue ( TEMP1 );
if (TEMP1>700 && loop==0)
{
LCD_writeStr ( " " );
alarm = 1;
}
else
{
LCD_writeCh ( 223 );
LCD_writeCh ( 'C' );
}
A = 0;
ADC_read(2);
_delay_ms ( 5 );
for ( int i=0; i<10; i++ )
{
A = A + ADC_read ( 2 );
_delay_ms ( 5 );
}
TEMP2 = A/2;
temparray2(temparray2pos++) = TEMP2;
TEMP2 = (temparray2(0) + temparray2(1) + temparray2(2) + temparray2(3) + temparray2(4) )/5;
if (temparray2pos>4)
temparray2pos = 0;
LCD_RowCol ( 2, 9 );
showValue ( TEMP2 );
if (TEMP2>700 && loop==0)
{
LCD_writeStr ( " " );
alarm = 1;
}
else
{
LCD_writeCh ( 223 );
LCD_writeCh ( 'C' );
}
if (alarm)
PORTD = ALARM;
_delay_ms ( 150 );
PORTD &= (~ALARM);
_delay_ms ( 60 );
}
return 0;
}
###
Diagramas de circuito
| VAT_meter_circuit_IVA |
 |