Talaan ng mga Nilalaman:

Arduino Waveform Generator: 5 Hakbang (na may Mga Larawan)
Arduino Waveform Generator: 5 Hakbang (na may Mga Larawan)

Video: Arduino Waveform Generator: 5 Hakbang (na may Mga Larawan)

Video: Arduino Waveform Generator: 5 Hakbang (na may Mga Larawan)
Video: Arduino MASTERCLASS | Full Programming Workshop in 90 Minutes! 2024, Nobyembre
Anonim
Tagabuo ng Arduino Waveform
Tagabuo ng Arduino Waveform

Pag-update noong Peb. 2021: suriin ang bagong bersyon na may 300x na sampling rate, batay sa Raspberry Pi Pico

Sa lab, madalas na nangangailangan ang isang paulit-ulit na signal ng isang tiyak na dalas, hugis at amplitude. Maaaring ito ay upang subukan ang isang amplifier, suriin ang isang circuit, isang bahagi o isang actuator. Ang mga makapangyarihang generator ng alon ay magagamit nang komersyo, ngunit madali itong gumawa ng isang kapaki-pakinabang sa iyong sarili sa isang Arduino Uno o Arduino Nano, tingnan ang halimbawa:

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

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

Narito ang paglalarawan ng isa pa kasama ang mga sumusunod na tampok:

* Tumpak na mga waveform: 8-bit na output gamit ang R2R DAC, 256-sample na hugis

* Mabilis: 381 kHz rate ng pag-sample

* Tiyak: Saklaw ng dalas ng mga hakbang na 1mHz. Tulad ng tumpak na Arduino na kristal.

* Madaling operasyon: ang form ng alon at dalas na maaayos na may solong umiikot na encoder

* Malawak na hanay ng mga amplitude: millivolts hanggang 20V

* 20 paunang natukoy na mga form ng alon. Prangka upang magdagdag ng higit pa.

* Madaling gawin: Arduino Uno o Nano kasama ang mga karaniwang bahagi

Hakbang 1: Mga Pagsasaalang-alang sa Teknikal

Paggawa ng isang analog signal

Ang isang pagkukulang ng Arduino Uno at Nano ay wala itong isang converter na digital-to-analog (DAC), kaya hindi posible na gawin itong output ng isang analog boltahe nang direkta sa mga pin. Ang isang solusyon ay ang hagdan ng R2R: 8 mga digital na pin ay konektado sa isang resistor network upang maabot ang 256 na antas ng output. Sa pamamagitan ng direktang pag-access sa port, maaaring magtakda ang Arduino ng 8 mga pin nang sabay-sabay sa isang solong utos. Para sa resistor network, 9 na resistors na may halagang R ang kinakailangan at 8 na may halagang 2R. Gumamit ako ng 10kOhm bilang isang halaga para sa R, na pinapanatili ang kasalukuyang mula sa mga pin hanggang 0.5mA o mas kaunti. Sa palagay ko ang R = 1kOhm ay maaaring gumana din, dahil ang Arduino ay madaling maghatid ng 5mA bawat pin, 40mA bawat port. Mahalaga na ang ratio sa pagitan ng R at ng 2R resistors ay talagang 2. Iyon ay mas madaling makamit sa pamamagitan ng paglalagay ng 2 resistors ng halagang R sa serye, para sa isang kabuuang 25 resistors.

Nag-iipon ng phase

Bumubuo ng isang waveform pagkatapos ay bumaba upang paulit-ulit na nagpapadala ng isang pagkakasunud-sunod ng mga 8-bit na numero sa mga pin ng Arduino. Ang waveform ay nakaimbak sa isang array ng 256 bytes at ang array na ito ay na-sample at ipinadala sa mga pin. Ang dalas ng output signal ay natutukoy ng kung gaano kabilis ang pagsulong ng isang tao sa pamamagitan ng array. Ang isang matatag, tumpak at matikas na paraan upang gawin iyon ay sa isang phase nagtitipon: isang 32-bit na numero ay nadagdagan sa regular na mga agwat, at ginagamit namin ang 8 pinaka-makabuluhang mga piraso bilang index ng array.

Mabilis na sampling

Pinapayagan ng mga nakakagambala na mag-sample sa mga natukoy nang oras, ngunit ang overhead ng mga nakakagambala ay naglilimita sa dalas ng sampling sa ~ 100kHz. Ang isang walang katapusang loop upang mai-update ang yugto, halimbawang ang form ng alon at itakda ang mga pin ay tumatagal ng 42 na mga cycle ng orasan, sa gayon makamit ang isang sampling rate na 16MHz / 42 = 381kHz. Ang pag-ikot o pagtulak ng rotary encoder ay nagdudulot ng pagbabago ng pin at isang nakakagambala na lumabas sa loop upang baguhin ang setting (waveform o frequency). Sa yugtong ito ang 256 na mga numero sa array ay muling kinalkula upang walang aktwal na mga kalkulasyon ng waveform na kailangang gumanap sa pangunahing loop. Ang ganap na maximum na dalas na maaaring mabuo ay 190kHz (kalahati ng rate ng pag-sample) ngunit pagkatapos ay may dalawang sample lamang bawat panahon, kaya't hindi gaanong makontrol ang hugis. Sa gayon hindi pinapayagan ng interface na itakda ang dalas sa itaas ng 100kHz. Sa 50kHz, mayroong 7-8 na mga sample bawat panahon at sa 1.5 kHz at mas mababa sa lahat ng 256 na mga numero na nakaimbak sa array na mag-sample sa bawat panahon. Para sa mga waveform na kung saan ang signal ay maayos na nagbabago, halimbawa ang sine wave, walang problema ang paglaktaw ng mga sample. Ngunit para sa mga waveform na may makitid na mga spike, halimbawa isang square wave na may isang maliit na cycle ng tungkulin, may panganib na para sa mga frequency na higit sa 1.5 kHz na nawawala ang isang solong sample ay maaaring magresulta sa isang hindi pag-uugali ng waveform tulad ng inaasahan

Kawastuhan ng dalas

Ang bilang kung saan ang yugto ay nadagdagan sa bawat sample ay proporsyonal sa dalas. Ang dalas ay maaaring itakda sa isang kawastuhan ng 381kHz / 2 ^ 32 = 0.089mHz. Sa pagsasagawa ng naturang kawastuhan ay halos hindi kinakailangan, kaya ang mga limitasyon ng interface upang itakda ang dalas sa mga hakbang ng 1mHz. Ang ganap na katumpakan ng dalas ay natutukoy ng katumpakan ng dalas ng orasan ng Arduino. Ito ay nakasalalay sa uri ng Arduino ngunit karamihan ay tumutukoy sa dalas ng 16.000MHz, kaya't isang katumpakan na ~ 10 ^ -4. Pinapayagan ng code na baguhin ang ratio ng dalas at ang pagtaas ng phase upang itama para sa maliliit na paglihis ng palagay na 16MHz.

Buffering at amplification

Ang resistor network ay may mataas na impedance ng output, kaya't ang boltahe ng output nito ay mabilis na bumaba kung ang isang karga ay nakakabit. Maaari itong malutas sa pamamagitan ng buffering o amplifying ang output. Dito, ang buffering at amplification ay ginagawa sa isang opamp. Ginamit ko ang LM358 dahil mayroon akong. Ito ay isang mabagal na opamp (pinatay ang rate na 0.5V bawat microsecond) kaya't sa mataas na dalas at mataas na amplitude ang signal ay nakakagulo. Ang isang magandang bagay ay maaari itong hawakan voltages napakalapit sa 0V. Ang output boltahe ay subalit limitado sa ~ 2V sa ibaba ng riles, kaya ang paggamit ng + 5V lakas ay naglilimita sa output boltahe sa 3V. Ang mga step-up module ay compact at mura. Ang pagpapakain ng + 20V sa opamp, maaari itong makabuo ng mga signal na may boltahe hanggang sa 18V. (NB, sinabi ng eskematiko na LTC3105 sapagkat iyon lamang ang nakita kong pag-step-up sa Fritzing. Sa totoo lang gumamit ako ng isang MT3608 module, tingnan ang mga larawan sa mga susunod na hakbang). Pinili kong mag-apply ng isang variable na pagpapalambing sa output ng R2R DAC pagkatapos ay gamitin ang isa sa mga opamp upang buffer ang signal nang walang amplification at ang iba pa upang palakasin ng 5.7, upang ang signal ay maaaring maabot ang isang maximum na output ng tungkol sa 20V. Ang kasalukuyang output ay sa halip limitado, ~ 10mA, kaya maaaring kailanganin ng isang mas malakas na amplifier kung ang signal ay upang himukin ang isang malaking speaker o electromagnet.

Hakbang 2: Kinakailangan na Mga Sangkap

Para sa pangunahing generator ng waveform

Arduino Uno o Nano

16x2 LCD display + 20kOhm trimmer at 100Ohm series resistor para sa backlight

5-pin rotary encoder (na may integrated pushbutton)

25 resistors ng 10kOhm

Para sa buffer / amplifier

LM358 o iba pang dual opamp

step-up module batay sa MT3608

50kOhm variable na risistor

10kOhm risistor

47kOhm risistor

1muF capacitor

Hakbang 3: Konstruksiyon

Konstruksyon
Konstruksyon
Konstruksyon
Konstruksyon

Inhinang ko ang lahat sa isang 7x9cm prototype board, tulad ng ipinakita sa larawan. Dahil medyo magulo ito sa lahat ng mga wire sinubukan kong kulayan ang mga lead na nagdadala ng positibong boltahe na pula at mga nagdadala ng itim na lupa.

Ang ginamit kong encoder ay may 5 mga pin, 3 sa isang gilid, 2 sa kabilang panig. Ang panig na may 3 mga pin ay ang aktwal na encoder, ang panig na may 2 mga pin ay ang pinagsamang pushbutton. Sa 3-pin na bahagi, ang gitnang pin ay dapat na konektado sa lupa, ang iba pang dalawang mga pin sa D10 at D11. Sa gilid na 2-pin, ang isang pin ay dapat na konektado sa lupa at ang isa sa D12.

Ito ang pinakapangit na bagay na nagawa ko ngunit gumagana ito. Masarap na ilagay sa isang enclosure, ngunit sa ngayon ang labis na trabaho at gastos ay hindi talaga ito katwiran. Ang Nano at ang display ay naka-attach sa mga pin-header. Hindi ko na gagawin iyon ulit kung gagawa ako ng bago. Hindi ko inilagay ang mga konektor sa pisara upang kunin ang mga signal. Sa halip, kinukuha ko ang mga ito ng mga lead ng crocodile mula sa nakausli na mga piraso ng wire na tanso, na may label na sumusunod:

R - raw signal mula sa R2R DAC

B - buffered signal

A - pinalakas na signal

T - timer signal mula sa pin 9

G - lupa

+ - positibong 'mataas' na boltahe mula sa step-up module

Hakbang 4: Ang Code

Ang code, isang Arduino sketch, ay nakakabit at dapat na mai-upload sa Arduino.

20 mga form ng alon ang naunang natukoy na. Dapat itong maging prangka upang magdagdag ng anumang iba pang mga alon. Tandaan na pinupunan ng mga random na alon ang 256-halaga na array na may mga random na halaga, ngunit ang parehong pattern ay paulit-ulit sa bawat panahon. Ang totoong mga random signal ay tunog tulad ng ingay, ngunit ang waveform na ito ay parang tunog ng sipol.

Nagtatakda ang code ng isang 1kHz signal sa pin D9 na may TIMER1. Kapaki-pakinabang ito upang suriin ang oras ng signal ng analog. Iyon ay kung paano ko nalaman na ang bilang ng mga cycle ng orasan ay 42: Kung ipinapalagay ko alinman sa 41 o 43, at bumuo ng isang 1kHz signal, malinaw na may iba't ibang dalas mula sa signal sa pin D9. Sa halagang 42 ganap na tumutugma ang mga ito.

Karaniwan, ang Arduino ay nakakagambala sa bawat millisecond upang subaybayan ang oras sa paggana ng millis (). Gagambala nito ang tumpak na pagbuo ng signal, kaya hindi pinagana ang partikular na pagkagambala.

Sinabi ng tagatala: "Gumagamit ang sketch ng 7254 bytes (23%) ng espasyo ng imbakan ng programa. Ang maximum ay 30720 bytes. Ang mga pandaigdigang variable ay gumagamit ng 483 bytes (23%) ng pabuong memorya, naiwan ang 1565 bytes para sa mga lokal na variable. Ang maximum ay 2048 bytes." Kaya may sapat na puwang para sa mas sopistikadong code. Mag-ingat na maaaring kailangan mong piliin ang "ATmega328P (lumang bootloader)" upang matagumpay na ma-upload sa Nano.

Hakbang 5: Paggamit

Maaaring palakasin ang signal generator sa pamamagitan ng mini-USB cable ng Arduino Nano. Mahusay na ginagawa ito sa isang power bank, upang walang aksidenteng ground loop na may aparatong maaaring ito ay konektado.

Kapag binuksan ito ay bubuo ng isang 100Hz sine wave. Sa pamamagitan ng pag-ikot ng knob, maaaring mapili ang isa sa iba pang 20 mga uri ng alon. Sa pamamagitan ng pag-ikot habang itinulak, ang cursor ay maaaring itakda sa alinman sa mga digit ng dalas, na maaaring mabago sa nais na halaga.

Ang amplitude ay maaaring makontrol sa potentiometer at maaaring magamit ang buffered o ang amplified signal.

Talagang kapaki-pakinabang na gumamit ng isang oscilloscope upang suriin ang signal amplitude, sa partikular kung ang signal ay nagbibigay ng kasalukuyang sa ibang aparato. Kung ang labis na kasalukuyang iginuhit, ang signal ay clip at ang signal ay mabigat na baluktot

Para sa napakababang mga frequency, ang output ay maaaring mailarawan sa isang LED sa serye na may isang risistor na 10kOhm. Ang mga frequency ng audio ay maaaring marinig sa isang speaker. Siguraduhing itakda ang signal nang napakaliit ~ 0.5V, kung hindi man ang kasalukuyang napapataas at ang signal ay nagsisimulang mag-clipping.

Inirerekumendang: