在这个项目中,您将学习如何制作自己的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);
}
}
全部0条评论
快来发表一下你的评论吧 !