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