- Kas ir DDS funkciju ģenerators?
- Izprotiet AD9833 funkciju ģeneratora IC darbību
- Komponenti, kas nepieciešami, lai izveidotu AD9833 balstītu funkciju ģeneratoru
- AD9833 bāzes funkciju ģenerators - shematiska shēma
- AD9833 bāzes funkciju ģenerators - Arduino kods
- Uz AD9833 bāzes funkciju ģeneratora pārbaude
- Turpmākie uzlabojumi
Ja esat tāds elektronikas entuziasts kā es, kurš vēlas pielāgoties dažādām elektroniskajām shēmām, pienācīga funkciju ģeneratora lietošana dažreiz kļūst obligāta. Bet viena piederība ir problēma, jo šāds pamataprīkojums var maksāt daudz naudas. Paša testa aprīkojuma izgatavošana ir ne tikai lētāka, bet arī lielisks veids, kā uzlabot savas zināšanas.
Tātad šajā rakstā mēs gatavojamies izveidot vienkāršu signālu ģeneratoru ar Arduino un AD9833 DDS funkciju ģeneratora moduli, kas izejā var radīt sinusa, kvadrāta un trīsstūra viļņus ar maksimālo frekvenci 12 MHz. Visbeidzot, mēs pārbaudīsim izejas frekvenci ar mūsu osciloskopa palīdzību.
Mēs jau iepriekš esam izveidojuši vienkāršu sinusa viļņu ģeneratoru, kvadrātveida viļņu ģeneratoru un trīsstūra viļņu ģeneratoru, izmantojot pamata analogās shēmas. Jūs varat tos pārbaudīt, ja meklējat dažas pamata viļņu ģeneratora shēmas. Turklāt, ja vēlaties izveidot lētāku Arduino Function ģeneratoru, neizmantojot AD9833 moduli, varat pārbaudīt DIY Arduino Waveform Generator Project.
Kas ir DDS funkciju ģenerators?
Kā norāda nosaukums, funkciju ģenerators ir ierīce, kas pēc iestatīšanas var izvadīt noteiktu viļņu formu ar noteiktu frekvenci. Piemēram, uzskatiet, ka jums ir LC filtrs, kuram vēlaties pārbaudīt izejas frekvences reakciju, to varat viegli izdarīt ar funkciju ģeneratora palīdzību. Viss, kas jums jādara, ir iestatīt vēlamo izejas frekvenci un viļņu formu, pēc tam varat to pagriezt uz leju vai uz augšu, lai pārbaudītu reakciju. Šis bija tikai viens piemērs. Turpinot sarakstu, ar to varat darīt vairāk.
DDS nozīmē tiešo digitālo sintēzi. Tas ir viļņu formas ģenerators, kas izmanto ciparu uz analogo pārveidotājus (DAC), lai izveidotu signālu no zemes. Šo metodi īpaši izmanto sinusa viļņa ģenerēšanai. Bet IC, kuru mēs izmantojam, var radīt kvadrātveida vai trīsstūra viļņu signālus. Darbības, kas notika DDS mikroshēmā, ir digitālas, tāpēc tā var ļoti ātri pārslēgt frekvenci vai ļoti ātri pārslēgties no viena signāla uz otru. Šai ierīcei ir smalkas frekvences izšķirtspēja ar plašu frekvenču spektru.
Izprotiet AD9833 funkciju ģeneratora IC darbību
Mūsu projekta centrā ir AD9833 programmējams viļņu formas ģeneratora IC, kuru ir izstrādājušas un izstrādājušas analogās ierīces. Tas ir mazjaudas programmējams viļņu formas ģenerators, kas spēj radīt sinusa, trīsstūra un kvadrāta viļņus ar maksimālo frekvenci 12 MHz. Tas ir ļoti unikāls IC, kas spēj mainīt izejas frekvenci un fāzi, izmantojot tikai programmatūru. Tam ir 3 vadu SPI interfeiss, tāpēc saziņa ar šo IC kļūst ļoti vienkārša un vienkārša. Šīs IC funkcionālā blokshēma ir parādīta zemāk.
Šīs IC darbība ir ļoti vienkārša. Ja mēs aplūkosim funkcionālo bloku diagrammu iepriekš, mēs novērosim, ka mums ir fāzes akumulators, kura uzdevums ir saglabāt visas iespējamās sinusa viļņa digitālās vērtības, sākot no 0 līdz 2π. Tālāk mums ir SIN ROM, kura uzdevums ir pārveidot fāzes informāciju, kuru vēlāk var tieši kartēt, amplitūdā. SIN ROM izmanto digitālās fāzes informāciju kā adresi uzmeklēšanas tabulai un pārveido fāzes informāciju amplitūdā. Visbeidzot, mums ir 10 bitu digitālais analogais pārveidotājs, kura uzdevums ir saņemt digitālos datus no SIN ROM un pārvērst tos atbilstošajos analogajos spriegumos, tieši to mēs iegūstam no izejas. Pie izejas mums ir arī slēdzis, kuru mēs varam ieslēgt vai izslēgt tikai ar nelielu programmatūras kodu. Par to mēs runāsim vēlāk rakstā.Iepriekš redzamā informācija ir ļoti atdalīta versija par to, kas notiek IC iekšienē, un lielākā daļa no iepriekš redzamajām detaļām ir ņemta no AD9833 datu lapas, jūs to varat arī pārbaudīt, lai iegūtu papildinformāciju.
Komponenti, kas nepieciešami, lai izveidotu AD9833 balstītu funkciju ģeneratoru
Zemāk ir uzskaitīti komponenti, kas nepieciešami uz AD9833 balstīta funkciju ģeneratora izveidei. Mēs izstrādājām šo shēmu ar ļoti vispārīgiem komponentiem, kas ļoti atvieglo replikācijas procesu.
- Arduino Nano - 1
- AD9833 DDS funkciju ģenerators - 1
- 128 X 64 OLED displejs - 1
- Vispārējs rotējošais kodētājs - 1
- DC Barrel Jack - 1
- LM7809 sprieguma regulators - 1
- 470uF kondensators - 1
- 220uF kondensators - 1
- 104pF kondensators - 1
- 10K rezistors - 6
- Taktilie slēdži - 4
- Skrūves spaile 5,04 mm - 1
- Sievietes galvene - 1
- 12 V strāvas avots - 1
AD9833 bāzes funkciju ģenerators - shematiska shēma
Pilna AD9833 un Arduino bāzes funkciju ģeneratora shēma ir parādīta zemāk.
Mēs izmantosim AD9833 ar Arduino, lai ģenerētu vēlamo frekvenci. Šajā sadaļā mēs izskaidrosim visas detaļas ar shēmas palīdzību; ļaujiet man sniegt īsu pārskatu par to, kas notiek ar ķēdi. Sāksim ar moduli AD9833. AD9833 modulis ir funkciju ģeneratora modulis, un tas ir savienots ar Arduino saskaņā ar shēmu. Lai darbinātu ķēdi, mēs izmantojam LM7809 sprieguma regulatoru IC ar pienācīgu atvienošanas kondensatoru, tas ir nepieciešams, jo barošanas troksnis var traucēt izejas signālu, kā rezultātā rodas nevēlama izeja. Kā vienmēr, Arduino darbojas kā smadzenes šim projektam. Lai parādītu iestatīto frekvenci un citu vērtīgu informāciju, mēs esam pievienojuši 128 X 64 OLED displeja moduli. Lai mainītu frekvenču diapazonu, mēs izmantojam trīs slēdžus. Pirmajā tiek iestatīta frekvence uz Hz, otrajā - izejas frekvence uz KHz, bet trešajā - frekvence uz MHz. Mums ir arī vēl viena poga, kuru var izmantot, lai iespējotu vai atspējotu izvadi. Visbeidzot, mums ir rotējošais kodētājs,un mums ir jāpiestiprina daži pievilkšanas rezistori, pretējā gadījumā šie slēdži nedarbosies, jo mēs pārbaudām pogas nospiešanas notikumu kopēšanas metodē. Rotējošo kodētāju izmanto, lai mainītu frekvenci, un taustes slēdzi rotējošā kodētāja iekšpusē izmanto, lai izvēlētos iestatīto viļņu formu.
AD9833 bāzes funkciju ģenerators - Arduino kods
Pilns šajā projektā izmantotais kods ir atrodams šīs lapas apakšdaļā. Pēc nepieciešamo galvenes failu un avota failu pievienošanas jums vajadzētu būt iespējai tieši kompilēt Arduino failu. Jūs varat lejupielādēt ad9833 Arduino bibliotēku un citas bibliotēkas no tālāk norādītās saites, vai arī varat izmantot paneļa pārvaldnieka metodi, lai instalētu bibliotēku.
- Lejupielādējiet Bila Viljamsa AD9833 bibliotēku
- Lejupielādējiet Adafruit SSD1306 OLED bibliotēku
- Lejupielādējiet Adafruit GFX bibliotēku
Ino koda skaidrojums . fails ir šāds. Pirmkārt, mēs iesakām iekļaut visas nepieciešamās bibliotēkas. Pēc AD9833 DDS moduļa bibliotēkas vispirms seko OLED bibliotēka, un dažiem mūsu aprēķiniem ir nepieciešama matemātikas bibliotēka.
#include // AD9833 modulis #include
Tālāk mēs definējam visas nepieciešamās ievades un izvades tapas pogām, slēdzim, rotējošajam kodētājam un OLED.
#define SCREEN_WIDATA_PINH 128 // OLED displeja platums pikseļos #define SCREEN_HEIGHT 64 // OLED displeja augstums pikseļos #define SET_FREQUENCY_HZ A2 // Spiedpoga, lai iestatītu frekvenci Hz A6 // spiedpoga, lai iestatītu frekvenci Mhz zonā #define ENABLE_DISABLE_OUTPUT_PIN A7 // spiedpoga, lai iespējotu / atspējotu izvadi #define FNC_PIN 4 // Fsync, ko prasa AD9833 modulis #define CLK_PIN 8 // Clock PIN koda PIN koda / Kodētāja datu tapa #define BTN_PIN 9 // Iekšējā spiedpoga kodētājā
Pēc tam mēs definējam visus nepieciešamos mainīgos, kas nepieciešami šajā kodā. Pirmkārt, mēs definējam vesela skaitļa mainīgo skaitītāju, kas saglabās rotējošā kodētāja vērtību. Nākamie divi mainīgie clockPin un clockPinState glabā tapas statuju, kas nepieciešama kodētāja virziena izpratnei. Mums ir laika mainīgais, kas satur pašreizējās taimera skaitītāja vērtības, šis mainīgais tiek izmantots pogu atcelšanai. Pēc tam mums ir neparakstīts garš mainīgais moduleFrequency, kas satur aprēķināto biežumu, kas tiks piemērots. Tālāk mums ir debitēšanas kavēšanās. Šo kavēšanos var pielāgot pēc nepieciešamības. Tālāk mums ir trīs loģiskie mainīgie set_frequency_hz,set_frequency_Khz un set_frequency_Mhz šie trīs mainīgie tiek izmantoti, lai noteiktu moduļa pašreizējo iestatījumu. Par to mēs sīkāk runāsim vēlāk rakstā. Pēc tam mums ir mainīgais, kas saglabā izejas viļņu statusu, noklusējuma izejas viļņu forma ir sinusa viļņa. Un visbeidzot, mums ir mainīgais encoder_btn_count, kas satur kodētāja pogu skaitu, ko izmanto izejas viļņu formas iestatīšanai.
int skaitītājs = 1; // Šī skaitītāja vērtība palielināsies vai samazināsies, ja pagriežot rotējošo kodētāju int clockPin; // Rotācijas kodētāja int clockPinState izmantotais tapas statusa vietturis; // Rotācijas kodētāja izmantotais piespraudes statusa vietturis neparakstīts ilgs laiks = 0; // Izmanto neparakstītā garā moduļa atcelšanaiFrequency; // izmanto, lai iestatītu izejas frekvenci ilgi debounce = 220; // Debounce delay bool btn_state; // izmantots, lai iespējotu AD98333 moduļa izejas atspējošanu set_frequency_hz = 1; // AD9833 moduļa defolēšanas biežums bool set_frequency_khz; bool set_frequency_mhz; String waveSelect = "SIN"; // Moduļa startēšanas viļņu forma int encoder_btn_count = 0; // izmanto, lai pārbaudītu kodētāja pogas nospiešanu Tālāk, mums ir divi objekti, viens ir paredzēts OLED displejam, bet otrs - modulim AD9833.Adafruit_SSD1306 displejs (SCREEN_WIDATA_PINH, SCREEN_HEIGHT & Wire, -1); AD9833 gen (FNC_PIN);
Pēc tam mums ir iestatīšanas () funkcija, šajā iestatīšanas funkcijā mēs sākam ar Serial iespējošanu atkļūdošanai. Mēs inicializējam moduli AD9833 ar sākuma () metodes palīdzību. Pēc tam mēs iestatījām visas piešķirtās rotējošās kodētāja tapas kā ievades. Un pulksteņa tapas vērtību mēs glabājam mainīgajā pulkstenīPinState, tas ir nepieciešams solis rotējošajam kodētājam.
Pēc tam mēs iestatījām visas pogas tapas kā ievades un iespējojam OLED displeju ar metodi display.begin () , kā arī pārbaudām, vai kļūdas nav ar paziņojumu if . Kad tas ir izdarīts, mēs notīrām displeju un izdrukājam palaišanas ekrānu, mēs pievienojam 2 sekunžu aizturi, kas ir arī slampāšanas ekrāna aizkave, un, visbeidzot, mēs izsaucam funkciju update_display (), kas notīra ekrānu un atjaunina vēlreiz. Metodes update_display () informācija tiks aplūkota vēlāk rakstā.
void setup () {Sērijas.sākt (9600); // Iespējot sērijas @ 9600 baud gen.Begin (); // šai JĀBŪT pirmajai komandai pēc AD9833 objekta pinMode (CLK_PIN, INPUT) deklarēšanas; // Pins iestatīšana kā ievades pinMode (DATA_PIN, INPUT); pinMode (BTN_PIN, INPUT_PULLUP); clockPinState = digitalRead (CLK_PIN); pinMode (SET_FREQUENCY_HZ, INPUT); // Piespraudes iestatīšana kā ievades pinMode (SET_FREQUENCY_KHZ, INPUT); pinMode (SET_FREQUENCY_MHZ, INPUT); pinMode (ENABLE_DISABLE_OUTPUT_PIN, INPUT); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Adrese 0x3D 128x64 sērijas.println (F ("SSD1306 piešķiršana neizdevās")); priekš (;;); } display.clearDisplay (); // Notīriet ekrānu display.setTextSize (2); // Iestatiet teksta izmēru display.setTextColor (WHITE); // iestatīt LCD krāsu displeju.setCursor (30, 0); // Iestatīt kursora pozīcijas display.println ("AD9833"); // Izdrukājiet šo teksta displeju.setCursor (17, 20); // Iestatīt kursora pozīcijas display.println ("Funkcija"); // Izdrukājiet šo tekstu display.setCursor (13, 40); // Iestatīt kursora pozīciju display.println ("Ģenerators"); // Izdrukājiet šo teksta display.display (); // Atjaunināt displeja aizkavi (2000); // 2 SEC update_display () aizkavēšanās; // Zvana update_display funkcija}
Tālāk mums ir funkcija loop (), visas galvenās funkcijas ir ierakstītas cilpas sadaļā.
Pirmkārt, mēs nolasījām Rotary kodētāja pulksteņa tapu un saglabājam to mainītajā clockPin mainītajā. Pēc tam if paziņojumā mēs pārbaudām, vai tapas iepriekšējā vērtība un tapas pašreizējā vērtība ir līdzīga, vai arī mēs pārbaudām arī tapas pašreizējo vērtību. Ja tas viss ir taisnība, mēs pārbaudām, lai datu pin, ja taisnība, ka līdzekļi kodētājs griežas pretēji pulksteņrādītāja un mēs samazināšanās counter vērtību ar palīdzību counter-- komandu. Citādi mēs palielinām skaitītāja vērtību ar komandu counter ++. Visbeidzot, mēs ievietojam vēl vienu if paziņojumu, lai iestatītu minimālo vērtību 1. Pēc tam mēs atjauninām clockPinState ar pašreizējo clockPinvērtība turpmākai izmantošanai.
void loop () {clockPin = digitalRead (CLK_PIN); if (clockPin! = clockPinState && clockPin == 1) {if (digitalRead (DATA_PIN)! = clockPin) {skaitītājs -; } else {counter ++; // Kodētājs rotē CW tā pieaugumu} if (skaitītājs <1) skaitītājs = 1; Serial.println (skaitītājs); update_display (); }
Pēc tam mums ir kods, lai noteiktu pogas nospiešanu. Šajā sadaļā mēs esam noteikuši pogu kodētāja iekšpusē, izmantojot dažus ligzdotus if paziņojumus, ja (digitalRead (BTN_PIN) == LOW && millis () - laiks> denonsēt), šajā paziņojumā vispirms pārbaudām, vai poga tapa ir zema vai nav, ja tā ir zema, tad tā ir nospiesta Tad atkal mēs pārbaudām taimera vērtību ar atlēciena aizkavi, ja abi apgalvojumi ir patiesi, tad mēs to pasludinām par veiksmīgu pogas nospiešanas darbību, ja tā mēs palielinām vērtību encoder_btn_count. Pēc tam mēs paziņojam vēl vienu if paziņojumu, lai iestatītu maksimālo skaitītāja vērtību 2, mums tas ir nepieciešams, jo mēs to izmantojam, lai iestatītu izejas viļņu formu.Trīs secīgi, ja apgalvojumi to dara, ja vērtība ir nulle, tiek izvēlēta sinusa viļņu forma, ja tā ir viena, tā ir kvadrātveida vilnis, un, ja vērtība ir 2, tas ir trīsstūrveida vilnis. Visos trijos no šiem if paziņojumiem mēs atjauninām displeju ar funkciju update_display () . Un visbeidzot, mēs atjauninām laika mainīgo ar pašreizējo taimera skaitītāja vērtību.
// Ja mēs konstatējam LOW signālu, poga tiek nospiesta, ja (digitalRead (BTN_PIN) == LOW && millis () - laiks> debounce) {encoder_btn_count ++; // Palieliniet vērtības, ja (kodētāja_btn_skaitlis> 2) //, ja vērtība ir lielāka par 2, atiestatiet to uz 0 {kodētāja_btn_skaits = 0; } if (kodētāja_btn_skaits == 0) {// ja vērtība ir 0, tiek izvēlēts sinusoidāls waveSelect = "SIN"; // atjauniniet virknes mainīgo ar sin vērtību update_display (); // atjauniniet displeju} if (kodētāja_btn_skaitījums == 1) {// ja vērtība ir 1 kvadrātveida vilnis, ir atlasīts waveSelect = "SQR"; // atjaunināt virknes mainīgo ar SQR vērtību update_display (); // atjauniniet displeju} if (kodētāja_btn_skaitījums == 2) {// ja vērtība ir 1 Atlasīts trīsstūrveida vilnis waveSelect = "TRI"; // atjaunināt virknes mainīgo ar TRI vērtību update_display ();// displeja atjaunināšana} laiks = milis (); // atjaunināt laika mainīgo}
Tālāk mēs definējam visu nepieciešamo kodu, kas nepieciešams visu pogu iestatīšanai ar atlēciena aizkavi. Tā kā pogas ir savienotas ar Arduino analogajām tapām, mēs izmantojam analogās lasīšanas komandu, lai identificētu pogas nospiešanu, ja analogās nolasīšanas vērtība sasniedz zemāku par 30, tad mēs konstatējam veiksmīgu pogas nospiešanu un gaidām 200 ms pārbaudiet, vai tas ir faktiskais pogas nospiešana vai tikai troksnis. Ja šis apgalvojums ir patiess, mēs piešķiram loģiskos mainīgos ar vērtībām, kas tiek izmantotas, lai iestatītu funkciju ģeneratora Hz, Khz un Mhz vērtības. Pēc tam mēs atjauninām displeju un atjauninām laika mainīgo. Mēs to darām visām četrām pogām, kas savienotas ar Arduino.
ja (analogRead (SET_FREQUENCY_HZ) <30 && milis () - laiks> debounce) {set_frequency_hz = 1; // atjaunināt Būla vērtības set_frequency_khz = 0; set_frequency_mhz = 0; update_display (); // atjaunināt displeja laiku = milis (); // atjaunināt laika mainīgo} if (analogRead (SET_FREQUENCY_KHZ) <30 && millis () - laiks> debounce) {set_frequency_hz = 0; // atjaunināt Būla vērtības set_frequency_khz = 1; set_frequency_mhz = 0; moduleFrequency = skaitītājs * 1000; update_display (); // atjaunināt displeja laiku = milis (); // atjaunināt laika mainīgo} if (analogRead (SET_FREQUENCY_MHZ) <30 && millis () - laiks> debounce) {// pārbaudīt analogo tapu ar atlēciena aizkavi set_frequency_hz = 0; // atjaunināt Būla vērtības set_frequency_khz = 0; kopas_frekvences_mhz = 1; moduleFrequency = skaitītājs * 1000000; update_display ();// atjauniniet displeja laiku = milis (); // atjauniniet laika mainīgo}, ja (analogRead (ENABLE_DISABLE_OUTPUT_PIN) <30 && millis () - laiks> debounce) {// pārbaudiet analogo tapu ar atcelšanas aizkavi btn_state =! btn_state; // Apgrieziet pogas stāvokļa gen.EnableOutput (btn_state); // Iespējot / atspējot funkciju ģeneratora izvadi atkarībā no pogas stāvokļa update_display (); // atjaunināt displeja laiku = milis (); // atjaunināt laika mainīgo}}// atjaunināt laika mainīgo}}// atjaunināt laika mainīgo}}
Visbeidzot, mums ir funkcija update_display (). Šajā funkcijā mēs izdarījām daudz vairāk nekā tikai atjauninot šo displeju, jo noteiktu displeja daļu nevar atjaunināt OLED. Lai to atjauninātu, jums tas jāpārkrāso ar jaunām vērtībām. Tas padara kodēšanas procesu daudz grūtāku.
Šīs funkcijas iekšpusē mēs sākam ar displeja notīrīšanu. Tālāk mēs iestatījām nepieciešamo teksta lielumu. Pēc tam mēs iestatām kursoru un izdrukāto funkciju ģeneratoru ar display.println ("Funkcijas funkcija"); komandu. Mēs atkal iestatījām teksta lielumu uz 2 un kursoru uz (0,20), izmantojot funkciju display.setCursor (0, 20).
Šeit mēs izdrukājam informāciju par to, kāds tas ir.
display.clearDisplay (); // Vispirms notīriet displeja display.setTextSize (1); // iestatiet teksta izmēru display.setCursor (10, 0); // Iestatīt kursora pozīcijas display.println ("Funkciju ģenerators"); // izdrukāt teksta display.setTextSize (2); // iestatīt teksta lielumu display.setCursor (0, 20); // iestatīt kursora pozīciju
Pēc tam mēs pārbaudām loģiskos mainīgos, lai iegūtu informāciju par frekvenci, un atjauninām vērtību mainīgā moduleFrequency. Mēs to darām Hz, kHz un MHz vērtībām. Pēc tam mēs pārbaudām mainīgo waveSelect un identificējam, kurš vilnis ir izvēlēts. Tagad mums ir vērtības, lai iestatītu viļņa tipu un frekvenci.
if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// pārbaudiet, vai ir nospiesta frekvences iestatīšanas poga Hz moduleFrequency = counter; // atjaunināt moduliFrekvences mainīgais ar pašreizējo skaitītāja vērtību} ja (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {// pārbaudiet, vai ir nospiesta frekvences iestatīšanas poga KHz moduleFrequency = counter * 1000; // atjauniniet moduļa Frequency mainīgo ar pašreizējo skaitītāja vērtību, bet mēs reizinām 1000, lai to iestatītu uz KHZ} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {// pārbaudiet, vai tiek nospiesta frekvences MHz iestatīšanas poga moduleFrequency = skaitītājs * 1000000; if (modulisFrekvence> 12000000) {modulisFrekvence = 12000000;// neļaujiet frekvencei būt rīvētai, ka 12Mhz skaitītājs = 12; }} if (waveSelect == "SIN") {// Ir atlasīts sinusa vilnis display.println ("SIN"); gen.ApplySignal (SINE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "SQR") {// Atlasīts Sqr vilnis display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Ir izvēlēts tri vilnis display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // atjauniniet moduli AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Atlasīts Sqr vilnis display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Ir izvēlēts tri vilnis display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // atjauniniet moduli AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Atlasīts Sqr vilnis display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Ir izvēlēts tri vilnis display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // atjauniniet moduli AD9833. Serial.println (moduleFrequency); }
Mēs atkal iestatām kursoru un atjauninām skaitītāja vērtības. Atkal mēs pārbaudām būla vērtību, lai displejā atjauninātu frekvenču diapazonu, mums tas jādara, jo OLED darbības princips ir ļoti dīvains.
display.setCursor (45, 20); display.println (skaitītājs); // displejā izdrukājiet skaitītāja informāciju. ja (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Hz"); // drukāt Hz displeja displejā.display (); // kad visi iestatījumi atjaunina displeju} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Khz"); display.display (); // kad visi iestatījumi atjaunina displeju} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setCursor (90, 20); display.println ("Mhz"); display.display (); // kad visi iestatījumi atjaunina displeju}
Pēc tam mēs pārbaudām pogas nospiešanas mainīgo, lai izdrukātu izvadi / izvadītu uz OLED. Atkal tas jādara OLED moduļa dēļ.
if (btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output ON"); // drukāt izvadi uz displeja displeja.display (); display.setTextSize (2); } else {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output OFF"); // izdrukāt izvadi uz displeja displeju.display (); display.setTextSize (2); }
Tas iezīmē mūsu kodēšanas procesa beigas. Ja šajā brīdī esat nesaprašanā, lai to saprastu, varat pārbaudīt komentārus kodā.
Uz AD9833 bāzes funkciju ģeneratora pārbaude
Lai pārbaudītu ķēdi, tiek izmantota iepriekšminētā iestatīšana. Kā redzat, mēs esam pievienojuši 12 V līdzstrāvas adapteri līdzstrāvas mucas ligzdai un pievienojuši Hantek osciloskopu ķēdes izejai. Esam arī savienojuši osciloskopu ar klēpjdatoru, lai vizualizētu un izmērītu izejas frekvenci.
Kad tas tika izdarīts, ar rotējošā kodētāja palīdzību mēs iestatījām izejas frekvenci uz 5Khz, un mēs pārbaudām izejas sinusoidālo viļņu un pārliecinieties, ka tas ir 5Khz sinusoidāls pie izejas.
Pēc tam mēs esam mainījuši izejas viļņu formu uz trīsstūra viļņu, bet frekvence palika nemainīga, izejas viļņu forma ir parādīta zemāk.
Tad mēs izmainījām izvadi uz kvadrātveida vilni un novērojām izvadi, un tas bija ideāls kvadrātveida vilnis.
Mēs arī mainījām frekvenču diapazonus un pārbaudījām izvadi, un tas darbojās labi.
Turpmākie uzlabojumi
Šī shēma ir tikai koncepcijas pierādījums, un tai ir vajadzīgi turpmāki uzlabojumi. Pirmkārt, izejai mums ir nepieciešams labas kvalitātes PCB un labs BNC savienotājs, pretējā gadījumā mēs nevaram iegūt augstāku frekvenci. Moduļa amplitūda ir ļoti zema, tāpēc, lai to uzlabotu, mums ir nepieciešamas dažas op-amp shēmas, lai pastiprinātu izejas spriegumu. Var mainīt potenciometru, lai mainītu izejas amplitūdu. Var pieslēgt slēdzi signāla kompensēšanai; tā ir arī obligāta funkcija. Un tālāk kods ir daudz jāuzlabo, jo tas ir nedaudz kļūdains. Visbeidzot, OLED displeji ir jāmaina, pretējā gadījumā nav iespējams uzrakstīt viegli saprotamu kodu.
Tas iezīmē šīs apmācības beigas, es ceru, ka jums patika raksts un uzzinājāt kaut ko jaunu. Ja jums ir kādi jautājumi par rakstu, varat tos atstāt zemāk esošajā komentāru sadaļā vai arī izmantot mūsu elektronikas forumu.