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, Studeni
Anonim
Arduino generator valova
Arduino generator valova

Ažuriranje veljače 2021.: pogledajte novu verziju s 300x stopom uzorkovanja, temeljenu na Raspberry Pi Pico

U laboratoriju 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 valnih oblika dostupni su na tržištu, ali relativno je jednostavno 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 značajkama:

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

* Brzo: brzina uzorkovanja od 381 kHz

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

* Jednostavan rad: 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

Izrada analognog signala

Jedan nedostatak Arduino Uno i Nano je što nema digitalno-analogni (DAC) pretvarač, pa ga nije moguće natjerati da izlazi analogni napon izravno na pinove. Jedno rješenje su ljestve R2R: 8 digitalnih pinova spojeno je na otporničku mrežu tako da se može doseći 256 razina izlaza. Izravnim pristupom portu, Arduino može postaviti 8 pinova istovremeno s jednom naredbom. Za mrežu otpornika 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 s 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 omjer između otpornika R i 2R bude doista 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 ponavljano slanje slijeda 8-bitnih brojeva na Arduino pinove. Valni oblik je pohranjen 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 točno 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 16 MHz/42 = 381 kHz. Rotiranje ili guranje rotacijskog davača uzrokuje promjenu pina i prekid koji izlazi iz petlje radi promjene postavke (valni oblik ili frekvencija). U ovoj fazi 256 brojeva u nizu se ponovno izračunava tako da u glavnoj petlji nije potrebno izvoditi stvarne proračune valnog oblika. Apsolutna maksimalna frekvencija koja se može generirati je 190 kHz (polovica brzine uzorkovanja), ali tada postoje samo dva uzorka po razdoblju, pa nema velike kontrole oblika. Sučelje stoga ne dopušta postavljanje frekvencije iznad 100kHz. Na 50 kHz postoji 7-8 uzoraka po razdoblju, a na 1,5 kHz i ispod svih 256 brojeva pohranjenih u nizu uzorkuje se svako razdoblje. 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

Točnost frekvencije

Broj za koji se faza povećava za svaki uzorak proporcionalan je frekvenciji. Frekvencija se tako može postaviti na toč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. Kôd omogućuje izmjenu omjera 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 njezin izlazni napon brzo pada ako je priključeno opterećenje. To se može riješiti međuspremnikom ili pojačanjem izlaza. Ovdje se međuspremnik i pojačanje obavljaju pomoću opampa. Koristio sam LM358 jer sam ga imao. To je spor opamp (brzina naprezanja 0,5V po mikrosekundi) pa se pri visokoj frekvenciji i velikoj amplitudi signal iskrivljuje. Dobra stvar je što može podnijeti napone vrlo blizu 0V. Izlazni napon je međutim ograničen na ~ 2V ispod tračnice, 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 spremanje 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, ~ 10 mA, 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 zaslon + trimer 20kOhm i otpornik serije 100Ohm za pozadinsko osvjetljenje

5-pinski rotacijski davač (s integriranim gumbom)

25 otpornika od 10kOhm

Za međuspremnik/pojačalo

LM358 ili drugi dvostruki opamp

step-up modul temeljen na MT3608

50kOhm promjenjivi otpornik

10kOhm otpornik

Otpor 47kOhm

Kondenzator 1muF

Korak 3: Izgradnja

Graditeljstvo
Graditeljstvo
Graditeljstvo
Graditeljstvo

Lemio sam sve na prototipnu ploču 7x9cm, kao što je prikazano na slici. Budući da 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 igle je stvarni davač, strana s 2 pina je integrirani gumb. Na 3-polnoj strani središnji pin treba biti spojen na masu, a druga dva 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 djeluje. Bilo bi lijepo staviti u kućište, ali za sada dodatni rad i troškovi to zapravo ne opravdavaju. Nano i zaslon povezani su pin-headerima. Ne bih to ponovio da sam sagradio 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 - međuspremni signal

A - pojačani signal

T - signal tajmera s pina 9

G - tlo

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

Korak 4: Kôd

Kôd, Arduino skica, nalazi se u privitku i treba ga prenijeti na Arduino.

Unaprijed je definirano 20 valnih oblika. Bilo bi jednostavno dodati bilo koji drugi val. Imajte na umu da nasumični valovi ispunjavaju niz od 256 vrijednosti slučajnim vrijednostima, ali isti se obrazac ponavlja svaki period. Istinski slučajni 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 s TIMER1. Ovo je korisno za provjeru vremena analognog signala. Tako sam zaključio 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. S 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 stvaranje točnog signala, pa je određeni prekid onemogućen.

Prevoditelj kaže: "Sketch koristi 7254 bajta (23%) prostora za pohranu 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šan prijenos 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 na koji se može spojiti.

Kad se uključi, generirat će sinusni val od 100Hz. Okretanjem gumba može se izabrati jedan od ostalih 20 tipova valova. Okretanjem dok se pritisne, 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, a može se koristiti ili međuspremnik ili pojačani signal.

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

Za vrlo niske frekvencije, izlaz se može vizualizirati serijski LED sa 10kOhm otpornikom. Audio frekvencije mogu se čuti zvučnikom. Signal treba biti vrlo mali ~ 0,5 V, u protivnom će struja postati previsoka i signal počinje prelaziti.

Preporučeni: