返回首页

ATmega8 上的电容表:原理图和代码

在 ATmega8 上使用 RC 充电方法开发了电容器电容表。描述了原理图、EasyEDA 中的 PCB 布局、带有 ADC 和 I2C LCD 的代码、3D 外壳。该项目展示了嵌入式开发的完整周期。

ATmega8 电容表:从原理图到 PCB 的完整指南
Advertisement 728x90

基于ATmega8的电容测量仪:从原理图到原型机

ATmega8微控制器通过RC充电法实现高精度电容测量。该设备配备I2C接口液晶屏、LM7805稳压器,以及可切换电阻以适应不同电容量程。开发过程使用EasyEDA进行PCB设计,Compass 3D完成外壳建模,Proteus用于电路仿真。

电容C定义为C = Q/U,电荷呈指数累积。当电压充至Ucc的63.2%时,对应的时间常数τ = R × C。算法步骤如下:

  • 将放电引脚设为"INPUT",防止提前放电。
  • 记录t0,即充电开始时刻。
  • 将充电引脚设为"OUTPUT"高电平,持续监测ADC直至达到Ucc的63.2%。
  • 计算C = (t - t0) / R。
  • 通过电阻放电:将放电引脚设为"INPUT",输出低电平。

通过切换电阻的RC电路,可覆盖从皮法到毫法的广泛电容范围。

Google AdInline article slot

原理图设计与电路架构

ATmega8(DIP-28封装)搭配10位ADC,将电容电压Uc转换为数字信号。ALU根据时间常数τ计算电容值。0603贴片电阻(1kΩ–1MΩ)构成RC网络。放电电阻用于限流。16×2 I2C液晶屏(SDA/SCL)大幅减少GPIO占用。供电路径为:9V电池 → LM7805 → 5V,经0603陶瓷电容和3216电解电容滤波。

AREF/AVCC接5V,Vcc/GND标准连接。通过数字输出控制电阻切换,实现自动量程切换。

核心元器件清单:

Google AdInline article slot
  • ATmega8-16PU
  • LM7805
  • I2C液晶屏 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)。通孔直径d=1.2 mm,适用于≤1 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电池仓、BNC测试端子接口、液晶屏开孔及电源按钮位置。壁厚2 mm,并设置加强筋。可视化模型确认人体工学设计合理,校准元件触手可及。

软件实现

采用C++编写AVR-GCC代码。初始化Wire与LiquidCrystal_I2C库。液晶屏地址为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) {} // 63.2% of 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每10毫秒轮询一次,具备定时器溢出保护机制。校准参数存储于EEPROM中。

关键收获

  • RC充电法在1nF–100μF范围内实现±5%测量精度。
  • 电阻切换扩展量程,同时保持ADC分辨率。
  • I2C液晶屏节省GPIO资源,特别适合嵌入式系统。
  • LM7805线性稳压器结构简单,但发热明显——适用于原型验证阶段。
  • 双层PCB结合EasyEDA的DRC检查,有效避免布线错误。

— Editorial Team

Advertisement 728x90

继续阅读