홈으로 돌아가기

ATmega8 정전용량 측정기: 회로도 및 코드

RC 충전 방법으로 ATmega8에서 커패시터 정전용량계 개발. 회로도, EasyEDA PCB 레이아웃, ADC 및 I2C LCD 코드, 3D 케이스 설명. 프로젝트는 임베디드 개발 전체 사이클을 보여줌.

ATmega8 정전용량계: 회로도부터 PCB까지 전체 가이드
Advertisement 728x90

ATmega8로 만드는 커패시턴스 미터: 회로도에서 프로토타입까지

ATmega8 마이크로컨트롤러를 사용하면 RC 충전 방식을 통해 정확한 커패시턴스 측정이 가능합니다. 이 장치는 I2C LCD 디스플레이, LM7805 전압 안정기, 다양한 커패시턴스 범위에 맞춰 전환 가능한 저항기 등을 탑재했습니다. 개발은 PCB 설계용 EasyEDA, 케이스 설계용 Compass 3D, 시뮬레이션용 Proteus를 통해 진행되었습니다.

커패시턴스 C는 전하가 지수적으로 축적되는 특성인 C = Q/U로 정의됩니다. 전원 전압 Ucc의 63.2%까지 충전되는 데 걸리는 시간이 시간 상수 τ = R × C와 같습니다. 알고리즘은 다음과 같습니다:

  • 방전 핀을 "INPUT"으로 설정해 방전을 막습니다.
  • 충전 시작 시점 t0를 기록합니다.
  • 충전 핀을 "OUTPUT" HIGH로 설정하고, ADC를 모니터링하여 Ucc의 63.2%에 도달할 때까지 기다립니다.
  • C = (t - t0) / R 공식으로 커패시턴스를 계산합니다.
  • 저항기를 통해 방전: 방전 핀을 "INPUT"으로 설정하고 출력을 LOW로 합니다.

스위처블 저항기를 갖춘 RC 회로는 피코파라드에서 밀리파라드까지 다양한 커패시턴스 범위에서 시간 상수 τ를 조절할 수 있습니다.

Google AdInline article slot

회로도 설계 및 회로 아키텍처

ATmega8(DIP-28)는 10비트 ADC를 통해 전압 Uc를 디지털 코드로 변환하며, ALU는 τ 기반으로 커패시턴스 C를 계산합니다. SMD 0603 저항기(1kΩ~1MΩ)가 RC 네트워크를 구성합니다. 방전용 저항기는 전류를 제한합니다. 16×2 I2C LCD(SDA/SCL)는 GPIO 핀 사용을 최소화합니다. 전원 공급: 9V 배터리 → LM7805 → 5V, 0603 세라믹 및 3216 알루미늄 전해 커패시터로 필터링됩니다.

AREF/AVCC는 5V에 연결되고, Vcc/GND는 표준 규격입니다. 디지털 출력을 통해 자동 범위 전환 기능이 구현됩니다.

주요 부품 목록:

Google AdInline article slot
  • ATmega8-16PU
  • LM7805
  • I2C LCD 0x3F
  • 0603 저항기: 1k, 10k, 100k, 1M
  • 커패시터: 100nF×4, 10μF, 100μF

EasyEDA에서의 PCB 설계

PCB 크기: 30×38 mm. 최소 트레이스 폭 b_min = I_max / (j_dop × t) = 0.254 mm (j_dop=50 A/mm², t=35 μm, I_max<0.1A). 리드 직경 ≤1 mm인 경우 홀 직경 d=1.2 mm. 면적 S = S'/Kz, Kz=0.4.

감광법: FR4 기판 위의 구리층을 에칭합니다. ADC 신호 경로 길이를 최소화해 노이즈를 줄였습니다. 접지선은 단단한 평면으로 구성되었고, 전원은 넓은 트레이스를 사용했습니다. 3D 뷰로 간섭 여부 확인이 가능합니다.

PCB 파라미터 계산:

Google AdInline article slot
  • 면적: S' = 각 부품 면적의 합, Kz=0.3–0.6.
  • 트레이스: 전류량과 제조 방법에 따라 b_min 결정.
  • 홀: d = d_element + |Δd| + r (r=0.1–0.4 mm).
  • 간섭 거리: ≥0.2 mm.
  • 패드: 직경 1.5–2×d.

라우팅: 아날로그 회로와 디지털 회로 분리; ADC 아래에 접지 레이어 배치.

케이스 및 기계 설계

Compass 3D로 설계: 9V 배터리 장착칸, Cx용 BNC 단자, LCD용 절단부, 전원 버튼. 벽 두께는 2mm이며 강화 리브를 추가했습니다. 시각화 결과 사용자 친화적인 디자인이 확인되었으며, 보정 부품 접근성이 용이합니다.

소프트웨어 구현

AVR-GCC용 C++ 코드. Wire 및 LiquidCrystal_I2C 초기화. LCD 주소: 0x3F. 핀 할당: 충전 PB0, 방전 PB1, 범위 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);

// 핀 정의
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 초기화
  ADMUX = (1<<REFS0); // AVCC 기준
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
}

float measureCapacitance(float R) {
  // 방전
  digitalWrite(DISCHARGE_PIN, LOW);
  delay(100);
  // 충전
  unsigned long t0 = millis();
  digitalWrite(CHARGE_PIN, HIGH);
  while (analogRead(ADC_PIN) < 645) {} // 1023의 63.2%
  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는 10ms마다 펄싱하며, 타이머 오버플로 방지 기능 포함. 보정 상수는 EEPROM에 저장됩니다.

핵심 요약

  • RC 충전 방식은 1nF~100μF 범위에서 ±5% 정확도를 달성합니다.
  • 저항기 스위칭으로 해상도 손실 없이 범위 확장이 가능합니다.
  • I2C LCD는 GPIO 핀을 절약해 임베디드 시스템에 적합합니다.
  • LM7805 선형 안정기는 간단하지만 발열이 발생하므로 프로토타입에는 적합합니다.
  • EasyEDA에서 DRC 검사를 수행한 이중층 PCB는 라우팅 오류를 방지합니다.

— Editorial Team

Advertisement 728x90

다음 읽기