Daftar Isi:

Arduino Waveform Generator: 5 Langkah (dengan Gambar)
Arduino Waveform Generator: 5 Langkah (dengan Gambar)

Video: Arduino Waveform Generator: 5 Langkah (dengan Gambar)

Video: Arduino Waveform Generator: 5 Langkah (dengan Gambar)
Video: variable frequency arduino generator 2024, Juli
Anonim
Generator Bentuk Gelombang Arduino
Generator Bentuk Gelombang Arduino

Pembaruan Februari 2021: lihat versi baru dengan kecepatan pengambilan sampel 300x, berdasarkan Raspberry Pi Pico

Di lab, seseorang sering membutuhkan sinyal berulang dengan frekuensi, bentuk, dan amplitudo tertentu. Mungkin untuk menguji amplifier, memeriksa sirkuit, komponen, atau aktuator. Generator bentuk gelombang yang kuat tersedia secara komersial, tetapi relatif mudah untuk membuatnya sendiri yang berguna dengan Arduino Uno atau Arduino Nano, lihat misalnya:

www.instructables.com/id/Arduino-Waveform-…

www.instructables.com/id/10-Resister-Ardui…

Berikut adalah deskripsi satu lagi dengan fitur-fitur berikut:

* Bentuk gelombang yang akurat: keluaran 8-bit menggunakan R2R DAC, bentuk 256-sampel

* Cepat: Tingkat pengambilan sampel 381 kHz

* Tepat: 1 MHz langkah rentang frekuensi. Akurat seperti kristal Arduino.

* Pengoperasian yang mudah: bentuk gelombang dan frekuensi dapat diatur dengan encoder putar tunggal

* Berbagai amplitudo: milivolt hingga 20V

* 20 bentuk gelombang yang telah ditentukan sebelumnya. Langsung untuk menambahkan lebih banyak.

* Mudah dibuat: Arduino Uno atau Nano plus komponen standar

Langkah 1: Pertimbangan Teknis

Membuat sinyal analog

Salah satu kekurangan Arduino Uno dan Nano adalah tidak memiliki konverter digital-to-analog (DAC), sehingga tidak memungkinkan untuk mengeluarkan tegangan analog langsung pada pin. Salah satu solusinya adalah tangga R2R: 8 pin digital terhubung ke jaringan resistor sehingga 256 level output dapat dicapai. Melalui akses port langsung, Arduino dapat mengatur 8 pin secara bersamaan dengan satu perintah. Untuk rangkaian resistor dibutuhkan 9 buah resistor dengan nilai R dan 8 buah dengan nilai 2R. Saya menggunakan 10kOhm sebagai nilai untuk R, yang menjaga arus dari pin ke 0,5mA atau kurang. Saya kira R=1kOhm bisa bekerja dengan baik, karena Arduino dapat dengan mudah mengirimkan 5mA per pin, 40mA per port. Penting bahwa rasio antara resistor R dan 2R benar-benar 2. Itu paling mudah dicapai dengan menempatkan 2 resistor bernilai R secara seri, dengan total 25 resistor.

Akumulator fase

Menghasilkan bentuk gelombang kemudian turun untuk mengirim urutan angka 8-bit secara berulang ke pin Arduino. Bentuk gelombang disimpan dalam array 256 byte dan array ini diambil sampelnya dan dikirim ke pin. Frekuensi sinyal output ditentukan oleh seberapa cepat seseorang maju melalui array. Cara yang kuat, tepat, dan elegan untuk melakukannya adalah dengan akumulator fase: angka 32-bit bertambah secara berkala, dan kami menggunakan 8 bit paling signifikan sebagai indeks larik.

Pengambilan sampel cepat

Interupsi memungkinkan pengambilan sampel pada waktu yang ditentukan dengan baik, tetapi overhead interupsi membatasi frekuensi pengambilan sampel hingga ~ 100kHz. Sebuah loop tak terbatas untuk memperbarui fase, sampel bentuk gelombang dan mengatur pin membutuhkan 42 siklus clock, sehingga mencapai tingkat sampling 16MHz/42=381kHz. Memutar atau mendorong rotary encoder menyebabkan perubahan pin dan interupsi yang keluar dari loop untuk mengubah pengaturan (bentuk gelombang atau frekuensi). Pada tahap ini 256 angka dalam array dihitung ulang sehingga tidak ada perhitungan sebenarnya dari bentuk gelombang yang perlu dilakukan di loop utama. Frekuensi maksimum absolut yang dapat dihasilkan adalah 190kHz (setengah dari laju pengambilan sampel) tetapi kemudian hanya ada dua sampel per periode, sehingga tidak banyak mengontrol bentuknya. Antarmuka dengan demikian tidak memungkinkan untuk mengatur frekuensi di atas 100kHz. Pada 50kHz, ada 7-8 sampel per periode dan pada 1,5 kHz dan di bawah semua 256 angka yang disimpan dalam array, dapatkan sampel setiap periode. Untuk bentuk gelombang di mana sinyal berubah dengan lancar, misalnya gelombang sinus, melewatkan sampel tidak masalah. Tetapi untuk bentuk gelombang dengan paku sempit, misalnya gelombang persegi dengan siklus kerja kecil, ada bahaya bahwa untuk frekuensi di atas 1,5 kHz kehilangan satu sampel dapat mengakibatkan bentuk gelombang tidak berperilaku seperti yang diharapkan.

Akurasi frekuensi

Jumlah fase yang bertambah pada setiap sampel sebanding dengan frekuensi. Dengan demikian, frekuensi dapat diatur ke akurasi 381kHz/2^32=0,089mHz. Dalam praktiknya, akurasi seperti itu hampir tidak pernah diperlukan, sehingga antarmuka membatasi untuk mengatur frekuensi dalam langkah 1MHz. Ketepatan mutlak frekuensi ditentukan oleh ketepatan frekuensi clock Arduino. Ini tergantung pada jenis Arduino tetapi sebagian besar menentukan frekuensi 16.000MHz, jadi presisi ~10^-4. Kode memungkinkan untuk memodifikasi rasio frekuensi dan kenaikan fase untuk mengoreksi penyimpangan kecil dari asumsi 16MHz.

Penyangga dan amplifikasi

Jaringan resistor memiliki impedansi keluaran yang tinggi, sehingga tegangan keluarannya cepat turun jika ada beban. Itu bisa diselesaikan dengan buffering atau penguatan output. Di sini, buffering dan amplifikasi dilakukan dengan opamp. Saya menggunakan LM358 karena saya punya beberapa. Ini adalah opamp lambat (laju perubahan tegangan 0,5V per mikrodetik) sehingga pada frekuensi tinggi dan amplitudo tinggi sinyal terdistorsi. Hal yang baik adalah ia dapat menangani tegangan yang sangat dekat dengan 0V. Namun tegangan keluaran dibatasi hingga ~2V di bawah rel, jadi menggunakan daya +5V membatasi tegangan keluaran menjadi 3V. Modul step-up ringkas dan murah. Memberi makan +20V ke opamp, dapat menghasilkan sinyal dengan tegangan hingga 18V. (NB, skema mengatakan LTC3105 karena itu adalah satu-satunya langkah yang saya temukan di Fritzing. Sebenarnya saya menggunakan modul MT3608, lihat gambar di langkah selanjutnya). Saya memilih untuk menerapkan atenuasi variabel ke output dari R2R DAC kemudian menggunakan salah satu opamps untuk buffer sinyal tanpa amplifikasi dan yang lainnya untuk memperkuat oleh 5,7, sehingga sinyal dapat mencapai output maksimum sekitar 20V. Arus keluaran agak terbatas, ~10mA, jadi penguat yang lebih kuat mungkin diperlukan jika sinyalnya untuk menggerakkan speaker besar atau elektromagnet.

Langkah 2: Komponen yang Diperlukan

Untuk generator bentuk gelombang inti

Arduino Uno atau Nano

Layar LCD 16x2 + pemangkas 20kOhm dan resistor seri 100Ohm untuk lampu latar

Encoder putar 5-pin (dengan tombol tekan terintegrasi)

25 resistor 10kOhm

Untuk penyangga/penguat

LM358 atau opamp ganda lainnya

modul step-up berdasarkan MT3608

resistor variabel 50kOhm

resistor 10kOhm

Resistor 47kOhm

1muF kapasitor

Langkah 3: Konstruksi

Konstruksi
Konstruksi
Konstruksi
Konstruksi

Saya menyolder semuanya pada papan prototipe 7x9cm, seperti yang ditunjukkan pada gambar. Karena agak berantakan dengan semua kabel, saya mencoba mewarnai kabel yang membawa tegangan positif merah dan yang membawa ground hitam.

Encoder yang saya gunakan memiliki 5 pin, 3 di satu sisi, 2 di sisi lain. Sisi dengan 3 pin adalah encoder yang sebenarnya, sisi dengan 2 pin adalah tombol tekan terintegrasi. Di sisi 3-pin, pin pusat harus terhubung ke ground, dua pin lainnya ke D10 dan D11. Di sisi 2-pin, satu pin harus dihubungkan ke ground dan yang lainnya ke D12.

Ini adalah hal paling jelek yang pernah saya buat tetapi berhasil. Akan menyenangkan untuk dimasukkan ke dalam selungkup, tetapi untuk saat ini pekerjaan ekstra dan biaya tidak benar-benar membenarkannya. Nano dan layar terpasang dengan pin-header. Saya tidak akan melakukannya lagi jika saya akan membangun yang baru. Saya tidak memasang konektor di papan untuk mengambil sinyal. Sebagai gantinya, saya mengambilnya dengan timah buaya dari potongan kawat tembaga yang menonjol, diberi label sebagai berikut:

R - sinyal mentah dari R2R DAC

B - sinyal buffer

A - sinyal yang diperkuat

T - sinyal timer dari pin 9

G - tanah

+ - tegangan 'tinggi' positif dari modul step-up

Langkah 4: Kode

Kode, sketsa Arduino, dilampirkan dan harus diunggah ke Arduino.

20 bentuk gelombang telah ditentukan sebelumnya. Seharusnya mudah untuk menambahkan gelombang lainnya. Perhatikan bahwa gelombang acak mengisi larik 256-nilai dengan nilai acak, tetapi pola yang sama berulang setiap periode. Sinyal acak yang sebenarnya terdengar seperti derau, tetapi bentuk gelombang ini lebih terdengar seperti peluit.

Kode menetapkan sinyal 1kHz pada pin D9 dengan TIMER1. Ini berguna untuk memeriksa waktu sinyal analog. Begitulah cara saya mengetahui bahwa jumlah siklus clock adalah 42: Jika saya mengasumsikan 41 atau 43, dan menghasilkan sinyal 1kHz, frekuensinya jelas berbeda dari sinyal pada pin D9. Dengan nilai 42 mereka sangat cocok.

Biasanya, Arduino menginterupsi setiap milidetik untuk melacak waktu dengan fungsi milis(). Ini akan mengganggu pembangkitan sinyal yang akurat, sehingga interupsi tertentu dinonaktifkan.

Kompilator mengatakan: "Sketsa menggunakan 7254 byte (23%) ruang penyimpanan program. Maksimum adalah 30720 byte. Variabel global menggunakan 483 byte (23%) memori dinamis, menyisakan 1565 byte untuk variabel lokal. Maksimum 2048 byte." Jadi ada banyak ruang untuk kode yang lebih canggih. Hati-hati bahwa Anda mungkin harus memilih "ATmega328P (bootloader lama)" untuk berhasil mengunggah ke Nano.

Langkah 5: Penggunaan

Generator sinyal dapat diaktifkan hanya melalui kabel mini-USB Arduino Nano. Ini paling baik dilakukan dengan bank daya, sehingga tidak ada loop tanah yang tidak disengaja dengan peralatan yang dapat dihubungkan dengannya.

Ketika dinyalakan akan menghasilkan gelombang sinus 100Hz. Dengan memutar kenop, salah satu dari 20 jenis gelombang lainnya dapat dipilih. Dengan memutar sambil didorong, kursor dapat diatur ke salah satu digit frekuensi, yang kemudian dapat diubah ke nilai yang diinginkan.

Amplitudo dapat diatur dengan potensiometer dan sinyal buffer atau sinyal yang diperkuat dapat digunakan.

Sangat membantu untuk menggunakan osiloskop untuk memeriksa amplitudo sinyal, khususnya ketika sinyal memasok arus ke perangkat lain. Jika terlalu banyak arus yang ditarik, sinyal akan terputus dan sinyal sangat terdistorsi

Untuk frekuensi yang sangat rendah, output dapat divisualisasikan dengan LED secara seri dengan resistor 10kOhm. Frekuensi audio dapat didengar dengan speaker. Pastikan untuk mengatur sinyal sangat kecil ~ 0,5V, jika tidak, arus menjadi terlalu tinggi dan sinyal mulai terputus.

Direkomendasikan: