Powrót do strony głównej

Miernik pojemności na ATmega8: schemat i kod

Opracowany miernik pojemności kondensatorów na ATmega8 z metodą RC-ładowania. Opisane schematy, projekt PCB w EasyEDA, kod z ADC i LCD I2C, obudowa 3D. Projekt demonstruje pełny cykl rozwoju embedded.

ATmega8 miernik pojemności: pełny przewodnik od schematu do PCB
Advertisement 728x90

Tworzenie miernika pojemności kondensatorów na platformie ATmega8: od schematu do prototypu

Pojemność C wyznacza się jako C = Q/U, gdzie ładunek gromadzi się wykładniczo. Czas naładowania do 63,2% napięcia Ucc odpowiada stałej czasowej τ = R × C. Algorytm działania:

  • Pin rozładowania ustawiony na "WEJŚCIE" — zapobiega rozładowaniu.
  • Zapisanie t0 — moment rozpoczęcia naładowania.
  • Pin naładowania na "WYJŚCIE" HIGH, monitorowanie ADC do osiągnięcia 63,2% Ucc.
  • C = (t - t0) / R.
  • Rozładowanie przez rezystor: pin rozładowania na "WEJŚCIE", wyjście LOW.

Obwód RC z przełączanymi rezystorami dostosowuje τ do zakresu pojemności od pF do mF.

Schemat blokowy i zasadniczy schemat elektryczny

Mikrokontroler ATmega8 (DIP-28) z 10-bitowym ADC przetwarza napięcie Uc na kod cyfrowy. ALU oblicza pojemność C na podstawie τ. Rezystory naładowania typu SMD 0603 (1 kΩ–1 MΩ) tworzą układ RC. Rezystor rozładowania ogranicza prąd. Ekran LCD 16×2 z interfejsem I2C (SDA/SCL) minimalizuje liczbę pinów. Zasilanie: 9 V bateria typu "Krona" → LM7805 → 5 V, z kondensatorami ceramicznymi 0603 i elektrolitycznymi 3216 do filtracji.

Google AdInline article slot

AREF/AVCC podłączone do 5 V, Vcc/GND standardowo. Automatyczne przełączanie zakresów poprzez wyjścia cyfrowe do rezystorów.

Lista kluczowych elementów:

  • ATmega8-16PU
  • LM7805
  • LCD I2C 0x3F
  • Rezystory 0603: 1k, 10k, 100k, 1M
  • Kondensatory: 100nF×4, 10μF, 100μF

Projektowanie płytki drukowanej w EasyEDA

Wymiary płytki: 30×38 mm. Minimalna szerokość ścieżek b_min = I_max / (j_dop × t) = 0,254 mm (j_dop=50 A/mm², t=35 μm, I_max<0,1 A). Otworki d=1,2 mm dla wyprowadzeń ≤1 mm. Powierzchnia S = S'/Kz, Kz=0,4.

Google AdInline article slot

Metoda subtrakcyjna: wytrawianie folii na podłożu FR4. Kompozycja minimalizuje długość linii ADC, zmniejszając zakłócenia. Masa całkowita, zasilanie płaskie szyny. Wizualizacja 3D potwierdza odpowiednie odstępy.

Obliczenia parametrów płytki:

  • Powierzchnia: S' = ∑ powierzchni EKR, Kz=0,3–0,6.
  • Ścieżki: b_min według prądu i metody.
  • Otworki: d = d_ew + |∆d_n| + r (r=0,1–0,4 mm).
  • Odstępy: ≥0,2 mm.
  • Płytki przyłączeniowe: średnica 1,5–2×d.

Trasowanie: linie analogowe oddzielone od cyfrowych, masa pod ADC.

Google AdInline article slot

Obudowa i konstrukcja mechaniczna

Prototyp został zaprojektowany w Kompass 3D: odcinek na baterię 9 V, zaciski BNC do Cx, wycięcie pod LCD, przycisk zasilania. Ścianki grubości 2 mm, żebra wzmacniające. Wizualizacja potwierdza ergonomię: dostęp do elementów kalibracji.

Realizacja oprogramowania

Kod w języku C++ dla AVR-GCC. Inicjalizacja Wire i LiquidCrystal_I2C. Adres LCD 0x3F. Piny: naładowanie PB0, rozładowanie PB1, zakres 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);

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

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

Odczyt ADC co 10 ms, ochrona przed przepełnieniem timera. Stałe kalibracyjne zapisane w EEPROM.

Co warto wiedzieć

  • Metoda naładowania RC zapewnia dokładność ±5% dla C=1 nF–100 μF.
  • Przełączanie rezystora rozszerza zakres bez utraty rozdzielczości ADC.
  • LCD z interfejsem I2C oszczędza GPIO, idealne dla systemów wbudowanych.
  • Stabilizator liniowy LM7805 jest prosty, ale nagrzewa się — dopuszczalny dla prototypu.
  • Płyta dwustronna, DRC w EasyEDA eliminuje błędy trasowania.

— Editorial Team

Advertisement 728x90

Czytaj dalej