Zurück zur Startseite

Kapazitätsmessgerät auf ATmega8: Schaltplan und Code

Entwickeltes Kondensatoren-Kapazitätsmessgerät auf ATmega8 mit RC-Auflademethode. Beschriebene Schaltpläne, PCB-Layout in EasyEDA, Code mit ADC und I2C LCD, 3D-Gehäuse. Das Projekt demonstriert den vollständigen Zyklus der Embedded-Entwicklung.

ATmega8 Kapazitätsmessgerät: vollständiger Leitfaden von Schaltplan bis PCB
Advertisement 728x90

Kapazitätsmesser mit ATmega8 bauen: Von der Schaltung zum Prototyp

Der ATmega8-Mikrocontroller ermöglicht ein präzises Kapazitätsmessgerät mithilfe der RC-Ladungsmethode. Das Gerät verfügt über einen I2C-LCD-Display, einen LM7805-Spannungsregler und schaltbare Widerstände für verschiedene Kapazitätsskalen. Die Entwicklung erfolgte in EasyEDA für die Leiterplattenplanung, Compass 3D für das Gehäuse und Proteus für die Simulation.

Die Kapazität C ist definiert als C = Q/U, wobei die Ladung exponentiell anwächst. Die Zeit, um 63,2 % von Ucc aufzuladen, entspricht der Zeitkonstante τ = R × C. Der Algorithmus:

  • Setze den Entlade-Pin auf "INPUT", um eine Entladung zu verhindern.
  • Notiere t0, den Beginn der Aufladung.
  • Setze den Lade-Pin auf "OUTPUT" HIGH und überwache den ADC, bis 63,2 % von Ucc erreicht sind.
  • Berechne C = (t - t0) / R.
  • Entlade über einen Widerstand: Setze den Entlade-Pin auf "INPUT", Ausgang auf LOW.

Ein RC-Schaltkreis mit schaltbaren Widerständen passt die Zeitkonstante τ über Kapazitätsbereiche von Pikofarad bis Millifarad an.

Google AdInline article slot

Schaltungsdesign und Schaltarchitektur

Der ATmega8 (DIP-28) mit einem 10-Bit-ADC wandelt Uc in digitale Werte um. Die ALU berechnet C basierend auf τ. SMD-Widerstände 0603 (1kΩ–1MΩ) bilden das RC-Netzwerk. Ein Entlade-Widerstand begrenzt den Strom. Ein 16×2-I2C-LCD (SDA/SCL) minimiert den GPIO-Aufwand. Versorgung: 9-V-Batterie → LM7805 → 5 V, gefiltert mit 0603-Keramik- und 3216-Elektrolytkondensatoren.

AREF/AVCC auf 5 V angebunden, Vcc/GND standard. Auto-Rangwechsel über digitale Ausgänge, die die Widerstände steuern.

Wichtige Bauteile:

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

Leiterplattendesign in EasyEDA

Plattengröße: 30×38 mm. Mindestspurbreite b_min = I_max / (j_dop × t) = 0,254 mm (j_dop=50 A/mm², t=35 μm, I_max<0,1 A). Bohrungsdurchmesser d=1,2 mm für Leiterbahnen ≤1 mm. Fläche S = S'/Kz, Kz=0,4.

Subtraktives Verfahren: Ätzen von Kupfer auf FR4. Layout minimiert die Länge der ADC-Signalleitung zur Rauschreduzierung. Erdung ist eine flächige Ebene; Stromversorgung nutzt breite Spuren. 3D-Ansicht überprüft Abstände.

Berechnungen für Leiterplattenparameter:

Google AdInline article slot
  • Fläche: S' = ∑ Bauteilfläche, Kz=0,3–0,6.
  • Spuren: b_min basierend auf Strom und Fertigungsmethode.
  • Bohrungen: d = d_element + |Δd| + r (r=0,1–0,4 mm).
  • Abstände: ≥0,2 mm.
  • Pads: Durchmesser 1,5–2×d.

Verdrahtung: Analog- und Digitalkreise getrennt; Erdung unter dem ADC.

Gehäuse und mechanisches Design

Entwickelt in Compass 3D: Batteriefach für 9 V, BNC-Anschlüsse für Cx, Ausschnitt für LCD, Netzschalter. Wanddicke: 2 mm, mit Stützrippen. Die Visualisierung bestätigt Ergonomie – einfacher Zugriff auf Kalibrierbauteile.

Software-Implementierung

C++-Code für AVR-GCC. Initialisiere Wire und LiquidCrystal_I2C. LCD-Adresse: 0x3F. Pins: Lade PB0, Entlade PB1, Bereich 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);

// Pins
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);
  // ADC-Initialisierung
  ADMUX = (1<<REFS0); // AVCC-Referenz
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
}

float measureCapacitance(float R) {
  // Entladen
  digitalWrite(DISCHARGE_PIN, LOW);
  delay(100);
  // Laden
  unsigned long t0 = millis();
  digitalWrite(CHARGE_PIN, HIGH);
  while (analogRead(ADC_PIN) < 645) {} // 63,2 % von 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);
}

ADC-Abfrage alle 10 ms, Timer-Überlaufschutz. Kalibrierkonstanten werden im EEPROM gespeichert.

Wichtige Erkenntnisse

  • Die RC-Ladungsmethode erreicht ±5 % Genauigkeit für C = 1 nF–100 μF.
  • Schaltbare Widerstände erweitern den Messbereich ohne Verlust der ADC-Auflösung.
  • Der I2C-LCD spart GPIO-Pins – ideal für eingebettete Systeme.
  • Der LM7805-Linearesteller ist einfach, aber erwärmt sich – akzeptabel für Prototypen.
  • Doppelschicht-Leiterplatte mit DRC-Prüfung in EasyEDA vermeidet Routing-Fehler.

— Editorial Team

Advertisement 728x90

Weiterlesen