Medidor de IVA usando ATMega8

Medidor de IVA usando ATMega8

Al medir voltaje y corriente con un multímetro, los cables de prueba deben cambiarse con cuidado. Existe la posibilidad de dañar el multímetro si el voltaje se mide por error en el modo de alta corriente. Si se miden tensión y corriente al mismo tiempo, tenemos que utilizar dos multímetros y se debe tener cuidado al conectar ambos multímetros. El medidor de IVA es una combinación de voltímetro, amperímetro y termómetro. Puede medir voltaje y corriente simultáneamente junto con la temperatura.
El proyecto está construido sobre ATMega8. Por lo tanto, el lector debe tener conocimiento de cómo comenzar con AVR y conectar la pantalla LCD con AVR. Utilizó el sensor de corriente ACS-712 para medir la corriente y el voltaje se mide mediante el terminal ACD. Se utilizan dos sensores de temperatura en el circuito que pueden medir la temperatura de dos lugares diferentes, como un transformador, un regulador de voltaje o cualquier componente de calefacción. Todos los datos se pueden observar en una pantalla LCD de 16×2. Este proyecto puede medir y mostrar un voltaje máximo de hasta 50 voltios CC y una corriente máxima de hasta 20 amperios CC. Cuando el voltaje excede los 45 VCC o la corriente excede los 15 A o la temperatura excede los 70 grados, la pantalla parpadea el parámetro junto al valor específico y se genera un pitido. Componentes necesarios – Diagrama de bloques -
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 – #incluir : – Cabecera AVR estándar para entrada/salida #incluir : – Encabezado AVR estándar para proporcionar retrasos de tiempo Función utilizada en el código – initPorts: – Para inicializar el puerto como entrada o putput. LCD_enable: – Para controlar el pin LCD EN LCD_WriteCmd: – comando de escritura para LCD LCD_init: – Para inicializar la pantalla LCD al principio. LCD_RowCol: – Para establecer la posición del cursor LCD_ClrScr: – Para limpiar la pantalla LCD LCD_writeCh: – Escribe caracteres en la pantalla LCD LCD_writeStr: – Escribe una cadena en la pantalla LCD. ADC_init: – Para inicializar ADC ADC_read: – Lee el valor de ADC showValue: – Muestra el valor en un formato específico _delay_ms: – Para retraso de tiempo Algoritmo – El código para este MEDIDOR DE IVA que utiliza ATMega8 funciona de la siguiente manera. Cuando se enciende el circuito del medidor de IVA, en primer lugar, se inicializa el puerto que define el puerto B y el puerto D como salida. puerto C configurado como entrada. anular los puertos de arranque ( ) { DDRB = 0xFF; DDRD = 0xFF; República Democrática del Congo = 0x00; } Después de la inicialización del puerto, el LED parpadeante se configuró en Alto durante un tiempo y luego se invirtió (se configuró en BAJO). Además, la pantalla LCD se inicializa. PUERTO = PARPADEO; _delay_ms (2000); LCD_init; _delay_ms(100); PUERTO &= (~PARPADEO); En primer lugar, se limpia la pantalla LCD para eliminar cualquier tipo de valores basura. Luego configure el cursor para imprimir el masaje "Bienvenido a" en la primera línea y "CONTADOR DE IVA" en la segunda línea. LCD_ClrScr; LCD_RowCol (1, 1); LCD_writeStr(“Bienvenido a”); LCD_RowCol (2, 7); LCD_writeStr(“CONTADOR DE IVA”); Ahora el ADC está inicializado y leyendo todos los valores del canal ADC. Luego se limpió la pantalla LCD para eliminar el masaje de bienvenida. ADC_init; _delay_ms (2000); para (int i=0; i<10; i++) { ADC_lectura (i/2); } LCD_ClrScr; Ingresamos al bucle while, aquí se utiliza la variable de bucle que hace parpadear el parámetro en la pantalla LCD en cada ciclo mientras cualquier valor excede el valor establecido. alarma configurada en BAJA. El LED intermitente está configurado para parpadear en cada ciclo, lo que indica que la MCU está funcionando. si (bucle == 0) bucle = 1; otro ciclo = 0; alarma = 0; PUERTO ^= PARPADEA; Lea el valor ACD del canal 3 y guárdelo en la variable A. Valor ADC dividido por 2 para mantener el rango máximo aproximado de 50 voltios. Cursor LCD colocado en su posición para imprimir el valor en un formato específico. Si el valor de voltaje excede el rango de 45 voltios, el parámetro "V" en la pantalla LCD parpadeará y sonará el zumbador. A = lectura_ADC(3); _delay_ms(5); LCD_RowCol(1, 1); VOLTIOS=A/2; mostrarValor(VOLTIOS); si (VOLTIOS>450 && bucle==0) { LCD_writeStr(””); alarma = 1; } otro LCD_writeStr(“V”); Ahora establezca A en cero para leer otro valor de ADC del canal 0. Algunos cálculos requieren convertir el valor de ADC a un valor de amperios. Una vez que obtengamos el valor de amperios, simplemente imprímalo en la pantalla LCD. Cuando la corriente excede el rango establecido de 15 A, el parámetro parpadea en la pantalla LCD y suena el zumbador. Una = 0; ADC_lectura(0); _delay_ms(5); para (int i=0; i<10; i++) { A = A + lectura_ADC (0); _delay_ms(5); } A = 5110-A; AMPERIOS = (A * FACTOR AM) /10000L; LCD_RowCol(2, 1); mostrar valor (AMPS); si ((AMPS>150 AMPS<-150) && bucle==0) { LCD_writeStr(””); alarma = 1; } otro LCD_writeStr(“A”); Configure A en cero y lea el valor del canal 1 del ADC. Aquí se toman 5 valores de temperatura para cada ciclo para obtener el valor de temperatura promedio. Cuando el valor de temperatura supera los 70 grados, el parámetro parpadea en la pantalla LCD y suena el zumbador. Una = 0; ADC_lectura(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; } otro { LCD_writeCh(223); LCD_writeCh('C'); } Establezca A en cero y lea el valor del canal 2 del ADC. Aquí, se toman 5 valores de temperatura para cada ciclo para obtener el valor de temperatura promedio. Cuando el valor de temperatura supera los 70 grados, el parámetro parpadea en la pantalla LCD y suena el zumbador. Una = 0; ADC_lectura(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; } otro { LCD_writeCh(223); LCD_writeCh('C'); } Si la variable de alarma es alta, emita un pitido a través del pin 1 del puerto D. si (alarma) PUERTO = ALARMA; _delay_ms(150); PUERTO &= (~ALARMA); _delay_ms(60); Consulte el código completo y comience rápidamente a construir este apasionante proyecto.

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

contenido relacionado

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.