Bagaimana cara membuat mikrofon yang bersih dengan konversi analog ke digital?

12

Saya telah mengajukan beberapa pertanyaan yang berkaitan dengan proyek ini selama beberapa hari terakhir, tetapi sepertinya saya tidak bisa menggabungkan semuanya.

Saya menghubungkan mic electret ke dalam opamp dan memberikan output ke mikrokontroler Arduino saya. ADC pada mikrokontroler mengubah kisaran 0 hingga 5 vV ke angka 10-bit (0 hingga 1023).

Saya mencoba 3 chip amp yang berbeda:

  • LM386 - Saya mendapat umpan balik chip ini tidak baik untuk tujuan ini, karena tidak opamp, dan tidak bekerja dengan benar seperti yang diharapkan.
  • LM358 - bekerja
  • UA741 - berfungsi, menguatkan lebih dari LM358

Saya mengikuti skema ini persis (kecuali untuk saya main-main dengan nilai-nilai resistor untuk mendapatkan keuntungan yang baik): Saya menggunakan 50k ohm untuk R5 dan 10 ohm untuk R2. masukkan deskripsi gambar di sini

Masalahnya adalah bahwa output dari dua chip terakhir tidak "bersih". AnalogRead () pada Arduino selalu membaca nilai non-nol bahkan ketika saya tidak membuat suara di mic. Pembacaan bereaksi dengan benar ketika saya membuat suara, tetapi nilai "nol" adalah bukan nol. Terkadang nilai "nol" bahkan berkedip-kedip melempar pembacaan sepanjang waktu. Semoga itu masuk akal.

Bisakah Anda membantu saya menyelesaikan masalah ini?

Sama seperti informasi tambahan yang tidak penting: Saya mencoba membuat sesuatu seperti ini , pada akhirnya.

Shubham
sumber
Anda yakin memiliki C2? Berapa voltase diam DC setelah C2?
Majenko
Ya saya punya C2 di tempatnya. Ini sekitar 2 volt. Saya tidak tahu apakah ini masuk akal: mungkinkah ada beberapa arus yang terperangkap (?) Dalam loop antara pin 2 dan 6, output dan input pembalik?
Shubham
Bagaimana dengan voltase diam DC setelah C2 dengan itu terputus dari pin input Arduino?
Majenko
Kehadiran C2 berarti bahwa output preamp akan berayun sekitar 0V - bukan 2,5V yang beroperasi secara internal.
Majenko
Satu hal lagi - Anda mungkin ingin menyelipkan dioda shottky di antara pre-amp C2 dan input Arduino - membuang tegangan negatif yang benar-benar tidak Anda pedulikan. Satu hal lagi yang saya lakukan adalah menambahkan kapasitor lain antara input analog dan ground untuk menghaluskan sinyal keluar sedikit. Membuat VU meteran sedikit kedipan.
Majenko

Jawaban:

17

Singkirkan kapasitor output. Rangkaian itu mungkin dimaksudkan untuk menghasilkan sinyal sekitar nol, sehingga kapasitor ada di sana untuk memblokir offset 1/2 Vdd. Namun, mikrokontroler ingin melihat sinyal terpusat sekitar 1/2 Vdd, jadi singkirkan kapasitor.

Mikrofon memang membutuhkan banyak keuntungan. Electrets bisa sensitif, tetapi Anda mungkin masih membutuhkan penguatan tegangan 1000. Gain di rangkaian Anda adalah rasio R5 ke R2, tetapi ini hanya bekerja dalam batas dari apa yang dapat dilakukan opamp.

Nilai-nilai yang Anda sebutkan di atas akan memberi Anda keuntungan 5000. Itu jauh lebih banyak daripada yang seharusnya Anda dapatkan dari satu tahap opamp. Tegangan offset tidak hanya akan dikalikan dengan penguatan ini, tetapi opamp tidak akan mampu menyediakannya pada rentang frekuensi penuh. Pada gain bandwidth 1 MHz, Anda hanya akan mendapatkan gain yang di bawah 200 Hz. Bahkan offset input 1 mV menjadi 5 V setelah amplifikasi sebesar 5000.

R2 juga merupakan impedansi yang terlihat oleh mikrofon setelah kapasitor input. Anda perlu ini agak lebih besar dari impedansi mikrofon dengan pullup dan kapasitor input pada frekuensi terendah. 10 Ω terlalu kecil untuk itu. 10 kΩ akan menjadi nilai yang lebih baik.

Coba dua tahap dengan keuntungan 30 atau lebih untuk pemula dan lihat di mana itu membuat Anda. Itu adalah keuntungan yang bisa diatasi dengan frekuensi yang masuk akal dengan ruang kepala yang cukup tersisa agar umpan balik bekerja. Anda juga perlu memasangkan dua tahap secara kapasitif agar tegangan offset input tidak menumpuk melalui semua tahap.

Edit: Menambahkan sirkuit

Saya tidak punya waktu untuk menggambar sirkuit tadi malam ketika saya menulis jawaban di atas. Berikut ini adalah rangkaian yang harus melakukannya:

Ini memiliki penguatan tegangan sekitar 1000, yang seharusnya cukup untuk mikrofon electret yang wajar. Saya mungkin sedikit terlalu banyak, tetapi mudah untuk menambahkan beberapa pelemahan.

Topologi agak berbeda dari sirkuit Anda. Satu hal yang paling penting untuk dicatat adalah bahwa ia tidak mencoba untuk menghasilkan seluruh keuntungan dalam satu tahap. Setiap tahap memiliki gain sekitar 31. Itu menyisakan banyak ruang utama gain pada frekuensi audio maksimum 20 kHz untuk umpan balik, sehingga gain akan dapat diprediksi dengan baik dan rata dalam rentang frekuensi audio karena MCP6022 memiliki gain-bandwidth khas produk 10 MHz. Faktor pembatas kemungkinan besar adalah mikrofon.

Tidak seperti apa yang saya katakan sebelumnya, dua tahap tidak perlu digabungkan secara kapasitif untuk mencegah akumulasi tegangan offset bersama dengan gain. Itu karena di sirkuit ini, setiap tahap hanya memiliki gain DC sebesar 1, sehingga offset akhir hanya dua kali offset opamp. Opamps ini hanya memiliki offset 500 µV, sehingga offset akhir hanya 1 mV karena opamps. Akan ada lebih banyak karena ketidakcocokan R3 dan R4. Bagaimanapun, output DC akan cukup dekat dengan 1/2 pasokan untuk tidak makan ke kisaran A / D dengan cara yang bermakna.

Gain DC dari 1 per tahap dicapai dengan menggabungkan jalur pembagi umpan balik kapasitif ke ground. Kapasitor memblokir DC, jadi setiap tahap hanyalah satu kesatuan pengikut DC. Gain penuh AC direalisasikan karena impedansi kapasitor (C3 pada tahap pertama) menjadi kecil dibandingkan dengan resistor pembagi yang lebih rendah (R7 pada tahap pertama). Ini mulai terjadi pada sekitar 16 Hz. Salah satu kelemahan dari pendekatan ini adalah bahwa konstanta waktu untuk menyelesaikan adalah C3 kali R7 + R5, bukan hanya R7. Sirkuit ini akan membutuhkan beberapa detik untuk menstabilkan setelah dinyalakan.

Olin Lathrop
sumber
Ketika saya mengambil tutup dari output, Arduino melihat input sekitar 3 volt. Maaf, tetapi bisakah Anda menjelaskan apa yang Anda maksud dengan tegangan offset? Untuk mendapatkan keuntungan 1000, dengan R2 menjadi 10k Ohm, saya perlu 10M ohm untuk R5? Apa kau yakin tentang ini? Keuntungannya adalah rasio antara R5 dan R2 kan?
Shubham
@ Shubham: Sirkuit Anda mencoba untuk mengalikan tegangan offset opamp dengan 5000, jadi tidak mengherankan output dipatok ke satu rel. Tidak ada opamp yang sempurna. Tegangan offset input adalah tegangan antara dua input saat output berada pada kisaran menengah. Secara teori kedua input akan sama. Spesifikasi tegangan offset input memberi tahu Anda seberapa jauh itu dari ideal ini.
Olin Lathrop
@ Shubham: Anda akan membutuhkan 10 MOhm untuk resistor umpan balik jika Anda mencoba memiliki satu tahap menghasilkan semua keuntungan. Seperti yang saya katakan, itu ide yang buruk.
Olin Lathrop
Terima kasih atas semua bantuannya, belajar banyak di sini. Jadi memiliki dua tahap 30 gain masing-masing memberi saya keuntungan total 900, kan? Saya akan mencoba ini menggunakan LM358 (itulah yang saya miliki), dan melaporkan kembali
Shubham
Akhirnya berhasil! Terima kasih telah memberikan saya skema itu! Tapi saya hanya mendapatkan kisaran ADC sekitar 200. Nilai ADC diam akan sedikit di atas titik tengah (512), tetapi tidak peduli berapa banyak suara yang saya buat di mic, nilai ADC tidak akan lebih dari 200 di atas nilai diam. Mungkin pengaturan topi dan resistor saya yang membatasi ini.
Shubham
5

Seperti yang Anda katakan, nilai digital akan dari 0 hingga 1023. Bagian tengah kisaran ini bukan 0, itu adalah 512 (yang sesuai dengan tegangan sekitar 2,5). Untuk keheningan, Anda harus melihat sesuatu di tengah kisaran seperti ini. Tidak harus 512 persis, tetapi harus dekat. Ini disebut "offset DC". Sinyal digeser ke atas dan berpusat di sekitar 2,5 V.

Jika Anda mengukur 2 V dan melihat nilai ADC sekitar 400, maka pada dasarnya itu berfungsi dengan baik.

Gelombang suara berubah dari tekanan negatif ke tekanan positif. Jika titik pusat adalah 0, dan sinyal hanya dapat diukur antara 0 dan 1023, maka nilai tekanan negatif (-1023) akan terputus.

Juga, itu akan selalu berfluktuasi sedikit karena lantai kebisingan ADC. (Dan akan selalu ada suara audio di ruangan tidak peduli seberapa tenangnya kamu.)

endolit
sumber
Ohhh yang menjelaskan "offset DC" Saya terus melihat jawaban lain. Apakah ada cara untuk menghapus offset DC tetapi meletakkan topi di suatu tempat?
Shubham
@ Shubham: Anda INGIN offset DC. Proses ADC tidak akan berfungsi tanpanya. Tutup C2 adalah yang memastikan Anda memilikinya. Dalam hal ini mungkin tidak ada banyak perbedaan, karena output dari U1 sudah diimbangi. Bisakah Anda mengukur nilai DC di setiap sisi C2?
endolith
@Shubham: Jika Anda ingin pengukuran digital Anda terpusat di sekitar 0 dan bukan 512, Anda bisa mengurangi offset dalam perangkat lunak Anda, atau lebih baik, menerapkan filter high-pass digital dalam perangkat lunak.
endolith
3

Bisakah Anda memposting lembar spesifikasi di mikrofon itu? Tidak ada alasan Anda perlu mendapatkan 5.000 dengan mikrofon electret kecuali Anda memiliki unit telanjang tanpa FET internal. Jika itu masalahnya, preamp perlu terlihat jauh berbeda.

Selain itu sirkuit yang Anda gunakan tidak terlalu kondusif untuk digunakan sebagai pre-amp untuk mikrofon electret.

Saya akan merekomendasikan:

masukkan deskripsi gambar di sini

R5 / R4 mengatur penguatan dan dapat disesuaikan tanpa mengacaukan impedansi input rangkaian. R3 dapat berasal dari 2k -> 10k ish. 10k akan cenderung meningkatkan kinerja distorsi, jika Anda menyesuaikan ini terlalu rendah, Anda harus memikirkan kembali nilai-nilai untuk R1 dan R2 untuk memperbaiki impedansi input.

Ini juga sangat penting bahwa catu daya cukup dipisahkan karena kebisingan akan masuk ke mikrofon.

Seperti jawaban lain yang disebutkan poin "nol" Anda akan ~ 512 ketika Anda membaca ADC dan akan sedikit berfluktuasi tidak peduli apa yang Anda lakukan.

Jika tujuan Anda adalah lampu berkedip sebagai respons terhadap level, Anda tidak seharusnya mengambil bacaan instan dengan arduino karena saya ragu Anda akan dapat mengambil sampel dengan cukup cepat untuk membuatnya merespons dengan baik. Alih-alih lakukan deteksi tingkat puncak atau rata-rata di domain analog dan setel periode rata-rata secara proporsional ke tingkat pengambilan sampel Anda.

EDIT: Lebih lanjut tentang melakukan ini dengan detektor puncak

Masalah yang Anda miliki di sini adalah bahwa Arduino memiliki tingkat pengambilan sampel yang relatif terbatas, saya pikir maksimum Anda akan menjadi sekitar 10khz yang berarti Anda hanya dapat menyelesaikan maks sinyal audio 5khz. Itu adalah dengan Arduino melakukan sangat sedikit kecuali menjalankan ADC, jika Anda perlu melakukan pekerjaan nyata (dan Anda melakukan beberapa untuk mendapatkan level) tingkat sampling akan lebih rendah.

Ingat Anda mengambil sampel diskrit dari sinyal mentah, hanya karena Anda memiliki gelombang sinus jangkauan penuh ke dalam ADC tidak berarti Anda tidak akan mendapatkan pembacaan 0 dari ADC, Anda akan mendapatkan sampel di berbagai titik gelombang. . Dengan musik asli, sinyal yang dihasilkan akan sangat kompleks dan Anda akan memiliki sampel di semua tempat.

Sekarang, jika semua yang Anda coba ukur adalah level sinyal input, dan tidak peduli untuk benar-benar mendapatkan representasi digital dari sinyal, maka Anda dapat menggunakan detektor puncak sederhana setelah pre-amp ini untuk melakukannya.

Apa ini artinya mengubah sinyal audio Anda menjadi tegangan yang mewakili tingkat puncaknya. Ketika Anda mengukur tegangan ini dengan ADC Anda akan memiliki nilai langsung yang mewakili tingkat sinyal pada saat pembacaan dilakukan. Anda masih akan memiliki sedikit goyangan karena suara adalah bentuk gelombang yang kompleks dan selalu bervariasi, tetapi ini harus mudah ditangani dalam perangkat lunak.

Detektor puncak tanpa penahan sebenarnya hanya penyearah dengan filter pada output. Dalam hal ini kita perlu menangani sinyal level rendah dan menjaga akurasi sehingga kita perlu melakukan sedikit lebih banyak dari apa yang akan dilakukan untuk rangkaian penyearah rata-rata Anda. Rangkaian rangkaian ini disebut "penyearah presisi".

masukkan deskripsi gambar di sini

Ada sekitar satu miliar cara berbeda untuk melakukan ini, tetapi saya akan menggunakan sirkuit ini, sepertinya bekerja paling baik saat menggunakan satu pasokan. Ini akan pergi setelah rangkaian pre-amp sudah dibahas dan inputnya bisa AC atau tidak, meskipun itu berjalan dari satu pasokan, itu benar-benar akan bekerja dengan baik dengan voltase input negatif selama Anda tidak melebihi puncak yang tersedia- to-peak voltage dari op amp.

OP1 bertindak sebagai (hampir) dioda ideal yang mengatasi masalah penurunan tegangan yang biasa terjadi pada dioda saat meluruskan. Hampir semua dioda sinyal kecil akan bekerja untuk D1, sesuatu dengan penurunan tegangan maju yang lebih rendah akan meningkatkan akurasi tetapi saya ragu itu akan menjadi masalah bagi penggunaan Anda.

C1 dan R4 bertindak sebagai filter low pass untuk memuluskan output, Anda dapat bermain dengan nilainya untuk menyesuaikan kinerja dengan apa yang Anda coba lakukan (dan laju sampling Anda).

Anda mungkin dapat menggunakan model op amp yang sama dengan yang Anda gunakan pada pre-amp tetapi Rail-to-Rail dan laju perubahan tegangan tinggi ideal untuk rangkaian ini. Jika Anda memiliki masalah stabilitas, tambah R1, R2, dan R3 hingga 100k ohm.

Menandai
sumber
Mic adalah mic kondensor electret standar. Saya akan membuat R3 10K, Vcc saya adalah 5.9V jadi apakah akan baik-baik saja jika R1 dan R2 juga 10K? Apa opamp yang akan Anda rekomendasikan: LM358 atau 741? Apakah ada cara saya bisa membawa titik "nol" ke 0 atau mendekati 0? "Alih-alih lakukan deteksi tingkat puncak atau rata-rata di domain analog dan setel periode rata-rata secara proporsional dengan apa pun tingkat pengambilan sampel Anda." - Bisakah Anda memberi saya sedikit lebih detail tentang ini? kedengarannya menarik dan saya benar-benar ingin melihatnya. Maaf saya punya banyak pertanyaan ... Saya seorang siswa EE di perguruan tinggi masih belajar.
Shubham
Saya mencoba rangkaian yang Anda rekomendasikan (jauh lebih bersih dari apa yang saya gunakan, kurang keacakan dalam output). Saya menggunakan 1M Ohm untuk R5 dan 1k Ohm untuk R4, memberikan amplifikasi 1000. Ketika saya melakukan beberapa pengukuran dengan DMM, opamp memberikan output diam sekitar 3 volt, dan C3 menguranginya menjadi sekitar 1,5 volt. Juga ketika saya menghapus R5, tidak ada bedanya dengan output ... apakah Anda yakin mendapatkan R4 / R5?
Shubham
1
R3 menetapkan titik bias FET di dalam mikrofon, (R1 || R2) || R3 mengatur impedansi input AC yang terlihat oleh mikrofon. Mengatur titik "nol" ke 0 tidak dapat diselesaikan dengan apa pun di domain analog, itulah fungsi ADC di Arduino yang memiliki catu daya tunggal. Yang harus Anda lakukan adalah kurangi ~ 512 dari setiap sampel jika Anda ingin tidak ada suara menjadi nol (pastikan Anda menggunakan tipe data yang ditandatangani karena ini berarti nilai-nilai negatif dimungkinkan)
Tandai
R4 / R5 adalah gain, namun gain 1000 mungkin melewati batas opamp pada frekuensi yang Anda uji. C2 di sirkuit hanya ada untuk membantu mengurangi setiap offset DC pada output dari umpan balik dan tidak mempengaruhi penguatan.
Tandai
Mark, C1 terhadap R1 // R2 memiliki frekuensi rolloff filter lulus tinggi 1,3 kHz. Itu jauh di atas fraksi frekuensi suara yang bagus dan 6 oktaf di atas batas bawah "HiFi". Ini mungkin baik-baik saja jika dia hanya ingin membuat pemicu yang diaktifkan suara, tetapi tidak baik jika dia ingin suara digital yang normal.
Olin Lathrop