يحتوي هذا المستودع على مكتبة Truerms C ++ لـ Arduino. مع هذه المكتبة ، من الممكن حساب متوسط القيمة و RMS (متوسط الجذر المربع) أو القيمة الفعالة لإشارة إدخال ADC. تقوم هذه المكتبة أيضًا بحساب القوة الواقعية والظاهرة وعامل الطاقة من كل من الإشارات الجهد والإدخال الحالي. من الإصدار 1.3 ، تمت إضافة قياس الطاقة إلى المشروع.
يمكن قياس الجهد وتمثيل الجهد للتيار مع ADC من Arduino باستخدام دارات الإدخال المناسبة لتوسيع نطاق الكميات المقاسة إلى ضمن نطاق الجهد المتوافق مع 0-5V من ADC. يستخدم الحل المقدم طريقة بسيطة لتوسيع نطاق الكميات المقاسة. يتعين على المستخدم فقط تحديد القيمة الكاملة للذروة إلى الذروة لجهد إدخال التيار المتردد والتيار. عندما يتم تعريف وحدات الكميات المقاسة في فولت و amperes ، تكون الطاقة المحسوبة في وات والطاقة في WS (joules). هذه المكتبة سهلة المحمولة للمنصات الأخرى.
يتم تنفيذ فصول المكتبة التالية:
AverageRmsRms2PowerPower2يحسب المتوسط متوسط القيمة من عدد من عينات الإدخال (عادة) من ADC. يهدف RMS أو RMS2 إلى حساب قيمة الجذر المربع للإشارة والطاقة أو Power2 هو حساب الطاقة من كل من الجهد والإدخال الحالي.
تعمل RMS2 و Power2 بشكل أفضل عند استخدامها في روتين خدمة المقاطعة من خلال نشر عبء المعالجة على فتحات وقت العينة. يتم تعريف عدد العينات الخاصة بتشغيل RMS (SCAN) على أنه نافذة . تشغل RMS2 و Power2 فتحة زمنية إضافية واحدة (طول النافذة +1) عندما يكون خيار ترميم خط الأساس التلقائي قيد التشغيل (BLR_ON).
الطرق التالية موجودة:
begin()start()stop()update()update1()update2()publish() لبداية سريعة ، تحقق من مثال رسومات Arduino التي تأتي مع المكتبة.
هذه هي الخطوات التي يجب اتباعها للتنفيذ الناجح:
begin() . هذه الطريقة للتهيئة وتحتاج إلى إدخال لتعيين تحجيم وحدات القياس ، وحجم نافذة أخذ العينات ، وعدد أجزاء البتات ADC المستخدمة (أو إشارة الدخل) ووضع الاستحواذ (المسح الضوئي المستمر/المسح الفردي).start() لبدء عملية الاستحواذ.update() (أو update1() + update2() for Power2 ) بشكل متكرر بمعدل ثابت.publish() للحصول على النتائج. بالنسبة إلى Power2 Class Update () يتم تقسيمها إلى update1() و update2() . يجب استدعاء update1() أولاً لمعالجة العينة من جهد الإدخال و update2() لمعالجة العينة من تيار الإدخال أو VICA vera (الجهد الكهربي). عادة ما يحدث جهد أخذ العينات والتيار في التسلسل ل ADC متعددة الإرسال.
لاستخدام متوسط الفصل:
void begin(float range, unsigned char window, unsigned char nob, bool mode);
مع:
range هو الحد الأقصى المتوقع على التوالي من إشارة إدخال التيار المتردد (قيمة الذروة إلى الذروة).window طول نافذة العينة ، معبر عنها في عدد كامل من العينات.nob هو دقة البت لإشارة الدخل (عمق بت ADC). استخدم الثوابت المحددة مسبقًا: ADC_8BIT ، ADC_10BIT أو ADC_12BIT .mode بتعيين الوضع للمسح المستمر أو المسح الفردي. استخدم الثوابت المقدمة CNT_SCAN أو SGL_SCAN . void start(void); تبدأ هذه الطريقة عملية الاستحواذ للمسح المستمر ووضع المسح الفردي.
void stop(void); هذه الطريقة تتوقف عن الاستحواذ.
void update(int instVal); تعيين قيمة العينة الحالية.
void publish(void); نشر النتيجة (S) من آخر عملية استحواذ مكتملة. النتائج موجودة في متغير (متغيرات) الإخراج على النحو المحدد بعد ذلك.
المتغيرات المحددة العامة هي:
int instVal - قيمة العينة الأخيرة المكتسبة
float average - متوسط نتيجة القيمة
bool acquire - Bit Status ، True عندما يكون الفحص معلقًا.
للصف RMS أو RMS2 استخدام:
void begin(float range, unsigned char window, unsigned char nob, bool blr, bool mode);
مع:
range هو الحد الأقصى المتوقع على التوالي الكامل لعملية AC (قيمة الذروة إلى الذروة).window طول نافذة العينة المعبر عنها في عدد كامل من العينات.nob هو دقة البت لإشارة الدخل ، وعادة ما يكون هذا عمق بت ADC. استخدم الثوابت المحددة مسبقًا: ADC_8BIT ، ADC_10BIT أو ADC_12BIT .blr بتعيين وظيفة ترميم خط الأساس تلقائيًا أو إيقاف تشغيلها. استخدم الثوابت المحددة BLR_ON أو BLR_OFF .mode بتعيين الوضع للمسح المستمر أو المسح الفردي. استخدم الثوابت المقدمة CNT_SCAN أو SGL_SCAN . void start(void); تبدأ هذه الطريقة عملية الاستحواذ للمسح المستمر ووضع المسح الفردي.
void stop(void); هذه الطريقة تتوقف عن الاستحواذ.
void update(int instVal); تعيين قيمة العينة الحالية.
void publish(void); نشر النتيجة (S) من آخر عملية استحواذ مكتملة. النتائج موجودة في متغير (متغيرات) الإخراج على النحو المحدد بعد ذلك.
المتغيرات المحددة العامة هي:
int instVal - قيمة العينة الأخيرة التي تم الحصول عليها ، تم استعادتها إلى الأساس عند BLR_ON
float rmsVal - نتيجة قيمة RMS
int dcBias - قيمة DCBIAS في وحدات ADC. ذات صلة فقط عند blr_on
bool acquire - بت الحالة ، صحيح إذا كان المسح معلق
لاستخدام الطاقة الفصل:
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
مع:
range1, range2 هو الحد الأقصى المتوقع على التوالي الكامل لعمليات AC (قيمة الذروة إلى الذروة) للجهد والتيار.window طول نافذة العينة المعبر عنها في عدد كامل من العينات.nob هو دقة البت لإشارة الدخل ، وعادة ما يكون هذا عمق بت ADC. استخدم الثوابت المسبقة: ADC_8BIT ، ADC_10BIT أو ADC_12BIT .blr بتعيين وظيفة ترميم خط الأساس تلقائيًا أو إيقاف تشغيلها. استخدم الثوابت المحددة BLR_ON أو BLR_OFF .mode بتعيين الوضع للمسح المستمر أو المسح الفردي. استخدم الثوابت المقدمة CNT_SCAN أو SGL_SCAN . void start(void); تبدأ هذه الطريقة عملية الاستحواذ للمسح المستمر ووضع المسح الفردي.
void stop(void); هذه الطريقة تتوقف عن الاستحواذ.
void update(int instVal1, int instVal2); قم بتعيين قيم العينة الحالية (على سبيل المثال الجهد والتيار) مرة واحدة.
void publish(void); نشر النتيجة (S) من آخر عملية استحواذ مكتملة. النتائج موجودة في متغير (متغيرات) الإخراج على النحو المحدد بعد ذلك.
المتغيرات المحددة العامة هي:
int instVal1 - قيمة العينة الأخيرة المكتسبة (الجهد) ، تم استعادتها إلى الأساس عند blr_on
int instVal2 - قيمة العينة الأخيرة المكتسبة (الحالية) ، تم استعادتها إلى خط الأساس عند blr_on
float rmsVal1 - RMS Value1 (الجهد)
float rmsVal2 - RMS Value2 (الحالي)
int dcBias1 - قيمة DCBIAS1 في وحدات ADC. ذات صلة فقط عند blr_on
int dcBias2 - قيمة DCBIAS2 في وحدات ADC. ذات صلة فقط عند 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 (قيمة الذروة إلى الذروة) للجهد والتيار.window طول نافذة العينة المعبر عنها في عدد كامل من العينات.nob هو دقة البت لإشارة الدخل ، وعادة ما يكون هذا عمق بت ADC. استخدم الثوابت المسبقة: ADC_8BIT ، ADC_10BIT أو ADC_12BIT .blr بتعيين وظيفة ترميم خط الأساس تلقائيًا أو إيقاف تشغيلها. استخدم الثوابت المحددة BLR_ON أو BLR_OFF .mode بتعيين الوضع للمسح المستمر أو المسح الفردي. استخدم الثوابت المقدمة CNT_SCAN أو SGL_SCAN . void start(void); تبدأ هذه الطريقة عملية الاستحواذ للمسح المستمر ووضع المسح الفردي.
void stop(void); هذه الطريقة تتوقف عن الاستحواذ.
void update1(int instVal); تعيين قيمة العينة الحالية على سبيل المثال للجهد.
void update2(int instVal); تعيين قيمة العينة الحالية على سبيل المثال للتيار. Call update1() و update2() بالتناوب في حلقة أخذ العينات.
void publish(void); نشر النتيجة (S) من آخر عملية استحواذ مكتملة. النتائج متوفرة من متغير (متغيرات) الإخراج على النحو المحدد بعد ذلك.
المتغيرات المحددة العامة هي:
int instVal1 - قيمة العينة الأخيرة المكتسبة (الجهد) ، تم استعادتها إلى الأساس عند blr_on
int instVal2 - قيمة العينة الأخيرة المكتسبة (الحالية) ، تم استعادتها إلى خط الأساس عند blr_on
float rmsVal1 - RMS Value1 (الجهد)
float rmsVal2 - RMS Value2 (الحالي)
int dcBias1 - قيمة DCBIAS1 في وحدات ADC. ذات صلة فقط عند blr_on
int dcBias2 - قيمة DCBIAS2 في وحدات ADC. ذات صلة فقط عند 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 إلى 5 فولت) قيمة من الذروة إلى الذروة من 700 فولت. هذا يساوي سعة إشارة 350V أو 247.5VRMS لموجة جيبية.
نافذة RMS هي 40 عينة ، مما يعني أن النافذة تغطي دورتين 50 هرتز ، عندما تم اختيار معدل أخذ العينات عند 1000 عينة/ثانية.
دقة بت ADC هي 10 بت (Arduino UNO).
BLR_ON يعني أنه يتم تشغيل استعادة خط الأساس. لالتقاط علامة AC مع ADC ، يجب تحويل القيمة الصفرية للإشارة نحو النقطة المتوسطة من النطاق ADC عن طريق إضافة جهد إزاحة DC مع دائرة إدخال ADC. يجب تصحيح هذه الإزاحة بعد ذلك في البرنامج عن طريق طرح قيمة ثابتة من قيمة ADC المكتسبة. يمكن إجراء هذا التصحيح تلقائيًا باستخدام BLR_ON ولا يلزم المعايرة. في الشكل 1 ، يشير الخط الأزرق إلى الحد الأقصى لإشارة الدخل المقوسة مع أرجوحة الجهد من 5 فولت والتحيز على 2.5 فولت. يعرض الخط الأخضر إشارة إدخال بسعة 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 كاملة. إنه يحتاج إلى كلا من الجهد وتمثيل الجهد للتيار كمدخلات على قناة ADC. يحسب القيم RMS للجهد والتيار ، والقوة الظاهرة ، والقوة الحقيقية وعامل الطاقة.
AC_powermeter_advanced.ino - يوضح هذا المثال أيضًا تطبيق قياس طاقة AC كامل. يعمل على أساس المقاطعة للحصول على قراءات مستقرة أفضل. يتم أخذ عينات من الجهد والتيار في 3 كيلو هرتز. عند إضاءة LED Arduino ، فإن مقاطع ADC (جهد ذروة الإدخال العالي جدًا) أو DC تحيزها خارج النطاق.
Energy_metering.ino يوضح الجهد واليار والطاقة الحقيقية والطاقة الصافية في WH.
إن أبسط طريقة لتفاعل الفولتية العالية AC مع Arduino ADC هي باستخدام محول الجهد ، على سبيل المثال محول جهد LV 25-P من LEM USA Inc. يوفر محول الطاقة هذا العزلة الجلفانية ، التحجيم وتحويل المستوى في حزمة واحدة. بالنسبة للاستشعار الحالي ، تقوم LEM أيضًا بتصنيع LEM_LA55-P ، مع نفس المزايا لمحول الطاقة الجهد.
إذا كان المرء يفضل إنشاء دوائر تحجيم الإدخال من مكونات منفصلة ، فسيتم تقديم وصف تفصيلي للتصميم في ملاحظة التطبيق Tiduay6C.PDF الذي ينتمي إلى تصميم مرجع العاكس مصدر الجهد من Texas Instruments. لاحظ التحذيرات! يمكن بسهولة تكييف الدوائر المقترحة مع نطاق 0-5V لـ Arduino.
في جميع الأوقات ، استخدم محول العزل للسلامة!
3 مرحلة قياس الطاقة.
تم حفظ الكثير من الوقت في تطوير هذه المكتبة باستخدام Sloeber Arduino-ide البديل. Sloeber هو مكون إضافي رائع Arduino لـ Eclipse. بفضل جانتجي ومساهميه!