Fig. 1: Imagen que muestra la lectura de voltaje en un voltímetro miniatura basado en AVR Attiny85 y un monitor de voltaje de batería
La mayoría de las veces, la medición en circuitos electrónicos se realiza midiendo voltaje CC. Normalmente, pondremos el multímetro en modo de voltaje CC y comprobaremos los niveles de voltaje en varios puntos de la PCB... Normalmente, pondremos el multímetro en modo de voltaje CC y comprobaremos los niveles de voltaje en varios puntos de la PCB. Principalmente, nuestro requisito está entre 5 V y 15 V CC. El circuito que se muestra es simple, ocupa menos espacio y se puede conectar directamente al voltaje de CC para realizar mediciones. Para minimizar el tamaño y el consumo de energía, en el circuito se utiliza MCU de 8 pines y OLED de 0,96” .
El voltímetro miniatura tiene dos modos de funcionamiento. En el primer modo (modo de batería de 12 V), se puede conectar directamente a la batería de 12 V, para medir el voltaje y monitorear el estado de la batería. En el segundo modo (modo voltímetro de 20 VCC), funciona como un voltímetro de CC normal, que puede medir de 0,0 a 20,0 VCC.
Se han proporcionado dos puentes J1 y J2 para elegir entre el modo 1 y el modo 2. Una vez seleccionado el modo, el MCU Attiny85 mide continuamente el voltaje a través de su canal ADC, en el pin 7 y lo convierte en valor digital. El valor ADC se convierte al valor de voltaje correspondiente mediante un algoritmo en el código. En el modo de batería, dependiendo del valor ADC, se muestran en el OLED diferentes estados de la batería (BAJO, Cargado, Sobrecargado, etc.) junto con el nivel actual de voltaje de la batería. En el modo voltímetro, el nivel de voltaje correspondiente se muestra en el OLED.
Lista de componentes:
ATTINY85 – 1 núm.
OLED 0,96” – 1 núm.
LM7805 – 1 núm.
1N4007 – 3 núms.
LED de 3 mm – 2 nodos.
100uF 50V – 1 núm.
10uF 16V – 1 núm.
Disco de 0,1uF – 1 no.
Trimpot 5K – 2 nudos.
Resistencia de 10K 0,25W – 2 nudos.
Resistencia de 4,7K 0,25W – 2 nudos.
Resistencia de 8,6K 0,25W – 1 núm.
Resistencia de 2,2K 0,25W – 1 núm.
Resistencia 1K 0,25W – 1 núm.
Batería de 9V – 1 núm.
Puentes de 2,54 mm – 2 nudos.
Interruptor SPDT o interruptor deslizante – 1 no.
Varios. = conectores, PCB, base IC, tira Berg, etc.
IC1 (7805) es un regulador de voltaje de 5 V que se utiliza para el suministro de energía de IC2 y OLED. IC2 es una MCU de 8 pines (ATTINY85) que es el corazón del circuito. Se utiliza un divisor de voltaje para proporcionar entrada a la MCU. El controlador acepta un máximo de 5 V como entrada en el pin ADC. El divisor de voltaje se utiliza para llevar el voltaje por debajo de 5 V.
Aquí se utiliza un módulo de pantalla OLED (diodo emisor de luz orgánico) de 0,96” (con conexiones de 4 pines) para hacer que el diseño general sea compacto. Sólo se utilizan dos pines (SDA y SCL) para la transferencia de datos a la pantalla OLED y dos pines más para la fuente de alimentación. La pantalla tiene una resolución de 128×64 píxeles. El texto pequeño se muestra con un tamaño de fuente de 16 x 8 bits, mientras que el voltaje medido se muestra con un tamaño de fuente grande con un tamaño de fuente de 32 x 24 bits.
Código
Guía de programación –
En este proyecto, el ATtiny85 está programado para mostrar el estado de carga de la batería de 9 V o 12 V (según el modo seleccionado) midiendo el voltaje del terminal de la batería. La MCU está codificada con C integrado utilizando AVR Studio 4.
Constantes utilizadas en el código –
#define F_CPU 1000000UL: constante utilizada para definir la frecuencia de reloj de la MCU
#define BLINKER 0b00000001: - Constante utilizada para hacer parpadear el LED como indicación de que la MCU está funcionando correctamente.
#define BATT12V 0B00000010: constante utilizada para definir el modo de batería de 12 V.
Variables utilizadas en el código –
R: – Variable utilizada para almacenar la lectura analógica del canal ADC de 10 bits
V: – Variable utilizada para convertir la lectura del ADC en voltaje e indicar el estado de la batería.
Prev_mode: – Variable utilizada para indicar el modo de batería anterior (modo de batería de 12V o 20V)
current_mode: – Variable utilizada para indicar el modo de batería actual (modo de batería de 12 V o 20 V)
dispstr(6)={'0′,'0′,'.','0′,'/',0} :- Matriz utilizada para definir el formato del OLED
Archivos de encabezado y bibliotecas utilizadas en el código .
#incluir : – Encabezado AVR estándar para entrada y salida
#incluir : – Encabezado AVR estándar para proporcionar retrasos de tiempo
#incluir Encabezado AVR estándar que incluye utilidades de espacio de programa
#include “OLED_LIB.C”: – Biblioteca de uso general que contiene funciones para trabajar con OLED de 0,96”. Esta biblioteca se puede utilizar con cualquier microcontrolador AVR. Tenga en cuenta que OLED_LIB define el pin 2 como SDA y el pin 3 como SCL de ATtiny85.
#include “FONT_BASIC_16x8.H”: – Este archivo de encabezado contiene alfabeto, números y símbolos de tamaño 16 × 8 píxeles (pequeño).
#include OLED_NUMS_32x24.H: – Este archivo de encabezado solo contiene números de tamaño 32 × 24 píxeles (grandes) para mostrar el valor de voltaje.
Funciones utilizadas en el código –
ADC_init: – función utilizada para inicializar el canal ADC.
readADC: – función utilizada para leer el voltaje analógico del canal 1 del ADC
OLED_init: – función utilizada para iniciar la pantalla OLED
OLED_floodfill: función utilizada para mostrar luz brillante pasando el parámetro 0xFF o borrar OLED pasando el parámetro 0x00.
Algoritmo –
1) Cuando se enciende el circuito del voltímetro, en primer lugar, el OLED se inicializa y se verifica mostrando una luz brillante. Luego, la pantalla OLED se apaga y parpadea un mensaje de bienvenida: "Bienvenido al voltímetro en miniatura". La MCU comienza a hacer parpadear un LED para indicar que está funcionando correctamente. La MCU verifica el estado del modo de batería (modo 12 V o 20 V) verificando la entrada digital en el pin 6 del Attiny85. Ahora el controlador está listo para tomar lecturas de voltaje.
DDRB = PARPADEO;
OLED_init; //comienza a mostrar OLED
_delay_ms(10);
OLED_floodfill(0xFF); // muestra OLED con luz brillante como autoprueba
_delay_ms(500);
ADC_init; // inicializa el sistema ADC
OLED_floodfill(0x00); //pantalla OLED en blanco
_delay_ms(500);
OLED_show_str_16x8 ("BIENVENIDO A",6,0); //un mensaje de bienvenida
OLED_show_str_16x8 ("MINIATURA",11,3); //se muestra en el OLED
OLED_show_str_16x8 (" VOLTÍMETRO ",6,6); // cómo realizar una autocomprobación de la visualización de texto en OLED
_delay_ms(1000);
OLED_floodfill(0x00); //pantalla OLED en blanco
_delay_ms(300);
2) El usuario puede tomar una lectura de voltaje de una fuente de voltaje estándar (o conocida) y ajustar el potenciómetro respectivo (de acuerdo con el modo actual de la batería) para calibrar el voltímetro. En este circuito, el voltímetro se calibra utilizando una fuente de voltaje estándar de 12 V donde la lectura del ADC se establece en 900 (para entrada de 12 V) en modo de batería de 12 V y 750 (para entrada de 12 V) en modo de batería de 20 V. Después de la calibración, la miniatura. Se espera que el voltímetro proporcione lecturas de voltaje exactamente precisas.
3) La MCU detecta el voltaje de la batería de 12 V o 20 V en el pin 7 (canal ADC 1) usando la función readADC y almacena este valor leído en la variable A. El ATtiny85 tiene un canal ADC de 10 bits, por lo que la lectura del ADC ( almacenado en la variable A) puede variar de 0 a 1023. Para una comparación de voltaje para indicar el estado de la batería, la lectura del ADC de 750 es equivalente a 12 V en el caso del modo de batería de 20 V y la lectura del ADC de 900 es equivalente a 12 V en el caso del modo de batería de 20 V. el caso del modo de batería de 12 V.
4) El valor almacenado en A se convierte en voltaje y se almacena en la variable V asumiendo que el valor de A es 750 (en el caso del modo de batería de 20 V) o 900 (en el caso del modo de batería de 12 V) es equivalente al valor real. voltaje de 12V. Tenga en cuenta que las condiciones para indicar el estado de la batería se definen en consecuencia en el código. La suposición anterior se deriva de la calibración del voltímetro en miniatura. En el modo de batería de 20 V, utilizando un voltaje conocido de 12 V, la lectura del ADC se calibra a 750 usando el potenciómetro. De manera similar, en el modo de batería de 12 V, cuando se usa el voltaje conocido de 12 V, la lectura del ADC se calibra a 900 usando el potenciómetro respectivo. Tenga en cuenta que la conversión de la lectura del ADC a voltaje aquí depende de la calibración. La fórmula estándar para la conversión de un solo extremo (Vin = ADC*Vref/1024) no se utiliza en el código, considerando el hecho de que el voltaje en reposo de diferentes baterías puede ser diferente y puede no ajustarse a una ecuación de calibración estándar.
PUERTO ^= INTERMITENTE; //alternar el parpadeo para indicar que la MCU está funcionando
A = leerAdc ( 1 ); // lee el valor ADC del canal nº 1
modo_curr = (PINB y BATT12V); // verifica el modo de operación mediante el uso del puente J2
// para modo de batería de 12 V o voltímetro de 20 V CC
si (modo_prev! = modo_actual)
{
OLED_floodfill(0x00);
_delay_ms (50);
}
si (modo_curr>0)
V = A/6;
demás
V = A/5;
5) El valor de V se compara en declaraciones else-if para indicar el estado de carga de la batería conectada.
if (curr_mode>0) // en el caso del modo de batería de 12 V, se muestra el estado apropiado en OLED
{
OLED_show_str_16x8 ("medidor de batería de 12 V", 0, 0);
si (V>150)
OLED_show_str_16x8 ("NO BATERIA DE 12 V", 0 .6);
de lo contrario si (V>135)
OLED_show_str_16x8 ("SOBRECARGA", 0 .6);
de lo contrario si (V>120)
OLED_show_str_16x8 ("BATT. BUENO", 0 .6);
de lo contrario si (V>100)
OLED_show_str_16x8 ("BATERÍA BAJA", 0 .6);
de lo contrario si (V>90)
OLED_show_str_16x8 ("BATT. DÉBIL", 0 .6);
de lo contrario si (V>60)
OLED_show_str_16x8 ("BATERÍA MUERTA", 0 .6);
de lo contrario //si (V<30)
OLED_show_str_16x8 ("BATT.ABSENT", 0 .6);
}
6) El valor V tiene formato en notación decimal y el voltaje leído se muestra en la pantalla OLED.
dispstr(0)=V/100+'0';
V=V%100;
dispstr(1)=V/10+'0';
dispstr(2)='.';
dispstr(3)=V%10+'0';
dispstr(4)='/';
dispstr(5)=0;
7) La lectura del ADC almacenada en A se compara con 1000 para verificar si el voltaje excede el rango designado.
if (A>1000) // en caso de que el valor de lectura del ADC esté fuera de rango, se muestra como OVERFLOW
{
OLED_show_str_16x8 ("DESBORDAMIENTO", 0,0);
_delay_ms (150);
OLED_show_str_16x8 ("", 0,0);
_delay_ms (100);
}
Laboral:
Ajuste inicial:
Después de ensamblar el circuito en una placa de circuito impreso, conecte la fuente de alimentación girando SW1 hacia la batería de 9V. Luego cargue/escriba el archivo miniVoltMeter.hex en la MCU (ATTINY85) usando cualquier programador AVR.
Inicialmente, OLED muestra todos los píxeles (128×64) en modo ON, lo que hace que la pantalla brille por un tiempo. Luego muestra un mensaje de bienvenida como BIENVENIDO AL VOLTÍMETRO EN MINIATURA. Luego muestra el voltaje aleatorio, que aún no ha sido calibrado.
Ahora configura la placa en MODO BATERÍA 12V, conectando el Jumper J1 y desconectando el Jumper J2. Luego conecte una fuente de voltaje conocida de aproximadamente 12 VCC o una batería de 12 V a los terminales de señal (o conecte un multímetro en paralelo a los terminales para saber el voltaje de entrada exacto). Ahora, configure el potenciómetro VR1 para mostrar el voltaje correcto en el OLED de la pantalla.
Ahora, configure la placa en MODO VOLTÍMETRO desconectando el puente J1 y conectando el puente J2. Luego, con la misma fuente de voltaje que la señal de entrada, ajuste el potenciómetro VR2 para mostrar el voltaje correcto en el OLED.
Ahora, la calibración está completa y el circuito está listo para usar. Desconecte la entrada de señal y configure la placa en uno de los modos según sea necesario.
Hay dos modos de operación. 12V y 20V.
Para el modo de batería de 12 V, conecte el puente J1 y desconecte el puente J2. El voltaje es leído por el canal ADC de la MCU y muestra el voltaje de la batería en el OLED en fuente grande. La línea superior del OLED se muestra como 12V BAT. EL MEDIDOR y el resultado final muestran el estado de la batería como BATT.ABSENT / BATT.DEAD / BATT.WEAK / BATT.GOOD / OVER CHRG. etc.
Para el modo de voltímetro de 20 VCC, desconecte el puente J1 y conecte el puente J2. El voltaje de la señal de entrada se lee en el canal ADC de la MCU y se muestra en OLED con una fuente grande en el centro. Aquí, la línea superior del OLED muestra VOLTÍMETRO y la línea inferior muestra 20 VOLTIOS CC.
En ambos modos, si el voltaje de entrada excede el valor de voltaje de entrada del ADC (aproximadamente 5 VCC), la línea superior parpadeará con el mensaje OVERFLOW. Si para leer señales débiles o voltajes inferiores a 8VDC, se debe girar SW1 para conectar la batería de 9V. El circuito de voltímetro en miniatura se puede utilizar como un voltímetro de CC rápido para fines de escritorio, monitor de voltaje y estado para cargadores de baterías, bancos de baterías, etc.
Código fuente del proyecto
/*
Nombre de archivo: miniVoltMeter.C
autor: Fayaz Hassan
Fecha: 15-02-2018
MCU: ATtiny85 (A)
Pantalla: OLED (I2C)
*/
#definir F_CPU 1000000UL
#incluir
#incluir
#incluir
#incluir "OLED_LIB.C"
#definir INTERMITENTE 0b00000001
#definir BATT12V 0B00000010
//================================================== ==========================================
anular ADC_init ()
{
ADCSRA = ( (1 << ADPS2) (1 << ADPS1) (1 << ADPS0) (1 << ADEN) );
}
//================================================== ==========================================
int readAdc (int canalno)
{
ADMUX = (número de canal%4);
ADCSRA = (1 << ADSC);
mientras (ADCSRA & (1 << ADSC));
devolver ADC;
}
//================================================== ==========================================
int principal()
{
intV=0;
intA=0;
int modo_prev = -1;
int modo_curr = 0;
char dispstr(6)={'0','0','.','0','/',0};
_delay_ms (500);
DDRB = PARPADEO;
OLED_init;
_delay_ms (10);
OLED_floodfill(0xFF);
_delay_ms (500);
ADC_init();
OLED_floodfill(0x00);
_delay_ms (500);
OLED_show_str_16x8 ("BIENVENIDO A",6,0);
OLED_show_str_16x8 (" MINIATURA ",11,3);
OLED_show_str_16x8 (" VOLTÍMETRO ",6,6);
_delay_ms (1000);
OLED_floodfill(0x00);
_delay_ms (300);
leerAdc (1);
leerAdc (1);
mientras(1)
{
PUERTO ^= INTERMITENTE;
A = leerAdc ( 1 );
modo_curr = (PINB y BATT12V);
si (modo_prev! = modo_actual)
{
OLED_floodfill(0x00);
_delay_ms (50);
}
si (modo_curr>0)
V = A/6;
demás
V = A/5;
si (modo_curr>0)
{
OLED_show_str_16x8 ("medidor de batería de 12 V", 0, 0);
si (V>150)
OLED_show_str_16x8 ("NO BATERIA DE 12 V", 0 .6);
de lo contrario si (V>135)
OLED_show_str_16x8 ("SOBRECARGA", 0 .6);
de lo contrario si (V>120)
OLED_show_str_16x8 ("BATT. BUENO", 0 .6);
de lo contrario si (V>100)
OLED_show_str_16x8 ("BATERÍA BAJA", 0 .6);
de lo contrario si (V>90)
OLED_show_str_16x8 ("BATT. DÉBIL", 0 .6);
de lo contrario si (V>60)
LED_show_str_16x8 ("BATERÍA MUERTA", 0,6);
de lo contrario //si (V<30)
OLED_show_str_16x8 ("BATT.ABSENT", 0 .6);
}
demás
{
OLED_show_str_16x8 (" VOLTÍMETRO ", 4, 0);
OLED_show_str_16x8 ("0-20 VOLTIOS CC", 0, 6);
}
dispstr(0)=V/100+'0';
V=V%100;
dispstr(1)=V/10+'0';
dispstr(2)='.';
dispstr(3)=V%10+'0';
dispstr(4)='/';
dispstr(5)=0;
si (dispstr(0)=='0' )
dispstr(0) = ':';
OLED_show_str_32x24 (dispstr, 5, 0.2);
si (A>1000)
{
OLED_show_str_16x8 ("DESBORDAMIENTO", 0,0);
_delay_ms (150);
OLED_show_str_16x8 (" ", 0,0);
_delay_ms (100);
}
modo_prev = modo_actual;
}
devolver 0;
}
Diagramas de circuito
Diagrama-de-circuito-miniatura-voltímetro-con-monitor-de-voltaje-de-batería |
 |
Vídeo del proyecto