- Що таке генератор функцій DDS?
- Зрозумійте роботу IC-генератора функцій AD9833
- Компоненти, необхідні для побудови генератора функцій на основі AD9833
- Генератор функцій на основі AD9833 - принципова схема
- Генератор функцій на основі AD9833 - код Arduino
- Тестування генератора функцій на основі AD9833
- Подальші вдосконалення
Якщо ви такий електронний ентузіаст, як я, який хоче налаштувати різні електронні схеми, наявність гідного генератора функцій іноді стає обов’язковим. Але володіння ним є проблемою, оскільки таке базове обладнання може коштувати ціле багатство. Створення власного випробувального обладнання - це не тільки дешевше, а й чудовий спосіб вдосконалити свої знання.
Отже, у цій статті ми збираємося створити простий генератор сигналів з модулем генератора функцій DDS Arduino та AD9833, який може створювати на виході синусоїдальні, квадратні та трикутні хвилі з максимальною частотою 12 МГц. І нарешті, ми збираємося перевірити вихідну частоту за допомогою нашого осцилографа.
Раніше ми побудували простий генератор синусоїд, генератор квадратних хвиль та генератор хвиль трикутника за допомогою базових аналогових схем. Ви можете перевірити їх, якщо шукаєте деякі основні схеми генератора сигналів. Крім того, якщо ви хочете створити дешевий генератор функцій Arduino без використання модуля AD9833, ви можете перевірити проект генератора хвильових форм DIY Arduino.
Що таке генератор функцій DDS?
Як випливає з назви, генератор функцій - це пристрій, який може виводити певний сигнал з певною частотою після встановлення. Наприклад, вважаємо, що у вас є LC-фільтр, для якого ви хочете перевірити свою вихідну частотну характеристику, ви можете легко це зробити за допомогою генератора функцій. Все, що вам потрібно зробити, це встановити бажану вихідну частоту та форму хвилі, після чого ви можете прокрутити її вниз або вгору, щоб перевірити реакцію. Це був лише один приклад, з ним можна робити більше речей, коли список триває.
DDS розшифровується як Прямий цифровий синтез. Це тип генератора сигналу, який використовує цифро-аналогові перетворювачі (ЦАП) для формування сигналу з нуля. Цей метод спеціально використовується для генерування синусоїди. Але ІС, яку ми використовуємо, може виробляти квадратичні або трикутні хвильові сигнали. Операції, що відбулися всередині мікросхеми DDS, є цифровими, тому він може дуже швидко перемикати частоту або дуже швидко перемикатися з одного сигналу на інший. Цей пристрій має чітку роздільну здатність по частоті з широким спектром частот.
Зрозумійте роботу IC-генератора функцій AD9833
В основі нашого проекту лежить програмований ІС генератора сигналів AD9833, який розроблений та розроблений аналоговими пристроями. Це програмований генератор сигналу з низькою потужністю, здатний виробляти синусоїдальні, трикутні та квадратні хвилі з максимальною частотою 12 МГц. Це дуже унікальна мікросхема, яка здатна змінювати вихідну частоту і фазу лише за допомогою програмного забезпечення. Він має 3-провідний інтерфейс SPI, тому спілкування з цим мікросхемою стає дуже простим і легким. Функціональна блок-схема цієї ІС наведена нижче.
Робота цієї ІС дуже проста. Якщо ми подивимося на функціональну блок-схему вище, ми помітимо, що у нас є Акумулятор фаз, завданням якого є зберігання всіх можливих цифрових значень синусоїди, починаючи від 0 до 2π. Далі ми маємо SIN ROM, завданням якого є перетворення фазової інформації, яка згодом може бути прямо зіставлена в амплітуду. SIN ROM використовує цифрову інформацію про фазу як адресу до таблиці пошуку та перетворює інформацію про фазу в амплітуду. І нарешті, у нас є 10-розрядний цифро-аналоговий перетворювач, завданням якого є отримання цифрових даних від SIN ROM і перетворення їх у відповідні аналогові напруги, саме це ми отримуємо з виводу. На виході ми також маємо перемикач, який ми можемо вмикати або вимикати лише за допомогою невеликого програмного коду. Про це ми поговоримо далі в статті.Деталі, які ви бачите вище, - це дуже розібрана версія того, що відбувається всередині мікросхеми, і більшість деталей, які ви бачите вище, взяті з таблиці даних AD9833, ви також можете переглянути її для отримання додаткової інформації.
Компоненти, необхідні для побудови генератора функцій на основі AD9833
Компоненти, необхідні для побудови генератора функцій на основі AD9833, перелічені нижче, ми розробили цю схему з дуже загальними компонентами, що робить процес реплікації дуже простим.
- Arduino Nano - 1
- Генератор функцій AD9833 DDS - 1
- 128 X 64 OLED-дисплей - 1
- Загальний поворотний кодер - 1
- Домкрат DC Barrel - 1
- LM7809 Регулятор напруги - 1
- Конденсатор 470 мкФ - 1
- Конденсатор 220 мкФ - 1
- Конденсатор 104pF - 1
- 10K резистор - 6
- Тактильні вимикачі - 4
- Гвинтовий клем 5,04 мм - 1
- Жіночий колонтитул - 1
- Джерело живлення 12 В - 1
Генератор функцій на основі AD9833 - принципова схема
Повна електрична схема AD9833 та генератора функцій на базі Arduino наведена нижче.
Ми збираємося використовувати AD9833 з Arduino для генерації бажаної частоти. І в цьому розділі ми пояснимо всі деталі за допомогою схеми; дозвольте мені дати вам короткий огляд того, що відбувається з ланцюгом. Почнемо з модуля AD9833. Модуль AD9833 є модулем генератора функцій, і він підключений до Arduino відповідно до схеми. Для живлення ланцюга ми використовуємо мікросхему регулятора напруги LM7809 з гідним роз'єднуючим конденсатором, це необхідно, оскільки шум живлення може перешкоджати вихідному сигналу, що призводить до небажаного виходу. Як завжди, Arduino працює як мозок для цього проекту. Щоб відобразити задану частоту та іншу цінну інформацію, ми підключили дисплейний модуль 128 X 64 OLED. Для зміни частотного діапазону ми використовуємо три перемикачі. Перший встановлює частоту на Гц, другий встановлює частоту на виході на КГц, а третій встановлює частоту на МГц, ми також маємо ще одну кнопку, за допомогою якої можна ввімкнути або вимкнути вихід. Нарешті, у нас є поворотний кодер,і ми повинні приєднати до нього якийсь підтягуючий резистор, інакше ці перемикачі не працюватимуть, оскільки ми перевіряємо подію натискання кнопки на методі об’єднання. Поворотний кодер використовується для зміни частоти, а тактильний перемикач всередині поворотного кодера використовується для вибору заданої форми сигналу.
Генератор функцій на основі AD9833 - код Arduino
Повний код, використаний у цьому проекті, можна знайти внизу цієї сторінки. Після додавання необхідних файлів заголовків та вихідних файлів ви зможете безпосередньо скомпілювати файл Arduino. Ви можете завантажити бібліотеку ad9833 Arduino та інші бібліотеки за посиланням, наведеним нижче, або ж ви можете скористатися методом диспетчера плат для встановлення бібліотеки.
- Завантажити бібліотеку AD9833 Білла Вільямса
- Завантажте бібліотеку OLED SSD1306 від Adafruit
- Завантажте бібліотеку Adafruit GFX
Пояснення коду в ino. файл такий. Спочатку ми починаємо з включення всіх необхідних бібліотек. Бібліотека для модуля AD9833 DDS спочатку супроводжується бібліотекою для OLED, а математична бібліотека потрібна для деяких наших обчислень.
#include // Бібліотека для модуля AD9833 #include
Далі ми визначаємо всі необхідні вхідні та вихідні штифти для кнопок, перемикача, поворотного кодера та OLED.
#define SCREEN_WIDATA_PINH 128 // OLED-дисплей Ширина в пікселях #define SCREEN_HEIGHT 64 // OLED-висота дисплея, в пікселях #define SET_FREQUENCY_HZ A2 // Кнопка для встановлення частоти в Гц #define SET_FREQUENCY_KHZ AH // QUOTH_ZH_FHEF_HHF_HEF_HEF_HEF_HZF_HEF_HEF_HEF_HEF_HEF_HEF_HEF_HEF_HEF_HEF_HEF_HEF_QU H A6 // Кнопка для встановлення частоти в МГц #define ENABLE_DISABLE_OUTPUT_PIN A7 // Кнопка для ввімкнення / вимкнення виходу #define FNC_PIN 4 // Fsync, необхідний модулю AD9833 #define CLK_PIN 8 // Clock Pin of the Encoder_PIN 7 / EINATA / Штифт даних кодера #define BTN_PIN 9 // Внутрішня кнопка на кодері
Після цього ми визначаємо всі необхідні змінні, які потрібні в цьому коді. Спочатку ми визначаємо цілочисельний змінний лічильник, який буде зберігати значення поворотного кодера. Наступні дві змінні clockPin і clockPinState зберігають статую штифта, необхідну для розуміння напрямку кодера. У нас є змінна часу, яка містить поточні значення лічильника таймера, ця змінна використовується для зняття з роботи кнопки. Далі ми маємо беззнаковий довгий змінний moduleFrequency, який містить обчислену частоту, яку буде застосовано. Далі ми маємо затримку скасування. Цю затримку можна регулювати за необхідності. Далі ми маємо три логічні змінні set_frequency_hz,set_frequency_Khz та set_frequency_Mhz ці три змінні використовуються для визначення поточного налаштування модуля. Про це ми поговоримо більш докладно далі в статті. Далі ми маємо змінну, яка зберігає статус вихідної форми сигналу, вихідною формою сигналу за замовчуванням є синусоїда. І нарешті, ми маємо змінну encoder_btn_count, що містить кількість кнопок кодера, яка використовується для встановлення вихідної форми сигналу.
int лічильник = 1; // Це значення лічильника буде збільшуватися або зменшуватися, якщо при повороті поворотного кодера int clockPin; // Заповнювач статусу виводу, що використовується поворотним кодером int clockPinState; // Заповнювач статусу виводу, який використовується поворотним кодером без підпису довгий час = 0; // Використовується для зняття беззнакових довгих moduleFrequency; // використовується для встановлення вихідної частоти long debounce = 220; // Затримка дебаунту bool btn_state; // використовується для вимкнення виводу модуля AD98333 bool set_frequency_hz = 1; // Частота несправностей модуля AD9833 bool set_frequency_khz; bool set_frequency_mhz; Рядок waveSelect = "SIN"; // Форма сигналу запуску модуля int encoder_btn_count = 0; // використовується для перевірки натискання кнопки кодера. Далі, у нас є два об'єкти - один для OLED-дисплея, інший - для модуля AD9833.Дисплей Adafruit_SSD1306 (SCREEN_WIDATA_PINH, SCREEN_HEIGHT, & Wire, -1); Покоління AD9833 (FNC_PIN);
Далі, ми маємо нашу функцію setup (), у цій функції налаштування ми починаємо з включення Serial для налагодження. Ми ініціалізуємо модуль AD9833 за допомогою методу begin (). Далі ми встановлюємо всі призначені поворотні штифти кодера як вхідні. І ми зберігаємо значення тактової частоти у змінній clockPinState, це необхідний крок для поворотного кодера.
Далі ми встановлюємо всі штифти кнопок як вхідні та вмикаємо OLED-дисплей за допомогою методу display.begin () , а також перевіряємо наявність помилок за допомогою оператора if . Після цього ми очищаємо дисплей і друкуємо початковий заставний екран, додаємо затримку в 2 секунди, яка також є затримкою для заставки, і нарешті, ми викликаємо функцію update_display (), яка очищає екран і оновлює дисплей ще раз. Детальніше про метод update_display () буде розглянуто далі в статті.
void setup () {Serial.begin (9600); // Увімкнути Serial @ 9600 бод gen.Begin (); // Це ПОВИННА бути першою командою після оголошення об’єкта AD9833 pinMode (CLK_PIN, INPUT); // Встановлення контактів як вхідного pinMode (DATA_PIN, INPUT); pinMode (BTN_PIN, INPUT_PULLUP); clockPinState = digitalRead (CLK_PIN); pinMode (SET_FREQUENCY_HZ, INPUT); // Встановлення контактів як вхідного pinMode (SET_FREQUENCY_KHZ, INPUT); pinMode (SET_FREQUENCY_MHZ, INPUT); pinMode (ENABLE_DISABLE_OUTPUT_PIN, INPUT); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Адреса 0x3D для 128x64 Serial.println (F ("Помилка розподілу SSD1306")); для (;;); } display.clearDisplay (); // Очищення екрана display.setTextSize (2); // Встановити розмір тексту display.setTextColor (БІЛИЙ); // встановити кольоровий РК-дисплей. setCursor (30, 0); // Встановити відображення позиції курсора.println ("AD9833"); // Друк цього текстового дисплея.setCursor (17, 20); // Встановити відображення положення курсора.println ("Функція"); // Роздрукуйте цей текст display.setCursor (13, 40); // Встановити відображення позиції курсора.println ("Генератор"); // Роздрукуйте цей текст display.display (); // Оновлення затримки відображення (2000); // Затримка 2 SEC update_display (); // Виклик update_display Функція}
Далі у нас є наша функція loop (), всі основні функціональні можливості записані в розділі циклу.
По-перше, ми читаємо висновок Clock поворотного кодера і зберігаємо його у змінній clockPin, про яку ми заявили раніше. Далі, у операторі if ми перевіряємо, чи попереднє значення штифта та поточне значення штифта подібні чи ні, а також перевіряємо поточне значення штифта. Якщо все це правда, ми перевіряємо наявність штифта даних, якщо true, це означає, що кодер обертається проти годинникової стрілки, і ми зменшуємо значення лічильника за допомогою команди counter--. В іншому випадку ми збільшуємо значення лічильника за допомогою команди counter ++. Нарешті, ми ставимо ще один оператор if, щоб встановити мінімальне значення на 1. Далі, ми оновлюємо clockPinState поточним clockPinзначення для майбутнього використання.
недійсний цикл () {clockPin = digitalRead (CLK_PIN); if (clockPin! = clockPinState && clockPin == 1) {if (digitalRead (DATA_PIN)! = clockPin) {counter -; } else {counter ++; // Кодер обертається CW, тому збільшується} if (counter <1) counter = 1; Serial.println (лічильник); update_display (); }
Далі ми маємо наш код для виявлення натискання кнопки. У цьому розділі ми виявили кнопку всередині кодера за допомогою деяких вкладених операторів if, якщо (digitalRead (BTN_PIN) == LOW && millis () - time> denounce), у цьому твердженні ми спочатку перевіряємо, чи є кнопка штифт низький чи ні, якщо він низький, значить натискається. Потім знову перевіряємо значення таймера із затримкою розриву, якщо обидва твердження відповідають дійсності, тоді ми оголошуємо це успішною дією натискання кнопки, якщо так збільшуємо значення encoder_btn_count. Далі ми оголошуємо ще один оператор if, щоб встановити максимальне значення лічильника на 2, він нам потрібен, оскільки ми використовуємо його для встановлення вихідної форми сигналу.Три послідовних твердження if роблять це, якщо значення дорівнює нулю, вибирається форма синусоїди, якщо вона одна, це квадратна хвиля, а якщо значення 2, це трикутна хвиля. У всіх трьох цих операторах if ми оновлюємо дисплей за допомогою функції update_display () . І нарешті, ми оновлюємо змінну часу поточним значенням лічильника таймера.
// Якщо ми виявляємо НИЗЬКИЙ сигнал, натискаємо кнопку if (digitalRead (BTN_PIN) == LOW && millis () - time> debounce) {encoder_btn_count ++; // Збільшуємо значення if (encoder_btn_count> 2) // якщо значення більше 2 скидаємо його до 0 {encoder_btn_count = 0; } if (encoder_btn_count == 0) {// якщо значення 0 вибрано синусоїду waveSelect = "SIN"; // оновлення рядкової змінної зі значенням гріха update_display (); // оновлення відображення} if (encoder_btn_count == 1) {// якщо значення 1 квадратна хвиля вибрано waveSelect = "SQR"; // оновлення змінної рядка зі значенням SQR update_display (); // оновлення відображення} if (encoder_btn_count == 2) {// якщо значення 1 Вибрано трикутну хвилю waveSelect = "TRI"; // оновлення змінної рядка зі значенням TRI update_display ();// оновлення відображення} time = millis (); // оновлення змінної часу}
Далі ми визначаємо весь необхідний код, який необхідний для налаштування всіх кнопок із затримкою відмови. Оскільки кнопки підключені до аналогових штифтів Arduino, ми використовуємо команду аналогового зчитування для ідентифікації натискання кнопки, якщо значення аналогового зчитування досягає нижче 30, тоді ми виявляємо його успішне натискання кнопки і чекаємо 200 мс перевірте, чи це справжнє натискання кнопки чи лише шум. Якщо це твердження відповідає дійсності, ми призначаємо булеві змінні зі значеннями, які використовуються для встановлення значень Гц, Хц та МГц генератора функцій. Далі ми оновлюємо відображення та оновлюємо змінну часу. Ми робимо це для всіх чотирьох кнопок, пов’язаних з Arduino.
if (analogRead (SET_FREQUENCY_HZ) <30 && millis () - time> debounce) {set_frequency_hz = 1; // оновлення булевих значень set_frequency_khz = 0; set_frequency_mhz = 0; update_display (); // оновити час відображення = millis (); // оновити змінну часу} if (analogRead (SET_FREQUENCY_KHZ) <30 && millis () - time> debounce) {set_frequency_hz = 0; // оновлення булевих значень set_frequency_khz = 1; set_frequency_mhz = 0; moduleFrequency = лічильник * 1000; update_display (); // оновлюємо час відображення = millis (); // оновлюємо змінну часу} if (analogRead (SET_FREQUENCY_MHZ) <30 && millis () - time> debounce) {// перевіряємо аналоговий штифт із затримкою debounce set_frequency_hz = 0; // оновлення булевих значень set_frequency_khz = 0; set_frequency_mhz = 1; moduleFrequency = лічильник * 1000000; update_display ();// оновлюємо час відображення = millis (); // оновлюємо змінну часу} if (analogRead (ENABLE_DISABLE_OUTPUT_PIN) <30 && millis () - time> debounce) {// перевіряємо аналоговий штифт із затримкою debounce btn_state =! btn_state; // Інвертувати стан кнопки gen.EnableOutput (btn_state); // Увімкнути / Вимкнути вихід генератора функцій залежно від стану кнопки update_display (); // оновити час відображення = millis (); // оновити змінну часу}}// оновлюємо змінну часу}}// оновлюємо змінну часу}}
Нарешті, у нас є функція update_display (). У цій функції ми зробили набагато більше, ніж просто оновили цей дисплей, оскільки певна частина дисплея не може бути оновлена в OLED. Щоб оновити його, вам доведеться перефарбувати його новими значеннями. Це значно ускладнює процес кодування.
Усередині цієї функції ми починаємо з очищення дисплея. Далі ми встановлюємо необхідний розмір тексту. Після цього ми встановили наш курсор та надрукували Генератор функцій із display.println ("Функціональна функція"); команди. Ми знову встановлюємо розмір тексту на 2, а курсор на (0,20) за допомогою функції display.setCursor (0, 20).
Тут ми друкуємо інформацію про те, яка це хвиля.
display.clearDisplay (); // Перше очищення дисплея display.setTextSize (1); // встановлюємо Розмір тексту display.setCursor (10, 0); // Встановлення позиції курсора display.println ("Генератор функцій"); // надрукувати текст display.setTextSize (2); // встановити розмір тексту display.setCursor (0, 20); // Встановити положення курсора
Далі ми перевіряємо булеві змінні на наявність деталей частоти та оновлюємо значення у змінній moduleFrequency. Ми робимо це для значень Гц, кГц та МГц. Далі перевіряємо змінну waveSelect та визначаємо, яку хвилю обрано. Тепер у нас є значення для встановлення типу та частоти хвилі.
if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// перевірити, чи натиснута кнопка для встановлення частоти в Гц moduleFrequency = counter; // оновити змінну moduleFrequency поточним значенням лічильника} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {// перевірити, чи натиснута кнопка для встановлення частоти в кГц moduleFrequency = counter * 1000; // оновити змінну moduleFrequency поточним значенням лічильника, але ми множимо 1000, щоб встановити її на KHZ} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {// перевірити, чи натиснута кнопка для встановлення частоти в МГц = лічильник * 1000000; if (moduleFrequency> 12000000) {moduleFrequency = 12000000;// не дозволяйте частоті бути нижчою, ніж лічильник 12 МГц = 12; }} if (waveSelect == "SIN") {// Синусоїда вибрана display.println ("SIN"); gen.ApplySignal (SINE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "SQR") {// Sqr хвиля вибрана display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Вибрано три хвилі display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // оновлення модуля AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Sqr хвиля вибрана display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Вибрано три хвилі display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // оновлення модуля AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Sqr хвиля вибрана display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Вибрано три хвилі display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // оновлення модуля AD9833. Serial.println (moduleFrequency); }
Ми знову встановлюємо курсор і оновлюємо значення лічильника. Знову ми перевіряємо логічне значення для оновлення діапазону частот на дисплеї, ми повинні це зробити, оскільки принцип роботи OLED дуже дивний.
display.setCursor (45, 20); display.println (лічильник); // надрукувати інформацію про лічильник на дисплеї. if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Гц"); // друк Гц на дисплеї display.display (); // коли всі набори оновлюють відображення} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Хз"); display.display (); // коли всі набори оновлюють відображення} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setCursor (90, 20); display.println ("МГц"); display.display (); // коли все встановлено оновити дисплей}
Далі перевіряємо змінну натискання кнопки, щоб надрукувати вихід на / вихід на OLED. Знову це потрібно зробити через модуль OLED.
якщо (btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output ON"); // друк виводу на дисплей display.display (); display.setTextSize (2); } ще {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output OFF"); // виведення друку на дисплей display.display (); display.setTextSize (2); }
На цьому наш процес кодування закінчується. Якщо ви в цей момент розгублені, ви можете перевірити коментарі в коді для подальшого розуміння.
Тестування генератора функцій на основі AD9833
Для тестування схеми використовується вищевказана установка. Як бачите, ми підключили адаптер живлення постійного струму 12 В до гнізда стовбура постійного струму, а осцилограф Hantek підключили до виходу схеми. Ми також підключили осцилограф до ноутбука для візуалізації та вимірювання вихідної частоти.
Після того, як це було зроблено, ми встановлюємо вихідну частоту на 5 кГц за допомогою поворотного кодера, і ми перевіряємо вихідну синусоїду, і, звичайно, це 5 кГц синусоїда на виході.
Далі ми змінили вихідну форму хвилі на трикутну, але частота залишилася незмінною, вихідна форма сигналу показана нижче.
Потім ми змінили вихід на квадратну хвилю і спостерігали вихід, і це була ідеальна квадратна хвиля.
Ми також змінили діапазони частот і протестували вихід, і він працював добре.
Подальші вдосконалення
Ця схема є лише доказом концепції і потребує подальших удосконалень. По-перше, нам потрібна якісна друкована плата та якісний BNC-роз'єм для виходу, інакше ми не можемо отримати більш високу частоту. Амплітуда модуля дуже низька, тому для його підвищення нам потрібні деякі схеми операційних підсилювачів для посилення вихідної напруги. Потенціометр можна підключити для зміни вихідної амплітуди. Можна підключити перемикач для зсуву сигналу; це також обов’язкова особливість. І далі, код потребує значного вдосконалення, оскільки він трохи глючить. Нарешті, OLED-дисплеї потрібно змінити, інакше неможливо написати легко зрозумілий код.
На цьому підручник закінчується, сподіваюся, вам сподобалась стаття і ви дізналися щось нове. Якщо у вас виникли запитання щодо статті, ви можете залишити їх у розділі коментарів нижче або скористатися нашим форумом з електроніки.