Isi kandungan:

Purata Menjalankan untuk Projek Mikrokontroler Anda: 6 Langkah
Purata Menjalankan untuk Projek Mikrokontroler Anda: 6 Langkah

Video: Purata Menjalankan untuk Projek Mikrokontroler Anda: 6 Langkah

Video: Purata Menjalankan untuk Projek Mikrokontroler Anda: 6 Langkah
Video: Измерение расстояния с помощью 6-контактного лазерного модуля VL53L0X с Arduino 2024, November
Anonim
Purata Menjalankan untuk Projek Mikrokontroler Anda
Purata Menjalankan untuk Projek Mikrokontroler Anda

Dalam arahan ini saya akan menerangkan apa itu rata-rata berjalan dan mengapa anda harus mempedulikannya, dan juga menunjukkan kepada anda bagaimana ia harus dilaksanakan untuk kecekapan komputasi maksimum (jangan bimbang tentang kerumitan, sangat mudah difahami dan saya akan menyediakan perpustakaan yang mudah digunakan untuk projek 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 nilai N terakhir dalam rangkaian data. Ini boleh dikira sama rata-rata normal atau anda boleh menggunakan tipuan untuk menjadikannya memberi kesan minimum terhadap prestasi kod anda.

Langkah 1: Kes Penggunaan: Melicinkan Pengukuran ADC

Kes Penggunaan: Melicinkan Pengukuran ADC
Kes Penggunaan: Melicinkan Pengukuran ADC

Arduino mempunyai 10 bit ADC yang baik dengan sedikit bunyi. Semasa mengukur nilai pada sensor seperti potensiometer, photoresistor atau komponen kebisingan tinggi yang lain, sukar untuk dipercayai bahawa pengukuran itu betul.

Salah satu penyelesaiannya adalah dengan melakukan beberapa pengukuran setiap kali anda ingin membaca sensor anda dan menghitungnya. Dalam beberapa kes, ini adalah penyelesaian yang boleh dilaksanakan tetapi tidak selalu. Sekiranya anda ingin membaca ADC 1000 kali sesaat, anda harus 10 000 jika anda mengambil purata 10 ukuran. Membazirkan banyak masa pengiraan.

Penyelesaian yang saya cadangkan adalah melakukan pengukuran 1000 kali sesaat, mengemas kini rata-rata berjalan setiap kali dan menggunakannya sebagai nilai semasa. Kaedah ini memperkenalkan beberapa kependaman tetapi mengurangkan kerumitan komputasi aplikasi anda, memberi anda lebih banyak masa untuk pemprosesan tambahan.

Dalam gambar di atas, saya menggunakan rata-rata 32 pengukuran terakhir. Anda akan melihat bahawa kaedah ini tidak 100% gagal tetapi akan meningkatkan ketepatan dengan ketara (tidak lebih buruk daripada rata-rata 32 sampel setiap kali). Sekiranya anda ingin mengira purata 32 pengukuran setiap kali, ini akan memakan masa lebih dari 0.25 ms di Arduino UNO untuk pengukuran sahaja!

Langkah 2: Kes Penggunaan: Mengukur Komponen DC Isyarat Mikrofon

Kes Penggunaan: Mengukur Komponen DC Isyarat Mikrofon
Kes Penggunaan: Mengukur Komponen DC Isyarat Mikrofon
Kes Penggunaan: Mengukur Komponen DC Isyarat Mikrofon
Kes Penggunaan: Mengukur Komponen DC Isyarat Mikrofon
Kes Penggunaan: Mengukur Komponen DC Isyarat Mikrofon
Kes Penggunaan: Mengukur Komponen DC Isyarat Mikrofon

Arduino dapat mengukur voltan antara 0 dan Vcc (biasanya 5 V). Isyarat audio benar-benar AC dan jika anda ingin mengukurnya pada mikrokontroler, anda harus bias sekitar 1/2 Vcc. Dalam projek Arduino UNO yang bermaksud kira-kira 2.5 V (DC) + isyarat audio (AC). Apabila menggunakan bekalan kuasa 10 bit ADC dan 5 V, bias 2.5 V harus sama dengan pengukuran 512. Jadi untuk mendapatkan nilai isyarat AC, 512 harus dikurangkan dari pengukuran ADC dan hanya itu, bukan?

Dalam dunia yang ideal, itu benar. Sayangnya kehidupan nyata lebih rumit dan kecenderungan isyarat kita cenderung melayang. Kebiasaan adalah kebisingan 50 Hz (60 Hz jika anda tinggal di AS) dari rangkaian elektrik. Biasanya tidak terlalu bermasalah tetapi ada baiknya mengetahui bahawa ia wujud. Lebih bermasalah ialah peralihan linear dari pemanasan komponen. Anda dengan berhati-hati menetapkan pembetulan offset DC pada permulaan dan perlahan-lahan melayang semasa aplikasi anda sedang berjalan.

Saya akan menerangkan masalah ini dengan alat muzik (music) beat detector. Anda menetapkan penghapusan berat sebelah dan rentak jelas (gambar 2). Selepas beberapa waktu, pergerakan dan rentak bias DC hampir tidak dapat dilihat oleh pengawal mikro (gambar 3). Algoritma pengesanan rentak akan diterokai secara mendalam pada masa akan datang yang dapat diarahkan kerana ia melebihi ruang lingkup artikel ini.

Nasib baik ada cara untuk terus mengira ofset DC audio. Tidak mengejutkan bahawa rata-rata berjalan, topik yang boleh dipesan ini, memberikan penyelesaian.

Kami tahu bahawa nilai purata bagi sebarang isyarat AC adalah 0. Dengan menggunakan pengetahuan ini, kita dapat menolak bahawa nilai purata isyarat AC + DC adalah bias DC. Untuk menghapusnya, kita dapat mengambil nilai rata-rata beberapa nilai terakhir dan mengurangkannya dari bacaan ADC semasa. Perhatikan bahawa anda perlu menggunakan jangka masa yang cukup lama. Untuk audio, sepersepuluh saat (bilangan sampel bergantung pada kadar sampel anda) sudah mencukupi tetapi ketahuilah bahawa purata lebih lama berfungsi lebih baik. Pada gambar pertama, anda dapat melihat contoh pengiraan bias DC sebenar dengan rata-rata berjalan dengan 64 elemen pada kadar sampel 1 kHz (kurang daripada yang saya sarankan tetapi masih berfungsi).

Langkah 3: Pengiraan

Pengiraan
Pengiraan

Anda boleh bayangkan rata-rata berjalan sebagai purata berat badan orang di ruang menunggu doktor. Doktor selesai memeriksa seorang pesakit dan serentak yang baru masuk ke ruang menunggu.

Untuk mengetahui berat rata-rata semua pesakit yang menunggu di ruang menunggu, perawat kemudian dapat bertanya kepada setiap pesakit mengenai berat badan mereka, menambahkan angka tersebut dan membagi dengan jumlah pesakit. Setiap kali doktor menerima pesakit baru, jururawat akan mengulangi keseluruhan proses.

Anda mungkin berfikir: "Ini tidak terdengar terlalu efisien … Pasti ada cara yang lebih baik untuk melakukan ini." Dan anda pasti betul.

Untuk mengoptimumkan proses ini, jururawat dapat menyimpan catatan jumlah berat kumpulan pesakit semasa. Setelah doktor memanggil pesakit baru, jururawat akan bertanya kepadanya tentang berat badannya dan mengurangkannya dari jumlah kumpulan dan membiarkannya pergi. Jururawat kemudian akan bertanya kepada pesakit yang baru saja memasuki ruang menunggu mengenai berat badannya dan menambahkannya kepada jumlah keseluruhan. Berat rata-rata pesakit selepas setiap shift adalah jumlah berat dibahagi dengan jumlah pesakit (ya, sama seperti sebelumnya tetapi sekarang jururawat hanya bertanya kepada dua orang mengenai berat badan mereka dan bukannya semuanya). Saya sedar perenggan ini mungkin agak membingungkan, jadi sila lihat ilustrasi di atas untuk penjelasan tambahan (atau ajukan soalan dalam komen).

Tetapi walaupun anda tidak menemui perenggan terakhir yang membingungkan, anda mungkin mempunyai soalan seperti apa yang seharusnya ada pada penumpuk pada awalnya, bagaimana cara memasukkan apa yang baru saya baca dalam kod C yang sebenarnya? Itu akan ditangani pada langkah seterusnya, di mana anda juga akan mendapatkan kod sumber saya.

Langkah 4: Kodnya

Kod tersebut
Kod tersebut

Untuk mengira purata berjalan, pertama anda memerlukan kaedah untuk menyimpan nilai N terakhir. anda mungkin mempunyai susunan dengan elemen N dan memindahkan keseluruhan kandungan ke satu tempat setiap kali anda menambahkan elemen (jangan lakukan ini), atau anda boleh menimpa satu elemen lama dan menyesuaikan penunjuk ke elemen seterusnya yang akan dibuang (sila lakukan ini:)

Akumulator harus mula diinisialisasi ke 0, sama berlaku untuk semua elemen dalam garis tunda. Dalam kes lain, rata-rata berjalan anda akan selalu salah. Anda akan melihat bahawa delayLine_init menguruskan memulakan garis kelewatan, anda harus mengurus penumpuk sendiri.

menambahkan elemen ke garis penundaan semudah pengurangan indeks elemen terbaru dengan 1, memastikan ia tidak menunjukkan sisi larik garis penundaan. setelah pengurangan indeks ketika 0, ia akan berubah menjadi 255 (kerana ia adalah bilangan bulat 8 bit yang tidak ditandatangani). Operator modulo (%) dengan ukuran susunan garis kelewatan akan memastikan indeks akan menunjukkan elemen yang sah.

Mengira purata berjalan semestinya mudah difahami jika anda mengikuti analogi saya pada langkah sebelumnya. Kurangkan elemen tertua dari penumpuk, tambahkan nilai terbaru ke penumpuk, tolak nilai terbaru ke garis penundaan, kembalikan pengumpul dibahagi dengan bilangan elemen.

Mudah, bukan?

Jangan ragu untuk bereksperimen dengan menggunakan kod yang dilampirkan untuk lebih memahami bagaimana semua ini berfungsi. Seperti sekarang, arduino membaca nilai analog pada pin analog A0 dan mencetak "[nilai ADC], [rata-rata berjalan]" pada port bersiri pada kadar baud 115200. Sekiranya anda membuka plotter bersiri arduino pada kadar baud yang betul, anda akan melihat dua baris: nilai ADC (biru) dan nilai halus (merah).

Langkah 5: Ekstra

Tambahan
Tambahan

Terdapat beberapa perkara yang anda tidak semestinya perlu tahu untuk menggunakan rata-rata berjalan dalam projek anda dan tidak ada salahnya untuk mengetahui.

kelewatan: Saya akan mulakan dengan membincangkan ilustrasi langkah ini. Anda akan melihat bahawa rata-rata berjalan lebih banyak elemen memperkenalkan kelewatan yang lebih besar. Sekiranya masa tindak balas anda untuk mengubah nilai adalah penting, anda mungkin ingin menggunakan purata berjalan yang lebih pendek atau meningkatkan kadar sampel (ukuran lebih kerap).

Melangkah terus.

inisialisasi: Semasa saya bercakap tentang memulakan elemen penumpuk dan penundaan, saya katakan anda harus menginisialisasi semuanya menjadi 0. Sebagai alternatif, anda boleh menginisialisasi garis tunda ke apa sahaja yang anda suka tetapi penumpuk harus bermula sebagai jumlah elemen N terbaru dalam garis tunda (di mana N ialah bilangan elemen dalam purata berjalan anda). Sekiranya penumpuk bermula seperti nilai lain, purata yang dikira akan salah - sama ada terlalu rendah atau terlalu tinggi, selalu dengan jumlah yang sama (dengan andaian keadaan awal yang sama). Saya cadangkan anda cuba mengetahui mengapa ini berlaku dengan menggunakan beberapa "simulasi pen dan kertas".

ukuran penumpuk: Anda juga harus perhatikan bahawa penumpuk harus cukup besar untuk menyimpan jumlah semua elemen dalam garis kelewatan jika semuanya positif atau negatif maksimum. Secara praktikal itu bermaksud penumpuk harus satu jenis data yang lebih besar daripada elemen garis tunda dan ditandatangani, jika elemen garis tunda ditandatangani.

silap mata: Garis penangguhan panjang memerlukan banyak memori. Itu boleh menjadi masalah dengan cepat. Sekiranya memori anda terhad dan tidak terlalu mementingkan ketepatan, anda boleh mengira purata berjalan dengan menghilangkan penangguhan sepenuhnya dan melakukannya: tolak 1 / N * penumpuk dari penumpuk dan tambahkan nilai baru (contohnya 8 rata-rata jangka panjang: penumpuk = penumpuk * 7/8 + Nilai baru). Kaedah ini memberikan hasil yang salah tetapi ini adalah kaedah yang baik untuk mengira purata berjalan ketika anda kehabisan memori.

linguistik: "rata-rata berjalan / rata-rata" biasanya digunakan ketika merujuk pada rata-rata waktu nyata sementara "rata-rata bergerak / rata-rata" biasanya bermaksud algoritma berjalan pada set data statik seperti spreadsheet excel.

Langkah 6: Kesimpulannya

Saya harap pengajaran ini cukup mudah difahami dan ia dapat membantu anda dalam projek masa depan anda. Jangan ragu untuk menghantar soalan di komen di bawah jika ada perkara yang tidak jelas.

Disyorkan: