Sadržaj:

Arduino generator valova: 5 koraka (sa slikama)
Arduino generator valova: 5 koraka (sa slikama)

Video: Arduino generator valova: 5 koraka (sa slikama)

Video: Arduino generator valova: 5 koraka (sa slikama)
Video: Схема аналогового звукового генератора тарелок драм-машины DR-110 2024, Novembar
Anonim
Arduino generator valova
Arduino generator valova

Ažuriranje februara 2021.: pogledajte novu verziju sa 300x stopom uzorkovanja, zasnovanu na Raspberry Pi Pico

U laboratoriji je često potreban ponavljajući signal određene frekvencije, oblika i amplitude. Možda je potrebno testirati pojačalo, provjeriti krug, komponentu ili aktuator. Snažni generatori talasnih oblika dostupni su na tržištu, ali relativno je lako sami napraviti koristan s Arduino Uno ili Arduino Nano, pogledajte na primjer:

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

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

Evo opisa još jednog sa sljedećim karakteristikama:

* Tačni oblici talasa: 8-bitni izlaz pomoću R2R DAC-a, oblik od 256 uzoraka

* Brzo: brzina uzorkovanja 381 kHz

* Precizno: frekvencijski raspon koraka od 1mHz. Tačan kao Arduino kristal.

* Jednostavno rukovanje: valni oblik i frekvencija podesivi s jednim rotacijskim davačem

* Širok raspon amplituda: milivolti do 20V

* 20 unaprijed definiranih valnih oblika. Jednostavno dodati još.

* Jednostavno za izradu: Arduino Uno ili Nano plus standardne komponente

Korak 1: Tehnička razmatranja

Stvaranje analognog signala

Jedan nedostatak Arduino Uno i Nano je to što nema digitalno-analogni (DAC) pretvarač, pa ga nije moguće natjerati da izlazi analogni napon izravno na pinove. Jedno rješenje je ljestvica R2R: 8 digitalnih pinova spojeno je na otporničku mrežu tako da se može doseći 256 izlaznih nivoa. Putem izravnog pristupa portu, Arduino može postaviti 8 pinova istovremeno s jednom naredbom. Za otporničku mrežu potrebno je 9 otpornika s vrijednošću R i 8 s vrijednošću 2R. Koristio sam 10kOhm kao vrijednost za R, koja održava struju sa pinova na 0,5mA ili manje. Pretpostavljam da bi R = 1 kOhm također mogao raditi, jer Arduino može lako isporučiti 5mA po pinu, 40mA po portu. Važno je da je odnos između R i 2R otpornika zaista 2. To se najlakše postiže stavljanjem 2 otpornika vrijednosti R u nizu, za ukupno 25 otpornika.

Fazni akumulator

Generiranje valnog oblika tada se svodi na ponavljajuće slanje niza 8-bitnih brojeva na Arduino pinove. Talasni oblik je uskladišten u nizu od 256 bajta i ovaj niz se uzorkuje i šalje na pinove. Učestalost izlaznog signala određena je brzinom napredovanja kroz niz. Robustan, precizan i elegantan način za to je pomoću faznog akumulatora: 32-bitni broj se povećava u pravilnim intervalima, a mi koristimo 8 najznačajnijih bitova kao indeks niza.

Brzo uzorkovanje

Prekidi omogućuju uzorkovanje u dobro definirano vrijeme, ali dodatni prekidi ograničavaju frekvenciju uzorkovanja na ~ 100 kHz. Beskonačna petlja za ažuriranje faze, uzorkovanje valnog oblika i postavljanje pinova traje 42 takta, čime se postiže brzina uzorkovanja od 16MHz/42 = 381kHz. Rotiranje ili guranje rotacijskog davača uzrokuje promjenu pina i prekid koji izlazi iz petlje radi promjene postavke (valnog oblika ili frekvencije). U ovoj fazi se 256 brojeva u nizu ponovno izračunava tako da u glavnoj petlji nije potrebno izvršiti stvarne proračune valnog oblika. Apsolutna maksimalna frekvencija koja se može generirati je 190 kHz (polovina brzine uzorkovanja), ali tada postoje samo dva uzorka po periodu, tako da nema velike kontrole oblika. Sučelje stoga ne dopušta postavljanje frekvencije iznad 100kHz. Na 50 kHz, ima 7-8 uzoraka po periodu, a na 1,5 kHz i ispod svih 256 brojeva pohranjenih u nizu se uzorkuje svaki period. Za valne oblike gdje se signal glatko mijenja, na primjer sinusni val, preskakanje uzoraka nije problem. No, za valne oblike s uskim šiljcima, na primjer kvadratni val s malim radnim ciklusom, postoji opasnost da za frekvencije iznad 1,5 kHz propuštanje jednog uzorka može dovesti do toga da se valni oblik ne ponaša kako je očekivano

Tačnost frekvencije

Broj za koji se faza povećava za svaki uzorak proporcionalan je frekvenciji. Frekvencija se tako može postaviti na tačnost od 381kHz/2^32 = 0,089mHz. U praksi takva točnost rijetko treba, pa sučelje ograničava postavljanje frekvencije u koracima od 1 mHz. Apsolutna preciznost frekvencije određena je preciznošću Arduino takta. To ovisi o vrsti Arduina, ali većina navodi frekvenciju od 16.000 MHz, pa je preciznost ~ 10^-4. Kod dozvoljava da se izmijeni omjer frekvencije i faznog prirasta kako bi se ispravila mala odstupanja pretpostavke od 16 MHz.

Međuspremnik i pojačanje

Mreža otpornika ima visoku izlaznu impedanciju, pa izlazni napon brzo pada ako je opterećenje priključeno. To se može riješiti međuspremnikom ili pojačanjem izlaza. Ovdje se međuspremnik i pojačanje rade pomoću opampa. Koristio sam LM358 jer sam ga imao. To je spor opamp (brzina naprezanja 0,5V po mikrosekundi) pa se pri velikoj frekvenciji i velikoj amplitudi signal izobličuje. Dobra stvar je što može podnijeti napone vrlo blizu 0V. Izlazni napon je međutim ograničen na ~ 2V ispod šine, pa upotreba +5V snage ograničava izlazni napon na 3V. Step-up moduli su kompaktni i jeftini. Napajajući opamp +20V, može generirati signale napona do 18V. (Napomena: shema kaže LTC3105 jer je to bio jedini korak koji sam pronašao u Fritzingu. U stvarnosti sam koristio modul MT3608, pogledajte slike u sljedećim koracima). Odlučio sam primijeniti promjenjivo slabljenje na izlaz R2R DAC -a, a zatim upotrijebiti jednu od opampi za međuspremnik signala bez pojačanja, a drugu za pojačanje za 5,7, tako da signal može doseći maksimalni izlaz od oko 20V. Izlazna struja je prilično ograničena, ~ 10mA, pa će možda biti potrebno jače pojačalo ako signal želi pokrenuti veliki zvučnik ili elektromagnet.

Korak 2: Potrebne komponente

Za generator valnog oblika jezgre

Arduino Uno ili Nano

16x2 LCD ekran + trimer 20kOhm i otpornik serije 100Ohm za pozadinsko osvetljenje

5-pinski rotacijski davač (s integriranim gumbom)

25 otpornika od 10 kOhm

Za bafer/pojačalo

LM358 ili drugi dvostruki opamp

step-up modul zasnovan na MT3608

50kOhm varijabilni otpornik

10kOhm otpornik

47kOhm otpornik

1muF kondenzator

Korak 3: Konstrukcija

Građevinarstvo
Građevinarstvo
Građevinarstvo
Građevinarstvo

Lemio sam sve na prototipnu ploču 7x9cm, kao što je prikazano na slici. Pošto je postalo pomalo neuredno sa svim žicama, pokušao sam obojati elektrode koje nose pozitivni napon u crveno, a one koje nose masu u crno.

Enkoder koji sam koristio ima 5 pinova, 3 s jedne strane, 2 s druge strane. Strana s 3 pina je stvarni koder, strana s 2 pina je integrirano dugme. Na 3-pinskoj strani, središnji pin bi trebao biti spojen na masu, a druga dva pina na D10 i D11. Na 2-polnoj strani jedan pin treba spojiti na masu, a drugi na D12.

To je nešto najružnije što sam ikad napravio, ali funkcionira. Bilo bi lijepo staviti u kućište, ali za sada dodatni rad i troškovi to ne opravdavaju. Nano i zaslon su pričvršćeni pin-headerima. Ne bih to ponovio da sam napravio novu. Nisam stavio konektore na ploču da pokupim signale. Umjesto toga, pokupim ih krokodilskim tragovima iz izbočenih komada bakrene žice, označenih na sljedeći način:

R - sirovi signal iz R2R DAC -a

B - memorirani signal

A - pojačani signal

T - signal tajmera s pina 9

G - uzemljenje

+ - pozitivan 'visoki' napon iz pojačavajućeg modula

Korak 4: Kôd

Kôd, Arduino skica, nalazi se u privitku i trebao bi se učitati na Arduino.

Unaprijed je definirano 20 valnih oblika. Trebalo bi biti jednostavno dodati bilo koji drugi val. Imajte na umu da nasumični valovi popunjavaju niz od 256 vrijednosti slučajnim vrijednostima, ali isti obrazac se ponavlja svaki period. Istinski nasumični signali zvuče kao šum, ali ovaj valni oblik zvuči mnogo više kao zvižduk.

Kod postavlja signal od 1 kHz na pin D9 sa TIMER1. Ovo je korisno za provjeru vremena analognog signala. Tako sam shvatio da je broj ciklusa takta 42: Ako pretpostavim 41 ili 43 i generiram signal od 1 kHz, očito ima drugačiju frekvenciju od signala na pinu D9. Sa vrijednošću 42 savršeno se slažu.

Uobičajeno, Arduino prekida svaku milisekundu kako bi pratio vrijeme pomoću funkcije millis (). To bi poremetilo precizno generiranje signala, pa je određeni prekid onemogućen.

Kompajler kaže: "Sketch koristi 7254 bajta (23%) prostora za skladištenje programa. Maksimalno je 30720 bajtova. Globalne varijable koriste 483 bajta (23%) dinamičke memorije, ostavljajući 1565 bajtova za lokalne varijable. Maksimalno je 2048 bajtova." Dakle, ima dovoljno prostora za sofisticiraniji kod. Pazite da ćete možda morati odabrati "ATmega328P (stari bootloader)" za uspješno učitavanje na Nano.

Korak 5: Upotreba

Generator signala može se jednostavno napajati putem mini-USB kabela Arduino Nano. Najbolje je to učiniti s napajanjem, kako ne bi došlo do slučajne petlje uzemljenja s uređajem s kojim bi mogao biti povezan.

Kada se uključi, generirat će sinusni val od 100Hz. Okretanjem dugmeta može se izabrati jedan od drugih 20 tipova talasa. Okretanjem dok je pritisnut, kursor se može postaviti na bilo koju znamenku frekvencije, koja se zatim može promijeniti na željenu vrijednost.

Amplituda se može regulirati potenciometrom i može se koristiti ili međuspremnik ili pojačani signal.

Zaista je korisno koristiti osciloskop za provjeru amplitude signala, posebno kada signal dovodi struju na drugi uređaj. Ako se izvuče previše struje, signal će se prekinuti i signal će biti jako izobličen

Za vrlo niske frekvencije, izlaz se može vizualizirati serijski LED sa 10kOhm otpornikom. Audio frekvencije se mogu čuti putem zvučnika. Uverite se da je signal postavljen na vrlo mali ~ 0.5V, u suprotnom će struja postati previsoka i signal počinje da se prekida.

Preporučuje se: