Talaan ng mga Nilalaman:
- Hakbang 1: Mga Pagsasaalang-alang sa Teknikal
- Hakbang 2: Kinakailangan na Mga Sangkap
- Hakbang 3: Konstruksiyon
- Hakbang 4: Ang Code
- Hakbang 5: Paggamit
Video: Arduino Waveform Generator: 5 Hakbang (na may Mga Larawan)
2024 May -akda: John Day | [email protected]. Huling binago: 2024-01-30 13:12
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
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:
DIY Function / Waveform Generator: 6 na Hakbang (na may Mga Larawan)
DIY Function / Waveform Generator: Sa proyektong ito magkakaroon kami ng isang maikling pagtingin sa mga komersyal na function / waveform generator upang matukoy kung anong mga tampok ang mahalaga para sa isang bersyon ng DIY. Pagkatapos ay ipapakita ko sa iyo kung paano lumikha ng isang simpleng generator ng pagpapaandar, ang analog at digit
Weather based Music Generator (ESP8266 Batay sa Midi Generator): 4 na Hakbang (na may Mga Larawan)
Weather based Music Generator (ESP8266 Batay sa Midi Generator): Kumusta, ngayon ipapaliwanag ko kung paano gumawa ng iyong sariling maliit na Weather based Music generator. Batay ito sa isang ESP8266, na kung saan ay tulad ng isang Arduino, at tumutugon ito sa temperatura, ulan at gaanong lakas. Huwag asahan na makagawa ito ng buong mga kanta o chord progr
Mababang Gastos ng Waveform Generator (0 - 20MHz): 20 Hakbang (na may Mga Larawan)
Mababang Gastos ng Waveform Generator (0 - 20MHz): ABSTRATH Ang Proyekto na ito ay nagmumula sa pangangailangan ng pagkuha ng isang generator ng alon na may bandwidth na higit sa 10 Mhz at isang maayos na pagbaluktot sa ilalim ng 1%, lahat ng ito ay may mababang presyo ng gastos. Inilalarawan ng dokumentong ito ang isang disenyo ng isang generator ng alon na may isang bandwidth na
Pasadyang Arduino upang Panatilihing MAAARI ang Mga Pindutan sa Mga Manibela na May Bagong Car Stereo: 9 Mga Hakbang (na may Mga Larawan)
Pasadyang Arduino upang Panatilihin ang CAN Steering Wheel Buttons Sa Bagong Car Stereo: Napagpasyahan kong palitan ang orihinal na stereo ng kotse sa aking Volvo V70 -02 ng isang bagong stereo upang masisiyahan ako sa mga bagay tulad ng mp3, bluetooth at handsfree. Ang aking kotse ay may ilang mga kontrol sa manibela para sa stereo na nais kong magamit pa rin.
Mga Lightsaber na Nakabatay sa Arduino Na May Magaang at Mga Epekto ng Tunog: 14 Mga Hakbang (na may Mga Larawan)
Batay sa Arduino Lightsaber Na May Mga Magaan at Tunog na Mga Epekto: Kamusta jedi! Ang itinuturo na ito ay tungkol sa paggawa ng isang lightsaber, na ang hitsura, tunog at pagganap tulad ng isa sa pelikula! Ang pagkakaiba lamang - hindi ito maaaring mag-cut metal: (Ang aparatong ito ay batay sa platform ng Arduino, at binibigyan ko ito ng maraming mga tampok at pag-andar, ito