สารบัญ:

เครื่องกำเนิด/ทดสอบ 4-20ma โดยใช้ Arduino: 8 ขั้นตอน
เครื่องกำเนิด/ทดสอบ 4-20ma โดยใช้ Arduino: 8 ขั้นตอน

วีดีโอ: เครื่องกำเนิด/ทดสอบ 4-20ma โดยใช้ Arduino: 8 ขั้นตอน

วีดีโอ: เครื่องกำเนิด/ทดสอบ 4-20ma โดยใช้ Arduino: 8 ขั้นตอน
วีดีโอ: Signal generator จำลองสัญญาณเซนเซอร์ สำหรับ Analog PLC ได้ทั้ง 0-10v และ 4-20mA ใช้ง่าย มีแบตในตัว 2024, ธันวาคม
Anonim
เครื่องกำเนิด / ทดสอบ 4-20ma โดยใช้ Arduino
เครื่องกำเนิด / ทดสอบ 4-20ma โดยใช้ Arduino

เครื่องปั่นไฟขนาด 4-20mA มีจำหน่ายบนอีเบย์ แต่สำหรับคนชอบส่วน DIY ของสิ่งต่างๆ และใช้ชิ้นส่วนที่ฉันมีอยู่

ฉันต้องการทดสอบอินพุตแบบอะนาล็อกของ PLC เพื่อตรวจสอบการอ่าน scada ของเรา และเพื่อทดสอบเอาต์พุตของเครื่องมือ 4-20mA มีตัวแปลงกระแสเป็นแรงดันจำนวนมากและตัวแปลงแรงดันเป็นกระแสสำหรับ arduino บนอีเบย์ พวกเขาต้องการการสอบเทียบ ฉันสามารถใช้สิ่งนี้เพื่อปรับเทียบคอนเวอร์เตอร์ที่พบในอีเบย์และสิ่งที่ชอบได้

ฉันตัดสินใจว่าจะ DIY เครื่องกำเนิดไฟฟ้าและผู้ทดสอบ ณ จุดนี้ยังคงเป็นงานที่กำลังดำเนินการและเป็นต้นแบบ

ฉันมีระบบเสียง 2.1 แบบเก่าที่ไม่ได้ใช้งาน (ลำโพงขนาดเล็ก) ดังนั้นฉันจึงใช้กล่องลำโพงอันใดอันหนึ่งเป็นกล่องหุ้ม ฉันยังมีแอมพลิฟายเออร์ที่ตายเพราะฟ้าผ่า ฉันถอดขั้วต่อลำโพงออกจากแอมพลิฟายเออร์นั้นเพื่อให้เชื่อมต่อได้ง่าย ฉันตั้งใจที่จะสร้าง PCB ในอนาคตและตู้ที่ดีกว่า

เสบียง:

ส่วนรายการ.

LCD // 20x4 (ปรับโค้ดหากคุณมีขนาดเล็กกว่า)

LM7808 // ตัวควบคุม 8 โวลต์

LED // ชนิดหรือขนาดใดก็ได้

ตัวต้านทานสำหรับ LED // เหมาะสำหรับประเภท LED และ 8volt

ตัวต้านทาน 100 โอห์ม + ตัวต้านทาน 47 โอห์มในซีรีย์ // จะใช้เป็นตัวต้านทานแบ่ง

ตัวต้านทาน 10K // Arduino อนาล็อกในการป้องกันไฟฟ้าแรงสูง

ตัวต้านทาน 22K // เพื่อหยุด A0 จากการลอยตัว

ตัวต้านทาน Trimpot 100 ohm + 47 ohm ในซีรีย์ // ตัวจำลอง PT100

ตัวเก็บประจุ 35 โวลต์ // ฉันใช้ 470uF เพียงเพื่อลดความผันผวนของแรงดันไฟฟ้าลง

RTD (ตัวแปลงสัญญาณ PT100) // Span ไม่สำคัญ (ช่วง)

DIODE (สำหรับการป้องกันขั้ว)

INA219

Arduino

ขั้นตอนที่ 1:

ภาพ
ภาพ

การปฏิบัติตามแผนผังนี้จะช่วยให้คุณเริ่มต้นได้ว่าจะเพิ่มชิ้นส่วนและต่อสายตรงไหน

LM7808 อนุญาตให้อินพุตสูงสุด 25 โวลต์ซึ่งดีสำหรับระบบ PLC โดยทั่วไปจะใช้แหล่งจ่ายไฟ 24 โวลต์ เพิ่มฮีทซิงค์ไปยังตัวควบคุมและอย่าใช้เป็นเวลานาน แรงดันไฟตก 16 โวลต์ทำให้ตัวควบคุมสร้างความร้อนได้มาก

แหล่งจ่ายอินพุตจะป้อนตัวควบคุมและเชื่อมต่อกับ INA219 VIN ในการกำหนดค่านี้ INA219 จะสามารถวัดแรงดันไฟจ่ายที่ถูกต้องลบด้วยแรงดันตกจากไดโอด คุณควรวัดแรงดันตกคร่อมไดโอดและเพิ่มลงในโค้ดเพื่อให้คุณได้รับค่าแรงดันไฟที่ถูกต้อง

จาก INA219 VOUT ถึง RTD+ จะเพิ่มพลังให้ RTD RTD- ลงกราวด์ทำให้วงจรสมบูรณ์

ในการทดสอบการ์ดแอนะล็อก PLC คุณจะต้องเชื่อมต่อ RTD- กับอินพุตบนการ์ดแอนะล็อกและกราวด์จากการ์ดไปยังกราวด์ Arduino (ตรวจสอบให้แน่ใจว่าได้ถอดอุปกรณ์ใดๆ ที่เชื่อมต่อกับช่องที่กำลังทดสอบอยู่)

R5 และ LED1 แสดงว่าเปิดเครื่องแล้ว

ตัวควบคุมจะป้อนเข้าสู่ Arduino VIN (arduino มีตัวควบคุมในตัวถึง 5 โวลต์)

พิน Arduino 5V ไปที่ INA219 เพื่อจ่ายไฟให้กับชิปออนบอร์ด INA219 GND ถึงกราวด์ Arduino

ทริมที่ปัดน้ำฝนเป็น RTD PIN1 และทริมหม้อพิน 3 ถึง RTD พิน 2 จะจำลองการเชื่อมต่อ PT100 (สลับสายไฟหากหมุนหม้อตัดแต่งตามเข็มนาฬิกาไม่เพิ่ม mA)

ขั้นตอนที่ 2: การทดสอบเอาต์พุตของเครื่องมือ

ในการทดสอบเอาต์พุตของเครื่องมือ จำเป็นต้องมีชิ้นส่วนพิเศษ เช่น ตัวต้านทาน shunt ตัวต้านทาน 0.25W ปกติจะทำงานได้ดี คุณสามารถปล่อยตัวต้านทาน shunt และเพิ่ม INA219 ตัวที่สองเพื่อทดสอบเอาต์พุตของอุปกรณ์ เหลือตัวเดียวก็เลยใช้ตัวต้านทานแทน

การทดสอบโดยใช้การแบ่งสามารถทำได้ในด้านลบของอุปกรณ์เท่านั้น หากคุณใช้ด้านบวก คุณจะจัดหา Arduino ของคุณด้วยแรงดันไฟฟ้าที่อนุญาตมากกว่า 4 เท่าและปล่อยควันออกมา

เพิ่มตัวต้านทาน shunt แบบอนุกรมด้วยลวดลบของเครื่องมือ ด้านข้างของตัวแบ่งที่ใกล้กับอุปกรณ์มากที่สุดจะกลายเป็นแอนะล็อกเชิงบวกสำหรับ Arduino ด้านอื่น ๆ ของ shunt ใกล้กับแหล่งจ่ายไฟมากที่สุดจะกลายเป็นกราวด์ของ Arduino ที่ทำวงจรอินพุตแบบอะนาล็อกให้สมบูรณ์

ตัวต้านทาน shunt 150 โอห์มเป็นค่าสูงสุดที่ควรใช้เมื่อใช้ Arduino ตัวต้านทานมีแรงดันตกคร่อมเป็นเส้นตรงไปยัง mA ที่ไหลผ่าน ยิ่ง mA มาก แรงดันไฟฟ้าก็จะยิ่งมากขึ้น

ที่กระแส 20mA # 150ohm*0.02A = 3volt เป็น Arduino

ที่กระแส 4mA # 150ohm*0.004A = 0.6volt เป็น Arduino

ตอนนี้คุณอาจต้องการให้แรงดันไฟฟ้าใกล้เคียงกับ 5 โวลต์เพื่อให้คุณสามารถใช้ ADC เต็มรูปแบบของ Arduino (ไม่ใช่ความคิดที่ดี)

RTD สามารถเข้าถึงเอาต์พุต 30.2mA (ของฉันได้) 150โอห์ม*0.03A = 4.8โวลต์ ที่ใกล้ที่สุดเท่าที่ฉันอยากจะเป็น

เว็บไซต์อื่นระบุว่าใช้ตัวต้านทาน 250ohm

ที่กระแส 20mA # 250ohm*0.02A = 5volt เป็น Arduino

ที่กระแส 30mA # 250ohm*0.03A = 7.5volt เป็น Arduino

คุณเสี่ยงที่จะเผา ADC และ Arduino ของคุณ

ในการทดสอบเครื่องมือภาคสนาม ให้นำแบตเตอรี่ขนาด 12 โวลต์ติดตัวไปด้วยและเชื่อมต่อกับอินพุตแหล่งจ่าย การใช้แหล่งพลังงานภายนอกจะไม่ส่งผลต่อการตั้งค่า PLC ปัจจุบัน

ในการทดสอบการ์ดอินพุตแบบอะนาล็อกในสนาม ให้นำแบตเตอรี่ 12 โวลต์ติดตัวไปด้วย ถอดอุปกรณ์ + ออกจากวงจร ต่อกราวด์กับกราวด์ของเครื่องมือและ RTD- กับสายเครื่องมือที่ถอดออก

ขั้นตอนที่ 3: การสอบเทียบ

การสอบเทียบ
การสอบเทียบ

ในการปรับเทียบการอ่านค่าความต้านทาน shunt ของคุณ ให้ต่อ RTD- เข้ากับ shunt Analog เข้า ตั้งค่า trim pot เพื่อให้ mA ที่สร้างขึ้นคือ 4mA หาก mA ของอุปกรณ์ไม่เท่ากัน ให้แก้ไขค่าแรกในโค้ดที่บรรทัดที่ 84 การเพิ่มค่านี้จะทำให้การอ่าน mA ลดลง

จากนั้นตั้งหม้อตัดแต่งของคุณเพื่อสร้าง 20mA หาก mA ของอุปกรณ์ไม่เท่ากัน ให้แก้ไขค่าที่สองในรหัสที่บรรทัดที่ 84

ดังนั้น 4-20mA ของคุณจะกลายเป็น 0.6-3volts (ตามทฤษฎี) เกินขอบเขตเพียงพอ การใช้ไลบรารี่จาก eRCaGuy การสุ่มตัวอย่างมากเกินไปจะทำให้คุณอ่านข้อมูลได้ดีขึ้นและมีเสถียรภาพ

หวังว่าคุณจะอ่านสิ่งนี้ นี่เป็นคำแนะนำครั้งแรกของฉัน ดังนั้นโปรดอย่ากังวลหากฉันทำผิดพลาดที่ไหนสักแห่งหรือทิ้งอะไรไว้

โปรเจ็กต์นี้อาจจะไม่ใช่วิธีที่ดีที่สุดที่จะทำ แต่มันได้ผลสำหรับฉันและสนุกกับการทำมัน

ความคิดบางอย่างที่ฉันมีพิเศษ…

เพิ่มเซอร์โวเพื่อหมุนหม้อตัดแต่งภายในกล่อง

เพิ่มปุ่มกดเพื่อหมุนเซอร์โวไปทางซ้ายหรือขวา

เพิ่มเซ็นเซอร์อุณหภูมิแบบดิจิตอลไปยังฮีทซิงค์เรกูเลเตอร์เพื่อเตือนความร้อนที่เป็นอันตราย

ขั้นตอนที่ 4: การเขียนโปรแกรม Arduino

#รวม

// #include // Uncomment ถ้าคุณใช้ LCD กับ shift register

#รวม

#รวม

#รวม

#รวม

//A4 = (SDA)

//A5 = (SCL)

Adafruit_INA219 ina219;

LiquidCrystal LCD (12, 11, 5, 4, 3, 2);

// LiquidCrystal_SR จอแอลซีดี (3, 4, 2); // Uncomment ถ้าคุณใช้ LCD กับ shift register

// | | |_สลักสลัก

// | \_ เข็มนาฬิกา

// \_ ข้อมูล/เปิดใช้งานพิน

ไบต์ bitsOfResolution = 12; //สั่งความละเอียดเกินจริง

numSamplesToAvg แบบยาวที่ไม่ได้ลงนาม = 20; //จำนวนตัวอย่างที่ความละเอียดเกินที่ต้องการและค่าเฉลี่ย

ADC_prescaler_t ADCSpeed = ADC_DEFAULT;

ก่อนหน้าMillis แบบยาวที่ไม่ได้ลงนาม = 0;

shuntvoltage ลอย = 0.0; //จาก INA219

แรงดันบัสลอย = 0.0; //จาก INA219

ลอยปัจจุบัน_mA = 0.0; //จาก INA219

แรงดันโหลดลอย = 0.0; //จาก INA219

โฟลต Arduinovoltage = 0.0; //การคำนวณแรงดันไฟฟ้าจาก A0 pin

A0analogReading แบบยาวที่ไม่ได้ลงนาม = 0;

ไบต์ analogIn = A0;

float ma_mapped = 0.0; // แผนที่แรงดันไฟฟ้าจาก A0 ถึง 4-20mA

การตั้งค่าเป็นโมฆะ () {

adc.setADCSpeed(ADCSpeed);

adc.setBitsOfResolution (บิตของความละเอียด);

adc.setNumSamplesToAvg(numSamplesToAvg);

uint32_t ความถี่ปัจจุบัน;

ina219.begin();

ina219.setCalibration_32V_30mA(); // แก้ไขไลบรารีเพื่อความแม่นยำมากขึ้นใน mA

lcd.begin(20, 4); // เริ่มต้น LCD

lcd.clear();

lcd.home (); // กลับบ้าน

lcd.print("*******************");

ล่าช้า (2000);

lcd.clear();

}

วงเป็นโมฆะ ()

{

ไม่ได้ลงนามยาว currentMillis = millis();

const ช่วงยาว = 100;

//&&&&&&&&&&&&&&&&&

อ่านอุปกรณ์ I2C เป็นระยะและทำการคำนวณ

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

ถ้า (currentMillis - PreviousMillis >= ช่วง) {

มิลลิวินาทีก่อนหน้า = ปัจจุบันมิลลิวินาที;

ช่วงเวลา ();

}

Print_To_LCD(); // ฉันอาจไม่จำเป็นต้องอัปเดต LCD อย่างรวดเร็วและสามารถย้ายไปด้านล่าง Interval()

}

โมฆะ

ช่วงเวลา () {

shuntvoltage = ina219.getShuntVoltage_mV();

แรงดันบัส = ina219.getBusVoltage_V();

current_mA = ina219.getCurrent_mA();

loadvoltage = (แรงดันบัส + (shuntvoltage / 1000)) + 0.71; // +0.71 คือแรงดันไฟไดโอดของฉันตก

A0analogReading = adc.newAnalogRead (แอนะล็อกใน);

arduinovoltage = (5.0 * A0analogReading); //คำนวณเป็น mV

ma_mapped = แผนที่ (arduinovoltage, 752, 8459, 30, 220) / 10.0; // แผนที่ไม่สามารถใช้ทุ่นลอยได้ เพิ่ม 0 หลังค่าที่แมปแล้วหารด้วย 10 เพื่อรับค่าโฟลตที่อ่านได้

//การทำแผนที่จากการคำนวณแรงดันไฟฟ้าช่วยให้อ่านค่าได้เสถียรยิ่งขึ้น จากนั้นใช้การอ่านข้อมูลดิบของ adc

ถ้า (shuntvoltage >= -0.10 && shuntvoltage <= -0.01) // เมื่อไม่มีการโหลด INA219 มีแนวโน้มที่จะอ่านด้านล่าง -0.01 ฉันก็ทำได้

{

ปัจจุบัน_mA = 0;

แรงดันบัส = 0;

แรงดันโหลด = 0;

แรงดันไฟฟ้ากระแสสลับ = 0;

}

}

โมฆะ

Print_To_LCD() {

lcd.setCursor(0, 0);

if (ma_mapped < 1.25) {// เมื่อไม่มีกระแสนี่คือการอ่าน mA ของฉัน ดังนั้นฉันจึงทิ้งมันไป

lcd.print("* เครื่องกำเนิด 4-20mA *");

}

อื่น {

lcd.print("** เครื่องทดสอบอนาล็อก **");

}

lcd.setCursor(0, 1);

lcd.print("อุปกรณ์:");

lcd.setCursor(10, 1);

ถ้า (ma_mapped < 1.25) {

lcd.print("ไม่มีอุปกรณ์");

}

อื่น {

lcd.print(ma_mapped);

}

lcd.print("mA");

lcd.setCursor(0, 2);

lcd.print("สร้าง:");

lcd.setCursor(10, 2);

lcd.print(current_mA);

lcd.print("mA");

lcd.setCursor(0, 3);

lcd.print("อุปทาน:");

lcd.setCursor(10, 3);

lcd.print (แรงดันโหลด);

lcd.print("วี");

}

ขั้นตอนที่ 5: ภาพถ่ายเพิ่มเติมบางส่วน

ภาพถ่ายเพิ่มเติมบางส่วน
ภาพถ่ายเพิ่มเติมบางส่วน

ขั้วต่อลำโพงเครื่องขยายเสียง LED ขับเคลื่อนโดยเครื่องกำเนิดไฟฟ้าปัจจุบัน (RTD) การเดินสายการ์ดแบบอะนาล็อกจะเข้ามาแทนที่ LED

เทอร์มินอลด้านซ้ายสุดสำหรับอินพุตแหล่งจ่าย ขั้วต่อทางด้านขวาสำหรับใส่อุปกรณ์

ขั้นตอนที่ 6: ติดตั้งเข้า

ติดตั้งใน
ติดตั้งใน

ทุกอย่างดูเหมือนจะพอดี ฉันใช้ซิลิโคนเพื่อยึดสิ่งของบางอย่างไว้ด้วยกันชั่วคราว หม้อตัดแต่งเป็นซิลิโคนที่ด้านบนขวา เจาะรูเล็กไว้ล่วงหน้า ฉันสามารถปรับกระแสจากด้านบนของกล่อง

ขั้นตอนที่ 7: แค่รูปถ่าย

แค่รูปถ่าย
แค่รูปถ่าย
แค่รูปถ่าย
แค่รูปถ่าย
แค่รูปถ่าย
แค่รูปถ่าย
แค่รูปถ่าย
แค่รูปถ่าย

ขั้นตอนที่ 8: คำสุดท้าย

ฉันได้ทดสอบเอาต์พุตของอุปกรณ์นี้กับ Allan Bradley PLC แล้ว ผลลัพธ์ดีมาก ฉันได้เต็มช่วง ฉันได้ทดสอบอุปกรณ์นี้ด้วยเซ็นเซอร์ความดัน 4-20mA ที่มีจอ LCD ในตัว กลับได้ผลดีมาก การอ่านของฉันถูกปิดโดยทศนิยมสองสามตำแหน่ง

ฉันเขียนโค้ด Arduino ในแท็บ ใน PLC จะเรียกว่ารูทีนย่อย ทำให้การดีบักง่ายขึ้นสำหรับฉัน

แนบเป็นไฟล์ข้อความของแท็บเหล่านั้น

แนะนำ: