Mengukur Tegangan AC True-RMS: 14 Langkah
Mengukur Tegangan AC True-RMS: 14 Langkah
Anonim
Image
Image
Demonstrasi
Demonstrasi

Hari ini, kita akan menggunakan STM32 Maple Mini untuk melakukan pembacaan AC. Dalam contoh kita, kita akan mendapatkan nilai RMS dari jaringan listrik. Ini sangat berguna bagi mereka yang ingin memantau jaringan listrik untuk Internet of Things. Kami kemudian akan membuat aplikasi menggunakan kekuatan komputasi Maple Mini, menerapkan sirkuit elektronik yang memungkinkan perolehan sinyal 127Vac, serta menerapkan perhitungan root mean square (RMS) pada sampel.

Langkah 1: Demonstrasi

Dalam perakitan kami hari ini, kami memiliki STM32, selain sirkuit analog kami untuk membuat input 110. Untuk menghindari guncangan, isolasi resistor yang masuk sebesar 110.

Sirkuit ini cukup sensitif. Saya masuk dengan 110, tetapi saya menguranginya 168 kali menggunakan pembagi tegangan dan memasukkannya ke dalam penguat operasional, yang memiliki beberapa fungsi.

Kami juga memiliki beberapa kapasitor opsional untuk penyaringan sumber. Jika sumber Anda berkualitas baik, Anda tidak perlu menggunakannya.

Input AD dihitung melalui osiloskop, di mana Anda melihat sinusoid, yang bukan 110 (tetapi terbentuk dengan baik). Hal lain adalah tegangan di jaringan listrik kita tidak 110 (sebenarnya 127 volt). Tapi saat kita menjalani stabilizer, itu akan menyesuaikan ke 115V.

Nilai yang ditampilkan pada monitor serial adalah yang dihitung dalam RMS, yaitu nilai yang diidentifikasi oleh Fluke Meter.

Langkah 2: Sumber Daya yang Digunakan

Sumber Daya yang Digunakan
Sumber Daya yang Digunakan

• Jumper

• Sebuah Maple Mini

• Protoboard

• Penguat LM386

• Sumber simetris (+ 5V dan -5V)

• Sebuah trimpot multi-putaran 10k (atau potensiometer)

• Empat kapasitor poliester 100nF

• Tiga resistor 10k

• Empat resistor 470k

• Satu resistor 5k6

• Satu dioda zener 1n4728A

Langkah 3: Blok Diagram

Diagram Blok
Diagram Blok

Langkah 4: Skema

Skema
Skema

Ini adalah rangkaian yang saya kembangkan berdasarkan spesifikasi yang saya yakini adalah yang terbaik untuk pengukuran ini, tetapi ada beberapa contoh lain yang dapat ditemukan di internet.

Langkah 5: LM386 - Menyematkan

LM386 - Menyematkan
LM386 - Menyematkan

LM386 memiliki dua amplifier untuk pengkondisian atau penguatan sinyal.

Langkah 6: AmpOp - Diferensial (pengurang)

AmpOp - Diferensial (pengurang)
AmpOp - Diferensial (pengurang)

Langkah 7: AmpOp - Penambah Inverter

AmpOp - Penambah Inverter
AmpOp - Penambah Inverter

Langkah 8: Maple Mini - Pinage

Maple Mini - Pinage
Maple Mini - Pinage

Pin ditandai pada:

Merah >> Toleransi 3V3

Hijau >> Toleransi 5V

Langkah 9: Maple Mini - Pinning - a / D Digunakan dalam Menangkap

Maple Mini - Pinning - a / D Digunakan dalam Menangkap
Maple Mini - Pinning - a / D Digunakan dalam Menangkap

Saya tekankan di sini bahwa pin yang saya gunakan adalah D11 yang (dalam nomenklatur STMicroelectronics) adalah PA0.

Langkah 10: Perakitan

perakitan
perakitan

Untuk sirkuit kami, Anda akan memerlukan sumber simetris, seperti yang kami buat untuk proyek ini. Jika tidak, Anda memerlukan dua sumber.

Langkah 11: Grafik Dengan Data yang Diperoleh

Grafik Dengan Data yang Diperoleh
Grafik Dengan Data yang Diperoleh

Langkah 12: Menghitung Nilai RMS

Menghitung Nilai RMS
Menghitung Nilai RMS

Langkah 13: Kode Sumber

Kode sumber - Definisi dan konstanta

Pada awalnya, kami mendefinisikan pembacaan pin sebagai D11, serta berbagai konstanta yang digunakan dalam perhitungan.

#define leituraTensao D11 //AD CH0 no pino PA0 //valor teórico divisor de tensão = 168.85714285714285714286 const float fatorDivisor = 168.40166345742404792461; //valor teórico do ganho de amplificação = 1,0 const float fatorAmplificador = 1,0; //Valor usado na multiplicação da leitura const float fatorMultiplicacao = fatorDivisor * fatorAmplificador; //Valor teórico da Tenso de alimentação Vcc = 3.3V const float Vcc = 3.3; //valor teórico do offset do amplificador = Vcc / 2.0; const float offSet = 1,66; //fator teórico da percakapan yang dilakukan AD = 3.3 / 4095.0 const float fatorAD = Vcc / 4095.0; const int amostras = 71429; //hasil dari 1, 027 segundos para cada atualização //const int amostras = 35715; //hasil em 0, 514 segundos para cada atualização

Kode sumber - Variabel global

Sekarang, kita mendefinisikan beberapa variabel global.

float Vrms = 0,0; //armazena o valor rms da tensãofloat Vmax = 0.0; //armazena o valor máximo detectado float Vmin = 10000.0; //armazena o valor mínimo detectado float Vmed = 0.0; //armazena o valor médio entre Vmáx e Vmín

Kode Sumber - Pengaturan ()

Mulai port serial pada 1Mbps. Kami menyesuaikan port AD sebagai input dan menunggu 5 detik sebelum mulai mengumpulkan data. Waktu siaga adalah opsional.

void setup() { Serial.begin(1000000); //inicia a porta serial em 1Mbps pinMode(leituraTensao, INPUT); //ajusta a porta do AD como entrada delay(5000); //aguarda 5s antes de iniciar a coleta. (opsional) }

Kode Sumber - Loop () - Memulai variabel pengumpulan data

Dalam Loop, kami memiliki variabel untuk iterasi. Di sini, kami juga menyimpan pembacaan AD di 0.0 dan me-restart variabel VRMS juga di 0.0.

void loop() { int i = 0; //variável para iteração float leitura = 0.0; //armazena seperti yang biasa dilakukan AD Vrms = 0.0; //reinicia a variável Vrms

Kode Sumber - Menangkap dan menjalankan perhitungan individual untuk setiap sampel

Pada tahap ini, jika i lebih kecil dari sampel, kita memulai siklus sampling sampai i mencapai jumlah sampel. Kami menjalankan analogRead untuk membaca port analog dan menghitung jumlah kuadrat dari tegangan baca. Akhirnya, kami meningkatkan iterator.

while (i < amostras) { //inicia um ciclo de amostragem até que i alcance o número de amostras leitura = analogRead(leituraTensao); //lê a porta analógica //Serial.println(leitur); //Descomente se quiser ver o sinal bruto do AD Vrms = Vrms + pow(((leitura * fatorAD) - offSet), 2.0); //hitung a soma dos quadrados das tensões lidas i++; //tambahan atau iterador }

Kode sumber - Perhitungan umum sampel dan identifikasi maksimum, minimum, dan rata-rata

Kami menerapkan fakta perkalian untuk menentukan nilai sebenarnya dari tegangan. Kami mendeteksi apakah nilainya maksimum atau minimum, dan kami menghitung rata-rata nilai maksimum dan minimum saat ini.

//Aplicando fator de multiplicação para determinar o valor real das tensões Vrms = (sqrt(Vrms / amostras)) * fatorMultiplicacao; //deteksi se é um valor é máximo if (Vrms > Vmax) { Vmax = Vrms; } //deteksi se é um valor mínimo if (Vrms < Vmin) { Vmin = Vrms; } //hitung media dos valores máximo e mínimo atuais Vmed = (Vmax + Vmin) / 2.0;

Kode Sumber - Opsi Keluaran

Kami memiliki tiga opsi untuk "merencanakan" nilai output. Kami memiliki output yang diformat ke plotter serial Arduino IDE, seperti CSV atau Jason.

//saída formatada untuk plotter serial IDE Arduino Serial.print(Vrms, 3); Serial.print(", "); Serial.print(Vmax, 3); Serial.print(", "); Serial.print(Vmin, 3); Serial.print(", "); Serial.println(Vmed, 3); /* //saída formatada como json Serial.print("{"instante(ms)\":"); Serial.print(milis()); Serial.print(", "); Serial.print("\"Vrms(V)\":"); Serial.print(Vrms, 3); Serial.print(", "); Serial.print("\"Vmax(V)\":"); Serial.print(Vmax, 3); Serial.print(", "); Serial.print("\"Vmin(V)\":"); Serial.print(Vmin, 3); Serial.print(", "); Serial.print("\"Vmed(V)\":"); Serial.print(Vmed, 3); Serial.println("}"); */ /* //saída formatada como CSV Serial.print(millis()); Serial.print(", "); Serial.print(Vrms, 3); Serial.print(", "); Serial.print(Vmax, 3); Serial.print(", "); Serial.print(Vmin, 3); Serial.print(", "); Serial.println(Vmed, 3); */ }

Langkah 14: File

Unduh file:

PDF

SAYA TIDAK