- Ano ang isang DDS Function Generator?
- Maunawaan ang Paggawa ng AD9833 Function Generator IC
- Kinakailangan ang Mga Bahagi upang Buuin ang AD9833 based Function Generator
- AD9833 Batay sa Tagabuo ng Pag-andar - Diagram ng Skematika
- AD9833 Batay sa Function Generator - Arduino Code
- Pagsubok sa AD9833 Batay sa Function Generator
- Karagdagang Mga Pagpapahusay
Kung ikaw ay isang elektronikong mahilig tulad ko na nais mag-tweak sa paligid ng iba't ibang mga elektronikong circuit, ang pagkakaroon ng isang disenteng Function Generator minsan ay nagiging sapilitan. Ngunit ang pagmamay-ari ng isa ay isang problema dahil ang naturang pangunahing kagamitan ay maaaring gastos sa isang malaking kapalaran. Ang pagbuo ng iyong sariling kagamitan sa pagsubok ay hindi lamang mas mura ngunit mahusay na paraan upang mapagbuti ang iyong kaalaman.
Kaya sa artikulong ito, magtatayo kami ng isang simpleng Signal Generator na may Arduino at AD9833 DDS Function Generator Module na maaaring makagawa ng sine, square, at triangle waves na may maximum frequency na 12 MHz sa output. At sa wakas, susubukan namin ang dalas ng output sa tulong ng aming oscilloscope.
Nakagawa na kami dati ng isang Simple Sine Wave Generator, isang Square Wave Generator, at isang Triangle Wave Generator sa tulong ng mga pangunahing analog na circuit. Maaari mong suriin ang mga iyon kung naghahanap ka para sa ilang pangunahing Waveform Generator Circuits. Gayundin, kung nais mong bumuo ng isang mas murang generator ng Arduino Function nang hindi ginagamit ang AD9833 Module, maaari mong suriin ang DIY Arduino Waveform Generator Project.
Ano ang isang DDS Function Generator?
Tulad ng ipinahihiwatig ng pangalan, ang isang generator ng function ay isang aparato na maaaring maglabas ng isang tukoy na form ng alon na may isang tukoy na dalas sa setting. Halimbawa, isaalang-alang mayroon kang isang filter ng LC kung saan nais mong subukan ang iyong tugon sa dalas ng output, madali mong magagawa iyon sa tulong ng isang generator ng pagpapaandar. Ang kailangan mo lang gawin ay itakda ang iyong nais na dalas ng output at waveform, pagkatapos ay maaari mo itong crank pababa o pataas upang masubukan ang tugon. Ito ay isang halimbawa lamang, maaari kang gumawa ng maraming bagay dito habang nagpapatuloy ang listahan.
Ang DDS ay nangangahulugang Direct Digital Synthesis. Ito ay isang uri ng generator ng waveform na gumagamit ng digital sa mga analog converter (DAC) upang bumuo ng isang senyas mula sa ground up. Ang pamamaraang ito ay partikular na ginagamit upang makabuo ng isang alon ng sine. Ngunit ang ginagamit naming IC ay maaaring makagawa ng mga signal ng Square o Triangular na alon. Ang mga Operasyong nangyari sa loob ng isang chip ng DDS ay digital kaya maaari nitong ilipat ang dalas nang napakabilis o maaari itong lumipat mula sa isang signal patungo sa isa pa nang napakabilis. Ang aparatong ito ay may mahusay na resolusyon ng dalas na may malawak na spectrum ng dalas.
Maunawaan ang Paggawa ng AD9833 Function Generator IC
Sa gitna ng aming proyekto ay ang AD9833 Programmable Waveform Generator IC na idinisenyo at binuo ng mga analog device. Ito ay isang mababang lakas, programmable na waveform generator na may kakayahang makagawa ng sine, tatsulok, at parisukat na alon na may maximum na dalas na 12 MHz. Ito ay isang natatanging IC na may kakayahang baguhin ang dalas ng output at phase na may isang programa lamang sa software. Mayroon itong 3 wire SPI interface kung kaya't ang pakikipag-usap sa IC na ito ay nagiging napaka-simple at madali. Ang functional diagram ng block ng IC na ito ay ipinapakita sa ibaba.
Ang pagtatrabaho ng IC na ito ay napaka-simple. Kung titingnan natin ang gumaganang diagram ng block sa itaas, matutunghayan namin na mayroon kaming isang Phase Accumulator na ang trabaho ay iimbak ang lahat ng posibleng mga digital na halaga ng isang sine wave, simula sa 0 hanggang 2π. Susunod, mayroon kaming SIN ROM na ang trabaho ay i-convert ang impormasyon ng phase na maaaring mamaya direktang mapa sa amplitude. Gumagamit ang SIN ROM ng impormasyong digital phase bilang isang address sa isang talahanayan ng pagtingin at binago ang impormasyon ng phase sa amplitude. At ang panghuli, mayroon kaming 10-bit digital sa analog converter na ang trabaho ay upang makatanggap ng digital data mula sa SIN ROM at i-convert ito sa kaukulang analog voltages, iyon ang makukuha namin mula sa output. Sa output, mayroon din kaming switch na maaari naming i-on o i-off gamit ang kaunting software code. Pag-uusapan natin iyon mamaya sa artikulo.Ang mga detalye na nakikita mo sa itaas ay isang napaka-hubad na bersyon ng kung ano ang nangyayari sa loob ng IC, at Karamihan sa mga detalye na nakikita mo sa itaas ay kinuha mula sa AD9833 datasheet, maaari mo ring suriin ito para sa karagdagang impormasyon.
Kinakailangan ang Mga Bahagi upang Buuin ang AD9833 based Function Generator
Ang mga sangkap na kinakailangan upang buuin ang AD9833 based function generator ay nakalista sa ibaba, dinisenyo namin ang circuit na ito na may napaka-generic na mga sangkap, na ginagawang napakadali ng proseso ng pagtitiklop.
- Arduino Nano - 1
- AD9833 DDS Function Generator - 1
- 128 X 64 OLED Display - 1
- Generic Rotary Encoder - 1
- DC Barrel Jack - 1
- LM7809 Voltage Regulator - 1
- 470uF Capacitor - 1
- 220uF Capacitor - 1
- 104pF Capacitor - 1
- 10K Resistor - 6
- Mga Tactile Switch - 4
- Screw Terminal 5.04mm - 1
- Babae Header - 1
- 12V Pinagmulan ng Lakas - 1
AD9833 Batay sa Tagabuo ng Pag-andar - Diagram ng Skematika
Ang kumpletong diagram ng circuit para sa AD9833 at Arduino Base Function Generator ay ipinapakita sa ibaba.
Gagamitin namin ang AD9833 kasama ang Arduino upang makabuo ng aming nais na dalas. At sa seksyong ito, ipaliwanag namin ang lahat ng mga detalye sa tulong ng eskematiko; hayaan mo akong bigyan ka ng isang maikling pangkalahatang ideya ng kung ano ang nangyayari sa circuit. Magsimula tayo sa modyul na AD9833. Ang AD9833 module ay ang module ng pagpapaandar ng function at ito ay konektado sa Arduino ayon sa eskematiko. Upang mapagana ang circuit, gumagamit kami ng isang LM7809 voltage regulator IC, na may disenteng decoupling capacitor, kinakailangan ito dahil ang ingay ng supply ay maaaring makagambala sa output signal na magreresulta sa hindi nais na output. Tulad ng dati, ang Arduino ay nagtatrabaho bilang utak para sa proyektong ito. Upang maipakita ang itinakdang dalas at iba pang mahalagang impormasyon, nakakonekta kami sa isang 128 X 64 OLED display module. Upang baguhin ang saklaw ng dalas, gumagamit kami ng tatlong mga switch. Itinatakda ng una ang dalas sa Hz, ang pangalawa ay itinakda ang dalas ng output sa KHz, at ang pangatlo ay nagtatakda ng dalas sa MHz, mayroon din kaming isa pang pindutan na maaaring magamit upang paganahin o huwag paganahin ang output. Sa wakas, mayroon kaming rotary encoder,at kailangan naming maglakip ng ilang pull-up risistor dito kung hindi man hindi gagana ang mga switch na iyon dahil sinusuri namin ang kaganapan ng pindutin ang pindutan sa pamamaraan ng pooling. Ginagamit ang rotary encoder upang baguhin ang dalas at ang tactile switch sa loob ng rotary encoder ay ginagamit upang piliin ang itinakdang waveform.
AD9833 Batay sa Function Generator - Arduino Code
Ang kumpletong code na ginamit sa proyektong ito ay matatagpuan sa ilalim ng pahinang ito. Matapos idagdag ang kinakailangang mga file ng header at mga mapagkukunan ng file, dapat na direktang maisaayos ang file ng Arduino. Maaari mong i-download ang ad9833 Arduino library at iba pang mga library mula sa link na ibinigay sa ibaba o kung hindi maaari mong gamitin ang board manager na paraan upang mai-install ang silid -aklatan.
- I-download ang AD9833 Library ni Bill Williams
- I-download ang SSD1306 OLED Library sa pamamagitan ng Adafruit
- Mag-download ng Adafruit GFX library
Ang paliwanag ng code sa ino. ang file ay ang mga sumusunod. Una, nagsisimula kami sa pamamagitan ng pagsasama ng lahat ng kinakailangang mga aklatan. Ang silid- aklatan para sa module ng AD9833 DDS ay unang sinusundan ng library para sa OLED at kinakailangan ang library ng matematika para sa ilan sa aming mga kalkulasyon.
#include // LIbrary para sa AD9833 Modyul # isama
Susunod, tinutukoy namin ang lahat ng kinakailangang mga input at output pin para sa mga pindutan, switch, rotary encoder, at OLEDs.
#define SCREEN_WIDATA_PINH 128 // OLED display Lapad sa mga pixel #define SCREEN_HEIGHT 64 // OLED taas ng pagpapakita, sa mga pixel #define SET_FREQUENCY_HZ A2 // Pushbutton Upang Itakda ang Frequency sa Hz #define SET_FREQUENCY_KHZ A3 // PushbutY__GWT Itakda angH A6 // Pushbutton To Set Frequency in Mhz #define ENABLE_DISABLE_OUTPUT_PIN A7 // Pushbutton To Enable / Disable the Output #define FNC_PIN 4 // Fsync Required by the AD9833 Module #define CLK_PIN 8 // Clock Pin of the Encoder #define / Data Pin ng Encoder # tukuyin ang BTN_PIN 9 // Panloob na Button ng Push sa Encoder
Pagkatapos nito, tinutukoy namin ang lahat ng kinakailangang mga variable na kinakailangan sa code na ito. Una, tinutukoy namin ang isang integer variable counter na mag-iimbak ng halaga ng rotary encoder. Ang susunod na dalawang variable na clockPin at clockPinState ay nag- iimbak ng pin rebulto na kinakailangan upang maunawaan ang direksyon ng encoder. Mayroon kaming isang variable ng oras na nagtataglay ng kasalukuyang mga halaga ng timer-counter, ginagamit ang variable na ito para sa pag-debit ng pindutan. Susunod, mayroon kaming isang hindi naka- sign na mahabang variable na moduleFrequency na humahawak sa kinakalkula na dalas na ilalapat. Susunod, mayroon kaming pagkaantala sa debounce. Ang pagkaantala na ito ay maaaring ayusin kung kinakailangan. Susunod, mayroon kaming tatlong variable ng boolean na set_frequency_hz,set_frequency_Khz, at set_frequency_Mhz ang tatlong mga variable na ito ay ginagamit upang matukoy ang kasalukuyang setting ng module. Pag-uusapan natin ito nang mas detalyado sa paglaon sa artikulo. Susunod, mayroon kaming variable na nag-iimbak ng katayuan ng output waveform, ang default na output form na alon ay isang sine wave. At sa wakas, mayroon kaming variable na encoder_btn_count na humahawak sa bilang ng encoder-button na ginagamit upang maitakda ang output waveform.
int counter = 1; // Ang halaga ng Counter na ito ay tataas o babaan kung kapag ang rotary encoder ay naka int intPPP; // Placeholder para sa katayuan ng pin na ginamit ng rotary encoder int clockPinState; // Placeholder para sa katayuang pin na ginamit ng rotary encoder na hindi pirmadong matagal = 0; // Ginamit para sa pag-debunto ng hindi naka-sign na mahabang moduleFrequency; // used to set output frequency long debounce = 220; // Debounce delay bool btn_state; // ginamit upang paganahin ang hindi paganahin ang output ng AD98333 Module bool set_frequency_hz = 1; // Madalas na kadramahan ng AD9833 Module bool set_frequency_khz; bool set_frequency_mhz; String waveSelect = "SIN"; // Startup waveform ng module int encoder_btn_count = 0; // ginamit upang suriin ang pindutan ng encoder pindutin ang Susunod, mayroon kaming dalawang mga bagay na ang isa ay para sa pagpapakita ng OLED at ang isa pa ay para sa module ng AD9833.Display ng Adafruit_SSD1306 (SCREEN_WIDATA_PINH, SCREEN_HEIGHT, & Wire, -1); AD9833 gen (FNC_PIN);
Susunod, mayroon kaming pag- andar ng aming pag- setup (), sa pagpapaandar na pag-setup na iyon, nagsisimula kami sa pagpapagana ng Serial para sa pag-debug. Pinasimulan namin ang module na AD9833 sa tulong ng simula () na pamamaraan. Susunod, itinakda namin ang lahat ng nakatalagang mga pin ng rotary encoder bilang Input. At iniimbak namin ang halaga ng relo ng orasan sa variable na orasanPinState, ito ay isang kinakailangang hakbang para sa rotary encoder.
Susunod, itinakda namin ang lahat ng mga pindutan ng pindutan bilang pag-input at paganahin ang display ng OLED sa tulong ng display.begin () na pamamaraan, at susuriin din namin ang anumang mga error sa isang kung pahayag . Kapag tapos na iyon, i- clear namin ang display at mag-print ng isang startup splash screen, nagdaragdag kami ng pagkaantala ng 2 segundo na kung saan ay ang pagkaantala rin para sa splash screen, at sa wakas, tinawag namin ang pagpapaandar na update_display () na nililimas ang screen at ina -update ang ipakita ulit. Ang mga detalye ng update_display () na pamamaraan ay tatalakayin sa ibang pagkakataon sa artikulo.
void setup () {Serial.begin (9600); // Paganahin ang Serial @ 9600 baud gen.Begin (); // DAPAT itong maging unang utos matapos ideklara ang AD9833 object pinMode (CLK_PIN, INPUT); // Setting Pins as input pinMode (DATA_PIN, INPUT); pinMode (BTN_PIN, INPUT_PULLUP); clockPinState = digitalRead (CLK_PIN); pinMode (SET_FREQUENCY_HZ, INPUT); // Pagtatakda ng mga Pins bilang input pinMode (SET_FREQUENCY_KHZ, INPUT); pinMode (SET_FREQUENCY_MHZ, INPUT); pinMode (ENABLE_DISABLE_OUTPUT_PIN, INPUT); kung (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Address 0x3D para sa 128x64 Serial.println (F ("Nabigo ang paglalaan ng SSD1306")); para sa (;;); } display.clearDisplay (); // Clear the Screen display.setTextSize (2); // Magtakda ng pagpapakita ng Sukat ng teksto.setTextColor (PUTI); // set LCD Color display.setCursor (30, 0); // Set Cursor Position display.println ("AD9833"); // I-print ang display ng Teksto na ito.setCursor (17, 20); // Set Cursor Position display.println ("Function"); // Print the Text display.setCursor (13, 40); // Set Cursor Position display.println ("Generator"); // I-print ang display ng Teksto na ito. Ipakita (); // I-update ang pagkaantala sa Display (2000); // Delay of 2 SEC update_display (); // Call update_display Function}
Susunod, mayroon kaming function na aming loop (), ang lahat ng mga pangunahing pag-andar ay nakasulat sa seksyon ng loop.
Una, binasa namin ang Clock pin ng Rotary encoder at iniimbak ito sa variable ng clockPin na idineklara namin nang mas maaga. Susunod, sa pahayag na kung , susuriin namin kung ang dating halaga ng pin at ang kasalukuyang halaga ng pin ay magkatulad o hindi at susuriin din namin ang kasalukuyang halaga ng pin. Kung totoo ang lahat, susuriin namin ang data pin, kung totoo nangangahulugang ang encoder ay umiikot na pakaliwa at binabawasan namin ang halaga ng counter sa tulong ng counter-- utos. Sa kabilang banda ay nadagdagan namin ang halaga ng counter sa counter ++ na utos. Sa wakas, naglalagay kami ng isa pang pahayag kung maitatakda ang minimum na halaga sa 1. Susunod, ina- update namin ang clockPinState gamit ang kasalukuyang clockPinhalaga para magamit sa hinaharap.
void loop () {clockPin = digitalRead (CLK_PIN); kung (clockPin! = clockPinState && clockPin == 1) {kung (digitalRead (DATA_PIN)! = clockPin) {counter -; } iba pa {counter ++; // Ang Encoder ay umiikot na CW kaya't nadaragdagan} kung (counter <1) counter = 1; Serial.println (counter); update_display (); }
Susunod, mayroon kaming aming code upang makita ang isang pindot ng pagpindot. Sa seksyong ito, nakita namin ang pindutan sa loob ng encoder sa tulong ng ilang nakapugad kung mga pahayag, kung (digitalRead (BTN_PIN) == LOW && millis () - oras> pagtuligsa), sa pahayag na ito, sinuri muna namin kung ang pindutan mababa ang pin o hindi, kung mababa ito pagkatapos ay pinindot. Pagkatapos ay muli naming suriin ang halaga ng timer sa pagkaantala ng pag-debit, kung ang parehong mga pahayag ay totoo, pagkatapos ay idineklara namin itong isang matagumpay na pagkilos na pindutin ang pagkilos kung kaya nadagdagan namin ang halagang encoder_btn_count. Susunod, idineklara namin ang isa pa kung pahayag upang maitakda ang maximum na halaga ng counter sa 2, kailangan namin ito dahil ginagamit namin ito upang maitakda ang output waveform.Ang sunud-sunod na tatlo kung ang mga pahayag ay gawin iyon, kung ang halaga ay zero, ang sine waveform ay napili, kung ito ay isa, ito ay isang square wave, at kung ang halaga ay 2, ito ay isang triangular na alon. Sa lahat ng tatlong mga ito kung mga pahayag, ina- update namin ang display na may pag- andar ng pag- update_display () . At sa wakas, ina-update namin ang variable ng oras sa kasalukuyang halaga ng counter ng timer.
// Kung nakakita kami ng isang LOW signal, ang pindutan ay pinindot kung (digitalRead (BTN_PIN) == LOW && millis () - oras> pag-debug) {encoder_btn_count ++; // Palakihin ang mga halaga kung (encoder_btn_count> 2) // kung ang halaga ay mas malaki sa 2 i-reset ito sa 0 {encoder_btn_count = 0; } kung (encoder_btn_count == 0) {// kung ang halaga ay 0 sine wave ay napili waveSelect = "SIN"; // update the string variable with sin halaga ng pag-update_display (); // update the display} if (encoder_btn_count == 1) {// kung ang halaga ay 1 square wave ay napili waveSelect = "SQR"; // update the string variable with SQR value update_display (); // update the display} if (encoder_btn_count == 2) {// kung ang halaga ay 1 Triangular wave ay napili waveSelect = "TRI"; // update the string variable with TRI value update_display ();// update the display} time = millis (); // update the time variable}
Susunod, tinutukoy namin ang lahat ng kinakailangang code na kinakailangan upang mai-set up ang lahat ng mga pindutan na may pagkaantala sa pag-debounce. Habang ang mga pindutan ay konektado sa mga analog pin ng Arduino, ginagamit namin ang utos na binasa ng analog upang makilala ang isang pindutin ang pindutan kung ang halaga na binasa ng analog ay umabot sa ibaba 30, pagkatapos ay nakita namin ang isang matagumpay na pindutin ang pindutan, at hinihintay namin ang 200 ms suriin kung ito ay isang aktwal na pindutin ang pindutan o isang ingay lamang. Kung totoo ang pahayag na ito, nagtatalaga kami ng mga variable ng boolean na may mga halagang ginamit upang itakda ang mga halagang Hz, Khz, at Mhz ng generator ng pagpapaandar. Susunod, ina-update namin ang display at na-update ang variable ng oras. Ginagawa namin iyon para sa lahat ng apat na mga pindutan na konektado sa Arduino.
kung (analogRead (SET_FREQUENCY_HZ) <30 && millis () - oras> pag-debounce) {set_frequency_hz = 1; // update boolean values set_frequency_khz = 0; set_frequency_mhz = 0; update_display (); // i-update ang display time = millis (); // i-update ang variable ng oras} kung (analogRead (SET_FREQUENCY_KHZ) <30 && millis () - time> debounce) {set_frequency_hz = 0; // update boolean values set_frequency_khz = 1; set_frequency_mhz = 0; moduleFrequency = counter * 1000; update_display (); // i-update ang oras ng pagpapakita = millis (); // i-update ang variable ng oras} kung (analogRead (SET_FREQUENCY_MHZ) <30 && millis () - oras> debounce) {// suriin ang analog pin na may pagkaantala ng debounce set_frequency_hz = 0; // update boolean values set_frequency_khz = 0; set_frequency_mhz = 1; moduleFrequency = counter * 1000000; update_display ();// update the display time = millis (); // update the time variable} if (analogRead (ENABLE_DISABLE_OUTPUT_PIN) <30 && millis () - time> debounce) {// check analog pin with debounce delay btn_state =! btn_state; // Baligtarin ang estado ng pindutan na gen.EnableOutput (btn_state); // Paganahin / Huwag paganahin ang output ng function generator depende sa pindutan ng estado update_display (); // i-update ang oras ng pagpapakita = millis (); // i-update ang variable ng oras}}// update the time variable}}// update the time variable}}
Panghuli, mayroon kaming pagpapaandar na update_display (). Sa pagpapaandar na ito, marami pa kaming nagawa kaysa sa pag-update lamang ng display na ito dahil ang isang tiyak na bahagi ng display ay hindi ma-update sa isang OLED. Upang mai-update ito, kailangan mong muling pinturahan ito ng mga bagong halaga. Ginagawa nitong mas mahirap ang proseso ng pag-coding.
Sa loob ng pagpapaandar na ito, nagsisimula kami sa pag-clear ng display. Susunod, itinakda namin ang aming kinakailangang laki ng teksto. Pagkatapos noon, itinakda namin ang aming cursor at naka-print na Function Generator na may display.println ("Function Function"); utos Itinakda namin muli ang laki ng teksto sa 2, at ang cursor sa (0,20) sa tulong ng pagpapakita ng function.setCursor (0, 20).
Dito namin nai-print ang impormasyon para sa kung ano ito.
display.clearDisplay (); // FIrst clear the display display.setTextSize (1); // set text Size display.setCursor (10, 0); // Itakda ang posisyon ng cursor display.println ("Generator ng Pag-andar"); // print the text display.setTextSize (2); // set text Size display.setCursor (0, 20); // Itakda ang posisyon ng cursor
Susunod, susuriin namin ang mga variable ng boolean para sa mga detalye ng dalas at i-update ang halaga sa variable ng moduleFrequency. Ginagawa namin ito para sa mga halagang Hz, kHz, at MHz. Susunod, suriin namin ang variable ng waveSelect at makilala kung aling alon ang napili. Ngayon, mayroon kaming mga halaga upang maitakda ang uri ng alon at dalas.
kung (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// suriin kung ang pindutan para sa pagtatakda ng dalas sa Hz ay pinindot ang moduleFrequency = counter; // update the moduleFrequency variable with current counter value} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {// suriin kung ang pindutan para sa pagtatakda ng dalas sa KHz ay pinindot na moduleFrequency = counter * 1000; // i-update ang variable ng moduleFrequency na may kasalukuyang halaga ng counter ngunit pinarami namin ang 1000 upang maitakda ito sa KHZ} kung (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {// suriin kung ang pindutan para sa pagtatakda ng dalas sa MHz ay pinindot na moduleFrequency = counter * 1000000; kung (moduleFrequency> 12000000) {moduleFrequency = 12000000;// huwag hayaan ang dalas na maging kudkuran na 12Mhz counter = 12; }} kung (waveSelect == "SIN") {// Sine wave ay napili display.println ("SIN"); gen.ApplySignal (SINE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } kung (waveSelect == "SQR") {// Sqr wave ay napili display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } kung (waveSelect == "TRI") {// Tri wave ay napili display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // update the AD9833 module. Serial.println (moduleFrequency); }} kung (waveSelect == "SQR") {// Sqr wave ay napili display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } kung (waveSelect == "TRI") {// Tri wave ay napili display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // update the AD9833 module. Serial.println (moduleFrequency); }} kung (waveSelect == "SQR") {// Sqr wave ay napili display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } kung (waveSelect == "TRI") {// Tri wave ay napili display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // update the AD9833 module. Serial.println (moduleFrequency); }
Itinakda namin muli ang cursor at ina-update ang mga halaga ng counter. Muli naming suriin ang boolean upang mai-update ang saklaw ng dalas sa display, kailangan nating gawin ito dahil ang prinsipyo ng pagtatrabaho ng OLED ay napaka-kakaiba.
display.setCursor (45, 20); display.println (counter); // i-print ang counter na impormasyon sa display. kung (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Hz"); // print Hz sa display display.display (); // kapag ang lahat ng nakatakdang i-update ang display} kung (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Khz"); display.display (); // kapag natapos ang lahat ng pag-update sa display} kung (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setCursor (90, 20); display.println ("Mhz"); display.display (); // kapag na-update na ang lahat ng itinakda}
Susunod, susuriin namin ang variable ng pindutin ang pindutin upang mai-print ang output sa / output papunta sa OLED. Muli kailangan itong gawin dahil sa OLED module.
kung (btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print ("ON Output"); // print output on to the display display.display (); display.setTextSize (2); } iba pa {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output OFF"); // print output off to the display display.display (); display.setTextSize (2); }
Ito ang marka ng pagtatapos ng aming proseso ng pag-coding. Kung ikaw ay nalilito sa puntong ito, maaari mong suriin ang mga komento sa code para sa karagdagang pag-unawa.
Pagsubok sa AD9833 Batay sa Function Generator
Upang subukan ang circuit, ginagamit ang setup sa itaas. Tulad ng nakikita mo, nakakonekta kami ng isang 12V DC power adapter sa DC barrel jack at ikinonekta namin ang Hantek Oscilloscope sa output ng circuit. Nakakonekta din namin ang oscilloscope sa laptop upang mailarawan at sukatin ang dalas ng output.
Kapag tapos na ito, itinakda namin ang dalas ng output sa 5Khz sa tulong ng rotary encoder at sinusubukan namin ang output sine wave at sapat na sigurado, ito ay isang 5Khz sine wave sa output.
Susunod, binago namin ang output waveform sa isang tatsulok na alon ngunit ang dalas ay nanatiling pareho, ang output waveform ay ipinapakita sa ibaba.
Pagkatapos ay binago namin ang output sa isang square wave at sinusunod ang output, at ito ay isang perpektong square wave.
Binago din namin ang mga saklaw ng dalas at sinubukan ang output, at gumagana ito nang maayos.
Karagdagang Mga Pagpapahusay
Ang circuit na ito ay isang katibayan lamang ng konsepto at nangangailangan ng karagdagang mga pagpapahusay. Una, kailangan namin ng isang mahusay na kalidad ng PCB at ilang mahusay na kalidad na konektor ng BNC para sa output kung hindi man ay hindi kami makakakuha ng mas mataas na dalas. Ang amplitude ng module ay napakababa, kaya upang mapahusay iyon, kailangan namin ng ilang mga circuit na op-amp upang palakasin ang output boltahe. Ang isang potentiometer ay maaaring konektado upang maiiba ang output amplitude. Ang isang switch para sa offsetting ng signal ay maaaring konektado; ito ay dapat ding magkaroon ng tampok na ito. At higit pa, ang code ay nangangailangan ng maraming pagpapabuti dahil ito ay isang maliit na buggy. Sa wakas, ang mga pagpapakita ng OLED ay kailangang mabago kung hindi imposibleng magsulat ng madaling maunawaan na code.
Ito ang marka ng pagtatapos ng tutorial na ito, sana ay nagustuhan mo ang artikulo at may natutunan na bago. Kung mayroon kang anumang mga katanungan tungkol sa artikulo, maaari mong iwanan ang mga ito sa seksyon ng komento sa ibaba o maaari mong gamitin ang aming Electronics Forum.