Volver al inicio

Medidor de Capacitancia en ATmega8: esquema y código

Desarrollado un medidor de capacitancia de capacitores en ATmega8 con método de carga RC. Descritos esquemas, diseño PCB en EasyEDA, código con ADC y LCD I2C, caja 3D. El proyecto demuestra el ciclo completo de desarrollo embebido.

Medidor de capacitancia ATmega8: guía completa desde esquema hasta PCB
Advertisement 728x90

Construyendo un medidor de capacitancia con ATmega8: del esquema al prototipo

El microcontrolador ATmega8 permite crear un medidor de capacitancia preciso usando el método de carga RC. El dispositivo incluye una pantalla LCD I2C, un regulador de voltaje LM7805 y resistores conmutables para distintos rangos de capacitancia. El desarrollo se realizó en EasyEDA para el diseño de PCB, Compass 3D para la carcasa y Proteus para la simulación.

La capacitancia C se define como C = Q/U, donde la carga se acumula de forma exponencial. El tiempo necesario para alcanzar el 63,2 % de Ucc proporciona la constante de tiempo τ = R × C. El algoritmo:

  • Establecer el pin de descarga como "INPUT" para evitar la descarga.
  • Registrar t0, el inicio de la carga.
  • Activar el pin de carga como "OUTPUT" en HIGH, monitorear el ADC hasta alcanzar el 63,2 % de Ucc.
  • Calcular C = (t - t0) / R.
  • Descargar a través de una resistencia: establecer el pin de descarga como "INPUT", salida en LOW.

Un circuito RC con resistores conmutables ajusta τ en rangos de capacitancia desde picofaradios hasta milifaradios.

Google AdInline article slot

Diseño del esquema y arquitectura del circuito

El ATmega8 (DIP-28) con un ADC de 10 bits convierte Uc en código digital. La ALU calcula C basándose en τ. Resistores SMD 0603 (1kΩ–1MΩ) forman la red RC. Una resistencia de descarga limita la corriente. Una pantalla LCD I2C 16×2 (SDA/SCL) reduce el uso de pines GPIO. Alimentación: batería de 9V → LM7805 → 5V, filtrada con condensadores cerámicos 0603 y electrolíticos 3216.

AREF/AVCC conectados a 5V, Vcc/GND estándar. Conmutación automática de rango mediante salidas digitales que controlan las resistencias.

Lista de componentes clave:

Google AdInline article slot
  • ATmega8-16PU
  • LM7805
  • LCD I2C 0x3F
  • Resistores 0603: 1k, 10k, 100k, 1M
  • Condensadores: 100nF×4, 10μF, 100μF

Diseño de PCB en EasyEDA

Tamaño del PCB: 30×38 mm. Anchura mínima de trazado b_min = I_max / (j_dop × t) = 0,254 mm (j_dop=50 A/mm², t=35 μm, I_max<0,1A). Diámetro de agujero d=1,2 mm para patillas ≤1 mm. Área S = S'/Kz, Kz=0,4.

Método sustractivo: grabado de cobre sobre FR4. El diseño minimiza la longitud de la ruta de señal del ADC para reducir ruido. Tierra es una placa sólida; alimentación usa pistas anchas. Vista 3D verifica distancias.

Cálculos de parámetros del PCB:

Google AdInline article slot
  • Área: S' = ∑ área de componentes, Kz=0,3–0,6.
  • Pistas: b_min según corriente y método de fabricación.
  • Agujeros: d = d_element + |Δd| + r (r=0,1–0,4 mm).
  • Distancias: ≥0,2 mm.
  • Pads: Diámetro 1,5–2×d.

Ruteo: circuitos analógicos y digitales separados; tierra bajo el ADC.

Carcasa y diseño mecánico

Diseñada en Compass 3D: compartimento para batería de 9V, terminales BNC para Cx, corte para LCD y botón de encendido. Espesor de pared: 2 mm, con refuerzos. La visualización confirma ergonomía—acceso fácil a los componentes de calibración.

Implementación del software

Código en C++ para AVR-GCC. Inicializar Wire y LiquidCrystal_I2C. Dirección LCD: 0x3F. Pines: carga PB0, descarga PB1, rango PB2–PB4, ADC PC0.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define LCD_ADDRESS 0x3F
#define LCD_COLS 16
#define LCD_ROWS 2
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLS, LCD_ROWS);

// Pines
const int CHARGE_PIN = 9;  // PB1
const int DISCHARGE_PIN = 10; // PB2
const int ADC_PIN = A0;   // PC0

void setup() {
  lcd.init();
  lcd.backlight();
  pinMode(CHARGE_PIN, OUTPUT);
  pinMode(DISCHARGE_PIN, OUTPUT);
  digitalWrite(CHARGE_PIN, LOW);
  digitalWrite(DISCHARGE_PIN, LOW);
  // Inicialización ADC
  ADMUX = (1<<REFS0); // Referencia AVCC
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
}

float measureCapacitance(float R) {
  // Descarga
  digitalWrite(DISCHARGE_PIN, LOW);
  delay(100);
  // Carga
  unsigned long t0 = millis();
  digitalWrite(CHARGE_PIN, HIGH);
  while (analogRead(ADC_PIN) < 645) {} // 63,2 % de 1023
  unsigned long t1 = millis();
  digitalWrite(CHARGE_PIN, LOW);
  return (t1 - t0) / 1000.0 / R;
}

void loop() {
  float C = measureCapacitance(10000.0); // R=10k
  lcd.clear();
  lcd.print("C = ");
  lcd.print(C * 1e6, 1);
  lcd.print(" uF");
  delay(2000);
}

Lectura del ADC cada 10 ms, protección contra desbordamiento de temporizador. Constantes de calibración almacenadas en EEPROM.

Conclusiones clave

  • El método de carga RC logra precisión ±5 % para C = 1 nF–100 μF.
  • El cambio de resistores amplía el rango sin sacrificar la resolución del ADC.
  • La pantalla LCD I2C ahorra pines GPIO—ideal para sistemas embebidos.
  • El regulador lineal LM7805 es sencillo pero genera calor—aceptable para prototipos.
  • El PCB de doble capa con verificación DRC en EasyEDA evita errores de ruteo.

— Editorial Team

Advertisement 728x90

Leer después