在這個項目中,您將學習如何制作自己的Arduino電容計(測量電容器的值,范圍從pF到1000的uF)。一般來說,電子愛好者喜歡設計自己的小工具而不是購買。在這個項目中,我們使用兩種電容測量方法,即充電和放電方法,Arduino電容表和多諧振蕩器方法,Arduino電容計。對于測量低值電容器,我們使用充電和放電方法,對于測量高值電容器,我們使用多諧振蕩器方法。
電容器:電容器以電場的形式存儲電能,電場由電容器的兩個電極上的電荷極性建立。
電容:它是元件在其中存儲電荷的能力。定量電容是可以存儲在元件中的每單位電壓電荷的量度。
從電容器的公式中,我們發(fā)現(xiàn)電容器存儲的能量為
從方程中我們發(fā)現(xiàn),電容器兩端的電壓是恒定的,通過它的電流為零。這意味著電容器,施加直流電壓并且沒有初始電荷,首先充當短路,但一旦保持完全充電,電容器就會表現(xiàn)為開路。
Arduino電容計電路說明
Arduino電容表的電路如圖1所示,由arduino uno板、LCD、定時器IC和少量其他電子元件(如電阻器、電容器等)組成。
Arduino電容計的電路連接說明:
使用LCD的目的是顯示電容器的值。我們在這里使用的 LCD 是 16×2 字母數(shù)字類型,有 16 個引腳輸出。16 個引腳中有 8
個引腳用于數(shù)據(jù)通信。通常,LCD 可以在兩種模式下運行,即 8 位模式和 4 位模式。在 8 位模式下,所有數(shù)據(jù)引腳 (D0 – D7) 都用于通信,而在 4
位模式下,只有高階數(shù)據(jù)引腳 (D4 – D7) 用于通信。在項目中,Arduino電容計使用4位數(shù)據(jù)模式。LCD 的引腳 D4 到 D7 分別連接到
arduino uno 的 D7 到 D4 引腳。使能 (E) 和 SET/RESET (RS) 引腳分別連接到 arduino uno 板的 D11 和
D12 引腳。
定時器IC
555配置為非穩(wěn)態(tài)多諧振蕩器(頻率發(fā)生器)模式,待測電容器的正極性連接到定時器IC的引腳2,電容器的負極性接地。定時器IC的輸出從引腳3連接到arduino
uno板的D2引腳。通常在pF(皮科法拉)范圍內(nèi)的較低值的電容器,使用模擬引腳直接測量,采用充電和放電方法,如電路圖所示。
充電放電方法的工作原理(用于測量1pF至100nF的低值電容)。
在這種方法中,電容器首先通過已知電阻器充電和放電。電容器的時間常數(shù)
其中 R = 用于電容器充電和放電的電阻的固定值
C = 電容器的電容
時間常數(shù)定義為電容器上的電荷達到最大電荷值的 63.2% 的時間。
arduino uno板基本上測量電容器在充滿電時達到其電壓的63.2%和完全放電時達到其電壓的36.8%所需的時間。
從上面的表達式中,我們發(fā)現(xiàn)需要一個電阻器來對電容器進行充電和放電,但在上述電路中,我們沒有使用外部電阻器。這是因為Arduino板內(nèi)部有上拉和下拉電阻,電容器通過該電阻器充電和放電。通過這種方式,我們可以使用充電和放電方法測量電容器的電容。
多諧振蕩器方法(測量范圍為1uF – 1000uF的電容器)
可以使用這種方法測量高值電容器。定時器IC在穩(wěn)態(tài)模式下使用。在這種模式下,輸出以恒定速率在高電平和低電平之間擺動,即產(chǎn)生頻率。
Arduino電容計涉及的數(shù)學
其中 R1= 連接在 Vcc 和定時器 IC 555 的引腳編號 7 之間的電阻器。
R2= 定時器 IC 的引腳 7 和引腳 6 之間連接的電阻
我們知道
arduino電容表的電阻值是固定的,使用兩個電阻,每個電阻100K歐姆。當我們插入任何電容器時,都會產(chǎn)生一個恒定的頻率,該頻率由Arduino板以時間為單位進行測量。由于arduino具有毫秒的內(nèi)置時間庫功能。
電容可以按時間計算
如果我們把電阻的值放在上面的表達式中,它看起來像
戴夫
這樣我們就可以計算出電容器的電容。
如果電容器的值較低,則在多諧振蕩器方法中誤差會變大,因此我們使用充電和放電方法來降低電容器的值。
單刀雙擲開關用于在高值電容器和低值電容器的測量之間切換。
Arduino電容計軟件代碼:軟件代碼是用Arduino編程語言編寫的,用Arduino編程語言編譯。您可以從下面下載代碼并在您的系統(tǒng)中使用,而無需進行任何修改。
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文章
13瀏覽量
6327 -
Arduino
+關注
關注
188文章
6469瀏覽量
187056
發(fā)布評論請先 登錄
相關推薦
評論