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 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 |