Съдържание:

Ардуино генератор на вълни: 5 стъпки (със снимки)
Ардуино генератор на вълни: 5 стъпки (със снимки)

Видео: Ардуино генератор на вълни: 5 стъпки (със снимки)

Видео: Ардуино генератор на вълни: 5 стъпки (със снимки)
Видео: Код на Arduino VL53L1X Време на полет 400 см Лазерен сензор за разстояние 2024, Юли
Anonim
Генератор на вълнова форма Arduino
Генератор на вълнова форма Arduino

Актуализация от февруари 2021: проверете новата версия с 300x честота на дискретизация, базирана на Raspberry Pi Pico

В лабораторията човек често се нуждае от повтарящ се сигнал с определена честота, форма и амплитуда. Може да се тества усилвател, да се провери верига, компонент или задвижващ механизъм. Мощни генератори на вълнови форми се предлагат в търговската мрежа, но е сравнително лесно сами да си направите полезен с Arduino Uno или Arduino Nano, вижте например:

www.instructables.com/id/Arduino-Waveform-…

www.instructables.com/id/10-Resister-Ardui…

Ето описанието на друго със следните функции:

* Точни форми на вълната: 8-битов изход, използващ R2R DAC, 256-образна форма

* Бързо: честота на дискретизация 381 kHz

* Прецизен: 1mHz стъпки честотен диапазон. Точен като кристала Arduino.

* Лесна работа: форма на вълната и честота, зададени с един въртящ се енкодер

* Широк диапазон от амплитуди: миливолта до 20V

* 20 предварително определени форми на вълната. Просто да добавите още.

* Лесен за приготвяне: Arduino Uno или Nano плюс стандартни компоненти

Стъпка 1: Технически съображения

Подаване на аналогов сигнал

Един недостатък на Arduino Uno и Nano е, че той няма цифрово-аналогов (DAC) преобразувател, така че не е възможно да го накарате да извежда аналогово напрежение директно върху щифтовете. Едно решение е R2R стълбата: 8 цифрови пина са свързани към резисторна мрежа, така че могат да бъдат достигнати 256 нива на изход. Чрез директен достъп до порта, Arduino може да зададе 8 пина едновременно с една команда. За резисторната мрежа са необходими 9 резистора със стойност R и 8 със стойност 2R. Използвах 10kOhm като стойност за R, която поддържа тока от щифтовете до 0.5mA или по -малко. Предполагам, че R = 1 kOhm също може да работи, тъй като Arduino може лесно да достави 5mA на пин, 40mA на порт. Важно е съотношението между резисторите R и 2R да е наистина 2. Това най -лесно се постига чрез поставяне на 2 резистора на стойност R последователно за общо 25 резистора.

Фазов акумулатор

След това генерирането на форма на вълна се свежда до многократно изпращане на последователност от 8-битови числа към щифтовете на Arduino. Формата на вълната се съхранява в масив от 256 байта и този масив се избира и изпраща към пиновете. Честотата на изходния сигнал се определя от това колко бързо човек напредва през масива. Здрав, прецизен и елегантен начин да направите това е с фазов акумулатор: 32-битово число се увеличава на редовни интервали и ние използваме 8-те най-значими бита като индекс на масива.

Бързо вземане на проби

Прекъсванията позволяват да се взема проба в точно определени часове, но допълнителните разходи за прекъсвания ограничават честотата на дискретизация до ~ 100kHz. Безкраен цикъл за актуализиране на фазата, изваждане на формата на вълната и задаване на щифтовете отнема 42 тактови цикъла, като по този начин се постига честота на дискретизация от 16MHz/42 = 381kHz. Завъртането или натискането на въртящия се енкодер причинява смяна на щифт и прекъсване, което излиза от контура, за да промени настройката (форма на вълната или честота). На този етап 256 числата в масива се преизчисляват, така че не е необходимо да се извършват действителни изчисления на формата на вълната в основния цикъл. Абсолютната максимална честота, която може да се генерира, е 190 kHz (половината от честотата на дискретизация), но тогава има само две проби за период, така че няма много контрол върху формата. По този начин интерфейсът не позволява да се настрои честотата над 100kHz. При 50kHz има 7-8 проби за период и при 1.5 kHz и под всички 256 номера, съхранени в масива, се вземат проби за всеки период. За форми на вълни, при които сигналът се променя плавно, например синусоида, пропускането на проби не е проблем. Но за форми на вълни с тесни шипове, например квадратна вълна с малък работен цикъл, съществува опасност, че за честоти над 1,5 kHz липсването на една проба може да доведе до това, че формата на вълната не се държи според очакванията

Точност на честотата

Броят, с който фазата се увеличава при всяка проба, е пропорционален на честотата. По този начин честотата може да бъде настроена на точност от 381kHz/2^32 = 0,089mHz. На практика подобна точност почти никога не е необходима, така че интерфейсът ограничава настройката на честотата на стъпки от 1 mHz. Абсолютната точност на честотата се определя от точността на тактовата честота на Arduino. Това зависи от типа Arduino, но повечето определят честота от 16.000MHz, така че точност от ~ 10^-4. Кодът позволява да се променя съотношението на честотата и фазовия прираст, за да се коригират малките отклонения на предположението от 16 MHz.

Буфериране и усилване

Резисторната мрежа има висок изходен импеданс, така че изходното му напрежение бързо пада, ако е прикрепен товар. Това може да се реши чрез буфериране или усилване на изхода. Тук буферирането и усилването се извършват с opamp. Използвах LM358, защото имах такива. Това е бавен opamp (скорост на нарастване 0,5V на микросекунда), така че при висока честота и висока амплитуда сигналът се изкривява. Хубавото е, че може да се справи с напрежение много близко до 0V. Изходното напрежение обаче е ограничено до ~ 2V под релсата, така че използването на +5V мощност ограничава изходното напрежение до 3V. Повишаващите модули са компактни и евтини. Захранвайки +20V към опампата, той може да генерира сигнали с напрежение до 18V. (NB, схемата казва LTC3105, защото това беше единственото усилване, което открих във Fritzing. В действителност използвах модул MT3608, вижте снимките в следващите стъпки). Избирам да приложа променливо затихване към изхода на R2R DAC, след което използвам една от операционните усилватели за буфериране на сигнала без усилване, а другата за усилване с 5.7, така че сигналът да може да достигне максимален изход от около 20V. Изходният ток е доста ограничен, ~ 10mA, така че може да е необходим по -силен усилвател, ако сигналът трябва да управлява голям високоговорител или електромагнит.

Стъпка 2: Необходими компоненти

За основния генератор на вълна

Arduino Uno или Nano

16x2 LCD дисплей + тример 20kOhm и резистор от серия 100Ohm за подсветка

5-пинов въртящ се енкодер (с вграден бутон)

25 резистора от 10kOhm

За буфера/усилвателя

LM358 или друга двойна опампа

стъпков модул, базиран на MT3608

50kOhm променлив резистор

10kOhm резистор

Резистор 47kOhm

1muF кондензатор

Стъпка 3: Строителство

Строителство
Строителство
Строителство
Строителство

Запоявах всичко на прототипна платка 7х9 см, както е показано на снимката. Тъй като стана малко объркано с всички проводници, аз се опитах да оцветя проводниците, които носят положително напрежение в червено, и тези, които носят земята в черно.

Енкодерът, който използвах, има 5 пина, 3 от едната страна, 2 от другата страна. Страната с 3 пина е действителният енкодер, страната с 2 пина е интегрираният бутон. От 3-пинова страна централният щифт трябва да бъде свързан към земята, а другите два щифта към D10 и D11. От страна на 2-пина, един щифт трябва да бъде свързан към земята, а другият към D12.

Това е най -грозното нещо, което съм правил, но работи. Би било хубаво да се постави в заграждение, но засега допълнителната работа и разходите не го оправдават. Nano и дисплеят са свързани с щифтове. Не бих направил това отново, ако построя нов. Не съм сложил конектори на платката, за да взема сигналите. Вместо това ги хващам с крокодилски проводници от стърчащи парчета медна тел, обозначени по следния начин:

R - необработен сигнал от R2R DAC

B - буфериран сигнал

А - усилен сигнал

T - сигнал на таймера от щифт 9

G - земя

+ - положително „високо“напрежение от повишаващия модул

Стъпка 4: Кодът

Кодът, скица на Arduino, е прикачен и трябва да бъде качен в Arduino.

20 форми на вълната са предварително дефинирани. Трябва да е лесно да добавите всяка друга вълна. Обърнете внимание, че случайните вълни запълват масива с 256 стойности със случайни стойности, но същият модел се повтаря всеки период. Истинските случайни сигнали звучат като шум, но тази форма на вълната звучи много по -скоро като свирка.

Кодът задава 1kHz сигнал на щифт D9 с TIMER1. Това е полезно за проверка на времето на аналоговия сигнал. Така разбрах, че броят на тактовите цикли е 42: Ако приемем 41 или 43 и генерирам 1kHz сигнал, той очевидно има различна честота от сигнала на щифт D9. Със стойността 42 те съвпадат перфектно.

Обикновено Arduino прекъсва всяка милисекунда, за да следи времето с функцията millis (). Това би нарушило точното генериране на сигнал, така че конкретното прекъсване е деактивирано.

Компилаторът казва: "Sketch използва 7254 байта (23%) от пространството за съхранение на програмата. Максимумът е 30720 байта. Глобалните променливи използват 483 байта (23%) динамична памет, оставяйки 1565 байта за локални променливи. Максимумът е 2048 байта." Така че има достатъчно място за по -сложен код. Внимавайте, че може да се наложи да изберете „ATmega328P (стар буутлоудър)“, за да качите успешно в Nano.

Стъпка 5: Използване

Генераторът на сигнали може да се захранва просто чрез мини-USB кабела на Arduino Nano. Най -добре е да се направи с банка за захранване, така че да няма случайно заземяване с апарата, с което може да се свърже.

При включване той ще генерира 100Hz синусова вълна. Чрез завъртане на копчето може да се избере един от другите 20 типа вълни. Чрез завъртане, докато се натиска, курсорът може да бъде настроен на всяка от цифрите на честотата, която след това може да бъде променена до желаната стойност.

Амплитудата може да се регулира с потенциометъра и може да се използва или буфериран, или усилен сигнал.

Наистина е полезно да се използва осцилоскоп за проверка на амплитудата на сигнала, особено когато сигналът подава ток към друго устройство. Ако се изтегли твърде голям ток, сигналът ще се прекъсне и сигналът ще бъде силно изкривен

За много ниски честоти изходът може да се визуализира с LED последователно с резистор 10kOhm. Аудио честотите могат да се чуват с високоговорител. Уверете се, че сте задали много малък сигнал ~ 0.5V, в противен случай токът става твърде висок и сигналът започва да се прекъсва.

Препоръчано: