- Apa itu Penjana Fungsi DDS?
- Fahami Kerja IC Generator Fungsi AD9833
- Komponen yang Diperlukan untuk Membina Generator Fungsi berasaskan AD9833
- Generator Fungsi Berasaskan AD9833 - Diagram Skematik
- Generator Fungsi Berasaskan AD9833 - Kod Arduino
- Menguji Generator Fungsi Berasaskan AD9833
- Penambahbaikan Lebih Lanjut
Sekiranya anda seorang peminat elektronik seperti saya yang ingin berbincang dengan rangkaian elektronik yang berbeza, mempunyai Fungsi Generator yang baik kadang-kadang menjadi wajib. Tetapi memiliki satu adalah masalah kerana peralatan asas seperti itu boleh menghabiskan banyak wang. Membina peralatan ujian anda sendiri bukan sahaja lebih murah tetapi juga kaedah terbaik untuk meningkatkan pengetahuan anda.
Jadi dalam artikel ini, kita akan membina Generator Isyarat sederhana dengan Arduino dan AD9833 DDS Function Generator Module yang dapat menghasilkan gelombang sinus, persegi, dan segitiga dengan frekuensi maksimum 12 MHz pada output. Dan akhirnya, kami akan menguji frekuensi output dengan bantuan osiloskop kami.
Kami sebelumnya telah membina Generator Gelombang Sine Sederhana, Penjana Gelombang Persegi, dan Penjana Gelombang Segitiga dengan bantuan litar analog asas. Anda boleh melihatnya jika anda mencari beberapa Litar Generator Gelombang asas. Juga, jika anda ingin membina generator Arduino Function yang lebih murah tanpa menggunakan Modul AD9833, anda boleh melihat Projek Generator Arduino Waveform DIY.
Apa itu Penjana Fungsi DDS?
Seperti namanya, generator fungsi adalah peranti yang dapat mengeluarkan bentuk gelombang tertentu dengan frekuensi tertentu semasa menetapkan. Sebagai contoh, anggap anda mempunyai penapis LC yang mana anda ingin menguji tindak balas frekuensi output anda, anda boleh melakukannya dengan mudah dengan bantuan penjana fungsi. Yang perlu anda lakukan adalah menetapkan frekuensi output dan bentuk gelombang yang anda inginkan, maka anda boleh menurunkannya atau menaikkannya untuk menguji tindak balas. Ini hanya satu contoh, anda boleh melakukan lebih banyak perkara dengannya semasa senarai terus berjalan.
DDS bermaksud Direct Digital Synthesis. Ia adalah sejenis penjana bentuk gelombang yang menggunakan penukar digital ke analog (DAC) untuk membina isyarat dari bawah ke atas. Kaedah ini digunakan secara khusus untuk menghasilkan gelombang sinus. Tetapi IC yang kita gunakan dapat menghasilkan isyarat gelombang Square atau Triangular. Operasi yang berlaku di dalam cip DDS bersifat digital sehingga dapat menukar frekuensi dengan sangat cepat atau dapat beralih dari satu isyarat ke isyarat yang lain dengan sangat pantas. Peranti ini mempunyai resolusi frekuensi halus dengan spektrum frekuensi yang luas.
Fahami Kerja IC Generator Fungsi AD9833
Inti projek kami adalah AD9833 Programformable Waveform Generator IC yang direka dan dikembangkan oleh peranti analog. Ia adalah penjana bentuk gelombang rendah yang dapat diprogramkan yang mampu menghasilkan gelombang sinus, segitiga, dan persegi dengan frekuensi maksimum 12 MHz. Ini adalah IC yang sangat unik yang mampu mengubah frekuensi dan fasa output hanya dengan program perisian. Ia mempunyai antara muka SPI 3 wayar dan itulah sebabnya berkomunikasi dengan IC ini menjadi sangat mudah dan senang. Gambarajah blok fungsional IC ini ditunjukkan di bawah.
Kerja IC ini sangat mudah. Sekiranya kita melihat rajah blok fungsional di atas, kita akan melihat bahawa kita mempunyai Fasa Accumulator yang tugasnya adalah untuk menyimpan semua kemungkinan nilai digital gelombang sinus, bermula dari 0 hingga 2π. Seterusnya, kita mempunyai SIN ROM yang tugasnya adalah menukar maklumat fasa yang kemudiannya dapat langsung dipetakan menjadi amplitud. ROM SIN menggunakan maklumat fasa digital sebagai alamat ke jadual carian dan menukar maklumat fasa menjadi amplitud. Dan terakhir, kami mempunyai penukar digital ke analog 10-bit yang tugasnya adalah untuk menerima data digital dari SIN ROM dan menukarnya menjadi voltan analog yang sesuai, itulah yang kami dapat dari output. Pada output, kita juga mempunyai suis yang dapat kita hidupkan atau matikan hanya dengan sedikit kod perisian. Kami akan membincangkannya kemudian dalam artikel.Butiran yang anda lihat di atas adalah versi yang sangat dilucutkan dari apa yang berlaku di dalam IC, dan Sebilangan besar butiran yang anda lihat di atas diambil dari lembaran data AD9833, anda juga boleh menyemaknya untuk mendapatkan maklumat lebih lanjut.
Komponen yang Diperlukan untuk Membina Generator Fungsi berasaskan AD9833
Komponen yang diperlukan untuk membina generator fungsi berdasarkan AD9833 disenaraikan di bawah, kami merancang litar ini dengan komponen yang sangat generik, yang menjadikan proses replikasi sangat mudah.
- Arduino Nano - 1
- Generator Fungsi AD9833 DDS - 1
- Paparan OLED 128 X 64 - 1
- Encoder Rotary Generik - 1
- Jack Barrel DC - 1
- Pengatur Voltan LM7809 - 1
- Kapasitor 470uF - 1
- Kapasitor 220uF - 1
- Kapasitor 104pF - 1
- Perintang 10K - 6
- Suis Taktil - 4
- Terminal Skru 5.04mm - 1
- Pengetua Wanita - 1
- Sumber Kuasa 12V - 1
Generator Fungsi Berasaskan AD9833 - Diagram Skematik
Gambarajah litar lengkap untuk Generator Fungsi Berasaskan AD9833 dan Arduino ditunjukkan di bawah.
Kami akan menggunakan AD9833 dengan Arduino untuk menghasilkan frekuensi yang diinginkan. Dan di bahagian ini, kami akan menerangkan semua butiran dengan bantuan skema; izinkan saya memberi anda gambaran ringkas mengenai apa yang berlaku dengan litar. Mari mulakan dengan modul AD9833. Modul AD9833 adalah modul penjana fungsi dan ia dihubungkan dengan Arduino mengikut skema. Untuk menghidupkan litar, kami menggunakan IC pengatur voltan LM7809, dengan kapasitor pemadatan yang baik, ini diperlukan kerana kebisingan bekalan dapat mengganggu isyarat output sehingga menghasilkan output yang tidak diingini. Seperti biasa, Arduino berfungsi sebagai otak untuk projek ini. Untuk memaparkan frekuensi yang ditetapkan dan maklumat berharga lain, kami telah menyambungkan modul paparan OLED 128 X 64. Untuk menukar julat frekuensi, kami menggunakan tiga suis. Yang pertama menetapkan frekuensi ke Hz, yang kedua menetapkan frekuensi output ke KHz, dan yang ketiga menetapkan frekuensi ke MHz, kami juga mempunyai butang lain yang dapat digunakan untuk mengaktifkan atau menonaktifkan output. Akhirnya, kita mempunyai pengekod putar,dan kita harus melampirkan beberapa resistor pull-up dengannya jika tidak, suis tersebut tidak akan berfungsi kerana kita sedang memeriksa acara tekan butang pada kaedah penyatuan. Pengekod putar digunakan untuk mengubah frekuensi dan suis taktil di dalam pengekod putar digunakan untuk memilih bentuk gelombang yang ditetapkan.
Generator Fungsi Berasaskan AD9833 - Kod Arduino
Kod lengkap yang digunakan dalam projek ini terdapat di bahagian bawah halaman ini. Setelah menambahkan fail header dan fail sumber yang diperlukan, anda seharusnya dapat menyusun fail Arduino secara langsung. Anda boleh memuat turun perpustakaan ad9833 Arduino dan perpustakaan lain dari pautan yang diberikan di bawah atau jika tidak, anda boleh menggunakan kaedah pengurus papan untuk memasang perpustakaan.
- Muat turun Perpustakaan AD9833 oleh Bill Williams
- Muat turun Perpustakaan OLED SSD1306 oleh Adafruit
- Muat turun perpustakaan Adafruit GFX
Penjelasan kod di ino. fail adalah seperti berikut. Pertama, kita mulakan dengan memasukkan semua perpustakaan yang diperlukan. Perpustakaan untuk modul AD9833 DDS pertama diikuti oleh perpustakaan untuk OLED dan perpustakaan matematik diperlukan untuk beberapa pengiraan kami.
#include // LIbrary untuk AD9833 Module #include
Seterusnya, kami menentukan semua pin input dan output yang diperlukan untuk butang, suis, pengekod putar, dan OLED.
#define SCREEN_WIDATA_PINH 128 // OLED paparan Lebar dalam piksel #define SCREEN_HEIGHT 64 // OLED tinggi paparan, dalam piksel #tentukan SET_FREQUENCY_HZ A2 // Tombol Tekan Untuk Menetapkan Kekerapan dalam Hz #tentukan SET_FREQUENCY_KHZ AZ_FRUSF_FRYF_FRFT_FRYF_FRF A6 // Tombol Tekan Untuk Menetapkan Frekuensi dalam Mhz #define ENABLE_DISABLE_OUTPUT_PIN A7 // Tombol Tekan Untuk Mengaktifkan / Menonaktifkan Output #define FNC_PIN 4 // Fsync Diperlukan oleh Modul AD9833 #define CLK_PIN 8 // Jam Jam dari Encoder / Pin Data Encoder #define BTN_PIN 9 // Butang Tekan Dalaman pada Encoder
Selepas itu, kami menentukan semua pemboleh ubah yang diperlukan yang diperlukan dalam kod ini. Pertama, kita menentukan pembilang pembolehubah integer yang akan menyimpan nilai pengekod putar. Dua pemboleh ubah seterusnya JamPin dan clockPinState menyimpan patung pin yang diperlukan untuk memahami arah pengekod. Kami mempunyai pemboleh ubah masa yang menyimpan nilai pembilang masa, pemboleh ubah ini digunakan untuk penyahkataan butang. Seterusnya, kita mempunyai Frekuensi modul pemboleh ubah panjang yang tidak ditandatangani yang menahan frekuensi yang dikira yang akan digunakan. Seterusnya, kami mempunyai kelewatan penyahtinjaan. Kelewatan ini dapat disesuaikan mengikut keperluan. Seterusnya, kita mempunyai tiga pemboleh ubah boolean set_frequency_hz,set_frequency_Khz, dan set_frequency_Mhz ketiga pemboleh ubah ini digunakan untuk menentukan tetapan modul semasa. Kami akan membincangkannya dengan lebih terperinci kemudian dalam artikel. Seterusnya, kita mempunyai pemboleh ubah yang menyimpan status bentuk gelombang output, bentuk gelombang output lalai adalah gelombang sinus. Dan akhirnya, kita mempunyai pemboleh ubah encoder_btn_count yang menahan kiraan butang pengekod yang digunakan untuk mengatur bentuk gelombang output.
kaunter int = 1; // Nilai Kaunter ini akan meningkat atau berkurang jika pengekod putar dihidupkan int clockPin; // Placeholder untuk status pin yang digunakan oleh rotary encoder int clockPinState; // Tempat letak untuk status pin yang digunakan oleh pengekod putar yang lama tidak ditandatangani = 0; // Digunakan untuk mendedahkan modul Frekuensi panjang yang tidak ditandatangani; // digunakan untuk menetapkan debounce frekuensi output panjang = 220; // Batalkan bool btn_state kelewatan; // digunakan untuk membolehkan melumpuhkan output modul AD98333 bool set_frequency_hz = 1; // Kekerapan kegagalan modul AD9833 bool set_frequency_khz; bool set_frequency_mhz; String waveSelect = "SIN"; // Permulaan bentuk gelombang modul int encoder_btn_count = 0; // digunakan untuk memeriksa butang pengekod tekan Seterusnya, kami mempunyai dua objek kami satu untuk paparan OLED dan satu lagi untuk modul AD9833.Paparan Adafruit_SSD1306 (SCREEN_WIDATA_PINH, SCREEN_HEIGHT, & Wire, -1); Gen AD9833 (FNC_PIN);
Seterusnya, kita mempunyai fungsi setup (), dalam fungsi setup tersebut, kita mulai dengan mengaktifkan Serial untuk debugging. Kami memulakan modul AD9833 dengan bantuan kaedah begin (). Seterusnya, kami menetapkan semua pin pengekod putar yang ditetapkan sebagai Input. Dan kami menyimpan nilai pin jam dalam pemboleh ubah clockPinState, ini adalah langkah yang diperlukan untuk pengekod putar.
Seterusnya, kami menetapkan semua pin butang sebagai input dan mengaktifkan paparan OLED dengan bantuan kaedah display.begin () , dan kami juga memeriksa sebarang kesalahan dengan pernyataan if . Setelah selesai, kami membersihkan paparan dan mencetak layar percikan permulaan, kami menambahkan penundaan 2 saat yang juga penundaan untuk layar percikan, dan akhirnya, kami memanggil fungsi update_display () yang membersihkan layar dan mengemas kini paparkan sekali lagi. Perincian kaedah update_display () akan dibincangkan kemudian dalam artikel.
persediaan tidak sah () {Serial.begin (9600); // Dayakan gen Serial @ 9600 baud. Mulakan (); // Ini HARUS menjadi arahan pertama setelah menyatakan objek ADM3333 pinMode (CLK_PIN, INPUT); // Menetapkan Pin sebagai input pinMode (DATA_PIN, INPUT); pinMode (BTN_PIN, INPUT_PULLUP); clockPinState = digitalRead (CLK_PIN); pinMode (SET_FREQUENCY_HZ, INPUT); // Menetapkan Pin sebagai input pinMode (SET_FREQUENCY_KHZ, INPUT); pinMode (SET_FREQUENCY_MHZ, INPUT); pinMode (ENABLE_DISABLE_OUTPUT_PIN, INPUT); jika (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Alamat 0x3D untuk 128x64 Serial.println (F ("Peruntukan SSD1306 gagal")); untuk (;;); } display.clearDisplay (); // Kosongkan paparan Skrin.setTextSize (2); // Tetapkan saiz teks display.setTextColor (PUTIH); // tetapkan paparan Warna LCD.setCursor (30, 0); // Tetapkan paparan Kedudukan Kursor.println ("AD9833"); // Cetak paparan Teks ini.setCursor (17, 20); // Tetapkan kedudukan Kursor display.println ("Fungsi"); // Cetak paparan Teks ini.setCursor (13, 40); // Tetapkan kedudukan Kursor display.println ("Generator"); // Cetak paparan Teks ini. Paparan (); // Kemas kini kelewatan Paparan (2000); // Kelewatan 2 SEC update_display (); // Panggilan kemas kini_Fungsi Paparan}
Seterusnya, kita mempunyai fungsi loop (), semua fungsi utama ditulis di bahagian gelung.
Pertama, kita membaca pin Jam pengekod Rotary dan menyimpannya dalam pemboleh ubah clockPin yang telah kita nyatakan sebelumnya. Seterusnya, dalam pernyataan if , kami memeriksa apakah nilai pin sebelumnya dan nilai pin serupa atau tidak dan kami juga memeriksa nilai pin semasa. Jika itu semua benar, kita memeriksa pin data, jika benar bahawa cara pengekod berputar lawan jam dan kami susutan nilai kaunter dengan bantuan counter-- arahan. Jika tidak, kita menambah nilai pembilang dengan arahan pembilang ++. Akhirnya, kami meletakkan pernyataan if lain untuk menetapkan nilai minimum ke 1. Seterusnya, kami mengemas kini clockPinState dengan clockPin semasanilai untuk kegunaan masa depan.
gelung kosong () {clockPin = digitalRead (CLK_PIN); if (clockPin! = clockPinState && clockPin == 1) {if (digitalRead (DATA_PIN)! = clockPin) {kaunter -; } lain {counter ++; // Encoder memutar CW jadi kenaikan} jika (pembilang <1) pembilang = 1; Serial.println (kaunter); kemas kini_ paparan (); }
Seterusnya, kami mempunyai kod kami untuk mengesan tekan butang. Dalam bahagian ini, kami telah mengesan butang di dalam pengekod dengan bantuan beberapa penyataan bersarang jika pernyataan, jika (digitalRead (BTN_PIN) == RENDAH && milis () - masa> tolak), dalam pernyataan ini, kami memeriksa terlebih dahulu apakah butang pin rendah atau tidak, jika rendah, maka ditekan. Sekali lagi kita menyemak nilai pemasa dengan kelewatan debounce, jika kedua-dua pernyataan itu benar, maka kita mengisytiharkan ia tindakan tekan butang yang berjaya jika benar kita kenaikan yang encoder_btn_count nilai. Seterusnya, kami menyatakan pernyataan if lain untuk menetapkan nilai penghitung maksimum ke 2, kami memerlukannya kerana kami menggunakannya untuk menetapkan bentuk gelombang output.Tiga pernyataan berturut-turut jika demikian, jika nilainya adalah sifar, bentuk gelombang sinus dipilih, jika satu, itu adalah gelombang persegi, dan jika nilainya adalah 2, itu adalah gelombang segitiga. Dalam ketiga-tiga pernyataan if ini, kami mengemas kini paparan dengan fungsi update_display () . Dan akhirnya, kami mengemas kini pemboleh ubah masa dengan nilai pembilang pemasa semasa.
// Sekiranya kita mengesan isyarat RENDAH, butang ditekan jika (digitalRead (BTN_PIN) == LOW && millis () - time> debounce) {encoder_btn_count ++; // Tingkatkan nilai jika (encoder_btn_count> 2) // jika nilai lebih besar daripada 2 tetapkan semula ke 0 {encoder_btn_count = 0; } if (encoder_btn_count == 0) {// jika nilainya 0 gelombang sinus dipilih waveSelect = "SIN"; // kemas kini pemboleh ubah rentetan dengan nilai sin update_display (); // kemas kini paparan} if (encoder_btn_count == 1) {// jika nilainya adalah 1 gelombang persegi dipilih gelombangSelect = "SQR"; // kemas kini pemboleh ubah rentetan dengan nilai SQR update_display (); // kemas kini paparan} if (encoder_btn_count == 2) {// jika nilainya adalah 1 Segitiga gelombang dipilih gelombangSelect = "TRI"; // kemas kini pemboleh ubah rentetan dengan nilai TRI update_display ();// kemas kini paparan} time = millis (); // kemas kini pemboleh ubah masa}
Seterusnya, kami menentukan semua kod yang diperlukan yang diperlukan untuk mengatur semua butang dengan kelewatan debounce. Oleh kerana butang disambungkan ke pin analog Arduino, kami menggunakan arahan membaca analog untuk mengenal pasti penekanan butang jika nilai bacaan analog mencapai di bawah 30, maka kami mengesan penekanan butang yang berjaya, dan kami menunggu 200 m periksa sama ada ia hanya menekan butang atau bunyi sahaja. Sekiranya pernyataan ini benar, kami menetapkan pemboleh ubah boolean dengan nilai yang digunakan untuk menetapkan nilai Hz, Khz, dan Mhz penjana fungsi. Seterusnya, kami mengemas kini paparan dan mengemas kini pemboleh ubah masa. Kami melakukannya untuk keempat-empat butang yang dihubungkan dengan Arduino.
if (analogRead (SET_FREQUENCY_HZ) <30 && milis () - masa> nyahtinju) {set_frequency_hz = 1; // kemas kini nilai boolean set_frequency_khz = 0; set_frequency_mhz = 0; update_display (); // kemas kini masa paparan = milis (); // kemas kini pemboleh ubah waktu} if (analogRead (SET_FREQUENCY_KHZ) <30 && millis () - time> debounce) {set_frequency_hz = 0; // kemas kini nilai boolean set_frequency_khz = 1; set_frequency_mhz = 0; modulFrequency = pembilang * 1000; update_display (); // kemas kini waktu paparan = millis (); // kemas kini pemboleh ubah waktu} if (analogRead (SET_FREQUENCY_MHZ) <30 && millis () - time> debounce) {// periksa pin analog dengan debounce delay set_frequency_hz = 0; // kemas kini nilai boolean set_frequency_khz = 0; set_frequency_mhz = 1; modulFrequency = pembilang * 1000000; kemas kini_ paparan ();// kemas kini masa paparan = millis (); // kemas kini pemboleh ubah masa} jika (analogRead (ENABLE_DISABLE_OUTPUT_PIN) <30 && millis () - time> debounce) {// periksa pin analog dengan kelewatan debounce btn_state =! btn_state; // Balikkan keadaan keadaan butang.EnableOutput (btn_state); // Aktifkan / Lumpuhkan output penjana fungsi bergantung pada status butang update_display (); // kemas kini masa paparan = milis (); // kemas kini pemboleh ubah waktu}}// kemas kini pemboleh ubah masa}}// kemas kini pemboleh ubah masa}}
Akhirnya, kami mempunyai fungsi update_display () kami. Dalam fungsi ini, kami melakukan lebih banyak daripada sekadar memperbarui paparan ini kerana bahagian paparan tertentu tidak dapat diperbarui dalam OLED. Untuk mengemas kini, anda mesti mengecatnya semula dengan nilai baru. Ini menjadikan proses pengekodan menjadi lebih sukar.
Di dalam fungsi ini, kita mulakan dengan membersihkan paparan. Seterusnya, kami menetapkan ukuran teks yang diperlukan. Selepas itu, kami menetapkan kursor dan Fungsi Generator bercetak dengan display.println ("Fungsi Fungsi"); arahan. Kami sekali lagi menetapkan ukuran teks menjadi 2, dan kursor ke (0,20) dengan bantuan fungsi display.setCursor (0, 20).
Di sinilah kami mencetak maklumat untuk gelombang apa itu.
display.clearDisplay (); // Pertama, hapus paparan display.setTextSize (1); // tetapkan teks Saiz paparan.setCursor (10, 0); // Tetapkan kedudukan kursor display.println ("Function Generator"); // cetak paparan teks.setTextSize (2); // tetapkan teks Ukuran paparan.setCursor (0, 20); // Tetapkan kedudukan kursor
Seterusnya, kami memeriksa pemboleh ubah boolean untuk perincian frekuensi dan mengemas kini nilai dalam pemboleh ubah modulFrequency. Kami melakukan ini untuk nilai Hz, kHz, dan MHz. Seterusnya, kami memeriksa pemboleh ubah waveSelect dan mengenal pasti gelombang mana yang dipilih. Sekarang, kita mempunyai nilai untuk menetapkan jenis dan frekuensi gelombang.
jika (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// periksa apakah butang untuk menetapkan frekuensi dalam Hz ditekan modulFrequency = counter; // kemas kini modul Pemboleh ubah frekuensi dengan nilai pembilang semasa} jika (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {// periksa apakah butang untuk menetapkan frekuensi dalam KHz ditekan modulFrequency = counter * 1000; // kemas kini modul Pemboleh ubah frekuensi dengan nilai pembilang semasa tetapi kita mengalikan 1000 untuk menetapkannya pada KHZ} jika (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {// periksa apakah butang untuk menetapkan frekuensi dalam MHz ditekan modul = kaunter * 1000000; jika (moduleFrequency> 12000000) {moduleFrequency = 12000000;// jangan biarkan frekuensi menjadi parutan yang 12Mhz counter = 12; }} if (waveSelect == "SIN") {// Gelombang sinus dipilih display.println ("SIN"); gen.ApplySignal (SINE_WAVE, REG0, modulFrequency); Serial.println (modulFrequency); } if (waveSelect == "SQR") {// Sqr wave dipilih display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, modulFrequency); Serial.println (modulFrequency); } if (waveSelect == "TRI") {// Tri gelombang dipilih display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, modulFrequency); // kemas kini modul AD9833. Serial.println (modulFrequency); }} if (waveSelect == "SQR") {// Sqr wave dipilih display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, modulFrequency); Serial.println (modulFrequency); } if (waveSelect == "TRI") {// Tri gelombang dipilih display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, modulFrequency); // kemas kini modul AD9833. Serial.println (modulFrequency); }} if (waveSelect == "SQR") {// Sqr wave dipilih display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, modulFrequency); Serial.println (modulFrequency); } if (waveSelect == "TRI") {// Tri gelombang dipilih display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, modulFrequency); // kemas kini modul AD9833. Serial.println (modulFrequency); }
Kami menetapkan kursor sekali lagi dan mengemas kini nilai pembilang. Sekali lagi kita memeriksa boolean untuk mengemas kini julat frekuensi pada paparan, kita harus melakukan ini kerana prinsip kerja OLED sangat pelik.
display.setCursor (45, 20); display.println (kaunter); // cetak maklumat kaunter pada paparan. jika (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Hz"); // cetak Hz pada paparan paparan. paparan (); // apabila semua set mengemas kini paparan} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Khz"); paparan.display (); // apabila semua set mengemas kini paparan} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setCursor (90, 20); display.println ("Mhz"); paparan.display (); // apabila semua set mengemas kini paparan}
Seterusnya, kami memeriksa pemboleh ubah tekan butang untuk mencetak output / output ke OLED. Sekali lagi ini perlu dilakukan kerana modul OLED.
jika (btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output AKTIF"); // mencetak output ke paparan paparan. paparan (); display.setTextSize (2); } lain {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output MATI"); // keluarkan cetak ke paparan paparan. paparan (); display.setTextSize (2); }
Ini menandakan berakhirnya proses pengekodan kami. Sekiranya anda keliru ketika ini, anda boleh menyemak komen dalam kod untuk pemahaman lebih lanjut.
Menguji Generator Fungsi Berasaskan AD9833
Untuk menguji litar, persediaan di atas digunakan. Seperti yang anda lihat, kami telah menyambungkan penyesuai kuasa 12V DC ke soket tong DC dan kami telah menghubungkan Osiloskop Hantek ke output litar. Kami juga telah menghubungkan osiloskop ke komputer riba untuk memvisualisasikan dan mengukur frekuensi output.
Setelah ini dilakukan, kami menetapkan frekuensi output ke 5Khz dengan bantuan pengekod putar dan kami menguji gelombang sinus output dan cukup yakin, itu adalah gelombang sinus 5Khz pada output.
Seterusnya, kami telah mengubah bentuk gelombang output menjadi gelombang segitiga tetapi frekuensi tetap sama, bentuk gelombang output ditunjukkan di bawah.
Kemudian kami menukar output menjadi gelombang persegi dan memerhatikan outputnya, dan itu adalah gelombang persegi yang sempurna.
Kami juga mengubah julat frekuensi dan menguji output, dan ia berfungsi dengan baik.
Penambahbaikan Lebih Lanjut
Litar ini hanya bukti konsep dan memerlukan penambahbaikan lebih lanjut. Pertama, kita memerlukan PCB berkualiti baik dan beberapa penyambung BNC berkualiti baik untuk output jika tidak kita tidak dapat memperoleh frekuensi yang lebih tinggi. Amplitud modul sangat rendah, jadi untuk meningkatkannya, kami memerlukan beberapa rangkaian op-amp untuk memperkuat voltan keluaran. Potensiometer dapat dihubungkan untuk mengubah amplitud output. Suis untuk mengimbangi isyarat boleh disambungkan; ini juga merupakan ciri yang mesti ada. Dan lebih jauh lagi, kodnya memerlukan banyak peningkatan kerana ia sedikit kereta. Akhirnya, paparan OLED perlu diubah jika tidak mungkin menulis kod yang mudah difahami.
Ini menandakan berakhirnya tutorial ini, saya harap anda menyukai artikel ini dan mempelajari sesuatu yang baru. Sekiranya anda mempunyai pertanyaan mengenai artikel itu, anda boleh meninggalkannya di bahagian komen di bawah atau anda boleh menggunakan Forum Elektronik kami.