- Apa itu Generator Fungsi DDS?
- Memahami Cara Kerja IC Generator Fungsi AD9833
- Komponen yang Diperlukan untuk Membangun Generator Fungsi berbasis AD9833
- Generator Fungsi Berbasis AD9833 - Diagram Skema
- Generator Fungsi Berbasis AD9833 - Kode Arduino
- Menguji Generator Fungsi Berbasis AD9833
- Peningkatan Lebih Lanjut
Jika Anda penggemar elektronik seperti saya yang ingin mengutak-atik rangkaian elektronik yang berbeda, terkadang memiliki Fungsi Generator yang layak menjadi suatu keharusan. Tetapi memilikinya adalah masalah karena peralatan dasar semacam itu bisa menghabiskan banyak uang. Membangun alat uji Anda sendiri tidak hanya lebih murah tetapi juga cara yang bagus untuk meningkatkan pengetahuan Anda.
Maka pada artikel ini, kita akan membangun Signal Generator sederhana dengan Arduino dan AD9833 DDS Function Generator Module yang dapat menghasilkan gelombang sinus, persegi, dan segitiga dengan frekuensi maksimum 12 MHz pada keluarannya. Dan akhirnya, kami akan menguji frekuensi keluaran dengan bantuan osiloskop kami.
Kami sebelumnya telah membangun Generator Gelombang Sinus Sederhana, Generator Gelombang Persegi, dan Generator Gelombang Segitiga dengan bantuan sirkuit analog dasar. Anda dapat memeriksanya jika Anda mencari beberapa Sirkuit Generator Bentuk Gelombang dasar. Juga, jika Anda ingin membangun generator Fungsi Arduino yang lebih murah tanpa menggunakan Modul AD9833, Anda dapat melihat Proyek Generator Bentuk Gelombang Arduino DIY.
Apa itu Generator Fungsi DDS?
Sesuai dengan namanya, generator fungsi adalah perangkat yang dapat mengeluarkan bentuk gelombang tertentu dengan frekuensi tertentu pada saat pengaturan. Misalnya, anggap Anda memiliki filter LC yang ingin Anda uji respons frekuensi keluarannya, Anda dapat dengan mudah melakukannya dengan bantuan generator fungsi. Yang perlu Anda lakukan adalah mengatur frekuensi keluaran dan bentuk gelombang yang Anda inginkan, kemudian Anda dapat menurunkan atau menaikkannya untuk menguji respons. Ini hanyalah satu contoh, Anda dapat melakukan lebih banyak hal dengannya seiring dengan bertambahnya daftar.
DDS adalah singkatan dari Direct Digital Synthesis. Ini adalah jenis generator gelombang yang menggunakan konverter digital ke analog (DAC) untuk membangun sinyal dari bawah ke atas. Metode ini secara khusus digunakan untuk menghasilkan gelombang sinus. Tetapi IC yang kami gunakan dapat menghasilkan sinyal gelombang Persegi atau Segitiga. Operasi yang terjadi di dalam chip DDS bersifat digital sehingga dapat mengalihkan frekuensi dengan sangat cepat atau dapat beralih dari satu sinyal ke sinyal lainnya dengan sangat cepat. Perangkat ini memiliki resolusi frekuensi yang bagus dengan spektrum frekuensi yang luas.
Memahami Cara Kerja IC Generator Fungsi AD9833
Di jantung dari proyek kami adalah AD9833 Programmable Waveform Generator IC yang dirancang dan dikembangkan oleh perangkat analog. Ini adalah generator bentuk gelombang berdaya rendah dan dapat diprogram yang mampu menghasilkan gelombang sinus, segitiga, dan persegi dengan frekuensi maksimum 12 MHz. Ini adalah IC yang sangat unik yang mampu mengubah frekuensi dan fase keluaran hanya dengan program perangkat lunak. Ini memiliki antarmuka SPI 3 kawat itulah sebabnya berkomunikasi dengan IC ini menjadi sangat sederhana dan mudah. Diagram blok fungsional dari IC ini ditunjukkan di bawah ini.
Cara kerja IC ini sangat sederhana. Jika kita melihat diagram blok fungsional di atas, kita akan melihat bahwa kita memiliki Akumulator Fase yang tugasnya adalah menyimpan semua nilai digital yang mungkin dari gelombang sinus, mulai dari 0 hingga 2π. Selanjutnya, kami memiliki ROM SIN yang tugasnya adalah mengubah informasi fase yang nantinya dapat langsung dipetakan menjadi amplitudo. ROM SIN menggunakan informasi fase digital sebagai alamat ke tabel pencarian dan mengubah informasi fase menjadi amplitudo. Dan terakhir, kami memiliki konverter digital ke analog 10-bit yang tugasnya menerima data digital dari ROM SIN dan mengubahnya menjadi voltase analog yang sesuai, itulah yang kami dapatkan dari output. Pada output, kita juga memiliki sakelar yang dapat kita hidupkan atau matikan hanya dengan sedikit kode perangkat lunak. Kami akan membicarakannya nanti di artikel.Detail yang Anda lihat di atas adalah versi yang sangat dipreteli dari apa yang terjadi di dalam IC, dan Sebagian besar detail yang Anda lihat di atas diambil dari lembar data AD9833, Anda juga dapat memeriksanya untuk informasi lebih lanjut.
Komponen yang Diperlukan untuk Membangun Generator Fungsi berbasis AD9833
Komponen yang diperlukan untuk membangun generator fungsi berbasis AD9833 tercantum di bawah ini, kami merancang rangkaian ini dengan komponen yang sangat umum, yang membuat proses replikasi menjadi sangat mudah.
- Arduino Nano - 1
- Generator Fungsi AD9833 DDS - 1
- Layar OLED 128 X 64 - 1
- Encoder Putar Generik - 1
- DC Barrel Jack - 1
- Regulator Tegangan LM7809 - 1
- 470uF Kapasitor - 1
- Kapasitor 220uF - 1
- 104pF Kapasitor - 1
- Resistor 10K - 6
- Sakelar Taktil - 4
- Terminal Sekrup 5.04mm - 1
- Header Wanita - 1
- Sumber Daya 12V - 1
Generator Fungsi Berbasis AD9833 - Diagram Skema
Diagram rangkaian lengkap untuk AD9833 dan Generator Fungsi Berbasis Arduino ditunjukkan di bawah ini.
Kami akan menggunakan AD9833 dengan Arduino untuk menghasilkan frekuensi yang kami inginkan. Dan di bagian ini, kami akan menjelaskan semua detail dengan bantuan skema; izinkan saya memberi Anda gambaran singkat tentang apa yang terjadi dengan rangkaian. Mari kita mulai dengan modul AD9833. Modul AD9833 adalah modul generator fungsi dan terhubung dengan Arduino sesuai skema. Untuk menyalakan rangkaian, kita menggunakan IC regulator tegangan LM7809, dengan kapasitor decoupling yang layak, hal ini diperlukan karena gangguan supply dapat mengganggu sinyal keluaran yang mengakibatkan keluaran yang tidak diinginkan. Seperti biasa, Arduino bekerja sebagai otak untuk proyek ini. Untuk menampilkan frekuensi yang ditetapkan dan informasi berharga lainnya, kami telah menghubungkan modul layar OLED 128 X 64. Untuk mengubah rentang frekuensi, kami menggunakan tiga sakelar. Yang pertama mengatur frekuensi ke Hz, yang kedua mengatur frekuensi output ke KHz, dan yang ketiga mengatur frekuensi ke MHz, kami juga memiliki tombol lain yang dapat digunakan untuk mengaktifkan atau menonaktifkan output. Terakhir, kami memiliki encoder putar,dan kami harus memasang beberapa resistor pull-up dengannya jika tidak, sakelar tersebut tidak akan berfungsi karena kami memeriksa acara tekan tombol pada metode penyatuan. Rotary encoder digunakan untuk mengubah frekuensi dan tombol taktil di dalam rotary encoder digunakan untuk memilih bentuk gelombang yang disetel.
Generator Fungsi Berbasis AD9833 - Kode Arduino
Kode lengkap yang digunakan dalam proyek ini dapat ditemukan di bagian bawah halaman ini. Setelah menambahkan file header dan file sumber yang diperlukan, Anda seharusnya dapat langsung mengkompilasi file Arduino. Anda dapat mengunduh perpustakaan Arduino ad9833 dan perpustakaan lainnya dari tautan yang diberikan di bawah ini atau Anda dapat menggunakan metode pengelola papan untuk menginstal perpustakaan.
- Unduh AD9833 Library oleh Bill Williams
- Unduh SSD1306 OLED Library oleh Adafruit
- Unduh perpustakaan Adafruit GFX
Penjelasan kode di ino. file adalah sebagai berikut. Pertama, kita mulai dengan memasukkan semua pustaka yang diperlukan. Pustaka untuk modul AD9833 DDS diikuti oleh pustaka untuk OLED dan pustaka matematika diperlukan untuk beberapa penghitungan kami.
#include // LIbrary untuk AD9833 Module #include
Selanjutnya, kami menentukan semua pin input dan output yang diperlukan untuk tombol, sakelar, encoder putar, dan OLED.
#define SCREEN_WIDATA_PINH 128 // Layar OLED Lebar dalam piksel # tentukan SCREEN_HEIGHT 64 // Tinggi layar OLED, dalam piksel #define SET_FREQUENCY_HZ A2 // Tombol Tekan Untuk Mengatur Frekuensi dalam Hz #tentukan SET_FREQUENCY_KHZ A3 // Tentukan Tombol SET_MFREQUENCY dalam Khz # A6 // Tombol Tekan Untuk Mengatur 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 // Pin Jam dari Encoder #define DATA_PIN 7 / / Pin Data dari Encoder #define BTN_PIN 9 // Tombol Tekan Internal pada Encoder
Setelah itu, kami mendefinisikan semua variabel yang diperlukan yang diperlukan dalam kode ini. Pertama, kita mendefinisikan penghitung variabel integer yang akan menyimpan nilai rotary encoder. Dua variabel berikutnya clockPin dan clockPinState menyimpan patung pin yang diperlukan untuk memahami arah pembuat enkode. Kami memiliki variabel waktu yang menyimpan nilai penghitung waktu saat ini, variabel ini digunakan untuk debouncing tombol. Selanjutnya, kita memiliki modul frekuensi variabel panjang unsigned yang menampung frekuensi terhitung yang akan diterapkan. Selanjutnya, kami memiliki penundaan debounce. Penundaan ini dapat diatur sesuai kebutuhan. Selanjutnya, kami memiliki tiga variabel boolean set_frequency_hz,set_frequency_Khz, dan set_frequency_Mhz ketiga variabel ini digunakan untuk menentukan pengaturan modul saat ini. Kami akan membicarakannya lebih detail nanti di artikel. Selanjutnya, kita memiliki variabel yang menyimpan status bentuk gelombang keluaran, bentuk gelombang keluaran default adalah gelombang sinus. Dan terakhir, kita memiliki variabel encoder_btn_count yang menahan jumlah tombol encoder yang digunakan untuk mengatur bentuk gelombang keluaran.
int counter = 1; // Nilai Counter ini akan bertambah atau berkurang jika rotary encoder dihidupkan int clockPin; // Placeholder untuk status pin yang digunakan oleh rotary encoder int clockPinState; // Placeholder untuk status pin yang digunakan oleh rotary encoder unsigned long time = 0; // Digunakan untuk debouncing long moduleFrequency yang tidak ditandatangani; // digunakan untuk mengatur frekuensi keluaran long debounce = 220; // Debounce penundaan bool btn_state; // digunakan untuk mengaktifkan menonaktifkan keluaran Modul AD98333 bool set_frequency_hz = 1; // Frekuensi kerusakan Modul AD9833 bool set_frequency_khz; bool set_frequency_mhz; String waveSelect = "SIN"; // Bentuk gelombang startup dari modul int encoder_btn_count = 0; // digunakan untuk memeriksa tombol encoder tekan Selanjutnya, kami memiliki dua objek, satu untuk tampilan OLED dan satu lagi untuk modul AD9833.Layar Adafruit_SSD1306 (SCREEN_WIDATA_PINH, SCREEN_HEIGHT, & Wire, -1); AD9833 gen (FNC_PIN);
Selanjutnya, kami memiliki fungsi setup () kami, dalam fungsi setup itu, kami mulai dengan mengaktifkan Serial untuk debugging. Kami menginisialisasi modul AD9833 dengan bantuan metode begin (). Selanjutnya, kami menetapkan semua pin encoder putar yang ditetapkan sebagai Input. Dan kami menyimpan nilai pin jam di variabel clockPinState, ini adalah langkah yang diperlukan untuk encoder putar.
Selanjutnya, kami mengatur semua pin tombol sebagai input dan mengaktifkan tampilan OLED dengan bantuan metode display.begin () , dan kami juga memeriksa kesalahan dengan pernyataan if . Setelah selesai, kami menghapus tampilan dan mencetak layar splash startup, kami menambahkan penundaan 2 detik yang juga merupakan penundaan untuk layar splash, dan terakhir, kami memanggil fungsi update_display () yang membersihkan layar dan memperbarui tampilkan sekali lagi. Detail metode update_display () akan dibahas nanti di artikel.
void setup () {Serial.begin (9600); // Aktifkan Serial @ 9600 baud gen.Begin (); // Ini HARUS menjadi perintah pertama setelah mendeklarasikan objek AD9833 pinMode (CLK_PIN, INPUT); // Mengatur Pin sebagai input pinMode (DATA_PIN, INPUT); pinMode (BTN_PIN, INPUT_PULLUP); clockPinState = digitalRead (CLK_PIN); pinMode (SET_FREQUENCY_HZ, INPUT); // Mengatur Pin sebagai input pinMode (SET_FREQUENCY_KHZ, INPUT); pinMode (SET_FREQUENCY_MHZ, INPUT); pinMode (ENABLE_DISABLE_OUTPUT_PIN, INPUT); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Alamat 0x3D untuk 128x64 Serial.println (F ("alokasi SSD1306 gagal")); untuk (;;); } display.clearDisplay (); // Bersihkan tampilan Layar.setTextSize (2); // Atur ukuran teks display.setTextColor (WHITE); // setel LCD Color display.setCursor (30, 0); // Atur Posisi Kursor display.println ("AD9833"); // Cetak tampilan Teks ini.setCursor (17, 20); // Atur Posisi Kursor display.println ("Fungsi"); // Cetak teks ini display.setCursor (13, 40); // Atur Posisi Kursor display.println ("Generator"); // Cetak teks ini display.display (); // Perbarui penundaan Tampilan (2000); // Penundaan 2 SEC update_display (); // Panggil Fungsi update_display}
Selanjutnya, kami memiliki fungsi loop () kami, semua fungsi utama ditulis di bagian loop.
Pertama, kita membaca pin Clock dari Rotary encoder dan menyimpannya di variabel clockPin yang telah kita nyatakan sebelumnya. Selanjutnya, di pernyataan if , kami memeriksa apakah nilai pin sebelumnya dan nilai pin saat ini sama atau tidak dan kami juga memeriksa nilai pin saat ini. Jika semuanya benar, kami memeriksa pin data, jika benar itu berarti encoder berputar berlawanan arah jarum jam dan kami mengurangi nilai counter dengan bantuan perintah counter. Jika tidak, kita menaikkan nilai counter dengan perintah counter ++. Terakhir, kami menempatkan pernyataan if lain untuk menyetel nilai minimum ke 1. Selanjutnya, kami memperbarui clockPinState dengan clockPin saat ininilai untuk digunakan di masa mendatang.
void loop () {clockPin = digitalRead (CLK_PIN); if (clockPin! = clockPinState && clockPin == 1) {if (digitalRead (DATA_PIN)! = clockPin) {counter -; } else {counter ++; // Encoder sedang memutar CW jadi increment} if (counter <1) counter = 1; Serial.println (penghitung); update_display (); }
Selanjutnya, kami memiliki kode untuk mendeteksi penekanan tombol. Di bagian ini, kami telah mendeteksi tombol di dalam encoder dengan bantuan beberapa pernyataan if bersarang, if (digitalRead (BTN_PIN) == LOW && millis () - time> denounce), dalam pernyataan ini, pertama-tama kami memeriksa apakah tombolnya pin rendah atau tidak, jika rendah, maka ditekan. Kemudian lagi kami memeriksa nilai timer dengan penundaan debounce, jika kedua pernyataan itu benar, maka kami menyatakan itu tindakan tekan tombol berhasil jika demikian kami menaikkan nilai encoder_btn_count. Selanjutnya, kami mendeklarasikan pernyataan if lain untuk menyetel nilai pencacah maksimum ke 2, kami membutuhkannya karena kami menggunakannya untuk menyetel bentuk gelombang keluaran.Tiga pernyataan if yang berurutan melakukan itu, jika nilainya nol, bentuk gelombang sinus dipilih, jika satu, itu gelombang persegi, dan jika nilainya 2, itu adalah gelombang segitiga. Di ketiga pernyataan if ini, kami memperbarui tampilan dengan fungsi update_display () . Dan terakhir, kami memperbarui variabel waktu dengan nilai penghitung waktu saat ini.
// Jika kita mendeteksi sinyal LOW, tombol akan ditekan if (digitalRead (BTN_PIN) == LOW && millis () - time> debounce) {encoder_btn_count ++; // Tingkatkan nilainya jika (encoder_btn_count> 2) // jika nilainya lebih besar dari 2 setel ulang ke 0 {encoder_btn_count = 0; } if (encoder_btn_count == 0) {// jika nilainya 0 gelombang sinus dipilih waveSelect = "SIN"; // perbarui variabel string dengan nilai sin update_display (); // perbarui tampilan} if (encoder_btn_count == 1) {// jika nilainya 1 gelombang persegi dipilih waveSelect = "SQR"; // perbarui variabel string dengan nilai SQR update_display (); // perbarui tampilan} if (encoder_btn_count == 2) {// jika nilainya 1 Gelombang segitiga dipilih waveSelect = "TRI"; // perbarui variabel string dengan nilai TRI update_display ();// perbarui tampilan} time = millis (); // perbarui variabel waktu}
Selanjutnya, kami mendefinisikan semua kode yang diperlukan yang diperlukan untuk mengatur semua tombol dengan penundaan debounce. Karena tombol terhubung ke pin analog Arduino, kami menggunakan perintah baca analog untuk mengidentifikasi penekanan tombol jika nilai pembacaan analog mencapai di bawah 30, kemudian kami mendeteksi penekanan tombol yang berhasil, dan kami menunggu 200 ms untuk periksa apakah itu penekanan tombol yang sebenarnya atau hanya suara bising. Jika pernyataan ini benar, kami menetapkan variabel boolean dengan nilai yang digunakan untuk menetapkan nilai Hz, Khz, dan Mhz dari generator fungsi. Selanjutnya, kami memperbarui tampilan dan memperbarui variabel waktu. Kami melakukannya untuk keempat tombol yang terhubung dengan Arduino.
jika (analogRead (SET_FREQUENCY_HZ) <30 && millis () - time> debounce) {set_frequency_hz = 1; // perbarui nilai boolean set_frequency_khz = 0; set_frequency_mhz = 0; update_display (); // perbarui tampilan waktu = millis (); // perbarui variabel waktu} if (analogRead (SET_FREQUENCY_KHZ) <30 && millis () - time> debounce) {set_frequency_hz = 0; // perbarui nilai boolean set_frequency_khz = 1; set_frequency_mhz = 0; moduleFrequency = penghitung * 1000; update_display (); // perbarui tampilan waktu = millis (); // perbarui variabel waktu} if (analogRead (SET_FREQUENCY_MHZ) <30 && millis () - time> debounce) {// periksa pin analog dengan penundaan debounce set_frequency_hz = 0; // perbarui nilai boolean set_frequency_khz = 0; set_frequency_mhz = 1; moduleFrequency = penghitung * 1000000; update_display ();// perbarui tampilan waktu = millis (); // perbarui variabel waktu} if (analogRead (ENABLE_DISABLE_OUTPUT_PIN) <30 && millis () - time> debounce) {// periksa pin analog dengan penundaan debounce btn_state =! btn_state; // Balikkan status tombol gen.EnableOutput (btn_state); // Aktifkan / Nonaktifkan keluaran dari generator fungsi tergantung pada status tombol update_display (); // perbarui tampilan waktu = millis (); // perbarui variabel waktu}}// perbarui variabel waktu}}// perbarui variabel waktu}}
Akhirnya, kami memiliki fungsi update_display () kami. Dalam fungsi ini, kami melakukan lebih dari sekadar memperbarui tampilan ini karena bagian tertentu dari tampilan tidak dapat diperbarui dalam OLED. Untuk memperbaruinya, Anda harus mengecat ulang dengan nilai baru. Ini membuat proses pengkodean jauh lebih sulit.
Di dalam fungsi ini, kita mulai dengan membersihkan tampilan. Selanjutnya, kami mengatur ukuran teks yang kami butuhkan. Setelah itu, kami mengatur kursor dan mencetak Function Generator dengan display.println ("Function Function"); perintah. Kami sekali lagi mengatur ukuran teks menjadi 2, dan kursor ke (0,20) dengan bantuan fungsi display.setCursor (0, 20).
Di sinilah kami mencetak informasi untuk wave itu.
display.clearDisplay (); // Pertama-tama hapus tampilan display.setTextSize (1); // setel Ukuran teks display.setCursor (10, 0); // Setel posisi kursor display.println ("Function Generator"); // mencetak tampilan teks.setTextSize (2); // mengatur ukuran teks display.setCursor (0, 20); // Mengatur posisi kursor
Selanjutnya, kami memeriksa variabel boolean untuk detail frekuensi dan memperbarui nilai di variabel moduleFrequency. Kami melakukan ini untuk nilai Hz, kHz, dan MHz. Selanjutnya, kami memeriksa variabel waveSelect dan mengidentifikasi gelombang mana yang dipilih. Sekarang, kami memiliki nilai untuk mengatur jenis gelombang dan frekuensi.
if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// periksa apakah tombol untuk mengatur frekuensi dalam Hz ditekan moduleFrequency = counter; // perbarui variabel moduleFrequency dengan nilai penghitung saat ini} jika (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {// periksa apakah tombol untuk menyetel frekuensi dalam KHz ditekan moduleFrequency = counter * 1000; // perbarui variabel moduleFrequency dengan nilai penghitung saat ini tetapi kami mengalikan 1000 untuk menyetelnya pada KHZ} jika (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {// periksa apakah tombol untuk menyetel frekuensi dalam MHz ditekan moduleFrequency = counter * 1000000; if (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, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "SQR") {// Gelombang Sqr dipilih display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Gelombang tri dipilih display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // perbarui modul AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Gelombang Sqr dipilih display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Gelombang tri dipilih display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // perbarui modul AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Gelombang Sqr dipilih display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Gelombang tri dipilih display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // perbarui modul AD9833. Serial.println (moduleFrequency); }
Kami mengatur kursor lagi dan memperbarui nilai penghitung. Sekali lagi kami memeriksa boolean untuk memperbarui rentang frekuensi pada tampilan, kami harus melakukan ini karena prinsip kerja OLED sangat aneh.
display.setCursor (45, 20); display.println (penghitung); // cetak informasi penghitung di layar. jika (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Hz"); // cetak Hz pada tampilan display.display (); // ketika semua siap perbarui tampilan} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Khz"); display.display (); // ketika semua siap perbarui tampilan} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setCursor (90, 20); display.println ("Mhz"); display.display (); // ketika semua siap perbarui tampilan}
Selanjutnya, kami memeriksa variabel tekan tombol untuk mencetak output on / output off ke OLED. Sekali lagi ini perlu dilakukan karena modul OLED.
if (btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output ON"); // mencetak keluaran ke tampilan display.display (); display.setTextSize (2); } lain {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output OFF"); // mencetak keluaran ke tampilan display.display (); display.setTextSize (2); }
Ini menandai akhir dari proses pengkodean kami. Jika Anda bingung saat ini, Anda dapat memeriksa komentar di kode untuk pemahaman lebih lanjut.
Menguji Generator Fungsi Berbasis AD9833
Untuk menguji sirkuit, digunakan pengaturan di atas. Seperti yang Anda lihat, kami telah menghubungkan adaptor daya DC 12V ke jack barel DC dan kami telah menghubungkan Osiloskop Hantek ke output rangkaian. Kami juga telah menghubungkan osiloskop ke laptop untuk memvisualisasikan dan mengukur frekuensi keluaran.
Setelah ini selesai, kami mengatur frekuensi output ke 5Khz dengan bantuan encoder putar dan kami menguji gelombang sinus keluaran dan cukup yakin, itu adalah gelombang sinus 5Khz pada output.
Selanjutnya, kami telah mengubah bentuk gelombang output menjadi gelombang segitiga tetapi frekuensinya tetap sama, bentuk gelombang output ditunjukkan di bawah ini.
Kemudian kami mengubah output menjadi gelombang persegi dan mengamati output, dan itu adalah gelombang persegi yang sempurna.
Kami juga mengubah rentang frekuensi dan menguji keluarannya, dan itu bekerja dengan baik.
Peningkatan Lebih Lanjut
Sirkuit ini hanya merupakan bukti konsep dan perlu peningkatan lebih lanjut. Pertama, kami membutuhkan PCB berkualitas baik dan beberapa konektor BNC berkualitas baik untuk output jika tidak, kami tidak dapat memperoleh frekuensi yang lebih tinggi. Amplitudo modul sangat rendah, sehingga untuk meningkatkannya, diperlukan rangkaian op-amp untuk memperkuat tegangan keluaran. Potensiometer dapat dihubungkan untuk memvariasikan amplitudo keluaran. Sakelar untuk mengimbangi sinyal dapat dihubungkan; ini juga merupakan fitur yang harus dimiliki. Dan selanjutnya, kodenya membutuhkan banyak perbaikan karena sedikit buggy. Akhirnya, tampilan OLED perlu diubah jika tidak, tidak mungkin menulis kode yang mudah dimengerti.
Ini menandai akhir dari tutorial ini, saya harap Anda menyukai artikel ini dan mempelajari sesuatu yang baru. Jika Anda memiliki pertanyaan tentang artikel tersebut, Anda dapat meninggalkannya di bagian komentar di bawah ini atau Anda dapat menggunakan Forum Elektronik kami.