- Co je to generátor funkcí DDS?
- Pochopte fungování IC generátoru funkcí AD9833
- Komponenty potřebné k sestavení generátoru funkcí založeného na AD9833
- Generátor funkcí založený na AD9833 - schematický diagram
- Generátor funkcí založený na AD9833 - Arduino kód
- Testování generátoru funkcí založeného na AD9833
- Další vylepšení
Pokud jste elektronický nadšenec jako já, který se chce vyladit pomocí různých elektronických obvodů, mít slušný generátor funkcí se někdy stává povinným. Ale vlastnit jeden je problém, protože takové základní vybavení může stát jmění. Budování vlastního zkušebního zařízení je nejen levnější, ale také skvělý způsob, jak zlepšit své znalosti.
V tomto článku tedy budeme stavět jednoduchý generátor signálu s modulem generátoru funkcí Arduino a AD9833 DDS, který může produkovat sinusové, čtvercové a trojúhelníkové vlny s maximální frekvencí 12 MHz na výstupu. A nakonec otestujeme výstupní frekvenci pomocí našeho osciloskopu.
Dříve jsme pomocí základních analogových obvodů postavili generátor jednoduchých sinusových vln, generátor hranatých vln a generátor trojúhelníkových vln. Můžete je zkontrolovat, pokud hledáte nějaké základní obvody generátoru vln. Také, pokud chcete vytvořit levnější generátor funkcí Arduino bez použití modulu AD9833, můžete si prohlédnout projekt DIY Arduino Waveform Generator Project.
Co je to generátor funkcí DDS?
Jak název napovídá, generátor funkcí je zařízení, které může při nastavení vydávat konkrétní tvar vlny se specifickou frekvencí. Vezměme si například, že máte LC filtr, u kterého chcete otestovat výstupní kmitočtovou odezvu, což můžete snadno udělat pomocí generátoru funkcí. Vše, co musíte udělat, je nastavit požadovanou výstupní frekvenci a tvar vlny, poté ji můžete kliknout dolů nebo nahoru, abyste otestovali odezvu. To byl jen jeden příklad, můžete s ním dělat více věcí, jak bude seznam pokračovat.
DDS je zkratka pro Direct Digital Synthesis. Jedná se o typ generátoru vln, který používá digitální a analogové převodníky (DAC) k vytváření signálu od základu. Tato metoda se konkrétně používá ke generování sinusové vlny. Ale IC, který používáme, může produkovat signály čtvercové nebo trojúhelníkové vlny. Operace, ke kterým došlo uvnitř čipu DDS, jsou digitální, takže mohou velmi rychle přepínat frekvenci nebo velmi rychle přepínat z jednoho signálu na druhý. Toto zařízení má jemné frekvenční rozlišení se širokým frekvenčním spektrem.
Pochopte fungování IC generátoru funkcí AD9833
Srdcem našeho projektu je programovatelný generátor vlnových tvarů AD9833, který je navržen a vyvinut pomocí analogových zařízení. Jedná se o programovatelný generátor vln s nízkým výkonem, který je schopen generovat sinusové, trojúhelníkové a čtvercové vlny s maximální frekvencí 12 MHz. Je to velmi jedinečný integrovaný obvod, který je schopen změnit výstupní frekvenci a fázi pouze pomocí softwarového programu. Má 3vodičové rozhraní SPI, a proto je komunikace s tímto IC velmi jednoduchá a snadná. Níže je uveden funkční blokový diagram tohoto integrovaného obvodu.
Práce tohoto IC je velmi jednoduchá. Pokud se podíváme na funkční blokové schéma výše, zjistíme, že máme fázový akumulátor, jehož úkolem je ukládat všechny možné digitální hodnoty sinusové vlny, počínaje od 0 do 2π. Dále máme SIN ROM, jehož úkolem je převést informace o fázi, které lze později přímo mapovat na amplitudu. SIN ROM používá informace o digitální fázi jako adresu vyhledávací tabulky a převádí informace o fázi na amplitudu. A konečně máme 10bitový digitálně-analogový převodník, jehož úkolem je přijímat digitální data ze SIN ROM a převádět je na odpovídající analogová napětí, to je to, co získáváme z výstupu. Na výstupu máme také přepínač, který můžeme zapnout nebo vypnout pomocí malého softwarového kódu. O tom si povíme později v článku.Podrobnosti, které vidíte výše, jsou velmi ořezanou verzí toho, co se děje uvnitř IC, a většina podrobností, které vidíte výše, je převzata z datového listu AD9833, můžete si také prohlédnout další informace.
Komponenty potřebné k sestavení generátoru funkcí založeného na AD9833
Níže jsou uvedeny komponenty potřebné k sestavení funkčního generátoru založeného na AD9833, tento obvod jsme navrhli s velmi obecnými komponentami, což velmi usnadňuje proces replikace.
- Arduino Nano - 1
- Generátor funkcí AD9833 DDS - 1
- 128 X 64 OLED displej - 1
- Obecný rotační kodér - 1
- DC hlaveň Jack - 1
- Regulátor napětí LM7809 - 1
- 470uF kondenzátor - 1
- Kondenzátor 220uF - 1
- Kondenzátor 104pF - 1
- 10K rezistor - 6
- Taktilní spínače - 4
- Šroubová svorka 5,04 mm - 1
- Ženský záhlaví - 1
- 12V zdroj energie - 1
Generátor funkcí založený na AD9833 - schematický diagram
Kompletní schéma zapojení pro AD9833 a generátor funkcí na bázi Arduino je uvedeno níže.
Budeme používat AD9833 s Arduino pro generování naší požadované frekvence. A v této části vysvětlíme všechny podrobnosti pomocí schématu; dovolte mi, abych vám poskytl krátký přehled toho, co se děje s obvodem. Začněme s modulem AD9833. Modul AD9833 je modul generátoru funkcí a je připojen k Arduinu podle schématu. K napájení obvodu používáme IC regulátor napětí LM7809 se slušným oddělovacím kondenzátorem, což je nezbytné, protože šum napájení může interferovat s výstupním signálem, což vede k nežádoucímu výstupu. Arduino jako vždy funguje jako mozek pro tento projekt. Pro zobrazení nastavené frekvence a dalších cenných informací jsme připojili OLED zobrazovací modul 128 X 64. Pro změnu frekvenčního rozsahu používáme tři přepínače. První nastaví frekvenci na Hz, druhá nastaví výstupní frekvenci na KHz a třetí nastaví frekvenci na MHz, máme také další tlačítko, kterým lze povolit nebo zakázat výstup. Konečně máme rotační kodér,a musíme s ním připojit nějaký pull-up rezistor, jinak tyto přepínače nebudou fungovat, protože kontrolujeme událost stisknutí tlačítka na metodě sdružování. Rotační kodér se používá ke změně frekvence a hmatový spínač uvnitř rotačního kodéru se používá k výběru nastaveného tvaru vlny.
Generátor funkcí založený na AD9833 - Arduino kód
Celý kód použitý v tomto projektu najdete ve spodní části této stránky. Po přidání požadovaných záhlaví a zdrojových souborů byste měli být schopni přímo kompilovat soubor Arduino. Knihovnu ad9833 Arduino a další knihovny si můžete stáhnout z níže uvedeného odkazu, jinak můžete knihovnu nainstalovat pomocí metody správce desky.
- Stáhněte si knihovnu AD9833 od Billa Williamse
- Stáhněte si knihovnu SSD1306 OLED od společnosti Adafruit
- Stáhněte si knihovnu Adafruit GFX
Vysvětlení kódu v ino. soubor je následující. Nejprve začneme zahrnutím všech požadovaných knihoven. Za knihovnou modulu AD9833 DDS nejprve následuje knihovna pro OLED a pro některé naše výpočty je vyžadována matematická knihovna.
#include // Knihovna pro modul AD9833 #include
Dále definujeme všechny potřebné vstupní a výstupní piny pro tlačítka, přepínač, rotační kodér a OLED.
#define SCREEN_WIDATA_PINH 128 // OLED šířka displeje v pixelech #define SCREEN_HEIGHT 64 // výška OLED displeje, v pixelech #define SET_FREQUENCY_HZ A2 // tlačítko pro nastavení frekvence v Hz #define SET_FREQUENCY_KHZ A3 // tlačítko pro nastavení frekvence v KhzF A6 // Tlačítko pro nastavení frekvence v Mhz #define ENABLE_DISABLE_OUTPUT_PIN A7 // Tlačítko pro zapnutí / vypnutí výstupu #define FNC_PIN 4 // Fsync vyžadováno modulem AD9833 #define CLK_PIN 8 // Pin hodin kodéru #define DATA_PIN 7 / / Datový kolík kodéru #define BTN_PIN 9 // Interní tlačítko na kodéru
Poté definujeme všechny potřebné proměnné, které jsou v tomto kódu vyžadovány. Nejprve definujeme celočíselné proměnné počítadlo, které uloží hodnotu rotačního kodéru. Další dvě proměnné clockPin a clockPinState ukládají sochu kolíku, která je nutná k pochopení směru kodéru. Máme časovou proměnnou, která obsahuje aktuální hodnoty časovače a čítače, tato proměnná se používá pro odskakování tlačítek. Dále máme nepodepsanou dlouhou proměnnou moduleFrequency, která drží vypočítanou frekvenci, která bude použita. Dále máme zpoždění debounce. Toto zpoždění lze upravit podle potřeby. Dále máme tři booleovské proměnné set_frequency_hz,set_frequency_Khz a set_frequency_Mhz tyto tři proměnné slouží k určení aktuálního nastavení modulu. Podrobněji o tom budeme hovořit dále v článku. Dále máme proměnnou, která ukládá stav výstupního průběhu, výchozí výstupní průběh je sinusový průběh. A konečně máme proměnnou encoder_btn_count, která drží počet tlačítek kodéru, který se používá k nastavení výstupního průběhu.
int counter = 1; // Tato hodnota počitadla se zvýší nebo sníží, pokud je otočný kodér otočen v clockPin; // Zástupný symbol stavu kolíku používaný rotačním kodérem int clockPinState; // Zástupný symbol stavu kolíku používaný rotačním kodérem unsigned long time = 0; // Používá se k odhalení nepodepsaného dlouhého modulu Frekvence; // slouží k nastavení výstupní frekvence long debounce = 220; // Zpoždění debounce bool btn_state; // slouží k povolení deaktivace výstupu modulu AD98333 bool set_frequency_hz = 1; // Výchozí frekvence modulu AD9833 bool set_frequency_khz; bool set_frequency_mhz; String waveSelect = "SIN"; // Startup waveform of the module int encoder_btn_count = 0; // slouží ke kontrole tlačítka kodéru stiskněte Další, máme dva objekty, jeden je pro OLED displej a druhý pro modul AD9833.Adafruit_SSD1306 display (SCREEN_WIDATA_PINH, SCREEN_HEIGHT, & Wire, -1); AD9833 gen (FNC_PIN);
Dále máme funkci setup (), v této funkci nastavení začneme povolením Serial pro ladění. Modul AD9833 inicializujeme pomocí metody begin (). Dále nastavíme všechny přiřazené piny rotačního kodéru jako Vstup. A ukládáme hodnotu hodinového kolíku do proměnné clockPinState, to je nezbytný krok pro rotační kodér.
Dále nastavíme všechny piny tlačítek jako vstup a pomocí metody display.begin () povolíme OLED displej a také zkontrolujeme případné chyby pomocí příkazu if . Když je to hotové, vyčistíme displej a vytiskneme úvodní úvodní obrazovku, přidáme zpoždění 2 sekundy, což je také zpoždění úvodní obrazovky, a nakonec zavoláme funkci update_display (), která vymaže obrazovku a aktualizuje znovu zobrazit. Podrobnosti metody update_display () budou popsány dále v článku.
void setup () {Serial.begin (9600); // Povolit Serial @ 9600 baud gen.Begin (); // MUSÍ to být první příkaz po deklaraci objektu AD9833 pinMode (CLK_PIN, INPUT); // Nastavení pinů jako vstupních pinMode (DATA_PIN, INPUT); pinMode (BTN_PIN, INPUT_PULLUP); clockPinState = digitalRead (CLK_PIN); pinMode (SET_FREQUENCY_HZ, INPUT); // Nastavení pinů jako vstupních pinMode (SET_FREQUENCY_KHZ, INPUT); pinMode (SET_FREQUENCY_MHZ, INPUT); pinMode (ENABLE_DISABLE_OUTPUT_PIN, INPUT); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Adresa 0x3D pro 128x64 Serial.println (F ("alokace SSD1306 selhala")); pro (;;); } display.clearDisplay (); // Vymazání obrazovky display.setTextSize (2); // Nastavit velikost textu display.setTextColor (WHITE); // nastavení barevného LCD displeje. setCursor (30, 0); // Nastavit pozici kurzoru display.println ("AD9833"); // Vytiskne tento textový displej.setCursor (17, 20); // Nastavit pozici kurzoru display.println ("Funkce"); // Vytiskněte tento text display.setCursor (13, 40); // Nastavit pozici kurzoru display.println ("Generátor"); // Vytiskněte tento text display.display (); // Aktualizace zpoždění displeje (2000); // Zpoždění 2 SEC update_display (); // Volání funkce update_display}
Dále máme funkci loop (), všechny hlavní funkce jsou zapsány v sekci loop.
Nejprve si přečteme pin hodin rotačního kodéru a uložíme jej do proměnné clockPin, kterou jsme dříve deklarovali. Dále v příkazu if zkontrolujeme, zda je předchozí hodnota kolíku a aktuální hodnota kolíku podobná nebo ne, a také zkontrolujeme aktuální hodnotu kolíku. Pokud je to všechno pravda, zkontrolujeme datový kolík, pokud je to pravda, znamená to, že se kodér otáčí proti směru hodinových ručiček a pomocí příkazu counter-- snižujeme hodnotu čítače. Jinak zvýšíme hodnotu čítače příkazem counter ++. Nakonec vložíme další příkaz if k nastavení minimální hodnoty na 1. Dále aktualizujeme clockPinState s aktuálním clockPinhodnota pro budoucí použití.
void loop () {clockPin = digitalRead (CLK_PIN); if (clockPin! = clockPinState && clockPin == 1) {if (digitalRead (DATA_PIN)! = clockPin) {counter -; } else {counter ++; // Kodér otáčí CW, takže se zvyšuje} if (counter <1) counter = 1; Serial.println (čítač); update_display (); }
Dále máme náš kód pro detekci stisknutí tlačítka. V této části jsme detekovali tlačítko uvnitř kodéru pomocí některých vnořených příkazů if, if (digitalRead (BTN_PIN) == LOW && millis () - time> denounce), v tomto prohlášení nejprve zkontrolujeme, zda tlačítko pin je nízký nebo ne, pokud je nízký, pak je stisknutý. Pak znovu zkontrolujeme hodnotu časovače se zpožděním debounce, pokud jsou oba příkazy pravdivé, pak ji deklarujeme jako úspěšnou akci stisknutí tlačítka, pokud tak zvýšíme hodnotu encoder_btn_count. Dále deklarujeme další if, abychom nastavili maximální hodnotu čítače na 2, potřebujeme ji, protože ji používáme k nastavení výstupního průběhu.Po sobě jdoucí tři příkazy if, pokud je hodnota nula, je vybrán sinusový průběh, pokud je jeden, je to obdélníková vlna a pokud je hodnota 2, je to trojúhelníková vlna. Ve všech třech těchto příkazech if aktualizujeme zobrazení pomocí funkce update_display () . A nakonec aktualizujeme časovou proměnnou s aktuální hodnotou čítače časovače.
// Pokud zjistíme NÍZKÝ signál, stiskne se tlačítko if (digitalRead (BTN_PIN) == LOW && millis () - čas> debounce) {encoder_btn_count ++; // Zvýšení hodnot if (encoder_btn_count> 2) // pokud je hodnota větší než 2 reset na 0 {encoder_btn_count = 0; } if (encoder_btn_count == 0) {// pokud je hodnota 0 je vybrána sinusová vlna waveSelect = "SIN"; // aktualizuje řetězcovou proměnnou o hodnotu sin update_display (); // aktualizovat zobrazení} if (encoder_btn_count == 1) {// pokud je vybrána hodnota 1 obdélníková vlna je vybrána waveSelect = "SQR"; // aktualizuje proměnnou řetězce hodnotou SQR update_display (); // aktualizovat zobrazení} if (encoder_btn_count == 2) {// pokud je hodnota 1 Je vybrána trojúhelníková vlna waveSelect = "TRI"; // aktualizuje proměnnou řetězce hodnotou TRI update_display ();// aktualizovat displej} time = millis (); // aktualizace časové proměnné}
Dále definujeme veškerý potřebný kód, který je vyžadován pro nastavení všech tlačítek se zpožděním odskoku. Jelikož jsou tlačítka připojena k analogovým pinům Arduina, používáme příkaz analogového čtení k identifikaci stisknutí tlačítka, pokud hodnota analogového čtení dosáhne pod 30, poté detekujeme jeho úspěšné stisknutí tlačítka a počkáme na 200 ms do zkontrolujte, zda se jedná o skutečné stisknutí tlačítka nebo pouze zvuk. Pokud je toto tvrzení pravdivé, přiřadíme logickým proměnným hodnoty, které se používají k nastavení hodnot Hz, Khz a Mhz generátoru funkcí. Dále aktualizujeme displej a aktualizujeme časovou proměnnou. Děláme to pro všechna čtyři tlačítka spojená s Arduino.
if (analogRead (SET_FREQUENCY_HZ) <30 && millis () - čas> debounce) {set_frequency_hz = 1; // aktualizovat booleovské hodnoty set_frequency_khz = 0; set_frequency_mhz = 0; update_display (); // aktualizovat čas zobrazení = millis (); // aktualizovat časovou proměnnou} if (analogRead (SET_FREQUENCY_KHZ) <30 && millis () - čas> debounce) {set_frequency_hz = 0; // aktualizovat booleovské hodnoty set_frequency_khz = 1; set_frequency_mhz = 0; moduleFrequency = counter * 1000; update_display (); // aktualizovat čas zobrazení = millis (); // aktualizovat časovou proměnnou} if (analogRead (SET_FREQUENCY_MHZ) <30 && millis () - čas> debounce) {// zkontrolovat analogový pin se zpožděním debounce set_frequency_hz = 0; // aktualizovat booleovské hodnoty set_frequency_khz = 0; set_frequency_mhz = 1; moduleFrequency = counter * 10 000 000; update_display ();// aktualizovat čas zobrazení = millis (); // aktualizovat časovou proměnnou} if (analogRead (ENABLE_DISABLE_OUTPUT_PIN) <30 && millis () - čas> debounce) {// zkontrolovat analogový pin se zpožděním debounce btn_state =! btn_state; // Invertovat stav tlačítka gen.EnableOutput (btn_state); // Povolit / Zakázat výstup generátoru funkcí v závislosti na stavu tlačítka update_display (); // aktualizovat čas zobrazení = millis (); // aktualizovat časovou proměnnou}}// aktualizace časové proměnné}}// aktualizace časové proměnné}}
Konečně máme naši funkci update_display (). V této funkci jsme udělali mnohem víc než jen aktualizaci tohoto displeje, protože určitou část displeje nelze aktualizovat v OLED. Chcete-li jej aktualizovat, musíte jej překreslit novými hodnotami. Díky tomu je proces kódování mnohem obtížnější.
Uvnitř této funkce začneme vymazáním displeje. Dále nastavíme požadovanou velikost textu. Poté nastavíme náš kurzor a vytiskneme Generátor funkcí pomocí display.println ("Funkce funkce"); příkaz. Znovu jsme nastavili velikost textu na 2 a kurzor na (0,20) pomocí funkce display.setCursor (0, 20).
Tady vytiskneme informace o vlně.
display.clearDisplay (); // PRVNÍ vymazání displeje display.setTextSize (1); // nastavení textu Velikost display.setCursor (10, 0); // Nastavit pozici kurzoru display.println ("Generátor funkcí"); // tisk textu display.setTextSize (2); // nastavení textu Velikost display.setCursor (0, 20); // nastavení pozice kurzoru
Dále zkontrolujeme boolean proměnné pro podrobnosti frekvence a aktualizujeme hodnotu v proměnné moduleFrequency. Děláme to pro hodnoty Hz, kHz a MHz. Dále zkontrolujeme proměnnou waveSelect a určíme, která vlna je vybrána. Nyní máme hodnoty pro nastavení typu vlny a frekvence.
if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// zkontrolujte, zda je stisknuto tlačítko pro nastavení frekvence v Hz moduleFrequency = counter; // aktualizujte proměnnou moduleFrequency o aktuální hodnotu čítače} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {// zkontrolujte, zda je stisknuto tlačítko pro nastavení frekvence v KHz moduleFrequency = counter * 1000; // aktualizujte proměnnou moduleFrequency o aktuální hodnotu čítače, ale vynásobíme 1000 a nastavíme ji na KHZ} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {// zkontrolujte, zda je stisknuto tlačítko pro nastavení frekvence v MHz = počitadlo * 10 000 000; if (moduleFrequency> 12000000) {moduleFrequency = 12000000;// nedovolte, aby frekvence byla strate, že 12Mhz counter = 12; }} if (waveSelect == "SIN") {// Je vybrána sinusová vlna display.println ("SIN"); gen.ApplySignal (SINE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "SQR") {// Je vybrána vlna Sqr display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri wave is selected display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // aktualizovat modul AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Je vybrána vlna Sqr display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri wave is selected display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // aktualizovat modul AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Je vybrána vlna Sqr display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri wave is selected display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // aktualizovat modul AD9833. Serial.println (moduleFrequency); }
Znovu nastavíme kurzor a aktualizujeme hodnoty čítače. Znovu zkontrolujeme boolean, abychom aktualizovali frekvenční rozsah na displeji, musíme to udělat, protože pracovní princip OLED je velmi divný.
display.setCursor (45, 20); display.println (čítač); // vytiskne informace o počitadle na displej. if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Hz"); // tisk Hz na displeji display.display (); // when all set update the display} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Khz"); display.display (); // when all set update the display} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setCursor (90, 20); display.println ("Mhz"); display.display (); // když vše nastaví aktualizaci displeje}
Dále zkontrolujeme proměnnou stisknutí tlačítka, aby se výstup tisku zapnul / vypnul na OLED. To je opět nutné udělat kvůli modulu OLED.
if (btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print ("Výstup ZAPNUTÝ"); // tiskový výstup na displej display.display (); display.setTextSize (2); } else {display.setTextSize (1); display.setCursor (65, 45); display.print ("Výstup vypnut"); // tiskový výstup vypnut na displej display.display (); display.setTextSize (2); }
To znamená konec našeho procesu kódování. Pokud jste v tomto okamžiku zmatení, můžete pro další porozumění zkontrolovat komentáře v kódu.
Testování generátoru funkcí založeného na AD9833
Pro testování obvodu se používá výše uvedené nastavení. Jak vidíte, připojili jsme napájecí adaptér 12V DC k jacku DC barelu a připojili jsme Hantek Osciloskop k výstupu obvodu. Také jsme připojili osciloskop k notebooku pro vizualizaci a měření výstupní frekvence.
Jakmile to bylo provedeno, nastavili jsme pomocí rotačního kodéru výstupní frekvenci na 5Khz a otestovali jsme výstupní sinusovou vlnu a zajisté, je to 5kHz sinusová vlna na výstupu.
Dále jsme změnili výstupní křivku na trojúhelníkovou vlnu, ale frekvence zůstala stejná, výstupní křivka je uvedena níže.
Potom jsme změnili výstup na obdélníkovou vlnu a pozorovali jsme výstup a byla to dokonalá obdélníková vlna.
Také jsme změnili frekvenční rozsahy a otestovali výstup a fungoval dobře.
Další vylepšení
Tento obvod je pouze důkazem koncepce a vyžaduje další vylepšení. Nejprve potřebujeme kvalitní PCB a nějaký kvalitní BNC konektor pro výstup, jinak nemůžeme získat vyšší frekvenci. Amplituda modulu je velmi nízká, takže abychom to vylepšili, potřebujeme nějaké obvody operačních zesilovačů pro zesílení výstupního napětí. Lze připojit potenciometr, který mění výstupní amplitudu. Lze připojit spínač pro vyrovnání signálu; to je také funkce, kterou musíte mít. A dále, kód potřebuje hodně vylepšení, protože je trochu buggy. Nakonec je třeba změnit OLED displeje, jinak není možné napsat snadno srozumitelný kód.
Tímto tutoriál končí, doufám, že se vám článek líbil a dozvěděli jste se něco nového. Máte-li jakékoli dotazy týkající se článku, můžete je zanechat v sekci komentářů níže nebo můžete použít naše fórum pro elektroniku.