ที่เก็บนี้มีไลบรารี Truerms C ++ สำหรับ Arduino ด้วยไลบรารีนี้เป็นไปได้ที่จะคำนวณค่า เฉลี่ย และ RMS (Root Mean Square) หรือค่า ที่มีประสิทธิภาพ ของสัญญาณอินพุต ADC ไลบรารีนี้ยังคำนวณพลังงาน จริง ที่ชัดเจน และ ปัจจัยพลังงาน จากทั้งสัญญาณแรงดันไฟฟ้าและสัญญาณอินพุตปัจจุบัน จากเวอร์ชัน 1.3 มีการเพิ่มการวัดพลังงานในโครงการ
แรงดันไฟฟ้าและการแสดงแรงดันไฟฟ้าของกระแสสามารถวัดได้ด้วย ADC ของ Arduino โดยใช้วงจรอินพุตที่เหมาะสมสำหรับการปรับขนาดปริมาณที่วัดได้ลงไปที่ช่วงแรงดันไฟฟ้าที่สอดคล้องกับ 0-5V ของ ADC โซลูชันที่ให้มาใช้วิธีง่ายๆในการปรับขนาดปริมาณที่วัดได้ ผู้ใช้จะต้องกำหนดค่าสูงสุดถึงจุดสูงสุดถึงจุดสูงสุดของแรงดันไฟฟ้าอินพุตและกระแสไฟฟ้า เมื่อหน่วยของปริมาณที่วัดได้ถูกกำหนดเป็นโวลต์และแอมแปร์จากนั้นพลังงานที่คำนวณจะอยู่ในวัตต์และพลังงานใน WS (จูล) ห้องสมุดนี้สามารถพกพาไปยังแพลตฟอร์มอื่นได้ง่าย
มีการใช้คลาสไลบรารีต่อไปนี้:
AverageRmsRms2PowerPower2ค่าเฉลี่ย คำนวณค่าเฉลี่ยจากจำนวนตัวอย่างอินพุต (ปกติ) จาก ADC RMS หรือ RMS2 มีความหมายในการคำนวณค่ารูท-ค่าแคว้น-สแควร์ของสัญญาณและ พลังงาน หรือ POWER2 หมายถึงการคำนวณพลังงานจากทั้งแรงดันไฟฟ้าและอินพุตปัจจุบัน
RMS2 และ POWER2 ทำงานได้ดีขึ้นเมื่อใช้ในการบริการขัดจังหวะโดยการกระจายภาระการประมวลผลในช่วงเวลาตัวอย่าง จำนวนตัวอย่างสำหรับการซื้อ RMS หนึ่งครั้ง (สแกน) ถูกกำหนดเป็น หน้าต่าง RMS2 และ POWER2 ครอบครองช่วงเวลาตัวอย่างพิเศษหนึ่งช่วงเวลา (ความยาวหน้าต่าง +1) เมื่อตัวเลือกการคืนค่าพื้นฐานอัตโนมัติเปิดอยู่ (BLR_ON)
มีวิธีการต่อไปนี้:
begin()start()stop()update()update1()update2()publish() สำหรับการเริ่มต้นอย่างรวดเร็วให้ตรวจสอบตัวอย่าง Arduino Sketches ที่มาพร้อมกับห้องสมุด
นี่คือขั้นตอนในการติดตามเพื่อการดำเนินการที่ประสบความสำเร็จ:
begin() วิธีนี้ใช้สำหรับการเริ่มต้นและจำเป็นต้องมีอินพุตเพื่อตั้งค่าการปรับขนาดของหน่วยวัดขนาดของหน้าต่างการสุ่มตัวอย่างจำนวนบิตของ ADC ที่ใช้แล้ว (หรือสัญญาณอินพุต) และโหมดการได้มา (สแกนแบบต่อเนื่อง/การสแกนเดี่ยว)start() เพื่อเริ่มการได้มาupdate() (หรือ update1() + update2() สำหรับ Power2 ) ซ้ำ ๆ ในอัตราคงที่publish() เพื่อรับผลลัพธ์ สำหรับการอัปเดตคลาส Power2 () จะถูกแบ่งออกเป็น update1() และ update2() update1() ต้องเรียกก่อนเพื่อประมวลผลตัวอย่างจากแรงดันไฟฟ้าอินพุตและ update2() เพื่อประมวลผลตัวอย่างจากอินพุตปัจจุบันหรือ VICA Versa (กระแสไฟฟ้ากระแส) แรงดันไฟฟ้าและกระแสไฟฟ้ามักจะเกิดขึ้นตามลำดับสำหรับ ADC แบบมัลติเพล็กซ์
สำหรับการใช้ โดยเฉลี่ย ในชั้นเรียน:
void begin(float range, unsigned char window, unsigned char nob, bool mode);
กับ:
range คือการแกว่งสูงสุดที่คาดหวังสูงสุดของสัญญาณอินพุต AC (ค่าสูงสุดถึงสูงสุด)window ความยาวของหน้าต่างตัวอย่างซึ่งแสดงในตัวอย่างจำนวนมากnob คือความละเอียดบิตของสัญญาณอินพุต (ความลึกของ ADC บิต) ใช้ค่าคงที่ที่กำหนดไว้ล่วงหน้า: ADC_8BIT , ADC_10BIT หรือ ADC_12BITmode ตั้งค่าโหมดเป็นสแกนอย่างต่อเนื่องหรือการสแกนเดี่ยว ใช้ค่าคงที่ predifined CNT_SCAN หรือ SGL_SCAN void start(void); วิธีนี้เริ่มต้นการได้มาสำหรับการสแกนอย่างต่อเนื่องและโหมดสแกนเดี่ยว
void stop(void); วิธีนี้หยุดการซื้อกิจการ
void update(int instVal); กำหนดค่าตัวอย่างปัจจุบัน
void publish(void); เผยแพร่ผลลัพธ์จากการซื้อกิจการที่เสร็จสมบูรณ์ครั้งล่าสุด ผลลัพธ์อยู่ในตัวแปรเอาต์พุตตามที่กำหนดไว้ถัดไป
ตัวแปรที่กำหนดสาธารณะคือ:
int instVal - ค่าของตัวอย่างที่ได้รับล่าสุด
float average - ผลลัพธ์ค่าเฉลี่ย
bool acquire - บิตสถานะจริงเมื่อสแกนกำลังรอดำเนินการ
สำหรับการใช้คลาส RMS หรือ RMS2 :
void begin(float range, unsigned char window, unsigned char nob, bool blr, bool mode);
กับ:
range คือการแกว่งที่คาดหวังสูงสุดของสัญญาณ AC-signal (ค่าสูงสุดถึงสูงสุด)window ความยาวของหน้าต่างตัวอย่างที่แสดงในตัวอย่างจำนวนมากnob คือความละเอียดบิตของสัญญาณอินพุตโดยปกติจะเป็นความลึกของ ADC Bit ใช้ค่าคงที่ที่กำหนดไว้ล่วงหน้า: ADC_8BIT , ADC_10BIT หรือ ADC_12BITblr ตั้งค่าฟังก์ชั่นการคืนค่าพื้นฐานโดยอัตโนมัติเปิดหรือปิด ใช้ค่าคงที่ predifined BLR_ON หรือ BLR_OFFmode ตั้งค่าโหมดเป็นสแกนอย่างต่อเนื่องหรือการสแกนเดี่ยว ใช้ค่าคงที่ predifined CNT_SCAN หรือ SGL_SCAN void start(void); วิธีนี้เริ่มต้นการได้มาสำหรับการสแกนอย่างต่อเนื่องและโหมดสแกนเดี่ยว
void stop(void); วิธีนี้หยุดการซื้อกิจการ
void update(int instVal); กำหนดค่าตัวอย่างปัจจุบัน
void publish(void); เผยแพร่ผลลัพธ์จากการซื้อกิจการที่เสร็จสมบูรณ์ครั้งล่าสุด ผลลัพธ์อยู่ในตัวแปรเอาต์พุตตามที่กำหนดไว้ถัดไป
ตัวแปรที่กำหนดสาธารณะคือ:
int instVal - ค่าของตัวอย่างล่าสุดที่ได้รับคืนสู่พื้นฐานเมื่อ blr_on
float rmsVal - ผลลัพธ์ค่า RMS
int dcBias - ค่า DCBIAS ใน ADC -units เกี่ยวข้องเฉพาะเมื่อ blr_on
bool acquire - บิตสถานะจริงถ้าสแกนอยู่ระหว่างดำเนินการ
สำหรับการใช้ พลังงาน ในชั้นเรียน:
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
กับ:
range1, range2 คือการแกว่งสูงสุดที่คาดว่าจะเต็มของสัญญาณ AC-signals (ค่าสูงสุดถึงสูงสุด) ของแรงดันไฟฟ้าและกระแสไฟฟ้าwindow ความยาวของหน้าต่างตัวอย่างที่แสดงในตัวอย่างจำนวนมากnob คือความละเอียดบิตของสัญญาณอินพุตโดยปกติจะเป็นความลึกของ ADC Bit ใช้ค่าคงที่ที่กำหนดไว้ล่วงหน้า: ADC_8BIT , ADC_10BIT หรือ ADC_12BITblr ตั้งค่าฟังก์ชั่นการคืนค่าพื้นฐานโดยอัตโนมัติเปิดหรือปิด ใช้ค่าคงที่ predifined BLR_ON หรือ BLR_OFFmode ตั้งค่าโหมดเป็นสแกนอย่างต่อเนื่องหรือการสแกนเดี่ยว ใช้ค่าคงที่ predifined CNT_SCAN หรือ SGL_SCAN void start(void); วิธีนี้เริ่มต้นการได้มาสำหรับการสแกนอย่างต่อเนื่องและโหมดสแกนเดี่ยว
void stop(void); วิธีนี้หยุดการซื้อกิจการ
void update(int instVal1, int instVal2); กำหนดค่าตัวอย่างปัจจุบัน (เช่นแรงดันไฟฟ้าและกระแสไฟฟ้า) ในครั้งเดียว
void publish(void); เผยแพร่ผลลัพธ์จากการซื้อกิจการที่เสร็จสมบูรณ์ครั้งล่าสุด ผลลัพธ์อยู่ในตัวแปรเอาต์พุตตามที่กำหนดไว้ถัดไป
ตัวแปรที่กำหนดสาธารณะคือ:
int instVal1 - ค่าของตัวอย่างล่าสุดที่ได้รับ (แรงดันไฟฟ้า) คืนสู่พื้นฐานเมื่อ blr_on
int instVal2 - ค่าของตัวอย่างที่ได้รับล่าสุด (ปัจจุบัน) คืนสู่พื้นฐานเมื่อ blr_on
float rmsVal1 - ค่า RMS 1 (แรงดันไฟฟ้า)
float rmsVal2 - RMS Value2 (ปัจจุบัน)
int dcBias1 - ค่า DCBIAS1 ใน ADC -units เกี่ยวข้องเฉพาะเมื่อ blr_on
int dcBias2 - ค่า DCBIAS2 ใน ADC -units เกี่ยวข้องเฉพาะเมื่อ blr_on
float apparentPwr - พลังที่ชัดเจน
float realPwr - พลังที่แท้จริง
float pf - ปัจจัยพลังงาน
float energy - Netto Energy
bool acquire - บิตสถานะจริงถ้าสแกนอยู่ระหว่างดำเนินการ
สำหรับการใช้ Power2 ในชั้นเรียน:
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
กับ:
range1, range2 คือการแกว่งสูงสุดที่คาดว่าจะเต็มของสัญญาณ AC-signals (ค่าสูงสุดถึงสูงสุด) ของแรงดันไฟฟ้าและกระแสไฟฟ้าwindow ความยาวของหน้าต่างตัวอย่างที่แสดงในตัวอย่างจำนวนมากnob คือความละเอียดบิตของสัญญาณอินพุตโดยปกติจะเป็นความลึกของ ADC Bit ใช้ค่าคงที่ที่กำหนดไว้ล่วงหน้า: ADC_8BIT , ADC_10BIT หรือ ADC_12BITblr ตั้งค่าฟังก์ชั่นการคืนค่าพื้นฐานโดยอัตโนมัติเปิดหรือปิด ใช้ค่าคงที่ predifined BLR_ON หรือ BLR_OFFmode ตั้งค่าโหมดเป็นสแกนอย่างต่อเนื่องหรือการสแกนเดี่ยว ใช้ค่าคงที่ predifined CNT_SCAN หรือ SGL_SCAN void start(void); วิธีนี้เริ่มต้นการได้มาสำหรับการสแกนอย่างต่อเนื่องและโหมดสแกนเดี่ยว
void stop(void); วิธีนี้หยุดการซื้อกิจการ
void update1(int instVal); กำหนดค่าตัวอย่างปัจจุบันตัวอย่างสำหรับแรงดันไฟฟ้า
void update2(int instVal); กำหนดค่าตัวอย่างปัจจุบันตัวอย่างสำหรับปัจจุบัน CALL update1() และ update2() สลับกันในลูปการสุ่มตัวอย่าง
void publish(void); เผยแพร่ผลลัพธ์จากการซื้อกิจการที่เสร็จสมบูรณ์ครั้งล่าสุด ผลลัพธ์มีให้จากตัวแปรเอาต์พุตตามที่กำหนดไว้ถัดไป
ตัวแปรที่กำหนดสาธารณะคือ:
int instVal1 - ค่าของตัวอย่างล่าสุดที่ได้รับ (แรงดันไฟฟ้า) คืนสู่พื้นฐานเมื่อ blr_on
int instVal2 - ค่าของตัวอย่างที่ได้รับล่าสุด (ปัจจุบัน) คืนสู่พื้นฐานเมื่อ blr_on
float rmsVal1 - ค่า RMS 1 (แรงดันไฟฟ้า)
float rmsVal2 - RMS Value2 (ปัจจุบัน)
int dcBias1 - ค่า DCBIAS1 ใน ADC -units เกี่ยวข้องเฉพาะเมื่อ blr_on
int dcBias2 - ค่า DCBIAS2 ใน ADC -units เกี่ยวข้องเฉพาะเมื่อ blr_on
float apparentPwr พลังที่ชัดเจน
float realPwr - พลังที่แท้จริง
float pf - ปัจจัยพลังงาน
float energy - Netto Energy
bool acquire - บิตสถานะจริงถ้าสแกนอยู่ระหว่างดำเนินการ
Rms gridVolt;
void setup() {
...
gridVolt.begin(700, 40, ADC_10BIT, BLR_ON, CNT_SCAN);`
...
}
ข้อโต้แย้งหมายถึง:
ช่วง ADC เต็มรูปแบบ (0 ถึง 5Volts) แสดงถึงค่าสูงสุดของสัญญาณถึงสูงสุดถึง 700V ซึ่งเท่ากับแอมพลิจูดสัญญาณ 350V หรือ 247.5VRMS สำหรับคลื่นไซน์
หน้าต่าง RMS คือ 40 ตัวอย่างซึ่งหมายความว่าหน้าต่างครอบคลุมสองรอบ 50Hz สองรอบเมื่อเลือกอัตราการสุ่มตัวอย่างที่ 1,000 ตัวอย่าง/วินาที
ความละเอียด ADC บิตคือ 10 บิต (Arduino UNO)
BLR_ON หมายความว่าเปิดการฟื้นฟูพื้นฐาน ในการจับสัญญาณ AC ด้วย ADC ค่าศูนย์ของสัญญาณจะต้องถูกเลื่อนไปยังจุดกึ่งกลางของช่วง ADC โดยการเพิ่มแรงดันไฟฟ้า DC-Offset ด้วยวงจรอินพุต ADC ออฟเซ็ตนี้จะต้องได้รับการแก้ไขหลังจากนั้นในซอฟต์แวร์โดยการลบค่าคงที่จากค่า ADC ที่ได้รับ การแก้ไขนี้สามารถทำได้โดยอัตโนมัติด้วย BLR_ON และการสอบเทียบไม่จำเป็น ในรูปที่ 1 เส้นสีน้ำเงินระบุสัญญาณอินพุตที่ปรับขนาดสูงสุดด้วยการแกว่งแรงดันไฟฟ้า 5V และลำเอียงบน 2.5V เส้นสีเขียวแสดงสัญญาณอินพุตที่มีแอมพลิจูด 1V และวัด 1V/SQRT (2) = 0.71VRMS

ด้วยตัวเลือก CNT_SCAN การซื้อกิจการจะถูกตั้งค่าในโหมดต่อเนื่อง การซื้อกิจการจะเริ่มต้นใหม่โดยอัตโนมัติหลังจากทำการสแกนครั้งสุดท้าย
โทร gridVolt.update(adcVal); จากห่วงหลักหรือจากรูทีนบริการขัดจังหวะ (ISR) ตรวจสอบให้แน่ใจว่าวนซ้ำในอัตราคงที่
รับผลลัพธ์ด้วย gridVolt.publish() และรับค่า rms: float Voltage = gridVolt.rmsVal;
void loop() { // loop must run at 1kHz
...
adcValue = analogRead(AN0); // read the ADC.
gridVolt.update(adcValue);
counter++;
if(counter >= 500) { // publish every 0.5s
gridVolt.publish();
Voltage = gridVolt.rmsVal;
counter = 0;
}
...
while(loop_timer_not_expired) {1}
...
}
Measure_avg.ino - ตัวอย่างนี้แสดงวิธีการคำนวณค่าเฉลี่ยของสัญญาณที่วัดด้วย ADC
Measure_rms.ino - ในตัวอย่างนี้ค่า RMS ของแรงดันไฟฟ้าอินพุต ADC จะถูกกำหนด
AC_powermeter.ino - ตัวอย่างนี้แสดงให้เห็นถึงแอปพลิเคชันการวัด AC -Power ที่สมบูรณ์ มันต้องการทั้งแรงดันไฟฟ้าและการแสดงแรงดันไฟฟ้าของกระแสเป็นอินพุตของ ADC-channels สองตัว มันคำนวณค่า RMS ของแรงดันไฟฟ้าและกระแสไฟฟ้าพลังงานที่ชัดเจนพลังงานที่แท้จริงและปัจจัยพลังงาน
AC_powermeter_advanced.ino - ตัวอย่างนี้ยังแสดงให้เห็นถึงแอปพลิเคชันการวัด AC -Power ที่สมบูรณ์ มันทำงานบนพื้นฐานการขัดจังหวะเพื่อให้ได้การอ่านที่มีเสถียรภาพที่ดีขึ้น แรงดันไฟฟ้าและกระแสไฟฟ้าทั้งสองตัวอย่างที่ 3KHz เมื่อ LED Arduino สว่างขึ้นคลิป ADC (แรงดันไฟฟ้าสูงสุดอินพุตสูงเกินไป) หรือ DC Bias มันออกไปนอกระยะ
Energy_metering.ino แสดงแรงดันไฟฟ้ากระแสพลังงานจริงและพลังงานสุทธิใน WH
วิธีที่ง่ายที่สุดในการเชื่อมต่อแรงดันไฟฟ้าสูง AC กับ Arduino ADC คือการใช้ตัวแปลงสัญญาณแรงดันไฟฟ้าเช่น Transducer แรงดันไฟฟ้า LV 25-P จาก LEM USA Inc. ทรานสดิวเซอร์นี้ให้การแยก Galvanic การปรับขนาดและการเลื่อนระดับในแพ็คเกจเดียว สำหรับการตรวจจับในปัจจุบัน LEM ยังผลิต LEM_LA55-P ด้วยข้อได้เปรียบเช่นเดียวกับตัวแปลงสัญญาณแรงดันไฟฟ้า
หากมีใครชอบสร้างวงจรสเกลอินพุตจากส่วนประกอบที่ไม่ต่อเนื่องคำอธิบายการออกแบบโดยละเอียดจะได้รับในแอปพลิเคชันหมายเหตุ tiduay6c.pdf ที่เป็นของการออกแบบอ้างอิงอินเวอร์เตอร์แหล่งกำเนิดแรงดันไฟฟ้าจาก Texas Instruments Incorporated สังเกตคำเตือน! วงจรที่เสนอสามารถปรับให้เข้ากับช่วง 0-5V สำหรับ Arduino ได้อย่างง่ายดาย
ตลอดเวลาใช้หม้อแปลงแยกเพื่อความปลอดภัย!
การวัดพลังงาน 3 เฟส
มีการประหยัดเวลามากมายในการพัฒนาห้องสมุดนี้โดยใช้ Sloeber Arduino-Ide ทางเลือกอื่น Sloeber เป็นปลั๊กอิน Arduino ที่ยอดเยี่ยมสำหรับ Eclipse ขอบคุณ Jantje และผู้มีส่วนร่วมของเขา!