Saya mencoba untuk mendapatkan lebih dari 10 bit presisi dari Arduino ADC saya, tetapi saya tidak dapat benar-benar memahami teori di baliknya. Catatan Aplikasi Atmel yang sering dikutip ( http://www.atmel.com/Images/doc8003.pdf ) mengatakan itu
Penting untuk diingat bahwa rata-rata normal tidak meningkatkan resolusi konversi. Decimation, atau Interpolasi, adalah metode rata-rata, yang dikombinasikan dengan oversampling, yang meningkatkan resolusi
Lalu apa yang mereka usulkan untuk 'Penipisan' adalah memindahkan titik desimal. Yang berarti mengurangi separuh bacaan biner untuk setiap tempat Anda memindahkannya sehingga Anda mungkin juga membagi nilai basis 10 dengan 2 atau 4 atau 8 atau apa pun. Apakah saya memahami penipisan salah?
Jawaban:
Saya melihat catatan itu dan itu memang klaim yang aneh (atau cara yang membingungkan untuk mengatakan apa yang sebenarnya mereka maksudkan).
Mungkin yang sebenarnya mereka maksud adalah poin bahwa jika Anda ingin mendapatkan lebih banyak resolusi, Anda tidak dapat membagi / menggeser angka sesudahnya ke skala yang sama dengan sampel tunggal karena (dalam bilangan bulat aritmatika) yang akan membuang bit yang Anda peroleh.
Jika sampel ADC Anda berisik , maka tentu saja Anda dapat membagi untuk mendapatkan nilai yang lebih tidak berisik pada skala aslinya.
Hal lain yang saya pikir dari hanya pertanyaan Anda adalah titik yang melakukan oversampling yang tepat Anda perlu untuk menggunakan low-pass filter yang efektif, dan rata-rata bergerak sederhana tidak seperti yang baik menjadi low-pass filter sebagai FIR yang dirancang dengan baik (atau IIR) filter - tetapi itu tampaknya tidak didukung oleh teks catatan.
sumber
Jika Anda meminta seseorang untuk mengukur papan 45,2cm akurat ke sentimeter terdekat, mereka akan (atau seharusnya) menjawab 45. Jika Anda meminta untuk mengukurnya lagi, mereka akan menjawab 45 lagi. Ulangi latihan 8 kali lebih banyak dan rata-rata semua pengukuran harus tepat 45. Tidak peduli berapa kali satu sampel input, satu akan berakhir dengan nilai 45. Rata-rata semua bacaan itu tentu saja akan menjadi 45 (meskipun papan memiliki panjang 45,2cm).
Jika Anda meminta orang menyesuaikan alat pengukur sehingga membaca 0,45 cm jauh sebelum pengukuran pertama, 0,35 cm jauh sebelum pengukuran kedua, 0,05 cm jauh sebelum yang kelima, 0,05 cm pendek sebelum yang keenam, dll hingga 0,45 cm pendek sebelum yang kesepuluh, kemudian dua pengukuran akan berbunyi 46 dan delapan lainnya akan membaca 45. Rata-rata dari semuanya adalah 45,2.
Dalam praktiknya, mengelola hal-hal yang bias dengan tepat memang sulit. Jika seseorang secara acak menyesuaikan alat pengukuran sebelum setiap pengukuran membaca di suatu tempat antara panjang 0,5 cm dan pendek 0,5 cm, maka sekitar 1/5 pengukuran akan membaca 46 dan sisanya 45, tetapi karena penyesuaian acak, fraksi yang sebenarnya mungkin lebih tinggi atau lebih rendah. Mengambil sepuluh pengukuran tidak akan menambah angka presisi yang cukup signifikan, tetapi rata-rata sekitar 100 akan melakukannya.
Saya tidak yakin saya cukup memahami alasan koran untuk perbedaan antara rata-rata dan pergeseran kanan. Orang harus sadar bahwa ketelitian yang dicapai dengan rata-rata dapat melebihi tingkat ketelitian yang berarti, tetapi dari pengalaman saya, pertanyaan tentang kapan dan seberapa banyak pergeseran ke kanan harus didorong oleh batas rentang numerik prosesor. Bekerja dengan angka-angka yang ditingkatkan sebanyak mungkin tanpa menyebabkan meluap umumnya akan meminimalkan efek kesalahan pembulatan, asalkan seseorang tidak memasang signifikansi yang tidak semestinya pada sejumlah kecil kebisingan.
Kebetulan, dalam penggunaan aslinya, untuk "memusnahkan" pasukan adalah untuk membunuh 1/10 tentara di dalamnya. Untuk memusnahkan data dari ADC adalah membuang bagian dari itu. Awalan umum dengan frasa "titik desimal" tidak menyiratkan hubungan.
sumber
Jawaban singkatnya adalah kebisingan, dan itu tidak selalu kebisingan yang penting, tetapi jenis kebisingan . Masalah lainnya adalah efek nonlinear seperti INL yang membuang nilai rata-rata
Pertama di Noise:
Jika kami mengambil sampel distribusi Gaussian, akan terlihat seperti ini:
Garis merah lebih dekat dengan distribusi termal aktual (rata-rata dari waktu ke waktu) dan histogram biru mewakili banyak sampel ADC. Jika kita ingin terus-menerus mencicipi distribusi ini, kita akan mendapatkan statistik yang lebih baik dan kita akan dapat menemukan nilai rata-rata atau rata-rata dengan akurasi yang lebih baik (yang biasanya adalah apa yang terjadi setelah itu. Ya, saya menyadari sinyal bergerak, ada penyaringan dan sinyal ke kebisingan) tergantung pada konten frekuensi tetapi mari kita pertimbangkan kasus DC di mana sinyal tidak bergerak untuk saat ini).
Masalahnya adalah noise flicker atau noise 1 / f, itu menggeser Gaussian mean sekitar dan menyebabkan statistik rusak, karena distribusinya tidak lagi gaussian.
Ini adalah model yang buruk tetapi Anda dapat menganggapnya tampak seperti INL ini juga merupakan masalah karena dapat memperkenalkan beberapa bit kesalahan yang juga membuang rata-rata.
Itu mungkin membingungkan, mari kita lihat domain waktu seperti yang ditunjukkan di bawah ini
Pada gambar atas Anda dapat melihat sinyal dengan noise gaussian akan mudah untuk "menggambar garis" melalui tengah dan menemukan rerata. Semakin banyak sampel yang Anda miliki dari sinyal seperti ini, semakin baik akurasi dan pengetahuan Anda tentang rata-rata.
Pada gambar bawah Anda dapat melihat seperti apa suara flicker, rata-rata tidak akan membantu di sini.
Masalahnya adalah sebagian besar elektronik memiliki kebisingan yang berkedip-kedip, resistor tidak (dengan asumsi tidak ada pengaruh dari suhu kamar) tetapi transistor dan IC lakukan. Ada amplifier yang disebut amplifier memotong yang memang mengatasi efek ini.
Hal lain yang perlu diketahui adalah ADC's (linier memiliki inti SAR baru) di mana para insinyur telah bekerja untuk menghilangkan efek noise 1 / f (dan efek nonlinier lainnya seperti ADL seperti INL) ke level yang jauh lebih rendah daripada bit ADCs. nilai. Anda dapat menggunakan oversampling berat dan mengeluarkan nilai 32-bit dari inti 14-bit.
Sumber: EDN- 1 / f Noise — lilin yang berkedip-kedip
sumber
tidak persis. bagian penipisannya menyatakan bahwa, dengan benar dalam pandangan saya, bahwa "rata-rata" normal dari banyak sampel, tetapi mempertahankan lebar bit, tidak menyimpan banyak informasi. Jadi jika Anda rata-rata membaca ADC m n-bit, rata-rata yang dihasilkan masih berupa pembacaan ADC n-bit.
pendekatan yang diusulkan adalah, secara sederhana, adalah untuk rata-rata pembacaan ADC n-bit sehingga rata-rata yang dihasilkan memiliki lebar bit yang lebih tinggi. Misalnya, menjumlahkan 4 bacaan ADC 10-bit dan membagi jumlahnya dengan 2 menghasilkan bacaan ADC 11-bit.
Saya pikir itu selalu menjadi cara oversampling dilakukan secara profesional. Rata-rata sederhana ini oleh orang-orang di internet secara luas dipahami sebagai pendekatan yang salah.
titik lain bahwa untuk mengurangi kebisingan, oversampling hanya efektif jika ada kebisingan yang benar. Jika Anda memiliki ADC 10-bit yang dirancang oleh Tuhan (yaitu setiap bacaan adalah bacaan benar mutlak, tanpa variasi), oversampling tidak akan berhasil.
sirkuit khusus pada akhir artikel tentang penggunaan PWM untuk menambah noise salah: pin menambahkan noise harus memiliki kapasitor pemblokiran DC. dan poin yang kurang substantif adalah bahwa itu tidak harus menjadi pin PWM. Pin GPIO normal akan bekerja.
sumber
Pertama, ADC hanya sebaik referensi tegangannya. Jika Arduino Anda menggunakan + 5V sebagai referensi, Anda bisa melupakan segala jenis presisi, karena regulator + 5V agak berisik, akurasi rendah seperti 1-5%, dan tegangan outputnya akan tergantung pada jumlah arus yang diambil dari itu, baik pada saat pengukuran dan juga dalam beberapa milidetik terakhir.
Jadi, jika Anda membutuhkan akurasi atau presisi, silakan pilih referensi voltase yang sesuai dengan kebutuhan Anda. Jika Anda tidak membutuhkan ketepatan absolut pada tegangan, itu akan lebih murah, karena Anda hanya akan membutuhkannya stabil, bukan akurat dan stabil.
Saya belum menguji SAR ADC di dalam Arduino. Saya memiliki pengalaman dengan yang ada di AT90PWM3B yang merupakan kerabat dekat. Cukup bagus. Dengan tegangan input konstan, Anda mendapatkan pembacaan ADC yang sama, berulang-ulang, dengan 1 LSB berfluktuasi jika tegangan berada di antara nilai. Tidak dapat mengharapkan hasil yang lebih baik dari SAR ADC. (Saya memang menggunakan referensi tegangan eksternal berkualitas baik)
Jadi, kebisingan bukanlah masalah di sini ...
Bahkan, kebisingan adalah temanmu ...
Misalkan tegangan yang ingin Anda ukur jatuh pada nilai ADC 100.1
Anda membuat 10 pengukuran, tetapi karena ADC bagus, Anda mendapatkan 100 setiap kali!
Jadi Anda memerlukan sedikit noise pada sinyal Anda, seperti satu LSB noise, untuk memastikan jika Anda mengukur 100.1 maka Anda akan mendapatkan 100 sembilan dari sepuluh, dan 101 satu dari sepuluh. Jadi rata-rata menjadi 100,1, mengerti?
Jika itu berasal dari sensor, biasanya Anda akan memiliki cukup noise gratis.
sumber
Apa yang Anda lewatkan adalah arti dari "penipisan."
Sebenarnya, "penipisan" adalah pengurangan menjadi 1/10. Artinya, dari 10 kurangi menjadi 1.
"Decimation" seperti yang digunakan dalam pengambilan sampel kehilangan arti yang ketat. Daripada 1/10, itu berarti "mengurangi jumlahnya."
Artinya, Anda membuat rata-rata jumlah sampel, dan mengurangi jumlah sampel dengan jumlah yang sama.
Sebagai contoh, jika Anda sampel pada 1000Hz dan rata-rata 4 sampel, Anda hanya menyimpan rata-rata. Pada akhirnya, Anda hanya memiliki 250 sampel per detik, bukan 1000. Anda kehilangan resolusi waktu, tetapi mendapatkan sedikit resolusi voltase.
Untuk setiap faktor 4, Anda mendapatkan 1 bit. Rata-rata dan pudar dengan 4, dan beralih dari resolusi 10 bit ke resolusi 11 bit.
Faktor lain dari 4 (4 * 4 = 16 total) membuat Anda dari 10 bit menjadi 12 bit. Faktor lain dari 4 membuat Anda mendapatkan resolusi 13 bit.
Tetapi, perhatikan bahwa Anda sekarang kelebihan sampel dengan faktor 64. Tingkat pengambilan sampel efektif Anda turun oleh faktor yang sama. Menggunakan contoh laju sampling 1000Hz, Anda turun menjadi sekitar 15 sampel efektif per detik.
Ini adalah penipisan, dan berapa banyak ADC bit tinggi yang mendapatkan resolusi tinggi. Mereka sampel pada tingkat tinggi, rata-rata (atau menggunakan filter low pass digital) dan memusnahkan.
Pada akhirnya, Anda memiliki ADC bit tunggal (pembanding sederhana) yang melebihi contoh beberapa milon kali untuk memberikan kedalaman bit efektif 16 bit.
Satu hal yang perlu Anda ingat agar ini berfungsi adalah Anda membutuhkan noise dalam sinyal Anda kira-kira sama dengan nilai terkecil yang dapat diukur ADC Anda. Untuk ADC 10 bit menggunakan tegangan referensi 5V, itu akan menjadi noise sekitar 5mV dari puncak ke puncak.
Rata-rata kebisingan adalah di mana keuntungan bit sebenarnya berasal. Bayangkan Anda memiliki sinyal (DC) yang terletak persis di antara nilai jumlah 512 ADC dan 513 jumlah ADC. Tanpa noise, nilai yang diukur akan selalu sama - rata-rata akan memberi Anda nilai yang sama dengan sampel.
Tambahkan noise dengan nilai terukur terkecil, dan itu terlihat sangat berbeda. Meskipun sinyal itu sendiri tidak berubah, nilai yang diukur akan "bergoyang" di sekitar nilai sebenarnya dari sinyal. Rata-rata sekarang berbeda dari sampel, dan semakin banyak sampel yang Anda gunakan semakin dekat dengan nilai riil sinyal
Saya telah menggunakan teknik ini dengan Arduino (yang menggunakan prosesor Atmel dengan ADC 10 bit) untuk mendapatkan resolusi yang lebih baik untuk beberapa pengukuran yang saya buat.
Saya mendapatkannya hingga 13 bit, tetapi ternyata saya membutuhkan lebih banyak. Saya bisa saja memilih faktor 4 yang lain, tetapi itu akan memakan waktu terlalu lama untuk setiap sampel dan hanya memberi saya satu bit lagi.
Eksperimen dengan oversampling menunjukkan bahwa apa yang saya lakukan dapat bekerja (saya mendapat hasil yang dapat dikenali tetapi berisik) tanpa harus menghabiskan waktu dan uang untuk mendapatkan ADC yang lebih baik. Dengan pembuktian konsep, saya bisa melanjutkan dan mendapatkan ADC yang lebih baik - dan mendapatkan pembuktian itu hanya menghabiskan beberapa baris kode dan sedikit waktu.
Saya menemukan saya membutuhkan setidaknya 16 bit. Itu berarti rata-rata 4.096 sampel.
Itu sekitar setengah detik menggunakan pengambilan sampel tercepat yang mungkin dengan perangkat lunak Arduino.
Karena saya membutuhkan 14400 pengukuran, proses penuh akan memakan waktu 2 jam.
Saya bukan pasien itu, dan hal-hal yang saya ukur tidak akan tetap konstan selama itu. Saya harus beralih menggunakan ADC yang menggunakan tingkat oversampling yang jauh lebih tinggi secara internal, dan yang memberikan sampel resolusi lebih tinggi pada tingkat yang lebih rendah.
Seperti halnya banyak hal lainnya, penipisan adalah kompromi yang dapat membuat Anda mendapatkan kinerja yang lebih baik di satu arah (kedalaman bit) sambil membebankan biaya kinerja Anda ke arah lain (laju sampling.)
sumber
Jadi Anda dapat mempelajari teorinya, tetapi saya dapat memberitahu Anda bahwa dalam praktiknya hanya model sederhana yang penting. Anda dapat rata-rata, selama sinyal Anda dalam noise. Kemudian rata-rata komponen noise akan di-zero-out, sementara sinyalnya akan tetap. Dengan cara ini Anda akan mendapatkan resolusi dalam biaya bandwidth.
Jika Anda memiliki misalnya adc 16-bit dan empat bit terakhir berisik, Anda dapat memfilternya dan mendapatkan sinyal di sana. Tetapi jika Anda hanya memiliki sedikit bising, tidak ada banyak rata-rata, sehingga Anda tidak akan mendapatkan banyak informasi baru.
Jika Anda membutuhkan resolusi sangat tinggi (dan bandwidth rendah) lihat bagaimana sigma-delta ADC bekerja. Mereka memiliki sinyal tingkat tinggi 1-bit yang kemudian disaring ke beberapa bandwidth dengan resolusi lebih tinggi, kadang-kadang 20 bit dan lebih banyak.
sumber
Rata-rata berfungsi untuk meningkatkan resolusi dengan mengurangi kesalahan standar deviasi,σ . Kriteria yang harus dipenuhi adalah Gaussian Noise harus melebihi kesalahan kuantisasi. Spesifikasi yang akan didefinisikan adalah kesalahan total dan membuat kesalahan kuantisasi atau resolusi berkontribusi hanya sejumlah kecil dari total anggaran kesalahan.
mis. Jika Anda ingin meningkatkan resolusi sebesar 2 bit, tetapi noise Anda sudah 3 bit, Anda harus mempertimbangkan cara mengurangi noise sebesar 2 + 3 = 5 bit sambil meningkatkan resolusi pada saat yang bersamaan sebesar 2 bit.
Di mana n adalah bit ekstra yang diinginkan dari resolusi, maka menggeser angka biner (atau menipiskan) x1 sama dengan / 2.
Untuk rata-rata itu berartiσ kebisingan berkurang sebesar x−−√ untuk x sampel tetapi juga bahwa latensi ditingkatkan oleh x sampel waktu, maka oversampling diperlukan untuk mengurangi latensi.
Namun kebisingan pada tingkat sampel itu,fs harus cukup untuk gentar +/- 1 bit pada beberapa sampel x, untuk mendapatkan peningkatan terbaik dalam resolusi.
Terlalu kesalahan kuantisasi atau terlalu banyak noise acak akan membutuhkan lebih banyak rata-rata untuk mengurangi kesalahan dan lebih banyak rata-rata meningkatkan latensi hasil.
Untuk mengoptimalkan ADC untuk kecepatan dan kesalahan, seseorang harus menentukan anggaran kesalahan total dan resolusi yang tersedia (bit), SNR yang diinginkan atau kesalahan absolut untuk setiap sinyal yang diberikan dalam seluruh rentang pengukuran. Mendefinisikan semua sumber kesalahan pada awalnya mungkin tampak sulit, namun perlu termasuk;
mis. gain error, kesalahan offset, kesalahan kuantisasi, kesalahan kebisingan CM, kesalahan kebisingan DM, kebisingan Vref atau kesalahan offset, kebisingan lingkungan, dll., kesalahan latensi (dari rata-rata)
Kemudian tentukan berapa banyak lagi bit resolusi yang Anda butuhkan untuk mencapai anggaran kesalahan desain di atas setelah semua sumber kesalahan lainnya telah diperkecil.
Hal yang sama berlaku untuk rata-rata (untuk sinyal lambat) dan oversampling bandwidth sinyal dan penghancuran untuk ADC real-time.
Ini tidak akan memperbaiki untuk mendapatkan atau mengimbangi kesalahan dan jika ada kebisingan acak tidak cukup maka kebisingan harus ditambahkan ke gentar sinyal. Idealnya semua sumber kebisingan dan kesalahan lainnya tidak melebihi 1 bit sehingga standar deviasi atau dither hanya bernilai +/- 1 dari jumlah sampel. Namun, harus ada suara yang cukup sehingga pembacaan yang sama tidak diperoleh dengan sampel berturut-turut di kedua metode.
sumber
Teori di baliknya dapat diambil, dalam bentuk singkat, dari kalimat ini di artikel Wikipedia tentang oversampling :
Jadi, asalkan sinyal Anda cocok dengan kriteria tertentu (seperti menjadi lebih lambat dan memiliki noise rendah) Anda benar-benar meningkatkan satu bit untuk setiap 4 sampel. Kemudian, untuk setiap 4 sampel yang dihasilkan, Anda bisa mendapatkan "bergabung" sekali lagi untuk membentuk sampel lain yang beresolusi lebih tinggi, sehingga pada akhirnya Anda mendapatkan log_4 (n) bit untuk setiap n sampel yang Anda baca di ADC Anda.
Adapun bagian penipisan, itu tidak benar-benar rata-rata, khususnya jika Anda mempertimbangkan bahwa kita berbicara tentang bilangan bulat di sini (sampel ADC). Misalnya, jika Anda memiliki sampel
1
,1
,3
dan2
, rata-rata akan menjadi:Karena Anda rata-rata dengan bilangan bulat matematika, "hasil matematika" Anda dari 1,75 akan dibulatkan menjadi 1. Jika Anda kalikan dengan 2, Anda akan mendapatkannya
2
.Sekarang, jika Anda memusnahkannya dengan:
Hasil Anda akan
3
. Anda dapat berargumen bahwa ini sama dengan membagi dengan 2, tetapi tentunya Anda tidak dapat membantah bahwa 3 adalah rata-rata 1, 1, 3 dan 2 . Lihat perbedaannya?Sekarang Anda mungkin tergoda untuk hanya menjumlahkan semuanya dan tidak membuang bit terakhir. Tetapi ingat bahwa bit ini adalah noise: Anda tidak dapat menggunakannya.
sumber
N/sqrt(N) = sqrt(N)
.Kedengarannya semua orang sudah membahas bagian teori dari pertanyaan Anda, tetapi karena Anda menggunakan Arduino, Anda mungkin ingin membaca petualangan saya mencoba untuk meningkatkan resolusi ADC dengan teknik ini:
Meningkatkan resolusi ADC Arduino dengan Dithering & Oversampling
Karakter suara adalah bagian penting dari cerita, dan ternyata Anda dapat menghasilkan gentar yang cukup baik dengan hanya menggebuk pin dengan resistor di atasnya saat Anda membaca ADC secara tidak sinkron. Itu tidak sempurna, dan Anda mendapatkan offset sinkron kecil yang bervariasi tergantung pada berapa banyak sampel / bit tambahan yang ingin Anda capai. Saya juga menerima kritik bahwa teknik ini tergantung pada stabilisasi rel yang buruk di Arduino, jadi benar-benar dirancang untuk cacat, daripada mengikuti praktik yang baik. Tetapi sangat mudah dilakukan.
sumber