(บล็อกที่ 18) LC Meter ใช้ Arduino: การวัดความเหนี่ยวนำและความถี่
LC Meter ใช้ Arduino: การวัดความเหนี่ยวนำและความถี่
ARDUINO
ดังที่เรากล่าวไว้แล้วว่าคลื่นของเราคือคลื่นไซน์ดังนั้นจึงมีช่วงเวลาเดียวกันในทั้งแอพพลิเคชั่นบวกและลบหมายความว่าเครื่องเปรียบเทียบจะแปลงเป็นคลื่นสี่เหลี่ยมที่มีรอบการทำงาน 50% เพื่อให้เราสามารถวัดได้โดยใช้ฟังก์ชัน pulseIn ()ของ Arduino ฟังก์ชั่นนี้จะทำให้เรามีช่วงเวลาที่สามารถแปลงเป็นความถี่ได้อย่างง่ายดายโดยการย้อนระยะเวลา เป็นฟังก์ชันpulseInวัดเพียงหนึ่งชีพจรดังนั้นตอนนี้เพื่อให้ได้ความถี่ที่ถูกต้องเราต้องคูณด้วย 2 ขณะนี้เรามีความถี่ที่สามารถแปลงเป็นตัวเหนี่ยวนำโดยใช้สูตรข้างต้น
ทุกคนที่ฝังตัวมีความคุ้นเคยกับมัลติมิเตอร์ซึ่งเป็นเครื่องมือที่ดีในการวัดแรงดันกระแสต้านทาน ฯลฯ มัลติมิเตอร์สามารถวัดได้ง่าย แต่บางครั้งเราจำเป็นต้องวัดความเหนี่ยวนำและความจุที่ไม่สามารถทำได้ด้วยเครื่องมัลติมิเตอร์แบบปกติ มีมัลติมิเตอร์แบบพิเศษที่สามารถวัดความเหนี่ยวนำและประจุตัวได้ แต่มีค่าใช้จ่ายสูง เราได้สร้างเครื่องวัดความถี่ , เครื่องวัดความสามารถและเครื่องวัดความต้านทานโดยใช้ Arduinoแล้ว ดังนั้นวันนี้เราจะไปทำให้การเหนี่ยวนำLC Meter ใช้ Arduino ในโครงการนี้เราจะแสดงค่าความเหนี่ยวนำและความจุรวมทั้งความถี่ในการแสดงผล LCD 16x2. จะมีปุ่มกดในวงจรเพื่อสลับระหว่างความจุและจอแสดงผลเหนี่ยวนำ
องค์ประกอบที่จำเป็น
- Arduino Uno
- 741 opamp IC
- แบตเตอรี่ 3v
- ตัวต้านทาน 100 โอห์ม
- ตัวเก็บประจุ
- ตัวนำกระแสไฟฟ้า
- 1n4007 diode
- ตัวต้านทาน 10k
- หม้อ 10k
- แหล่งจ่ายไฟ
- กดปุ่ม
- Breadboard หรือ PCB
- สายเชื่อมต่อ
การคำนวณความถี่และความเหนี่ยวนำ
ในโครงการนี้เราจะไปวัดเหนี่ยวนำและความจุโดยใช้วงจร LC ในแบบคู่ขนาน วงจรนี้เป็นเหมือนแหวนหรือกระดิ่งซึ่งเริ่มมีเสียงสะท้อนที่ความถี่บางอย่าง เมื่อใดก็ตามที่เราใช้ชีพจรวงจร LC นี้จะเริ่มต้นการสะท้อนและความถี่เรโซแนนซ์นี้อยู่ในรูปแบบอะนาล็อก (คลื่นไซน์) ดังนั้นเราจำเป็นต้องแปลงเป็นคลื่นอัศวิน เมื่อต้องการทำเช่นนี้เราใช้ความถี่เรโซแนนซ์อนาล็อกนี้เป็น opamp (741 ในกรณีของเรา) ซึ่งจะแปลงเป็นคลื่นอัจฉริยะ (ความถี่) ที่ 50% ของรอบการทำงาน ตอนนี้เราวัดความถี่โดยใช้ Arduino และโดยใช้การคำนวณทางคณิตศาสตร์บางอย่างที่เราสามารถหาตัวเหนี่ยวนำหรือความจุ เราได้ใช้กำหนดLCสูตรการตอบสนองความถี่วงจร
f = 1 / (2 * เวลา)
ที่เวลาเป็นผลลัพธ์ของpulseIn ()ฟังก์ชั่น
ตอนนี้เรามีวงจร LC ความถี่:
f = 1/2 * Pi * รากที่สองของ (LC)
เราสามารถแก้ปัญหาได้เพื่อให้ได้ตัวเหนี่ยวนำ:
f 2 = 1 / (4Pi 2 LC) L = 1 / (4Pi 2 f 2 C) L = 1 / (4 * pi * pi * f * f * C)
หมายเหตุ:ในขณะที่วัดค่าตัวเหนี่ยวนำ (L1) ค่าตัวเก็บประจุ (C1) ควรเป็น 0.1uF และในขณะที่วัดค่าความจุ (C1) ค่าเหนี่ยวนำ (L1) ควรเป็น 10mH
แผนผังวงจรและคำอธิบาย
ในแผนภาพวงจร LC Meterนี้เราได้ใช้ Arduino เพื่อควบคุมการทำงานของโครงการ ในนี้เราได้ใช้วงจร LCวงจร LC นี้ประกอบด้วย Cuductor และ Capacitor ในการแปลงคลื่นความถี่ไซน์เป็นคลื่นแบบดิจิตอลหรือคลื่นสี่เหลี่ยมเราใช้เครื่องขยายเสียงในการดำเนินงานคือ 741 นี่จำเป็นต้องใช้แหล่งจ่ายไฟเชิงลบเพื่อให้ได้ความถี่เอาต์พุตที่ถูกต้อง ดังนั้นเราจึงใช้แบตเตอรี่ 3v ที่เชื่อมต่ออยู่ในขั้วย้อนกลับหมายถึงขาพิ้น 741 ที่เชื่อมต่อกับขั้วลบของแบตเตอรี่และขาบวกของแบตเตอรี่เชื่อมต่อกับพื้นของวงจรที่เหลืออยู่ สำหรับข้อมูลเพิ่มเติมโปรดดูแผนผังด้านล่าง
ที่นี่เรามีปุ่มกดเพื่อเปลี่ยนโหมดการทำงานไม่ว่าเราจะวัดความเหนี่ยวนำหรือความจุ จอ LCD ขนาด 16x2 ถูกใช้แสดงความเหนี่ยวนำหรือความจุด้วยความถี่ของวงจร LC มีการใช้หม้อขนาด 10k เพื่อควบคุมความสว่างของจอ LCDวงจรขับเคลื่อนด้วยความช่วยเหลือของแหล่งจ่ายไฟ Arduino 5v และเราสามารถใช้พลังงาน Arduino ได้ 5v โดยใช้อะแดปเตอร์ USB หรือ 12v
อธิบายการเขียนโปรแกรม
ส่วนการเขียนโปรแกรมของโครงการ LC Meterนี้ทำได้ง่ายมาก รหัสArduino สมบูรณ์จะได้รับที่ท้ายบทความนี้
ขั้นแรกเราต้องใส่ไลบรารีสำหรับ LCD และประกาศหมุดและมาโครบางตัว
#include <LiquidCrystal.h> LiquidCrystal lcd (A5, A4, A3, A2, A1, A0); #define serial #define charge 3 #define freqIn 2 #define mode 10 #define Delay 15 ความถี่คู่, ประจุ, ความเหนี่ยวนำ; typedef struct { int flag: 1; }ธง; ธงบิต;
หลังจากนั้นในฟังก์ชันการตั้งค่าเราได้เริ่มต้นการสื่อสาร LCD และ Serialเพื่อแสดงค่าที่วัดได้ผ่านจอ LCD และจอภาพอนุกรม
void setup () { #ifdef Serial.begin แบบอนุกรม(9600); endif # lcd.begin (16, 2); pinMode (freqIn, INPUT); pinMode (ค่า, OUTPUT); pinMode (โหมด, INPUT_PULLUP); lcd.print ("LC Meter Using"); lcd.setCursor (0, 1); lcd.print ("Arduino"); ล่าช้า (2000); lcd.clear (); lcd.print ("วงจรย่อย"); ล่าช้า (2000); }
จากนั้นในฟังก์ชันลูปให้ใช้ชีพจรของช่วงเวลาที่กำหนดไปยังวงจร LC ซึ่งจะชาร์จวงจร LC หลังจากถอดวงจรชีพจร LC จะเริ่มสะท้อน จากนั้นเราอ่านการแปลงคลื่นสแควร์ที่มาจาก op-amp โดยใช้ฟังก์ชัน pulseIn ()และแปลงข้อมูลโดยคูณด้วย 2 ที่นี่เราได้นำตัวอย่างบางส่วนมาใช้ด้วย นั่นคือวิธีการคำนวณความถี่ :
void loop () { สำหรับ (int i = 0; i <Delay; i ++) { digitalWrite (เรียกเก็บเงิน, สูง); delayMicroseconds (100); digitalWrite (ค่าใช้จ่ายต่ำ); delayMicroseconds (50); ชีพจรสองครั้ง = ชีพจร (freqIn, HIGH, 10000); ถ้า (ชีพจร> 0.1) ความถี่ + = 1.E6 / (2 * ชีพจร); ล่าช้า (20); } ความถี่ / = ล่าช้า; #ifdef serial serial ("ความถี่:"); Serial.print (ความถี่); Serial.print ("Hz"); endif # lcd.setCursor (0, 0); lcd.print ( "ความถี่:"); lcd.print (ความถี่); lcd.print ("Hz");
หลังจากรับค่าความถี่แล้วเราได้แปลงค่าเป็นค่าความเหนี่ยวนำโดยใช้โค้ดที่ให้มา
capacitance = 0.1E-6; ตัวเหนี่ยวนำ = (1. / (ความจุ * ความถี่ * ความถี่ * 4. * 3.14159 * 3.14159)) * 1.E6; #ifdef serial serial.print ("ind:"); ถ้า (เหนี่ยวนำ> = 1000) { Serial.print (เหนี่ยวนำ / 1000); Serial.println ("mH"); } else { Serial.print (ตัวเหนี่ยวนำ); Serial.println ("uH"); } #endif lcd.setCursor (0, 1); lcd.print ( "Ind:"); ถ้า (inductance> = 1000) { lcd.print (inductance / 1000); lcd.print ("mH"); } else { lcd.print (ตัวเหนี่ยวนำ); lcd.print ("uH"); } }
และโดยการใช้รหัสให้เราคำนวณความจุ
if (Bit.flag) { inductance = 1.E-3; capacitance = ((1. / (ความเหนี่ยวนำ * ความถี่ * ความถี่ * 4. * 3.14159 * 3.14159)) * 1.E9); ถ้า capacitance (int) <0) capacitance = 0; #ifdef serial serial ("Capacitance:"); Serial.print (ความจุ, 6); Serial.println ("uF"); endif # lcd.setCursor (0, 1); lcd.print ("Cap:"); ถ้า (ความจุ> 47) { lcd.print ((capacitance / 1000)); lcd.print ("uF"); } else { lcd.print (capacitance); lcd.print ("nF"); } }
นี่คือวิธีที่เราคำนวณความถี่, ค่าความจุและความเหนี่ยวนำโดยใช้ Arduinoและแสดงบนจอ LCD ขนาด 16x2
รหัส
#include <LiquidCrystal.h>
LiquidCrystal lcd (A5, A4, A3, A2, A1, A0);
LiquidCrystal lcd (A5, A4, A3, A2, A1, A0);
#define serial
#define charge 3
#define freqIn 2
#define mode 10
#define freqIn 2
#define mode 10
#define Delay 15
ความถี่คู่, ประจุ, ความเหนี่ยวนำ;
typedef struct
{
int flag: 1;
}ธง;
{
int flag: 1;
}ธง;
ธงบิต;
void setup ()
{
#ifdef
Serial.begin แบบอนุกรม(9600);
endif #
lcd.begin (16, 2);
pinMode (freqIn, INPUT);
pinMode (ค่า, OUTPUT);
pinMode (โหมด, INPUT_PULLUP);
lcd.print ("LC Meter Using");
lcd.setCursor (0, 1);
lcd.print ("Arduino");
ล่าช้า (2000);
lcd.clear ();
lcd.print ("วงจรย่อย");
ล่าช้า (2000);
}
{
#ifdef
Serial.begin แบบอนุกรม(9600);
endif #
lcd.begin (16, 2);
pinMode (freqIn, INPUT);
pinMode (ค่า, OUTPUT);
pinMode (โหมด, INPUT_PULLUP);
lcd.print ("LC Meter Using");
lcd.setCursor (0, 1);
lcd.print ("Arduino");
ล่าช้า (2000);
lcd.clear ();
lcd.print ("วงจรย่อย");
ล่าช้า (2000);
}
void loop ()
{
สำหรับ (int i = 0; i <Delay; i ++)
{
digitalWrite (เรียกเก็บเงิน, สูง);
delayMicroseconds (100);
digitalWrite (ค่าใช้จ่ายต่ำ);
delayMicroseconds (50);
ชีพจรสองครั้ง = ชีพจร (freqIn, HIGH, 10000);
ถ้า (ชีพจร> 0.1)
ความถี่ + = 1.E6 / (2 * ชีพจร);
ล่าช้า (20);
}
ความถี่ / = ล่าช้า;
#ifdef serial serial
("ความถี่:");
Serial.print (ความถี่);
Serial.print ("Hz");
endif #
{
สำหรับ (int i = 0; i <Delay; i ++)
{
digitalWrite (เรียกเก็บเงิน, สูง);
delayMicroseconds (100);
digitalWrite (ค่าใช้จ่ายต่ำ);
delayMicroseconds (50);
ชีพจรสองครั้ง = ชีพจร (freqIn, HIGH, 10000);
ถ้า (ชีพจร> 0.1)
ความถี่ + = 1.E6 / (2 * ชีพจร);
ล่าช้า (20);
}
ความถี่ / = ล่าช้า;
#ifdef serial serial
("ความถี่:");
Serial.print (ความถี่);
Serial.print ("Hz");
endif #
lcd.setCursor (0, 0);
lcd.print ( "ความถี่:");
lcd.print (ความถี่);
lcd.print ("Hz");
lcd.print ( "ความถี่:");
lcd.print (ความถี่);
lcd.print ("Hz");
if (Bit.flag)
{
inductance = 1.E-3;
capacitance = ((1. / (ความเหนี่ยวนำ * ความถี่ * ความถี่ * 4. * 3.14159 * 3.14159)) * 1.E9);
ถ้า capacitance (int) <0)
capacitance = 0;
#ifdef serial serial
("Capacitance:");
Serial.print (ความจุ, 6);
Serial.println ("uF");
endif #
lcd.setCursor (0, 1);
lcd.print ("Cap:");
ถ้า (ความจุ> 47)
{
lcd.print ((capacitance / 1000));
lcd.print ("uF");
}
else
{
lcd.print (capacitance);
lcd.print ("nF");
}
}
else
{
capacitance = 0.1E-6;
ตัวเหนี่ยวนำ = (1. / (ความจุ * ความถี่ * ความถี่ * 4. * 3.14159 * 3.14159)) * 1.E6;
#ifdef serial
serial.print ("ind:");
ถ้า (เหนี่ยวนำ> = 1000)
{
Serial.print (เหนี่ยวนำ / 1000);
Serial.println ("mH");
}
else
{
Serial.print (ตัวเหนี่ยวนำ);
Serial.println ("uH");
}
#endif
{
inductance = 1.E-3;
capacitance = ((1. / (ความเหนี่ยวนำ * ความถี่ * ความถี่ * 4. * 3.14159 * 3.14159)) * 1.E9);
ถ้า capacitance (int) <0)
capacitance = 0;
#ifdef serial serial
("Capacitance:");
Serial.print (ความจุ, 6);
Serial.println ("uF");
endif #
lcd.setCursor (0, 1);
lcd.print ("Cap:");
ถ้า (ความจุ> 47)
{
lcd.print ((capacitance / 1000));
lcd.print ("uF");
}
else
{
lcd.print (capacitance);
lcd.print ("nF");
}
}
else
{
capacitance = 0.1E-6;
ตัวเหนี่ยวนำ = (1. / (ความจุ * ความถี่ * ความถี่ * 4. * 3.14159 * 3.14159)) * 1.E6;
#ifdef serial
serial.print ("ind:");
ถ้า (เหนี่ยวนำ> = 1000)
{
Serial.print (เหนี่ยวนำ / 1000);
Serial.println ("mH");
}
else
{
Serial.print (ตัวเหนี่ยวนำ);
Serial.println ("uH");
}
#endif
lcd.setCursor (0, 1);
lcd.print ( "Ind:");
ถ้า (inductance> = 1000)
{
lcd.print (inductance / 1000);
lcd.print ("mH");
}
else
{
lcd.print (ตัวเหนี่ยวนำ);
lcd.print ("uH");
}
}
lcd.print ( "Ind:");
ถ้า (inductance> = 1000)
{
lcd.print (inductance / 1000);
lcd.print ("mH");
}
else
{
lcd.print (ตัวเหนี่ยวนำ);
lcd.print ("uH");
}
}
ถ้า (digitalRead (โหมด) == LOW)
{
Bit.flag =! Bit.flag;
ล่าช้า (1000)
ขณะที่ (digitalRead (โหมด) == ต่ำ);
}
ล่าช้า (50);
}
{
Bit.flag =! Bit.flag;
ล่าช้า (1000)
ขณะที่ (digitalRead (โหมด) == ต่ำ);
}
ล่าช้า (50);
}
ความคิดเห็น
แสดงความคิดเห็น