Obsah:

Generátor průběhů Arduino: 5 kroků (s obrázky)
Generátor průběhů Arduino: 5 kroků (s obrázky)

Video: Generátor průběhů Arduino: 5 kroků (s obrázky)

Video: Generátor průběhů Arduino: 5 kroků (s obrázky)
Video: 5 AI, které ti usnadní celé studium! 2024, Červenec
Anonim
Generátor průběhů Arduino
Generátor průběhů Arduino

Aktualizace z února 2021: podívejte se na novou verzi s 300násobnou vzorkovací frekvencí na základě Raspberry Pi Pico

V laboratoři člověk často potřebuje opakující se signál o určité frekvenci, tvaru a amplitudě. Může to být test zesilovače, kontrola obvodu, součásti nebo aktuátoru. Výkonné generátory křivek jsou komerčně dostupné, ale je poměrně snadné vyrobit si užitečné sami pomocí Arduino Uno nebo Arduino Nano, viz například:

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

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

Zde je popis dalšího s následujícími funkcemi:

* Přesné průběhy: 8bitový výstup pomocí R2R DAC, tvar 256 vzorků

* Rychlý: vzorkovací frekvence 381 kHz

* Přesné: frekvenční rozsah kroků 1 mHz. Přesné jako krystal Arduino.

* Snadné ovládání: tvar vlny a frekvence nastavitelné pomocí jediného rotačního kodéru

* Široký rozsah amplitud: milivoltů až 20V

* 20 předdefinovaných průběhů. Přímo přidat další.

* Snadná výroba: Arduino Uno nebo Nano plus standardní komponenty

Krok 1: Technická hlediska

Vytváření analogového signálu

Jedním z nedostatků Arduino Uno a Nano je, že nemá převodník digitálního signálu na analogový (DAC), takže není možné přimět jej k výstupu analogového napětí přímo na piny. Jedním z řešení je žebřík R2R: 8 digitálních pinů je připojeno k odporové síti, takže lze dosáhnout 256 úrovní výstupu. Prostřednictvím přímého přístupu k portu může Arduino nastavit 8 pinů současně jediným příkazem. Pro síť odporů je zapotřebí 9 odporů s hodnotou R a 8 s hodnotou 2R. Použil jsem 10 kOhm jako hodnotu pro R, která udržuje proud z kolíků na 0,5 mA nebo méně. Myslím, že R = 1 kOhm by také mohlo fungovat, protože Arduino může snadno dodávat 5mA na pin, 40mA na port. Je důležité, aby poměr mezi rezistory R a 2R byl skutečně 2. Toho lze nejsnáze dosáhnout zapojením 2 rezistorů o hodnotě R do série, celkem tedy 25 rezistorů.

Fázový akumulátor

Generování průběhu pak přichází na opakované odesílání sekvence 8bitových čísel na piny Arduino. Tvar vlny je uložen v poli 256 bytů a toto pole je vzorkováno a odesláno na piny. Frekvence výstupního signálu je dána tím, jak rychle člověk postupuje polem. Robustní, přesný a elegantní způsob, jak toho dosáhnout, je pomocí fázového akumulátoru: 32bitové číslo se v pravidelných intervalech zvyšuje a jako index pole používáme 8 nejvýznamnějších bitů.

Rychlé vzorkování

Přerušení umožňují vzorkovat v přesně definovaných časech, ale režie přerušení omezuje vzorkovací frekvenci na ~ 100kHz. Nekonečná smyčka pro aktualizaci fáze, vzorkování průběhu a nastavení pinů trvá 42 hodinových cyklů, čímž se dosáhne vzorkovací frekvence 16 MHz/42 = 381 kHz. Otáčení nebo tlačení rotačního kodéru způsobí změnu pinů a přerušení, které se dostane ze smyčky, za účelem změny nastavení (křivky nebo frekvence). V této fázi je 256 čísel v poli přepočítáno, takže v hlavní smyčce není třeba provádět žádné skutečné výpočty průběhu. Absolutní maximální frekvence, kterou lze generovat, je 190 kHz (polovina vzorkovací frekvence), ale pak existují pouze dva vzorky za období, takže tvar není příliš ovládán. Rozhraní tedy neumožňuje nastavit frekvenci nad 100kHz. Při 50 kHz je 7-8 vzorků za periodu a při 1,5 kHz a níže všech 256 čísel uložených v poli bude vzorkováno každou periodu. U průběhů, kde se signál mění plynule, například u sinusových vln, není přeskakování vzorků žádný problém. Ale pro křivky s úzkými špičkami, například pro čtvercovou vlnu s malým pracovním cyklem, existuje nebezpečí, že pro frekvence nad 1,5 kHz chybí jeden vzorek, což může mít za následek, že se průběh nechová podle očekávání

Přesnost frekvence

Počet, o který se fáze zvyšuje u každého vzorku, je úměrný frekvenci. Kmitočet tak lze nastavit s přesností 381kHz/2^32 = 0,089mHz. V praxi je taková přesnost téměř nikdy zapotřebí, takže rozhraní omezuje nastavení frekvence v krocích po 1 mHz. Absolutní přesnost frekvence je dána přesností hodinové frekvence Arduino. To závisí na typu Arduino, ale většina udává frekvenci 16 000 MHz, takže přesnost ~ 10^-4. Kód umožňuje upravit poměr frekvence a fázového přírůstku tak, aby korigoval malé odchylky předpokladu 16 MHz.

Vyrovnávací paměť a zesílení

Rezistorová síť má vysokou výstupní impedanci, takže její výstupní napětí rychle klesá, pokud je připojena zátěž. To lze vyřešit vyrovnávací pamětí nebo zesílením výstupu. Zde se ukládání do vyrovnávací paměti a zesílení provádí pomocí operačního zesilovače. Použil jsem LM358, protože jsem nějaké měl. Je to pomalý operační zesilovač (rychlost přeběhu 0,5 V za mikrosekundu), takže při vysoké frekvenci a vysoké amplitudě je signál zkreslený. Dobrá věc je, že zvládne napětí velmi blízké 0V. Výstupní napětí je však omezeno na ~ 2V pod kolejnicí, takže použití +5V napájení omezuje výstupní napětí na 3V. Zesílené moduly jsou kompaktní a levné. Napájení +20V do operačního zesilovače může generovat signály s napětím až 18V. (Pozn., Schéma říká LTC3105, protože to byl jediný krok, který jsem ve Fritzing našel. Ve skutečnosti jsem použil modul MT3608, viz obrázky v dalších krocích). Rozhodl jsem se použít proměnný útlum na výstup R2R DAC a poté použít jeden z opampů k uložení signálu bez zesílení a druhý k zesílení o 5,7, takže signál může dosáhnout maximálního výkonu asi 20V. Výstupní proud je poměrně omezený, ~ 10 mA, takže pokud má signál pohánět velký reproduktor nebo elektromagnet, může být zapotřebí silnější zesilovač.

Krok 2: Požadované součásti

Pro generátor křivek jádra

Arduino Uno nebo Nano

16x2 LCD displej + 20kOhm trimr a odpor 100Ohm pro podsvícení

5kolíkový rotační snímač (s integrovaným tlačítkem)

25 odporů 10 kOhm

Pro pufr/zesilovač

LM358 nebo jiný duální operační zesilovač

rozšiřující modul založený na MT3608

50kOhm variabilní odpor

Rezistor 10 kOhm

Odpor 47 kOhm

1 mF kondenzátor

Krok 3: Konstrukce

Konstrukce
Konstrukce
Konstrukce
Konstrukce

Vše jsem připájel na prototypovou desku 7x9 cm, jak je znázorněno na obrázku. Protože se to se všemi dráty trochu zamotalo, zkusil jsem vybarvit vodiče, které nesou kladné napětí, červenou a ty, které nesou zem, černou.

Kodér, který jsem použil, má 5 pinů, 3 na jedné straně, 2 na druhé straně. Strana se 3 piny je skutečným kodérem, strana se 2 piny je integrované tlačítko. Na straně se 3 piny by měl být centrální kolík připojen k zemi, další dva piny k D10 a D11. Na straně se 2 piny by měl být jeden kolík připojen k zemi a druhý k D12.

Je to nejošklivější věc, kterou jsem kdy vyrobil, ale funguje. Bylo by hezké vložit do skříně, ale prozatím to práce navíc a náklady opravdu neospravedlňují. Nano a displej jsou připevněny hlavičkami. Neudělal bych to znovu, kdybych postavil nový. Na desku jsem neumístil konektory, abych zachytil signály. Místo toho je sbírám krokodýlími vývody z vyčnívajících kusů měděného drátu, které jsou označeny takto:

R - surový signál z R2R DAC

B - signál s vyrovnávací pamětí

A - zesílený signál

T - signál časovače z pinu 9

G - zem

+ - kladné „vysoké“napětí ze zvyšovacího modulu

Krok 4: Kód

Kód, skica Arduina, je přiložen a měl by být nahrán do Arduina.

Předdefinováno bylo 20 průběhů. Přidání jakékoli další vlny by mělo být jednoduché. Náhodné vlny zaplňují pole 256 hodnot náhodnými hodnotami, ale stejný vzor se opakuje každé období. Skutečné náhodné signály zní jako šum, ale tento průběh zní mnohem více jako píšťalka.

Kód nastavuje signál 1kHz na pin D9 s TIMER1. To je užitečné pro kontrolu načasování analogového signálu. Tak jsem zjistil, že počet hodinových cyklů je 42: Pokud předpokládám buď 41 nebo 43 a generuji signál 1 kHz, má jasně jinou frekvenci než signál na pinu D9. S hodnotou 42 se perfektně shodují.

Arduino obvykle každou milisekundu přeruší, aby sledoval čas pomocí funkce millis (). To by narušilo přesné generování signálu, takže konkrétní přerušení je deaktivováno.

Překladač říká: "Skica používá 7254 bytů (23%) úložného prostoru programu. Maximum je 30720 bytů. Globální proměnné využívají 483 bytů (23%) dynamické paměti, přičemž pro lokální proměnné zbývá 1565 bytů. Maximum je 2048 bytů." Existuje tedy dostatek místa pro sofistikovanější kód. Pamatujte, že možná budete muset zvolit „ATmega328P (starý zavaděč)“pro úspěšné nahrání do Nano.

Krok 5: Použití

Generátor signálu lze napájet jednoduše pomocí mini USB kabelu Arduino Nano. Nejlepší je to provést s powerbankou, aby s přístrojem nevznikla náhodná zemní smyčka, se kterou by mohl být spojen.

Po zapnutí generuje sinusovou vlnu 100 Hz. Otáčením knoflíku lze vybrat jeden z dalších 20 typů vln. Otáčením při tlačení lze kurzor nastavit na libovolnou číslici frekvence, kterou lze poté změnit na požadovanou hodnotu.

Amplitudu lze regulovat potenciometrem a lze použít buď pufrovaný nebo zesílený signál.

Je opravdu užitečné použít osciloskop ke kontrole amplitudy signálu, zvláště když signál dodává proud do jiného zařízení. Pokud je odebíráno příliš mnoho proudu, signál se vypne a signál je silně zkreslený

Pro velmi nízké frekvence lze výstup vizualizovat pomocí LED v sérii s odporem 10 kOhm. Zvukové frekvence lze slyšet pomocí reproduktoru. Ujistěte se, že je signál nastaven na velmi malý ~ 0,5 V, jinak bude proud příliš vysoký a signál začne ořezávat.

Doporučuje: