Medidor de IVA usando ATMega8

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

Conteúdo Relacionado

Voltar para o blog

Deixe um comentário

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