Obsah:

Generátor priebehov Arduino: 5 krokov (s obrázkami)
Generátor priebehov Arduino: 5 krokov (s obrázkami)

Video: Generátor priebehov Arduino: 5 krokov (s obrázkami)

Video: Generátor priebehov Arduino: 5 krokov (s obrázkami)
Video: Набор Ардуино для начинающих 📟 с Алиэкспресс. Обзор набора модулей Arduino Unoдля обучения 2024, Júl
Anonim
Generátor priebehov Arduino
Generátor priebehov Arduino

Aktualizácia z februára 2021: pozrite sa na novú verziu s 300 -násobnou vzorkovacou frekvenciou na základe Raspberry Pi Pico

V laboratóriu človek často potrebuje opakujúci sa signál určitej frekvencie, tvaru a amplitúdy. Môže to byť test zosilňovača, kontrola obvodu, komponentu alebo akčného člena. Výkonné generátory priebehov sú komerčne dostupné, ale je relatívne jednoduché urobiť si užitočný generátor sami pomocou Arduino Uno alebo Arduino Nano, pozri napríklad:

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

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

Tu je popis ďalšej s nasledujúcimi funkciami:

* Presné priebehy: 8-bitový výstup s použitím R2R DAC, tvar 256 vzoriek

* Rýchly: vzorkovacia frekvencia 381 kHz

* Presné: frekvenčný rozsah krokovania 1 mHz. Presné ako kryštál Arduino.

* Jednoduché ovládanie: tvar vlny a frekvenciu je možné nastaviť pomocou jedného rotačného snímača

* Široký rozsah amplitúd: milivolty až 20V

* 20 preddefinovaných priebehov. Jednoducho pridajte ďalšie.

* Jednoduchá výroba: štandardné komponenty Arduino Uno alebo Nano plus

Krok 1: Technické úvahy

Vytváranie analógového signálu

Jedným z nedostatkov Arduino Uno a Nano je, že nemá prevodník digitálneho signálu na analógový (DAC), takže nie je možné dosiahnuť, aby na výstupoch bol analógové napätie. Jedným z riešení je rebrík R2R: 8 digitálnych pinov je pripojených k sieti odporov, takže je možné dosiahnuť 256 úrovní výstupu. Prostredníctvom priameho prístupu k portu môže Arduino nastaviť 8 pinov súčasne jediným príkazom. Pre odporovú sieť je potrebných 9 odporov s hodnotou R a 8 s hodnotou 2R. Použil som 10 kOhm ako hodnotu pre R, ktorá udržuje prúd z kolíkov na 0,5 mA alebo menej. Myslím, že R = 1 kOhm by tiež mohlo fungovať, pretože Arduino môže ľahko dodávať 5mA na pin, 40mA na port. Je dôležité, aby pomer medzi odpormi R a 2R bol skutočne 2. To sa dá najľahšie dosiahnuť zapojením 2 odporov hodnoty R do série, celkom 25 odporov.

Fázový akumulátor

Generovanie tvaru vlny potom spočíva v opakovanom odosielaní sekvencie 8-bitových čísel na piny Arduino. Tvar vlny je uložený v poli 256 bajtov a toto pole je vzorkované a odoslané na piny. Frekvencia výstupného signálu je určená tým, ako rýchlo človek postupuje poľom. Robustný, presný a elegantný spôsob, ako to dosiahnuť, je fázový akumulátor: 32-bitové číslo sa v pravidelných intervaloch zvyšuje a ako index poľa používame 8 najvýznamnejších bitov.

Rýchle vzorkovanie

Prerušenia umožňujú vzorkovať v presne definovaných časoch, ale réžia prerušenia obmedzuje vzorkovaciu frekvenciu na ~ 100 kHz. Nekonečná slučka na aktualizáciu fázy, vzorkovanie priebehu a nastavenie pinov trvá 42 hodinových cyklov, čím sa dosiahne vzorkovacia frekvencia 16 MHz/42 = 381 kHz. Otáčanie alebo tlačenie rotačného enkodéra spôsobuje zmenu pinov a prerušenie, ktoré sa dostane von zo slučky, za účelom zmeny nastavenia (priebeh alebo frekvencia). V tejto fáze sa 256 čísel v poli prepočíta, takže v hlavnej slučke nie je potrebné vykonávať žiadne skutočné výpočty tvaru vlny. Absolútna maximálna frekvencia, ktorú je možné vygenerovať, je 190 kHz (polovica vzorkovacej frekvencie), ale potom existujú iba dve vzorky za obdobie, takže tvar nie je veľmi ovládateľný. Rozhranie teda neumožňuje nastaviť frekvenciu nad 100 kHz. Pri 50 kHz je k dispozícii 7 až 8 vzoriek za periódu a pri 1,5 kHz a nižšie sa vzorkuje každú 256 číslic uložených v poli. Pre krivky, kde sa signál plynule mení, napríklad pre sínusovú vlnu, nie je preskočenie vzoriek žiadny problém. Ale pre krivky s úzkymi hrotmi, napríklad pre štvorcovú vlnu s malým pracovným cyklom, existuje nebezpečenstvo, že pri frekvenciách nad 1,5 kHz chýba jedna vzorka, čo môže mať za následok, že sa priebeh vlny nechová podľa očakávania.

Presnosť frekvencie

Počet, o ktoré sa fáza zvyšuje pri každej vzorke, je úmerný frekvencii. Frekvenciu je tak možné nastaviť s presnosťou 381kHz/2^32 = 0,089mHz. V praxi je taká presnosť takmer nikdy potrebná, takže rozhranie obmedzuje nastavenie frekvencie v krokoch po 1 mHz. Absolútna presnosť frekvencie je určená presnosťou hodinovej frekvencie Arduino. To závisí od typu Arduino, ale väčšina udáva frekvenciu 16 000 MHz, takže presnosť ~ 10^-4. Kód umožňuje upraviť pomer frekvencie a fázového prírastku tak, aby boli korigované malé odchýlky od predpokladu 16 MHz.

Vyrovnávacia pamäť a zosilnenie

Sieť rezistorov má vysokú výstupnú impedanciu, takže ak je k nemu pripojené zaťaženie, jeho výstupné napätie rýchlo klesá. To sa dá vyriešiť vyrovnávacou pamäťou alebo zosilnením výstupu. Tu sa ukladanie do vyrovnávacej pamäte a zosilnenie vykonáva pomocou operačného zosilňovača. Použil som LM358, pretože som nejaké mal. Je to pomalý operačný zosilňovač (rýchlosť prebehu 0,5 V za mikrosekundu), takže pri vysokej frekvencii a vysokej amplitúde je signál skreslený. Dobrá vec je, že dokáže zvládnuť napätie veľmi blízke 0V. Výstupné napätie je však obmedzené na ~ 2 V pod koľajnicou, takže použitie napájania +5 V obmedzuje výstupné napätie na 3 V. Zosilňovacie moduly sú kompaktné a lacné. Napájanie +20V na operačný zosilňovač môže generovať signály s napätím až 18V. (Poznámka: v schéme je LTC3105, pretože to bol jediný krok, ktorý som vo Fritzing našiel. V skutočnosti som použil modul MT3608, pozri obrázky v ďalších krokoch). Rozhodol som sa použiť premenlivý útlm na výstup R2R DAC a potom použiť jeden z operačných zosilňovačov na vyrovnanie signálu bez zosilnenia a druhý na zosilnenie o 5,7, aby signál mohol dosiahnuť maximálny výstup asi 20V. Výstupný prúd je dosť obmedzený, ~ 10 mA, takže ak má signál poháňať veľký reproduktor alebo elektromagnet, môže byť potrebný silnejší zosilňovač.

Krok 2: Požadované súčasti

Pre generátor jadrových priebehov

Arduino Uno alebo Nano

16x2 LCD displej + 20kOhm trimer a rezistor 100Ohm pre podsvietenie

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

25 odporov 10 kOhm

Pre nárazník/zosilňovač

LM358 alebo iný duálny operačný zosilňovač

krokový modul založený na MT3608

50 kOhm variabilný odpor

Rezistor 10 kOhm

Odpor 47 kOhm

1 mF kondenzátor

Krok 3: Konštrukcia

Konštrukcia
Konštrukcia
Konštrukcia
Konštrukcia

Všetko som spájkoval na prototypovú dosku 7 x 9 cm, ako je znázornené na obrázku. Pretože sa to so všetkými vodičmi trochu zamotalo, pokúsil som sa zafarbiť vodiče, ktoré nesú kladné napätie, na červenú a tie, ktoré nesú uzemnenie, na čiernu.

Kodér, ktorý som použil, má 5 pinov, 3 na jednej strane, 2 na druhej strane. Strana s 3 kolíkmi je skutočným snímačom, strana s 2 kolíkmi je integrované tlačidlo. Na 3-pólovej strane by mal byť stredový kolík spojený so zemou, ďalšie dva kolíky na D10 a D11. Na 2-pólovej strane by mal byť jeden kolík pripojený k zemi a druhý k D12.

Je to najškaredšia vec, akú som kedy urobil, ale funguje to. Bolo by pekné vložiť kryt, ale zatiaľ to práca navyše a náklady v skutočnosti neospravedlňujú. Nano a displej sú pripevnené kolíkovými hlavičkami. Už by som to neurobil, keby som postavil nový. Na dosku som neumiestňoval konektory na zachytenie signálov. Namiesto toho ich vyberám krokodílími zvodmi z vyčnievajúcich kúskov medeného drôtu, ktoré sú označené nasledovne:

R - surový signál z R2R DAC

B - signál s vyrovnávacou pamäťou

A - zosilnený signál

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

G - zem

+ - kladné „vysoké“napätie zo zosilňovacieho modulu

Krok 4: Kód

Kód, náčrt Arduina, je priložený a mal by byť nahraný do Arduina.

Preddefinovaných bolo 20 priebehov. Pridanie akejkoľvek ďalšej vlny by malo byť jednoduché. Všimnite si toho, že náhodné vlny zapĺňajú 256-hodnotové pole náhodnými hodnotami, ale rovnaký vzor sa opakuje každé obdobie. Skutočné náhodné signály znejú ako šum, ale tento priebeh znie oveľa viac ako píšťalka.

Kód nastavuje signál 1 kHz na kolíku D9 s TIMER1. To je užitočné na kontrolu načasovania analógového signálu. Takto som zistil, že počet hodinových cyklov je 42: Ak predpokladám buď 41 alebo 43 a vygenerujem signál 1 kHz, má jasne inú frekvenciu ako signál na kolíku D9. S hodnotou 42 sa perfektne zhodujú.

Arduino bežne prerušuje každú milisekundu, aby sledoval čas s funkciou millis (). To by narušilo presné generovanie signálu, takže konkrétne prerušenie je deaktivované.

Kompilátor hovorí: "Skica používa 7254 bajtov (23%) úložného priestoru programu. Maximum je 30720 bajtov. Globálne premenné používajú 483 bajtov (23%) dynamickej pamäte, pričom pre lokálne premenné zostáva 1565 bajtov. Maximum je 2048 bajtov." Existuje teda dostatok priestoru pre sofistikovanejší kód. Dávajte si pozor, že na úspešné nahranie do Nano budete možno musieť zvoliť „ATmega328P (starý bootloader)“.

Krok 5: Použitie

Generátor signálu je možné napájať jednoducho pomocou mini-USB kábla Arduino Nano. Najlepšie sa to robí s napájacou bankou, aby s prístrojom nedošlo k žiadnej náhodnej uzemňovacej slučke, s ktorou by bolo možné ho pripojiť.

Po zapnutí generuje sínusovú vlnu 100 Hz. Otáčaním gombíka je možné zvoliť jeden z ďalších 20 typov vĺn. Otáčaním pri zatlačení je možné kurzor nastaviť na ľubovoľnú z číslic frekvencie, ktorú je potom možné zmeniť na požadovanú hodnotu.

Amplitúdu je možné regulovať potenciometrom a je možné použiť buď medzipamäťový alebo zosilnený signál.

Je skutočne užitočné použiť osciloskop na kontrolu amplitúdy signálu, najmä keď signál dodáva prúd inému zariadeniu. Ak je odobratý príliš veľký prúd, signál sa vypne a signál je silne skreslený

Pre veľmi nízke frekvencie je možné výstup vizualizovať pomocou LED diódy v sérii s odporom 10 kOhm. Zvukové frekvencie je možné počúvať pomocou reproduktora. Signál nastavte na veľmi malý ~ 0,5 V, inak bude prúd príliš vysoký a signál sa začne orezávať.

Odporúča: