Repositori ini berisi perpustakaan Truerms C ++ untuk Arduino. Dengan pustaka ini dimungkinkan untuk menghitung nilai rata -rata dan RMS (root mean square) atau nilai efektif dari sinyal input ADC. Perpustakaan ini juga menghitung daya nyata , nyata dan faktor daya dari kedua, tegangan dan sinyal input arus. Dari versi 1.3, pengukuran energi telah ditambahkan ke proyek.
Tegangan dan representasi tegangan arus dapat diukur dengan ADC Arduino dengan menggunakan sirkuit input yang sesuai untuk menskalakan jumlah yang diukur ke dalam dalam kisaran tegangan 0-5V yang sesuai dari ADC. Solusi yang disediakan menggunakan metode sederhana untuk menskalakan jumlah yang diukur. Pengguna hanya perlu menentukan nilai puncak-ke-puncak skala penuh dari tegangan input AC dan arus. Ketika unit -unit dari jumlah yang diukur didefinisikan dalam volt dan ampere, maka daya yang dihitung adalah dalam watt dan energi dalam WS (joule). Perpustakaan ini mudah portabel untuk platform lain.
Kelas perpustakaan berikut diimplementasikan:
AverageRmsRms2PowerPower2Rata -rata menghitung nilai rata -rata dari sejumlah sampel input (biasanya) dari ADC. RMS atau RMS2 dimaksudkan untuk menghitung nilai root-square dari sinyal dan daya atau power2 dimaksudkan untuk menghitung daya dari input tegangan dan arus.
RMS2 dan Power2 berkinerja lebih baik ketika digunakan dalam rutinitas layanan interupsi dengan menyebarkan beban pemrosesan pada slot waktu sampel. Jumlah sampel untuk satu run akuisisi RMS (SCAN) didefinisikan sebagai jendela . RMS2 dan Power2 menempati satu slot waktu sampel tambahan (panjang jendela +1) ketika opsi restorasi baseline otomatis aktif (BLR_ON).
Metode berikut ada:
begin()start()stop()update()update1()update2()publish() Untuk awal yang cepat, periksa contoh sketsa Arduino yang datang dengan perpustakaan.
Ini adalah langkah -langkah yang harus diikuti untuk implementasi yang berhasil:
begin() . Metode ini untuk diinisialisasi dan perlu input untuk mengatur penskalaan unit pengukuran, ukuran jendela pengambilan sampel, jumlah bit ADC yang digunakan (atau sinyal input) dan mode akuisisi (pemindaian/pemindaian tunggal kontinu).start() untuk memulai akuisisi.update() (atau update1() + update2() untuk Power2 ) berulang kali pada tingkat konstan.publish() untuk mendapatkan hasilnya. Untuk Power2 Class Update () dipecah menjadi update1() dan update2() . update1() harus dipanggil terlebih dahulu untuk memproses sampel dari tegangan input dan update2() untuk memproses sampel dari arus input atau VICA Versa (arus tegangan). Tegangan dan arus pengambilan sampel biasanya terjadi secara berurutan untuk ADC multipleks.
Untuk penggunaan rata -rata kelas:
void begin(float range, unsigned char window, unsigned char nob, bool mode);
Dengan:
range adalah ayunan penuh maksimum yang diharapkan dari sinyal input AC (nilai puncak-ke-puncak).window panjang jendela sampel, dinyatakan dalam sejumlah sampel.nob adalah resolusi bit dari sinyal input (kedalaman bit ADC). Gunakan konstanta yang telah ditentukan: ADC_8BIT , ADC_10BIT atau ADC_12BIT .mode Mengatur mode ke pemindaian kontinu atau pemindaian tunggal. Gunakan konstanta yang dipredifinasi CNT_SCAN atau SGL_SCAN . void start(void); Metode ini memulai akuisisi untuk pemindaian kontinu dan mode pemindaian tunggal.
void stop(void); Metode ini menghentikan akuisisi.
void update(int instVal); Tetapkan nilai sampel saat ini.
void publish(void); Publikasikan hasil dari menjalankan akuisisi terakhir. Hasilnya ada dalam variabel output seperti yang ditentukan selanjutnya.
Variabel yang ditentukan publik adalah:
int instVal - Nilai sampel yang diperoleh terakhir
float average - hasil nilai rata -rata
bool acquire - Status bit, benar saat pemindaian sedang menunggu.
Untuk kelas RMS atau RMS2 Penggunaan:
void begin(float range, unsigned char window, unsigned char nob, bool blr, bool mode);
Dengan:
range adalah ayunan penuh maksimum yang diharapkan dari sinyal AC (nilai puncak-ke-puncak).window Panjang jendela sampel yang diekspresikan dalam sejumlah sampel.nob adalah resolusi bit dari sinyal input, biasanya ini adalah kedalaman bit ADC. Gunakan konstanta yang telah ditentukan: ADC_8BIT , ADC_10BIT atau ADC_12BIT .blr mengatur fungsi restorasi baseline secara otomatis menyala atau mati. Gunakan konstanta yang dipredifinasi BLR_ON atau BLR_OFF .mode Mengatur mode ke pemindaian kontinu atau pemindaian tunggal. Gunakan konstanta yang dipredifinasi CNT_SCAN atau SGL_SCAN . void start(void); Metode ini memulai akuisisi untuk pemindaian kontinu dan mode pemindaian tunggal.
void stop(void); Metode ini menghentikan akuisisi.
void update(int instVal); Tetapkan nilai sampel saat ini.
void publish(void); Publikasikan hasil dari menjalankan akuisisi terakhir. Hasilnya ada dalam variabel output seperti yang ditentukan selanjutnya.
Variabel yang ditentukan publik adalah:
int instVal - Nilai sampel yang diperoleh terakhir, dikembalikan ke garis dasar saat BLR_ON
float rmsVal - hasil nilai rms
int dcBias - Nilai DCBIAS di ADC -Unit. Hanya relevan saat blr_on
bool acquire - bit status, benar jika pemindaian sedang menunggu
Untuk penggunaan daya kelas:
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
Dengan:
range1, range2 adalah ayunan penuh maksimum yang diharapkan dari sinyal AC (nilai puncak-ke-puncak) dari tegangan dan arus.window Panjang jendela sampel yang diekspresikan dalam sejumlah sampel.nob adalah resolusi bit dari sinyal input, biasanya ini adalah kedalaman bit ADC. Gunakan konstanta yang dipredifinasi: ADC_8BIT , ADC_10BIT atau ADC_12BIT .blr mengatur fungsi restorasi baseline secara otomatis menyala atau mati. Gunakan konstanta yang dipredifinasi BLR_ON atau BLR_OFF .mode Mengatur mode ke pemindaian kontinu atau pemindaian tunggal. Gunakan konstanta yang dipredifinasi CNT_SCAN atau SGL_SCAN . void start(void); Metode ini memulai akuisisi untuk pemindaian kontinu dan mode pemindaian tunggal.
void stop(void); Metode ini menghentikan akuisisi.
void update(int instVal1, int instVal2); Tetapkan nilai sampel saat ini (misalnya tegangan dan arus) sekaligus.
void publish(void); Publikasikan hasil dari menjalankan akuisisi terakhir. Hasilnya ada dalam variabel output seperti yang ditentukan selanjutnya.
Variabel yang ditentukan publik adalah:
int instVal1 - Nilai sampel yang diperoleh terakhir (tegangan), dikembalikan ke baseline saat BLR_ON
int instVal2 - Nilai sampel yang diperoleh terakhir (saat ini), dikembalikan ke baseline saat BLR_ON
float rmsVal1 - rms value1 (tegangan)
float rmsVal2 - rms value2 (saat ini)
int dcBias1 - Nilai DCBIAS1 di ADC -Unit. Hanya relevan saat blr_on
int dcBias2 - nilai dcbias2 dalam unit ADC. Hanya relevan saat blr_on
float apparentPwr - Kekuatan yang TERLIHAT
float realPwr - kekuatan nyata
float pf - Faktor Daya
float energy - Energi Netto
bool acquire - bit status, benar jika pemindaian sedang menunggu
Untuk Kelas Power2 Gunakan:
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
Dengan:
range1, range2 adalah ayunan penuh maksimum yang diharapkan dari sinyal AC (nilai puncak-ke-puncak) dari tegangan dan arus.window Panjang jendela sampel yang diekspresikan dalam sejumlah sampel.nob adalah resolusi bit dari sinyal input, biasanya ini adalah kedalaman bit ADC. Gunakan konstanta yang dipredifinasi: ADC_8BIT , ADC_10BIT atau ADC_12BIT .blr mengatur fungsi restorasi baseline secara otomatis menyala atau mati. Gunakan konstanta yang dipredifinasi BLR_ON atau BLR_OFF .mode Mengatur mode ke pemindaian kontinu atau pemindaian tunggal. Gunakan konstanta yang dipredifinasi CNT_SCAN atau SGL_SCAN . void start(void); Metode ini memulai akuisisi untuk pemindaian kontinu dan mode pemindaian tunggal.
void stop(void); Metode ini menghentikan akuisisi.
void update1(int instVal); Tetapkan nilai sampel saat ini misalnya untuk tegangan.
void update2(int instVal); Tetapkan nilai sampel saat ini misalnya untuk arus. Call update1() dan update2() secara bergantian di loop pengambilan sampel.
void publish(void); Publikasikan hasil dari menjalankan akuisisi terakhir. Hasilnya tersedia dari variabel output sebagaimana didefinisikan selanjutnya.
Variabel yang ditentukan publik adalah:
int instVal1 - Nilai sampel yang diperoleh terakhir (tegangan), dikembalikan ke baseline saat BLR_ON
int instVal2 - Nilai sampel yang diperoleh terakhir (saat ini), dikembalikan ke baseline saat BLR_ON
float rmsVal1 - rms value1 (tegangan)
float rmsVal2 - rms value2 (saat ini)
int dcBias1 - Nilai DCBIAS1 di ADC -Unit. Hanya relevan saat blr_on
int dcBias2 - nilai dcbias2 dalam unit ADC. Hanya relevan saat blr_on
float apparentPwr , kekuatan yang jelas
float realPwr - kekuatan nyata
float pf - Faktor Daya
float energy - Energi Netto
bool acquire - bit status, benar jika pemindaian sedang menunggu
Rms gridVolt;
void setup() {
...
gridVolt.begin(700, 40, ADC_10BIT, BLR_ON, CNT_SCAN);`
...
}
Argumen itu berarti:
Kisaran ADC lengkap (0 hingga 5volts) mewakili nilai puncak ke puncak 700V. Ini sama dengan amplitudo sinyal 350V atau 247.5VRMS untuk gelombang sinus.
Jendela RMS adalah 40 sampel, yang berarti bahwa jendela mencakup dua siklus 50Hz, ketika laju pengambilan sampel dipilih pada 1000 sampel/detik.
Resolusi bit ADC adalah 10bit (Arduino UNO).
BLR_ON berarti bahwa restorasi baseline dinyalakan. Untuk menangkap sinyal AC dengan ADC, nilai nol sinyal harus digeser ke arah titik tengah rentang ADC dengan menambahkan tegangan dc-offset dengan sirkuit input ADC. Offset ini harus diperbaiki setelahnya dalam perangkat lunak dengan mengurangi nilai konstan dari nilai ADC yang diperoleh. Koreksi ini dapat dilakukan secara otomatis dengan BLR_ON dan kalibrasi tidak diperlukan. Pada Gambar 1, garis biru menunjukkan sinyal input skala maksimum dengan ayunan tegangan 5V dan bias pada 2.5V. Garis hijau menunjukkan sinyal input dengan amplitudo 1V dan mengukur 1V/sqrt (2) = 0,71VRMS.

Dengan opsi CNT_SCAN, akuisisi diatur dalam mode kontinous. Akuisisi akan dimulai kembali secara otomatis setelah menyelesaikan pemindaian terakhir.
Hubungi gridVolt.update(adcVal); dari loop utama atau dari interupsi layanan rutin (ISR). Pastikan loop berulang pada tingkat yang konstan.
Dapatkan hasilnya dengan gridVolt.publish() dan dapatkan nilai 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 - Contoh ini menunjukkan cara menghitung nilai rata -rata sinyal yang diukur dengan ADC.
Measure_rms.ino - Dalam contoh ini nilai RMS dari tegangan input ADC ditentukan.
AC_powermeter.ino - Contoh ini menunjukkan aplikasi pengukuran AC -Power lengkap. Dibutuhkan baik, tegangan dan representasi tegangan arus sebagai input pada dua saluran ADC. Ini menghitung nilai RMS dari tegangan dan arus, daya yang jelas, daya nyata dan faktor daya.
AC_powermeter_advanced.ino - Contoh ini juga menunjukkan aplikasi pengukuran AC -Power lengkap. Ini berjalan berdasarkan interupsi untuk mendapatkan bacaan yang lebih stabil. Tegangan dan arus keduanya diambil sampelnya pada 3kHz. Ketika LED Arduino dinyalakan, klip ADC (tegangan puncak input terlalu tinggi) atau bias DC di luar jangkauan.
Energy_metering.ino menunjukkan tegangan, arus, daya nyata dan energi bersih di WH.
Cara paling sederhana untuk menghubungkan AC tegangan tinggi dengan ADC Arduino adalah dengan menggunakan transduser tegangan, misalnya transduser tegangan LV 25-P dari LEM USA Inc. Transduser ini menyediakan isolasi galvanik, penskalaan, dan pergeseran level dalam satu paket tunggal. Untuk penginderaan saat ini, LEM juga memproduksi LEM_LA55-P , dengan keunggulan yang sama seperti untuk transduser tegangan.
Jika seseorang lebih suka membangun sirkuit penskalaan input dari komponen diskrit, deskripsi desain terperinci diberikan dalam catatan aplikasi Tiduay6c.pdf miliknya milik desain referensi inverter sumber tegangan dari Texas Instruments Incorporated. Perhatikan peringatannya! Sirkuit yang diusulkan dapat dengan mudah disesuaikan dengan kisaran 0-5V untuk Arduino.
Setiap saat, gunakan transformator isolasi untuk keselamatan!
Pengukuran Daya 3 Fase.
Banyak waktu disimpan dalam mengembangkan perpustakaan ini dengan menggunakan alternatif Arduino-Iide Sloeber. Sloeber adalah plugin Arduino yang indah untuk Eclipse. Terima kasih kepada Jantje dan kontributornya!