如何制作自己的Arduino电容计

描述

在这个项目中,您将学习如何制作自己的Arduino电容计(测量电容器的值,范围从pF到1000的uF)。一般来说,电子爱好者喜欢设计自己的小工具而不是购买。在这个项目中,我们使用两种电容测量方法,即充电和放电方法,Arduino电容表和多谐振荡器方法,Arduino电容计。对于测量低值电容器,我们使用充电和放电方法,对于测量高值电容器,我们使用多谐振荡器方法。

电容器:电容器以电场的形式存储电能,电场由电容器的两个电极上的电荷极性建立。

电容:它是元件在其中存储电荷的能力。定量电容是可以存储在元件中的每单位电压电荷的量度。

从电容器的公式中,我们发现电容器存储的能量为

电容计

从方程中我们发现,电容器两端的电压是恒定的,通过它的电流为零。这意味着电容器,施加直流电压并且没有初始电荷,首先充当短路,但一旦保持完全充电,电容器就会表现为开路。

Arduino电容计电路说明

Arduino电容表的电路如图1所示,由arduino uno板、LCD、定时器IC和少量其他电子元件(如电阻器、电容器等)组成。

电容计

Arduino电容计的电路连接说明:

使用LCD的目的是显示电容器的值。我们在这里使用的 LCD 是 16×2 字母数字类型,有 16 个引脚输出。16 个引脚中有 8
个引脚用于数据通信。通常,LCD 可以在两种模式下运行,即 8 位模式和 4 位模式。在 8 位模式下,所有数据引脚 (D0 – D7) 都用于通信,而在 4
位模式下,只有高阶数据引脚 (D4 – D7) 用于通信。在项目中,Arduino电容计使用4位数据模式。LCD 的引脚 D4 到 D7 分别连接到
arduino uno 的 D7 到 D4 引脚。使能 (E) 和 SET/RESET (RS) 引脚分别连接到 arduino uno 板的 D11 和
D12 引脚。

定时器IC
555配置为非稳态多谐振荡器(频率发生器)模式,待测电容器的正极性连接到定时器IC的引脚2,电容器的负极性接地。定时器IC的输出从引脚3连接到arduino
uno板的D2引脚。通常在pF(皮科法拉)范围内的较低值的电容器,使用模拟引脚直接测量,采用充电和放电方法,如电路图所示。

充电放电方法的工作原理(用于测量1pF至100nF的低值电容)。

在这种方法中,电容器首先通过已知电阻器充电和放电。电容器的时间常数电容计

其中 R = 用于电容器充电和放电的电阻的固定值

C = 电容器的电容

时间常数定义为电容器上的电荷达到最大电荷值的 63.2% 的时间。

arduino uno板基本上测量电容器在充满电时达到其电压的63.2%和完全放电时达到其电压的36.8%所需的时间。

从上面的表达式中,我们发现需要一个电阻器来对电容器进行充电和放电,但在上述电路中,我们没有使用外部电阻器。这是因为Arduino板内部有上拉和下拉电阻,电容器通过该电阻器充电和放电。通过这种方式,我们可以使用充电和放电方法测量电容器的电容。

多谐振荡器方法(测量范围为1uF – 1000uF的电容器)

可以使用这种方法测量高值电容器。定时器IC在稳态模式下使用。在这种模式下,输出以恒定速率在高电平和低电平之间摆动,即产生频率。

Arduino电容计涉及的数学

电容计

其中 R1= 连接在 Vcc 和定时器 IC 555 的引脚编号 7 之间的电阻器。

R2= 定时器 IC 的引脚 7 和引脚 6 之间连接的电阻

电容计

我们知道

电容计电容计电容计电容计

arduino电容表的电阻值是固定的,使用两个电阻,每个电阻100K欧姆。当我们插入任何电容器时,都会产生一个恒定的频率,该频率由Arduino板以时间为单位进行测量。由于arduino具有毫秒的内置时间库功能。

电容可以按时间计算

电容计

如果我们把电阻的值放在上面的表达式中,它看起来像

电容计电容计

电容计

戴夫

这样我们就可以计算出电容器的电容。

如果电容器的值较低,则在多谐振荡器方法中误差会变大,因此我们使用充电和放电方法来降低电容器的值。

单刀双掷开关用于在高值电容器和低值电容器的测量之间切换。

Arduino电容计软件代码:软件代码是用Arduino编程语言编写的,用Arduino编程语言编译。您可以从下面下载代码并在您的系统中使用,而无需进行任何修改。

LiquidCrystal lcd(12, 11, 7, 6, 5, 4);

volatile unsigned long microseconds;

volatile float capacitance;

int CapPf=9;

int CapUf=10;

const int Cap_Out = A2;

const int Cap_In = A0;

const float Stray_Cap = 24.48;

const float Cap_GND = Stray_Cap;

const float Pullup_Res = 34.8;

const int ADC_Value = 1023;

void setup() {

lcd.begin(16, 2);

pinMode(2,INPUT);

pinMode(CapPf,INPUT);

pinMode(CapUf,INPUT);

pinMode(Cap_Out, OUTPUT);

pinMode(Cap_In, OUTPUT);

Serial.begin(9600);

lcd.setCursor(0,0);

lcd.print(“ Capacitance ”);

lcd.setCursor(0,1);

lcd.print(“ Meter ”);

delay(2000);

}

void cap() {

microseconds=micros()-microseconds;

capacitance=1.443*microseconds/300;

capacitance = capacitance/1000;

Serial.print(capacitance,3);

Serial.println(“uF”);

lcd.clear();

lcd.setCursor(0,0);

lcd.print(“Range: 1uf-1mF”);

lcd.setCursor(0, 1);

lcd.print(capacitance,3);

lcd.print(“uF ”);

microseconds=micros();

}

void loop(){

if(digitalRead(CapUf))

{

attachInterrupt(0,cap,RISING);

}

if(digitalRead(CapPf))

{

lcd.clear();

pinMode(Cap_In, INPUT);

digitalWrite(Cap_Out, HIGH);

int val = analogRead(Cap_In);

digitalWrite(Cap_Out, LOW);

if (val 《 1000)

{

pinMode(Cap_In, OUTPUT);

float capacitance = (float)val * Cap_GND / (float)(ADC_Value -

val);

lcd.setCursor(0,0);

lcd.print(“Range: 1pF-1nF”);

lcd.setCursor(0,1);

lcd.print(capacitance,3);

lcd.setCursor(14,1);

lcd.print(“pF”);

delay(200);

}

else

{

pinMode(Cap_In, OUTPUT);

delay(1);

pinMode(Cap_Out, INPUT_PULLUP);

unsigned long u1 = micros();

unsigned long t;

int digVal;

do

{

digVal = digitalRead(Cap_Out);

unsigned long u2 = micros();

t = u2 》 u1 ? u2 - u1 : u1 - u2;

}

while ((digVal 《 1) && (t 《 400000L));

pinMode(Cap_Out, INPUT);

val = analogRead(Cap_Out);

digitalWrite(Cap_In, HIGH);

int dischargeTime = (int)(t / 1000L) * 5;

delay(dischargeTime);

pinMode(Cap_Out, OUTPUT);

digitalWrite(Cap_Out, LOW);

digitalWrite(Cap_In, LOW);

float capacitance = -(float)t / Pullup_Res / log(1.0 - (float)val /
(float)ADC_Value);

lcd.setCursor(0,0);

lcd.print(“Scale: 1pF-1nF”);

if (capacitance 》 1000.0)

{

lcd.setCursor(0,1);

lcd.print(capacitance / 1000.0, 2);

lcd.setCursor(14,1);

lcd.print(“uF ”);

delay(200);

}

else

{

lcd.setCursor(0,1);

lcd.print(capacitance);

lcd.setCursor(14,1);

lcd.print(“nF”);

delay(200);

}

}

while (micros() % 1000 != 0);

}

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
jf_54141814 06-01
0 回复 举报
案例很好,期待合作。L617844220微信 收起回复

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分