Sisukord:

Arduino lainekuju generaator: 5 sammu (piltidega)
Arduino lainekuju generaator: 5 sammu (piltidega)

Video: Arduino lainekuju generaator: 5 sammu (piltidega)

Video: Arduino lainekuju generaator: 5 sammu (piltidega)
Video: Начало работы с QLC+ Управление цветомузыкой с компьютера. Как управлять светом. 2024, November
Anonim
Arduino lainekuju generaator
Arduino lainekuju generaator

Veebruari 2021 värskendus: vaadake uut versiooni, mille proovivõtu sagedus on 300 korda suurem ja mis põhineb Raspberry Pi Picol

Laboris on sageli vaja teatud sageduse, kuju ja amplituudiga korduvat signaali. See võib olla võimendi testimine, vooluahela, komponendi või täiturmehhanismi kontrollimine. Võimsad lainekujugeneraatorid on kaubanduslikult saadaval, kuid Arduino Uno või Arduino Nano abil on suhteliselt lihtne kasulik ise valmistada, vt näiteks:

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

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

Siin on veel ühe kirjeldus, millel on järgmised omadused:

* Täpsed lainekujud: 8-bitine väljund, kasutades R2R DAC, 256 proovi kuju

* Kiire: 381 kHz diskreetimissagedus

* Täpne: 1mHz sammu sagedusvahemik. Sama täpne kui Arduino kristall.

* Lihtne kasutada: lainekuju ja sagedus on seadistatavad ühe pöörleva kodeerijaga

* Lai amplituudide vahemik: millivolt kuni 20 V.

* 20 eelnevalt määratletud lainekuju. Lihtne lisada veel.

* Lihtne valmistada: Arduino Uno või Nano pluss standardkomponendid

Samm: tehnilised kaalutlused

Analoogsignaali tegemine

Üks Arduino Uno ja Nano puudusi on see, et sellel ei ole digitaal-analoog (DAC) muundurit, seega ei ole võimalik panna seda analoogpinget otse tihvtidele väljastama. Üks lahendus on R2R redel: 8 digitaalset tihvti on ühendatud takistusvõrguga, et saavutada 256 väljundi taset. Otsese juurdepääsu kaudu pordile saab Arduino ühe käsuga korraga määrata 8 kontakti. Takisti võrgu jaoks on vaja 9 takistit väärtusega R ja 8 väärtust 2R. Kasutasin R väärtuseks 10 kOhm, mis hoiab tihvtide voolu kuni 0,5 mA või vähem. Ma arvan, et R = 1 kOhm võiks samuti töötada, kuna Arduino suudab hõlpsalt tarnida 5 mA pin, 40 mA porti. On oluline, et R ja 2R takistite suhe oleks tõesti 2. Seda on kõige lihtsam saavutada, pannes järjestikku 2 takistit väärtusega R, kokku 25 takisti.

Faaside aku

Lainekuju genereerimine tähendab seejärel 8-bitiste numbrite jada korduvat saatmist Arduino tihvtidele. Lainekuju salvestatakse 256 -baidisesse massiivi ning sellest massiivist võetakse proovid ja saadetakse tihvtidele. Väljundsignaali sageduse määrab see, kui kiiresti massiivist edasi liigutakse. Tugev, täpne ja elegantne viis selleks on faasiakumulaator: 32-bitist arvu suurendatakse korrapäraste ajavahemike järel ja me kasutame massiivi indeksina 8 kõige olulisemat bitti.

Kiire proovide võtmine

Katkestused võimaldavad proovide võtmist täpselt määratletud aegadel, kuid katkestuste üldkulud piiravad diskreetimissagedust ~ 100 kHz. Lõpmatu tsükkel faasi värskendamiseks, lainekuju proovide võtmiseks ja tihvtide seadmiseks kulub 42 taktsüklit, saavutades seega diskreetimissageduse 16MHz/42 = 381kHz. Pöörleva kodeerija pööramine või lükkamine põhjustab nööpnõela vahetuse ja silmusest väljuva katkestuse, mis muudab seadistust (lainekuju või sagedus). Selles etapis arvutatakse massiivi 256 numbrit ümber nii, et põhiahelas ei ole vaja tegelikke lainekuju arvutusi teha. Absoluutne maksimaalne sagedus, mida saab genereerida, on 190 kHz (pool proovivõtu sagedusest), kuid siis on perioodi kohta ainult kaks proovi, seega ei ole kuju palju kontrollitav. Seega ei võimalda liides seadistada sagedust üle 100 kHz. 50 kHz juures on perioodil 7–8 proovi ja 1,5 kHz ja allpool võetakse kõik 256 massiivi salvestatud numbrit igal perioodil. Lainekuju puhul, mille signaal muutub sujuvalt, näiteks siinuslaine, pole proovide vahelejätmine probleem. Kuid kitsaste naeltega lainekuju puhul, näiteks väikese töötsükliga ruutlaine puhul, on oht, et sageduste puhul, mis ületavad 1,5 kHz, puudub üks proov, võib lainekuju toimida ootuspäraselt

Sageduse täpsus

Arv, mille võrra faasi iga proovi puhul suurendatakse, on proportsionaalne sagedusega. Sageduse saab seega seada täpsusele 381 kHz/2^32 = 0,089 MHz. Praktikas pole sellist täpsust peaaegu kunagi vaja, nii et liides piirab sageduse seadmist 1 mHz sammuga. Sageduse absoluutse täpsuse määrab Arduino taktsageduse täpsus. See sõltub Arduino tüübist, kuid enamik määrab sageduse 16 000 MHz, seega täpsus ~ 10^-4. Kood võimaldab muuta sageduse ja faasi juurdekasvu suhet 16MHz eelduse väikeste kõrvalekallete parandamiseks.

Puhverdamine ja võimendamine

Takisti võrgul on kõrge väljundtakistus, mistõttu koormuse kinnitamisel langeb selle väljundpinge kiiresti. Seda saab lahendada väljundi puhverdamise või võimendamisega. Siin tehakse puhverdamine ja võimendamine opampiga. Ma kasutasin LM358, sest mul oli neid. See on aeglane opamp (pöördekiirus 0,5 V mikrosekundi kohta), nii et kõrge sageduse ja suure amplituudiga signaal moonutatakse. Hea on see, et see saab hakkama 0V lähedaste pingetega. Väljundpinge on siiski piiratud ~ 2V rööpa all, seega piirab +5V võimsuse kasutamine väljundpinget 3V -ni. Step-up moodulid on kompaktsed ja odavad. Toites +20V opampile, võib see genereerida signaale pingega kuni 18 V. (NB! Skeemil on kirjas LTC3105, sest see oli ainus samm, mille leidsin Fritzingist. Tegelikkuses kasutasin MT3608 moodulit, vt järgmiste sammude pilte). Valin R2R DAC väljundile muutuva sumbumise, seejärel kasutan ühte opampidest signaali puhverdamiseks ilma võimenduseta ja teist võimendamiseks 5,7 võrra, nii et signaal jõuab maksimaalse väljundini umbes 20 V. Väljundvool on üsna piiratud, ~ 10mA, seega võib vaja minna tugevamat võimendit, kui signaal peab juhtima suurt kõlarit või elektromagnetit.

2. samm: nõutavad komponendid

Tuumlainekuju generaatori jaoks

Arduino Uno või Nano

16x2 LCD -ekraan + 20kOhm trimmer ja 100Ohm seeria takisti taustvalgustuse jaoks

5-kontaktiline pöördkooder (integreeritud nupuga)

25 takisti 10kOhm

Puhvri/võimendi jaoks

LM358 või muu kahekordne opamp

astmemoodul, mis põhineb MT3608-l

50 kOhm muutuv takisti

10 kOhm takisti

47 kOhm takisti

1 µF kondensaator

3. samm: ehitamine

Ehitus
Ehitus
Ehitus
Ehitus

Jootsin kõik 7x9cm prototüüpplaadile, nagu pildil näidatud. Kuna kõikide juhtmetega läks natuke sassi, proovisin positiivset pinget kandvaid juhtmeid punaseks värvida ja maandusjuhtmeid mustaks.

Minu kasutatud kodeerijal on 5 tihvti, 3 ühel küljel, 2 teisel küljel. 3 tihvtiga külg on tegelik kodeerija, 2 tihvtiga külg on integreeritud nupp. Kolme kontaktiga küljel tuleb keskne tihvt ühendada maandusega, ülejäänud kaks tihvti D10 ja D11 külge. Kahe kontaktiga küljel tuleb üks tihvt ühendada maandusega ja teine D12-ga.

See on koledam asi, mida ma kunagi teinud olen, kuid see töötab. Oleks tore korpusesse panna, kuid praegu ei õigusta lisatöö ja kulud seda tegelikult. Nano ja ekraan on kinnitatud nööpnõeltega. Ma ei teeks seda uuesti, kui ehitaksin uue. Ma ei pannud tahvlile pistikuid signaalide vastuvõtmiseks. Selle asemel võtan need välja krokodillijuhtmetega vasktraadi väljaulatuvatest tükkidest, mis on märgistatud järgmiselt:

R - toorsignaal R2R DAC -st

B - puhverdatud signaal

A - võimendatud signaal

Taimeri signaal tihvtist 9

G - maapind

+ - positiivne kõrgepinge lisamoodulist

4. samm: kood

Kood, Arduino visand, on lisatud ja see tuleks Arduinosse üles laadida.

20 lainekuju on eelnevalt määratletud. Mis tahes muu laine lisamine peaks olema lihtne. Pange tähele, et juhuslikud lained täidavad 256 väärtusega massiivi juhuslike väärtustega, kuid sama mustrit korratakse igal perioodil. Tõelised juhuslikud signaalid kõlavad nagu müra, kuid see lainekuju kõlab palju rohkem kui vile.

Kood seab 1kHz signaali tihvtile D9 koos TIMER1 -ga. See on kasulik analoogsignaali ajastuse kontrollimiseks. Nii ma arvasin, et taktsüklite arv on 42: kui ma eeldan, et 41 või 43 ja genereerin 1 kHz signaali, siis on selle sagedus selgelt erinev tihvti D9 signaalist. Väärtusega 42 sobivad nad ideaalselt kokku.

Tavaliselt katkestab Arduino iga millisekundi, et jälgida millis () funktsiooniga aega. See häiriks täpset signaali genereerimist, seega on konkreetne katkestus keelatud.

Koostaja ütleb: "Sketch kasutab programmi salvestusruumi 7254 baiti (23%). Maksimaalne on 30720 baiti. Globaalsed muutujad kasutavad 483 baiti (23%) dünaamilist mälu, jättes kohalikele muutujatele 1565 baiti. Maksimaalne on 2048 baiti." Nii et keerukama koodi jaoks on piisavalt ruumi. Olge ettevaatlik, et Nano -le edukaks üleslaadimiseks peate võib -olla valima "ATmega328P (vana alglaadur)".

5. samm: kasutamine

Signaaligeneraatorit saab toita lihtsalt Arduino Nano mini-USB-kaabli kaudu. Seda on kõige parem teha toitepangaga, nii et seadmega ei oleks juhuslikku maandusahelat, millega seda ühendada.

Sisselülitamisel tekitab see 100 Hz siinuslaine. Nuppu keerates saab valida ühe ülejäänud 20 lainetüübist. Nihutamise ajal pööramisel saab kursori seada mis tahes sageduse numbrile, mida saab seejärel soovitud väärtusele muuta.

Amplituudi saab reguleerida potentsiomeetriga ja kasutada kas puhverdatud või võimendatud signaali.

Signaali amplituudi kontrollimiseks on tõesti kasulik ostsilloskoop, eriti kui signaal annab voolu teisele seadmele. Kui voolu tõmmatakse liiga palju, siis signaal katkeb ja signaal on tugevasti moonutatud

Väga madalate sageduste korral saab väljundit visualiseerida 10kOhm takisti jada LED -iga. Kõlariga saab kuulda helisagedusi. Kindlasti seadke signaal väga väikeseks ~ 0,5V, vastasel juhul muutub vool liiga suureks ja signaal hakkab kärpima.

Soovitan: