Daftar Isi:
- Langkah 1: Demonstrasi
- Langkah 2: Sumber Daya yang Digunakan
- Langkah 3: Blok Diagram
- Langkah 4: Skema
- Langkah 5: LM386 - Menyematkan
- Langkah 6: AmpOp - Diferensial (pengurang)
- Langkah 7: AmpOp - Penambah Inverter
- Langkah 8: Maple Mini - Pinage
- Langkah 9: Maple Mini - Pinning - a / D Digunakan dalam Menangkap
- Langkah 10: Perakitan
- Langkah 11: Grafik Dengan Data yang Diperoleh
- Langkah 12: Menghitung Nilai RMS
- Langkah 13: Kode Sumber
- Langkah 14: File
2025 Pengarang: John Day | [email protected]. Terakhir diubah: 2025-01-13 06:57
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
• 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
Langkah 4: 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 memiliki dua amplifier untuk pengkondisian atau penguatan sinyal.
Langkah 6: AmpOp - Diferensial (pengurang)
Langkah 7: AmpOp - Penambah Inverter
Langkah 8: Maple Mini - Pinage
Pin ditandai pada:
Merah >> Toleransi 3V3
Hijau >> Toleransi 5V
Langkah 9: 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
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
Langkah 12: 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:
SAYA TIDAK