Kazalo:

Arduino generator valov: 5 korakov (s slikami)
Arduino generator valov: 5 korakov (s slikami)

Video: Arduino generator valov: 5 korakov (s slikami)

Video: Arduino generator valov: 5 korakov (s slikami)
Video: Крутейший генератор сигналов на Arduino! 2024, Julij
Anonim
Arduino generator valov
Arduino generator valov

Posodobitev februarja 2021: preverite novo različico s 300 -kratnim vzorčenjem, ki temelji na Raspberry Pi Pico

V laboratoriju pogosto potrebujemo ponavljajoč se signal določene frekvence, oblike in amplitude. Lahko poskusite ojačevalnik, preverite vezje, komponento ali aktuator. Zmogljivi generatorji valovnih oblik so na voljo v prodaji, vendar jih je razmeroma enostavno narediti z Arduino Uno ali Arduino Nano, glej na primer:

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

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

Tukaj je opis drugega z naslednjimi lastnostmi:

* Natančne valovne oblike: 8-bitni izhod z uporabo R2R DAC, oblika 256 vzorcev

* Hitro: vzorčenje 381 kHz

* Natančno: frekvenčno območje korakov 1mHz. Tako natančen kot kristal Arduino.

* Enostavno upravljanje: valovno obliko in frekvenco nastavite z enim vrtljivim dajalnikom

* Širok razpon amplitud: milivoltov do 20V

* 20 vnaprej določenih valovnih oblik. Preprosto dodati še nekaj.

* Enostaven za izdelavo: Arduino Uno ali Nano plus standardne komponente

1. korak: Tehnični premisleki

Ustvarjanje analognega signala

Pomanjkljivost Arduino Uno in Nano je, da nima digitalno-analognega (DAC) pretvornika, zato ni mogoče izvesti analogne napetosti neposredno na nožicah. Ena od rešitev je lestev R2R: 8 digitalnih zatičev je povezanih z uporovnim omrežjem, tako da je mogoče doseči 256 izhodnih ravni. Z neposrednim dostopom do vrat lahko Arduino nastavi 8 zatičev hkrati z enim ukazom. Za uporovno omrežje je potrebno 9 uporov z vrednostjo R in 8 z vrednostjo 2R. Uporabil sem 10kOhm kot vrednost za R, ki ohranja tok od nožic do 0,5 mA ali manj. Mislim, da bi lahko deloval tudi R = 1 kOhm, saj lahko Arduino zlahka odda 5mA na pin, 40mA na vrata. Pomembno je, da je razmerje med upori R in 2R res 2. To je najlažje doseči tako, da 2 upora vrednosti R v zaporedju, skupaj 25 uporov.

Fazni akumulator

Ustvarjanje valovne oblike se nato nanaša na ponavljajoče se pošiljanje zaporedja 8-bitnih številk na nožice Arduino. Valovna oblika je shranjena v nizu po 256 bajtov in ta niz se vzorči in pošlje na nožice. Frekvenca izhodnega signala je določena s tem, kako hitro se napreduje skozi matriko. Robusten, natančen in eleganten način za to je s faznim akumulatorjem: 32-bitno število se v rednih časovnih presledkih povečuje, za indeks matrike pa uporabljamo 8 najpomembnejših bitov.

Hitro vzorčenje

Prekinitve omogočajo vzorčenje ob točno določenih časih, vendar režijski stroški prekinitev omejujejo frekvenco vzorčenja na ~ 100 kHz. Neskončna zanka za posodobitev faze, vzorčenje valovne oblike in nastavitev nožic traja 42 urnih ciklov, s čimer se doseže frekvenca vzorčenja 16MHz/42 = 381kHz. Z vrtenjem ali potiskanjem vrtljivega dajalnika pride do spremembe nožice in prekinitve, ki pride ven iz zanke, da spremeni nastavitev (valovna oblika ali frekvenca). Na tej stopnji se 256 številk v nizu ponovno izračuna, tako da v glavni zanki ni treba izvajati dejanskih izračunov valovne oblike. Absolutna največja frekvenca, ki jo je mogoče ustvariti, je 190 kHz (polovica frekvence vzorčenja), potem pa sta na voljo samo dva vzorca na obdobje, zato ni veliko nadzora nad obliko. Tako vmesnik ne omogoča nastavitve frekvence nad 100 kHz. Pri 50 kHz je na obdobje 7-8 vzorcev, pri 1,5 kHz in manj pa se za vsako obdobje vzorči vseh 256 številk, shranjenih v matriki. Za valovne oblike, kjer se signal gladko spreminja, na primer sinusni val, preskakovanje vzorcev ni problem. Toda za valovne oblike z ozkimi konicami, na primer kvadratni val z majhnim delovnim ciklom, obstaja nevarnost, da lahko pri frekvencah nad 1,5 kHz manjka en sam vzorec, zaradi česar se valovna oblika ne obnaša po pričakovanjih

Natančnost frekvence

Število, za katero se faza poveča pri vsakem vzorcu, je sorazmerno s frekvenco. Frekvenco lahko tako nastavite na natančnost 381kHz/2^32 = 0,089mHz. V praksi takšna natančnost skoraj nikoli ni potrebna, zato vmesnik omejuje nastavitev frekvence v korakih po 1 mHz. Absolutna natančnost frekvence je določena z natančnostjo ure Arduino. To je odvisno od vrste Arduino, vendar večina določa frekvenco 16.000 MHz, zato je natančnost ~ 10^-4. Koda omogoča spreminjanje razmerja frekvence in faznega prirasta, da se odpravijo majhna odstopanja 16MHz predpostavke.

Medpomnjenje in ojačanje

Uporno omrežje ima visoko izhodno impedanco, zato njegova izhodna napetost hitro pade, če je priključena obremenitev. To je mogoče rešiti z medpomnjenjem ali povečanjem izhoda. Tu se medpomnjenje in ojačanje izvede z opampom. Uporabil sem LM358, ker sem ga imel. Je počasen opamp (hitrost obračanja 0,5 V na mikrosekundo), zato se pri visoki frekvenci in visoki amplitudi signal popači. Dobra stvar je, da lahko prenese napetosti zelo blizu 0V. Izhodna napetost je omejena na ~ 2V pod tirnico, zato uporaba +5V moči omeji izhodno napetost na 3V. Step-up moduli so kompaktni in poceni. Napajanje +20V na opamp lahko generira signale z napetostjo do 18V. (Opomba: shema pravi LTC3105, ker je bil to edini korak v Fritzingu. V resnici sem uporabil modul MT3608, glejte slike v naslednjih korakih). Odločil sem se, da na izhodu R2R DAC -ja uporabim spremenljivo oslabitev, nato pa z enim od opampov za blaženje signala brez ojačitve, drugega pa za ojačanje za 5,7, tako da signal lahko doseže največjo izhodno vrednost približno 20 V. Izhodni tok je precej omejen, ~ 10 mA, zato bo morda potreben močnejši ojačevalnik, če naj signal poganja velik zvočnik ali elektromagnet.

2. korak: Potrebne komponente

Za generator jedrne valovne oblike

Arduino Uno ali Nano

16x2 LCD zaslon + trimer 20kOhm in upor serije 100Ohm za osvetlitev ozadja

5-polni rotacijski dajalnik (z vgrajenim gumbom)

25 uporov 10kOhm

Za medpomnilnik/ojačevalnik

LM358 ali drug dvojni opamp

povečevalni modul, ki temelji na MT3608

50 kOhm spremenljiv upor

10kOhm upor

Upor 47kOhm

1muF kondenzator

3. korak: Gradnja

Gradnja
Gradnja
Gradnja
Gradnja

Vse sem spajkal na prototipno ploščo 7x9cm, kot je prikazano na sliki. Ker se je z vsemi žicami nekoliko zapletlo, sem poskušal obarvati kable, ki nosijo pozitivno napetost v rdečo, in tiste, ki nosijo ozemljitev v črno.

Dajalnik, ki sem ga uporabil, ima 5 zatičev, 3 na eni strani, 2 na drugi strani. Stran s tremi zatiči je dejanski dajalnik, stran z dvema zatičema pa integriran gumb. Na 3-polni strani mora biti osrednji zatič priključen na ozemljitev, druga dva zatiča na D10 in D11. Na 2-polni strani mora biti en pin priključen na ozemljitev, drugi pa na D12.

To je najbolj grda stvar, ki sem jo kdaj naredil, vendar deluje. Lepo bi bilo postaviti v ohišje, vendar zaenkrat dodatno delo in stroški tega ne upravičujejo. Nano in zaslon sta pritrjena z zatiči. Tega ne bi ponovil, če bi zgradil novega. Nisem dal priključkov na ploščo, da bi pobral signale. Namesto tega jih poberem s krokodilskimi vodi iz štrlečih kosov bakrene žice, označenih na naslednji način:

R - surov signal iz R2R DAC

B - medpomnjeni signal

A - ojačan signal

T - časovnik signal s pina 9

G - tla

+ - pozitivna „visoka“napetost iz povečevalnega modula

4. korak: Koda

Koda, skica Arduino, je priložena in jo je treba naložiti v Arduino.

20 valovnih oblik je bilo vnaprej definiranih. Dodajanje katerega koli drugega vala bi moralo biti preprosto. Upoštevajte, da naključni valovi napolnijo niz z 256 vrednostmi z naključnimi vrednostmi, vendar se isti vzorec ponovi vsako obdobje. Resnični naključni signali zvenijo kot hrup, vendar ta valovna oblika zveni veliko bolj kot piščalka.

Koda nastavi signal 1kHz na pin D9 s TIMER1. To je koristno za preverjanje časa analognega signala. Tako sem ugotovil, da je število ciklov ure 42: Če predpostavim, da je 41 ali 43 in ustvarim signal 1kHz, ima očitno drugačno frekvenco od signala na zatiču D9. Z vrednostjo 42 se popolnoma ujemata.

Običajno Arduino prekine vsako milisekundo, da spremlja čas s funkcijo millis (). To bi motilo natančno generiranje signala, zato je določena prekinitev onemogočena.

Prevajalec pravi: "Sketch uporablja 7254 bajtov (23%) prostora za shranjevanje programa. Največ 30720 bajtov. Globalne spremenljivke uporabljajo 483 bajtov (23%) dinamičnega pomnilnika, pri čemer je za lokalne spremenljivke 1565 bajtov. Največ 2048 bajtov." Tako je dovolj prostora za bolj izpopolnjeno kodo. Pazite, da boste za uspešno nalaganje v Nano morali izbrati "ATmega328P (stari zagonski nalagalnik)".

5. korak: Uporaba

Generator signala lahko preprosto napajate prek mini-USB kabla Arduino Nano. To je najbolje narediti z napajalnikom, da ne pride do naključne ozemljitvene zanke z aparatom, s katero bi lahko bil povezan.

Ko je vklopljen, bo ustvaril sinusni val 100Hz. Z vrtenjem gumba lahko izberete eno od drugih 20 vrst valov. Z vrtenjem med potiskanjem lahko kazalec nastavite na katero koli številko frekvence, ki jo nato lahko spremenite na želeno vrednost.

Amplitudo lahko regulirate s potenciometrom in uporabite bodisi medpomnjeni ali ojačani signal.

Za preverjanje amplitude signala je zelo koristno uporabiti osciloskop, zlasti kadar signal napaja tok z drugo napravo. Če pride do prevelikega toka, se bo signal odrezal in signal bo močno popačen

Pri zelo nizkih frekvencah lahko izhod vizualizirate z LED zaporedno z uporom 10 kOhm. Zvočne frekvence lahko slišite z zvočnikom. Signal nastavite na zelo majhen ~ 0,5 V, sicer bo tok previsok in signal se začne odrezati.

Priporočena: