Fig. 1: Diagrama de bloques del MEDIDOR de IVA usando ATMega8
Conexiones de circuito –
Este dispositivo está basado en el AVR ATMega8. ATMega8 es un microcontrolador de 8 bits que puede operar hasta 16 MIPS de velocidad de transferencia sincronizada a 16 MHz. Aquí utilizamos el oscilador RC interno de ATMega8 que proporciona una velocidad de reloj fija de 1,0 2,0 4,0 u 8,0 MHz, luego configuramos su ATMega8 interno. Oscilador RC a 1 MHz.
ATMega8 está interconectado con LCD 16×2, L M35 y ACS712 para fabricar el dispositivo. Hay un Trimpot (que se muestra como VR1 en el diagrama del circuito) que se utiliza para ajustar el contraste de la pantalla LCD. Hay un LED amarillo con una interfaz paralela a todo el circuito que se utiliza para indicar que la fuente de alimentación del circuito está funcionando correctamente. Hay un intermitente conectado al bit 0 del puerto D del ATMega8 que indica que la MCU está funcionando.
Se utilizan dos sensores de temperatura LM35 para obtener el estado de temperatura en dos ubicaciones diferentes. Ambos LM35 están conectados a los bits 1, 2 del puerto C del ATMega8, que son los pines 1 y 2 del ADC. El sensor de corriente ACS712 se utiliza para medir corriente a través de una conexión en serie con una fuente de alimentación de CC. El pin OUT del ACS712 está conectado al bit 0 del puerto C del ATMega8 que es el pin 0 del ADC. El voltaje se mide mediante el bit 3 del puerto C del ATMega8, que es el pin 3 del ADC. diagrama) que se utiliza para calibrar el voltaje.
El transistor BC548 se utiliza para activar el zumbador. La base del transistor está conectada al bit 1 del puerto D del ATMega8. El colector del transistor está conectado al zumbador y el emisor está conectado a tierra. AREF o pin 21 de ATMega8 está conectado a 5v a través de un inductor de 10mH y también hay un capacitor de 0.1uf conectado entre tierra y AREF. Todo el circuito funciona con 5 V CC que se puede obtener de un banco de energía de 5 V o de una batería de 9 V con una fuente de alimentación regulada de 5 V utilizando 7805 IC. El oscilador RC interno (1 MHz) se usa con ATMega8, por lo que no es necesario agregar un oscilador externo.
Cómo funciona el circuito –
Después de ensamblar el circuito, el puerto ISP del ATmega8 debe conectarse a cualquier programador AVR y el archivo VATmeter.hex debe actualizarse en el microcontrolador. Luego desconecte el circuito del programador AVR. Ahora el dispositivo está listo para funcionar. Cuando el dispositivo está encendido, el LED parpadeante comienza a parpadear y el LED muestra "Bienvenido a VAT METER". Después de unos segundos, la pantalla LCD entra en un estado estable que muestra el voltaje, el amperaje y la temperatura de ambos sensores y actualiza los datos según la actualización de la entrada del sensor.
Mientras conectamos la fuente de alimentación CC en serie con el sensor de corriente ACS712 como se muestra en el diagrama del circuito. La pantalla LCD muestra el voltaje y la corriente de la batería. Asegúrese de que la carga esté conectada en serie con la batería y el sensor de corriente ACS712 para que la corriente se pueda medir a través de la carga. El sensor de temperatura se puede colocar cerca del componente calefactor para medir la temperatura.
Si la temperatura excede los 70 grados centígrados o el voltaje excede los 45 VCC o la corriente excede los 15 ACC, la pantalla parpadeará el parámetro cerca del valor específico y se generará una señal audible a través de un zumbador.
Fig.1: Imagen que muestra el funcionamiento del VAT METER
Guía de programación –
Este dispositivo está basado en AVR ATMega8 y está programado con C integrado usando AVR Studio 4. También se pueden usar otras herramientas de programación como Atmel Studio o Notepad++ para escribir y compilar el código. El ATMega8 está programado para medir voltaje, corriente y temperatura al mismo tiempo en una sola pantalla. Este proyecto puede medir voltaje de hasta 50 voltios CC y corriente máxima de hasta 20 amperios CC.
Constantes utilizadas en el código –
#define F_CPU 1000000L: constante utilizada para definir la frecuencia de reloj de la MCU
#define BLINKER 0b00000001: define el LED parpadeante para el bit 0 del puerto D
#define ALARMA 0b00000010: define el zumbador conectado al bit 1 del puerto D
#define LCD_DP PORTB: – Puerto B definido como puerto de control de datos LCD
#define LCD_CP PORTD: – El puerto D se define como puerto de control LCD
#define LCD_EN 0b10000000: – El pin EN de la pantalla LCD está conectado a 7 bits del puerto D
#define LCD_RS 0b01000000: – El pin RS de la pantalla LCD está conectado a 6 bits del puerto D
Variable utilizada en el código –
AMP largo = 488; : – Para calcular el valor de amperios al valor de ADC
VOLTIOS internos=0; : – Para almacenar el valor de voltaje
amperios largos = 0L; : – Para almacenar el valor actual
intTEMP1=0; :- Para almacenar la temperatura del primer sensor.
int TEMP2 = 0; :- Para almacenar la temperatura del segundo sensor.
char horario de verano(8); :- Para mostrar el valor en la pantalla LCD
largo A=0; : – Para almacenar inicialmente el valor ADC
bucle interno = 0; :- Para controlar el parpadeo del parámetro en el LED
alarma interna = 0; : – Para controlar el timbre
int temparray1(5)={25,25,25,25,25}; : – Para almacenar 5 valores de temperatura para temperatura promedio
int temporray1pos=0; :- Para seleccionar el valor de la matriz de temperatura
int temparray2(5)={25,25,25,25,25}; : – Para almacenar 5 valores de temperatura para temperatura promedio
int temporalray2pos=0; :- Para seleccionar el valor de la matriz de temperatura
Archivo de encabezado y bibliotecas utilizadas en el código –
#incluirCódigo fuente del proyecto
###
//Programa para / * nombre de archivo: VATmeter.C autor: f.hassan fecha: 10-03-2018 MCU: ATmeaga8 pantalla: LCD 16x2 */ #definir F_CPU 1000000L #definir INTERMITENTE 0b00000001 #definir ALARMA 0b00000010 //================================================== =================================== #incluir#incluir #definir puerto LCD_DP #definir LCD_CP PORTD #definir LCD_ES 0b10000000 #definir LCD_RS 0b01000000 AMPFACTOR largo = 488; // para 20A int VOLTIOS=0; amperios largos=0L; int TEMP1=0; int TEMP2 = 0; char horario de verano(8); //================================================== ============================== anular los puertos de inicio ( ) { DDRB = 0xFF; DDRD = 0xFF; DDRC = 0x00; } //================================================== ============================== anular LCD_enable ( ) { LCD_CP = LCD_ES; _delay_us(50); LCD_CP &= (~LCD_ES); _delay_us(30); } //================================================== ============================ void LCD_WriteCmd (cmd de carácter sin firmar) { LCD_CP &= (~LCD_RS); LCD_DP = cmd; LCD_enable ( ); } //================================================== ============================== anular LCD_init() { inicial de carácter sin firmar = 0x30; _delay_ms (50); LCD_WriteCmd (0x30); _delay_ms (20); LCD_WriteCmd (0x30); _delay_us (200); LCD_WriteCmd (0x30); _delay_ms (100); valor inicial = 0b00001000; valor inicial = 0b00000100; LCD_WriteCmd (valor inicial); _delay_ms (25); LCD_WriteCmd (0x0C); _delay_ms (25); LCD_WriteCmd (0x06); _delay_ms (50); } //================================================== ============================== void LCD_RowCol (carácter R sin firmar, carbón C sin firmar) { interruptor (R) { caso 2: LCD_WriteCmd (0xC0 + C-1); romper; caso 1: predeterminado: LCD_WriteCmd (0x80 + C-1); romper; } _delay_ms (3); } //================================================== ============================== anular LCD_ClrScr () { LCD_WriteCmd (0x01); _delay_ms(3); } //================================================== ============================== void LCD_writeCh (carácter sin firmar) { LCD_CP = LCD_RS; LCD_DP = canal; LCD_enable ( ); } //================================================== ============================== vacío LCD_writeStr ( caracteres ) { para (int i=0; s(i)!=0; i++) { LCD_writeCh (s(i)); _delay_us (20); } } //================================================== ========================================== anular ADC_init () { ADCSRA = ( (1 << ADPS2) (1 << ADPS1) (1 << ADPS0) (1 << ADEN) ); } //================================================== ========================================== int ADC_read (int cno) { ADMUX = (cno%4); ADCSRA = (1 << ADSC); mientras (ADCSRA & (1 << ADSC)); devolver ADC; } //================================================== ========================================== mostrar valor vacío (int vin) { int V = vino; si ( V < 0 ) { Horario de verano(0)= '-'; V = V * -1; } demás { Horario de verano(0)= ' '; } Horario de verano(1)=V/1000 + '0'; V=V%1000; horario de verano(2)=V/100 + '0'; V=V%100; horario de verano(3)=V/10 + '0'; Horario de verano(4)='.'; horario de verano(5)=V%10 + '0'; horario de verano(6)=0; si (horario de verano(1) == '0' && horario de verano(2) == '0') { Horario de verano(1) = ' '; Horario de verano(2) = ' '; } si (horario de verano(1) == '0' ) Horario de verano(1) = ' '; LCD_writeStr (horario de verano); } //================================================== ========================================== int principal() { largoA=0; bucle int = 0; alarma interna = 0; int temparray1(5)={25,25,25,25,25}; inttemparray1pos=0; int temparray2(5)={25,25,25,25,25}; inttemparray2pos=0; _delay_ms (100); puertos de inicio ( ); PUERTO = PARPADEO; _delay_ms (2000); LCD_init ( ); _delay_ms (100); PUERTO &= (~PARPADEO); LCD_ClrScr; LCD_RowCol (1, 1); LCD_writeStr ("Bienvenido a"); LCD_RowCol (2, 7); LCD_writeStr ("CONTADOR DE IVA"); ADC_init(); _delay_ms (2000); para (int i=0; i<10; i++) { ADC_read (i/2); } LCD_ClrScr; mientras(1) { si (bucle == 0) bucle = 1; demás bucle = 0; alarma = 0; PUERTO ^= PARPADEO; A = ADC_read(3); _delay_ms (5); LCD_RowCol (1, 1); VOLTIOS = A/2; mostrarValor ( VOLTIOS ); si (VOLTIOS>450 && bucle==0) { LCD_writeStr( " " ); alarma = 1; } demás LCD_writeStr("V"); Una = 0; ADC_read (0); _delay_ms (5); para (int i=0; i<10; i++) { A = A + ADC_read (0); _delay_ms (5); } A = 5110-A; AMPERIOS = (A * AMPFACTOR) /10000L; LCD_RowCol (2, 1); mostrarValor (AMPS); si ((AMPERIOS>150 AMPS<-150) && bucle==0) { LCD_writeStr( " " ); alarma = 1; } demás LCD_writeStr("A"); Una = 0; ADC_read(1); _delay_ms (5); para (int i=0; i<10; i++) { A = A + ADC_read (1); _delay_ms (5); } TEMP1 = A/2; temparray1(temparray1pos++) = TEMP1; TEMP1 = (matriz temp1 (0) + matriz temp1 (1) + matriz temp1 (2) + matriz temp1 (3) + matriz temp1 (4))/5; si (temparray1pos>4) temparray1pos = 0; LCD_RowCol (1, 9); mostrarValor (TEMP1); si (TEMP1>700 && bucle==0) { LCD_writeStr( " " ); alarma = 1; } demás { LCD_writeCh (223); LCD_writeCh ('C'); } Una = 0; ADC_read(2); _delay_ms (5); para (int i=0; i<10; i++) { A = A + ADC_read (2); _delay_ms (5); } TEMP2 = A/2; temparray2(temparray2pos++) = TEMP2; TEMP2 = (matriz temp2 (0) + matriz temp2 (1) + matriz temp2 (2) + matriz temp2 (3) + matriz temp2 (4))/5; si (temparray2pos>4) temparray2pos = 0; LCD_RowCol (2, 9); mostrarValor (TEMP2); si (TEMP2>700 && bucle==0) { LCD_writeStr( " " ); alarma = 1; } demás { LCD_writeCh (223); LCD_writeCh ('C'); } si (alarma) PUERTO = ALARMA; _delay_ms (150); PUERTO &= (~ALARMA); _delay_ms (60); } devolver 0; }
###
Diagramas de circuito
Circuito_medidor_IVA_IVA |