Daftar Isi:

Menjalankan Rata-Rata untuk Proyek Mikrokontroler Anda: 6 Langkah
Menjalankan Rata-Rata untuk Proyek Mikrokontroler Anda: 6 Langkah

Video: Menjalankan Rata-Rata untuk Proyek Mikrokontroler Anda: 6 Langkah

Video: Menjalankan Rata-Rata untuk Proyek Mikrokontroler Anda: 6 Langkah
Video: SULTAN MEDAN INDRAKENZ NAIK JET PRIBADI KE PULAU PRIBADI!! 2024, November
Anonim
Menjalankan Rata-Rata untuk Proyek Mikrokontroler Anda
Menjalankan Rata-Rata untuk Proyek Mikrokontroler Anda

Dalam instruksi ini saya akan menjelaskan apa itu rata-rata berjalan dan mengapa Anda harus mempedulikannya, serta menunjukkan kepada Anda bagaimana itu harus diterapkan untuk efisiensi komputasi maksimum (jangan khawatir tentang kerumitan, ini sangat mudah dipahami dan saya akan menyediakan perpustakaan yang mudah digunakan untuk proyek arduino Anda juga:)

Rata-rata berjalan, juga biasa disebut sebagai rata-rata bergerak, rata-rata bergerak atau rata-rata berjalan, adalah istilah yang digunakan untuk menggambarkan nilai rata-rata dari nilai N terakhir dalam seri data. Ini dapat dihitung seperti rata-rata normal atau Anda dapat menggunakan trik untuk membuatnya memiliki dampak minimal pada kinerja kode Anda.

Langkah 1: Kasus Penggunaan: Menghaluskan Pengukuran ADC

Kasus Penggunaan: Menghaluskan Pengukuran ADC
Kasus Penggunaan: Menghaluskan Pengukuran ADC

Arduino memiliki ADC 10 bit yang layak dengan sedikit noise. Saat mengukur nilai pada sensor seperti potensiometer, fotoresistor, atau komponen kebisingan tinggi lainnya, sulit untuk mempercayai bahwa pengukuran itu benar.

Salah satu solusinya adalah melakukan beberapa pengukuran setiap kali Anda ingin membaca sensor Anda dan membuat rata-ratanya. Dalam beberapa kasus ini adalah solusi yang layak tetapi tidak selalu. Jika Anda ingin membaca ADC 1000 kali per detik, Anda harus 10 000 jika Anda mengambil rata-rata 10 pengukuran. Pemborosan waktu komputasi yang sangat besar.

Solusi yang saya usulkan adalah melakukan pengukuran 1000 kali per detik, memperbarui rata-rata berjalan setiap kali dan menggunakannya sebagai nilai saat ini. Metode ini memperkenalkan beberapa latensi tetapi mengurangi kompleksitas komputasi aplikasi Anda, memberi Anda lebih banyak waktu untuk pemrosesan tambahan.

Pada gambar di atas saya menggunakan rata-rata berjalan dari 32 pengukuran terakhir. Anda akan melihat bahwa metode ini tidak 100% tahan gagal tetapi meningkatkan akurasi secara signifikan (tidak lebih buruk daripada rata-rata 32 sampel setiap kali). Jika Anda ingin menghitung rata-rata 32 pengukuran setiap kali, itu akan memakan waktu lebih dari 0,25 ms pada Arduino UNO untuk pengukuran saja!

Langkah 2: Kasus Penggunaan: Mengukur Komponen DC dari Sinyal Mikrofon

Kasus Penggunaan: Mengukur Komponen DC dari Sinyal Mikrofon
Kasus Penggunaan: Mengukur Komponen DC dari Sinyal Mikrofon
Kasus Penggunaan: Mengukur Komponen DC dari Sinyal Mikrofon
Kasus Penggunaan: Mengukur Komponen DC dari Sinyal Mikrofon
Kasus Penggunaan: Mengukur Komponen DC dari Sinyal Mikrofon
Kasus Penggunaan: Mengukur Komponen DC dari Sinyal Mikrofon

Arduino dapat mengukur tegangan antara 0 dan Vcc (biasanya 5 V). Sinyal audio sepenuhnya AC dan jika Anda ingin mengukurnya pada mikrokontroler, Anda harus membiaskannya sekitar 1/2 Vcc. Dalam proyek Arduino UNO itu berarti kira-kira 2,5 V (DC) + sinyal audio (AC). Saat menggunakan ADC 10 bit dan catu daya 5 V, bias 2,5 V harus sama dengan pengukuran 512. Jadi untuk mendapatkan nilai sinyal AC, 512 harus dikurangi dari pengukuran ADC dan hanya itu, kan?

Di dunia yang ideal, itu benar. Sayangnya kehidupan nyata lebih rumit dan bias sinyal kami cenderung melayang. Sangat umum adalah kebisingan 50 Hz (60 Hz jika Anda tinggal di AS) dari jaringan listrik. Biasanya tidak terlalu bermasalah tetapi ada baiknya mengetahui hal itu ada. Lebih bermasalah adalah penyimpangan linier dari pemanasan komponen. Anda dengan hati-hati mengatur koreksi offset DC di awal dan perlahan menghilang saat aplikasi Anda berjalan.

Saya akan mengilustrasikan masalah ini dengan detektor ketukan (musik). Anda mengatur penghapusan bias Anda dan ketukannya jelas (gambar 2). Setelah beberapa waktu, bias DC bergerak dan berdetak hampir tidak terlihat oleh mikrokontroler (gambar 3). Algoritme deteksi ketukan akan dieksplorasi secara mendalam di masa mendatang yang dapat diinstruksikan karena melebihi cakupan artikel ini.

Untungnya ada cara untuk terus menghitung offset DC audio. Tidak mengherankan bahwa rata-rata lari, topik instruksi ini, memberikan solusi.

Kita tahu bahwa nilai rata-rata dari setiap sinyal AC adalah 0. Dengan menggunakan pengetahuan ini kita dapat mengurangi bahwa nilai rata-rata dari sinyal AC+DC adalah bias DC. Untuk menghapusnya, kita dapat mengambil rata-rata berjalan dari beberapa nilai terakhir dan menguranginya dari pembacaan ADC saat ini. Perhatikan bahwa Anda perlu menggunakan rata-rata lari yang cukup lama. Untuk audio, sepersepuluh detik (jumlah sampel tergantung pada laju sampel Anda) sudah cukup tetapi ketahuilah bahwa rata-rata yang lebih lama berfungsi lebih baik. Pada gambar pertama Anda dapat melihat contoh perhitungan bias DC nyata dengan rata-rata berjalan dengan 64 elemen pada laju sampel 1 kHz (kurang dari yang saya rekomendasikan tetapi masih berfungsi).

Langkah 3: Perhitungan

Perhitungan
Perhitungan

Anda dapat membayangkan rata-rata lari sebagai rata-rata berat orang di ruang tunggu dokter. Dokter selesai memeriksa satu pasien dan secara bersamaan yang baru masuk ke ruang tunggu.

Untuk mengetahui rata-rata berat badan semua pasien yang menunggu di ruang tunggu, perawat kemudian dapat menanyakan berat badan masing-masing pasien, menjumlahkan dan membaginya dengan jumlah pasien. Setiap kali dokter menerima pasien baru, perawat akan mengulangi seluruh proses.

Anda mungkin berpikir: "Ini kedengarannya tidak terlalu efisien… Pasti ada cara yang lebih baik untuk melakukan ini." Dan Anda akan benar.

Untuk mengoptimalkan proses ini, perawat dapat mencatat berat total kelompok pasien saat ini. Begitu dokter memanggil pasien baru, perawat akan menanyakan berat badannya dan menguranginya dari total kelompok dan membiarkannya pergi. Perawat kemudian akan bertanya kepada pasien yang baru saja masuk ke ruang tunggu tentang berat badannya dan menambahkannya ke total. Berat rata-rata pasien setelah setiap shift akan menjadi jumlah berat dibagi dengan jumlah pasien (ya, sama seperti sebelumnya tapi sekarang perawat hanya menanyakan dua orang tentang berat badan mereka, bukan semuanya). Saya menyadari paragraf ini mungkin agak membingungkan jadi silakan lihat ilustrasi di atas untuk kejelasan tambahan (atau ajukan pertanyaan di komentar).

Tetapi bahkan jika Anda tidak menemukan paragraf terakhir yang membingungkan, Anda mungkin memiliki pertanyaan seperti apa yang seharusnya ada di akumulator di awal, bagaimana cara memasukkan apa yang baru saja saya baca ke dalam kode C yang sebenarnya? Itu akan dibahas pada langkah berikutnya, di mana Anda juga akan mendapatkan kode sumber saya.

Langkah 4: Kode

Kode
Kode

Untuk menghitung rata-rata berjalan, pertama-tama Anda memerlukan cara untuk menyimpan nilai N terakhir. anda dapat memiliki array dengan elemen N dan memindahkan seluruh konten satu tempat setiap kali Anda menambahkan elemen (jangan lakukan ini), atau Anda dapat menimpa satu elemen lama dan menyesuaikan penunjuk ke elemen berikutnya untuk dibuang (tolong lakukan ini:)

Akumulator harus mulai diinisialisasi ke 0, hal yang sama berlaku untuk semua elemen di garis tunda. Dalam kasus lain rata-rata lari Anda akan selalu salah. Anda akan melihat bahwa delayLine_init menangani inisialisasi garis tunda, Anda harus mengurus sendiri akumulator.

menambahkan elemen ke garis tunda semudah mengurangi indeks elemen terbaru dengan 1, memastikan itu tidak menunjukkan sisi array garis tunda. setelah penurunan indeks ketika itu 0, itu akan berputar ke 255 (karena itu adalah 8 bit unsigned integer). Operator modulo (%) dengan ukuran delay line array akan memastikan indeks akan menunjuk ke elemen yang valid.

Menghitung rata-rata berjalan seharusnya mudah dipahami jika Anda mengikuti analogi saya di langkah sebelumnya. Kurangi elemen terlama dari akumulator, tambahkan nilai terbaru ke akumulator, dorong nilai terbaru ke garis tunda, kembalikan akumulator dibagi dengan jumlah elemen.

Mudah, kan?

Silakan bereksperimen dengan menggunakan kode terlampir untuk lebih memahami bagaimana semua ini bekerja. Seperti saat ini, arduino membaca nilai analog pada pin analog A0 dan mencetak "[nilai ADC], [rata-rata berjalan]" pada port serial pada 115200 baud rate. Jika Anda membuka plotter serial arduino pada baud rate yang benar, Anda akan melihat dua baris: nilai ADC (biru) dan nilai smoothed out (merah).

Langkah 5: Ekstra

Ekstra
Ekstra

Ada beberapa hal yang tidak perlu Anda ketahui untuk menggunakan rata-rata berjalan dalam proyek Anda, tetapi tidak ada salahnya untuk mengetahuinya.

delay: Saya akan mulai dengan berbicara tentang ilustrasi langkah ini. Anda akan melihat bahwa menjalankan rata-rata lebih banyak elemen menyebabkan penundaan yang lebih besar. Jika waktu respons Anda terhadap perubahan nilai sangat penting, Anda mungkin ingin menggunakan rata-rata berjalan yang lebih pendek atau meningkatkan laju sampel (mengukur lebih sering).

Bergerak.

inisialisasi: Ketika saya berbicara tentang inisialisasi akumulator dan elemen tunda, saya katakan Anda harus menginisialisasi semuanya ke 0. Atau Anda dapat menginisialisasi garis tunda ke apa pun yang Anda suka tetapi akumulator harus dimulai sebagai jumlah elemen N terbaru di baris tunda (di mana N adalah jumlah elemen dalam rata-rata lari Anda). Jika akumulator dimulai sebagai nilai lain, rata-rata yang dihitung akan salah - terlalu rendah atau terlalu tinggi, selalu dengan jumlah yang sama (dengan asumsi kondisi awal yang sama). Saya sarankan Anda mencoba mempelajari mengapa demikian dengan menggunakan beberapa "simulasi pena dan kertas".

ukuran akumulator: Anda juga harus mencatat bahwa akumulator harus cukup besar untuk menyimpan jumlah semua elemen dalam baris penundaan jika semuanya positif atau negatif maks. Praktis itu berarti akumulator harus satu tipe data lebih besar dari elemen garis tunda dan ditandatangani, jika elemen garis tunda ditandatangani.

trik: Garis tunda yang panjang memakan banyak memori. Itu bisa dengan cepat menjadi masalah. Jika memori Anda sangat terbatas dan tidak terlalu peduli dengan akurasi, Anda dapat memperkirakan rata-rata berjalan dengan menghilangkan penundaan sepenuhnya dan melakukan ini sebagai gantinya: kurangi 1/N * akumulator dari akumulator dan tambahkan nilai baru (pada contoh 8 rata-rata berjalan lama: akumulator = akumulator * 7/8 + nilai baru). Metode ini memberikan hasil yang salah tetapi ini adalah metode yang layak untuk menghitung rata-rata berjalan saat Anda kehabisan memori.

linguistik: "rata-rata/rata-rata berjalan" biasanya digunakan ketika mengacu pada rata-rata waktu nyata sementara "rata-rata/rata-rata bergerak" biasanya berarti algoritma berjalan pada kumpulan data statis seperti spreadsheet excel.

Langkah 6: Kesimpulan

Saya harap instruksi ini cukup mudah untuk dipahami dan itu akan membantu Anda dalam proyek masa depan Anda. Silahkan ajukan pertanyaan di kolom komentar di bawah jika ada yang kurang jelas.

Direkomendasikan: