Turinys:

„Arduino“bangų formos generatorius: 5 žingsniai (su nuotraukomis)
„Arduino“bangų formos generatorius: 5 žingsniai (su nuotraukomis)

Video: „Arduino“bangų formos generatorius: 5 žingsniai (su nuotraukomis)

Video: „Arduino“bangų formos generatorius: 5 žingsniai (su nuotraukomis)
Video: Output DC or AC Voltage using MCP4725 DAC with LCD and PWM to Voltage Converter with Arduino 2024, Lapkritis
Anonim
„Arduino“bangų formos generatorius
„Arduino“bangų formos generatorius

2021 m. Vasario mėn. Atnaujinimas: patikrinkite naują versiją, kurios imties dažnis yra 300 kartų didesnis, remiantis Raspberry Pi Pico

Laboratorijoje dažnai reikia pasikartojančio tam tikro dažnio, formos ir amplitudės signalo. Tai gali būti stiprintuvo bandymas, grandinės, komponento ar pavaros patikrinimas. Galingų bangų formų generatorių galima įsigyti prekyboje, tačiau palyginti paprasta pasidaryti naudingą patiems naudojant „Arduino Uno“ar „Arduino Nano“, žr., Pavyzdžiui:

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

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

Čia yra dar vieno aprašymas su šiomis savybėmis:

* Tikslios bangos formos: 8 bitų išvestis naudojant R2R DAC, 256 mėginio forma

* Greitas: 381 kHz atrankos dažnis

* Tikslus: 1mHz žingsnių dažnių diapazonas. Tikslus kaip „Arduino“kristalas.

* Lengvas valdymas: bangos formą ir dažnį galima nustatyti naudojant vieną sukamąjį kodavimo įrenginį

* Platus amplitudžių diapazonas: milivoltai iki 20 V.

* 20 iš anksto nustatytų bangų formų. Paprasta pridėti daugiau.

* Lengva pagaminti: „Arduino Uno“arba „Nano plus“standartiniai komponentai

1 žingsnis: techninės aplinkybės

Analoginio signalo skleidimas

Vienas „Arduino Uno“ir „Nano“trūkumų yra tas, kad jis neturi skaitmeninio-analoginio (DAC) keitiklio, todėl neįmanoma jo išvesti analoginės įtampos tiesiai ant kaiščių. Vienas iš sprendimų yra R2R kopėčios: 8 skaitmeniniai kaiščiai yra prijungti prie rezistorių tinklo, kad būtų galima pasiekti 256 išvesties lygius. Per tiesioginę prieigą prie „Arduino“vienu metu gali nustatyti 8 kaiščius su viena komanda. Rezistorių tinklui reikalingi 9 rezistoriai, kurių vertė R, ir 8, kurių vertė 2R. Aš naudoju 10 kOhm kaip R vertę, kuri išlaiko srovę nuo kaiščių iki 0,5 mA ar mažiau. Manau, kad R = 1kOhm taip pat gali veikti, nes „Arduino“gali lengvai tiekti 5 mA už kaištį, 40 mA į prievadą. Svarbu, kad santykis tarp R ir 2R rezistorių būtų tikrai 2. Tai lengviausia pasiekti, kai nuosekliai sudedami 2 R vertės rezistoriai, iš viso 25 rezistoriai.

Fazinis akumuliatorius

Sukuriant bangos formą, kartotinai siunčiama 8 bitų skaičių seka į „Arduino“kaiščius. Bangos forma saugoma 256 baitų masyve, iš šios masyvo imami mėginiai ir siunčiami į smeigtukus. Išėjimo signalo dažnis nustatomas pagal tai, kaip greitai judama per masyvą. Tvirtas, tikslus ir elegantiškas būdas tai padaryti naudojant fazių akumuliatorių: 32 bitų skaičius reguliariai didinamas, o mes naudojame 8 reikšmingiausius bitus kaip masyvo indeksą.

Greitas mėginių ėmimas

Pertraukos leidžia atrinkti mėginius tiksliai apibrėžtu laiku, tačiau pridėtinės pertraukos riboja mėginių ėmimo dažnį iki ~ 100 kHz. Begalinis ciklas fazei atnaujinti, bangos formai atrinkti ir kaiščiams nustatyti užtrunka 42 laikrodžio ciklus, taip pasiekiant 16MHz/42 = 381kHz mėginių ėmimo dažnį. Sukamas arba stumiamas sukamasis kodavimo įrenginys keičia kaištį ir pertrauką, kuri išeina iš kilpos, kad būtų pakeisti nustatymai (bangos forma ar dažnis). Šiame etape masyvo 256 skaičiai perskaičiuojami taip, kad pagrindiniame cikle nereikia atlikti jokių faktinių bangos formos skaičiavimų. Absoliutus maksimalus dažnis, kurį galima generuoti, yra 190 kHz (pusė mėginių ėmimo dažnio), tačiau tada yra tik du mėginiai per laikotarpį, todėl nėra daug formos kontrolės. Taigi sąsaja neleidžia nustatyti dažnio virš 100 kHz. Esant 50 kHz dažniui, per laikotarpį yra 7–8 mėginiai, o esant 1,5 kHz dažniui ir žemiau visų 256 masyve saugomų skaičių imami mėginiai kiekvieną laikotarpį. Jei bangos formos, kai signalas keičiasi sklandžiai, pavyzdžiui, sinusinė banga, mėginių praleidimas nėra problema. Tačiau bangų formoms su siauromis smailėmis, pavyzdžiui, kvadratinėms bangoms su nedideliu veikimo ciklu, kyla pavojus, kad esant didesniems nei 1,5 kHz dažniams trūkstant vieno mėginio, bangos forma gali veikti ne taip, kaip tikėtasi

Dažnio tikslumas

Skaičius, kuriuo fazė padidinama kiekviename mėginyje, yra proporcingas dažniui. Taigi dažnis gali būti nustatytas 381 kHz/2^32 = 0,089 mHz tikslumu. Praktiškai tokio tikslumo beveik niekada nereikia, todėl sąsaja riboja dažnio nustatymą 1 mHz žingsniais. Absoliutus dažnio tikslumas nustatomas pagal „Arduino“laikrodžio dažnio tikslumą. Tai priklauso nuo „Arduino“tipo, tačiau dauguma nurodo 16 000 MHz dažnį, taigi tikslumas yra ~ 10^-4. Šis kodas leidžia keisti dažnio ir fazės prieaugio santykį, kad būtų ištaisyti nedideli 16MHz prielaidos nuokrypiai.

Buferizavimas ir stiprinimas

Rezistorių tinkle yra didelė išėjimo varža, todėl prijungus apkrovą jo išėjimo įtampa greitai sumažėja. Tai galima išspręsti buferizuojant arba stiprinant išvestį. Čia buferizavimas ir stiprinimas atliekamas naudojant opampą. Aš naudoju LM358, nes turėjau keletą. Tai yra lėtas opampas (sukimosi dažnis 0,5 V per mikrosekundę), todėl esant aukštam dažniui ir aukštai amplitudei signalas iškraipomas. Geras dalykas yra tai, kad jis gali atlaikyti labai artimą 0 V įtampą. Tačiau išėjimo įtampa yra apribota iki ~ 2 V žemiau bėgio, todėl naudojant +5 V galią, išėjimo įtampa ribojama iki 3 V. „Step-up“moduliai yra kompaktiški ir pigūs. Maitindamas +20 V į opampą, jis gali generuoti signalus, kurių įtampa yra iki 18 V. (NB, schemoje rašoma „LTC3105“, nes tai buvo vienintelis žingsnis, kurį radau „Fritzing“. Iš tikrųjų naudojau MT3608 modulį, žr. Paveikslėlius kituose žingsniuose). Aš pasirenku taikyti kintamą slopinimą R2R DAC išėjimui, tada naudoju vieną iš opampų, kad buferizuotų signalą be stiprinimo, o kitą - sustiprinti 5,7, kad signalas galėtų pasiekti maksimalią išvestį apie 20 V. Išėjimo srovė yra gana ribota, ~ 10 mA, todėl gali prireikti stipresnio stiprintuvo, jei signalas turi valdyti didelį garsiakalbį ar elektromagnetą.

2 žingsnis: reikalingi komponentai

Šerdies bangų formos generatoriui

„Arduino Uno“arba „Nano“

16x2 LCD ekranas + 20kOhm žoliapjovė ir 100Ohm serijos rezistorius foniniam apšvietimui

5 kontaktų sukamasis kodavimo įrenginys (su integruotu mygtuku)

25 rezistoriai po 10 kOhm

Buferiui/stiprintuvui

LM358 ar kitas dvigubas opampas

padidinimo modulis, pagrįstas MT3608

50 kOhm kintamas rezistorius

10 kOhm rezistorius

47 kOhm rezistorius

1muF kondensatorius

3 žingsnis: statyba

Statyba
Statyba
Statyba
Statyba

Viską litavau ant 7x9 cm dydžio prototipo lentos, kaip parodyta paveikslėlyje. Kadangi su visais laidais buvo šiek tiek netvarkinga, bandžiau nudažyti laidus, kurie turi teigiamą įtampą, raudoną, o tuos, kurie įžemina, juodą.

Mano naudojamas kodavimo įrenginys turi 5 kaiščius, 3 vienoje pusėje, 2 kitoje pusėje. Šoninė dalis su 3 kaiščiais yra tikrasis kodavimo įrenginys, o pusė su 2 kaiščiais yra integruotas mygtukas. Trijų kontaktų pusėje centrinis kaištis turi būti prijungtas prie žemės, kiti du kaiščiai-prie D10 ir D11. Dviejų kontaktų pusėje vienas kaištis turi būti prijungtas prie žemės, o kitas-prie D12.

Tai bjauriausias dalykas, kokį aš kada nors padariau, bet jis veikia. Būtų malonu įdėti į aptvarą, tačiau kol kas papildomas darbas ir išlaidos to tikrai nepateisina. „Nano“ir ekranas pritvirtinti kaiščiais. Aš daugiau to nedaryčiau, jei pastatyčiau naują. Aš neįdėjau jungčių į plokštę signalams priimti. Vietoj to aš juos paimu krokodilo laidais iš išsikišusių vario vielos gabalų, pažymėtų taip:

R - neapdorotas signalas iš R2R DAC

B - buferinis signalas

A - sustiprintas signalas

Laikmačio signalas iš 9 kaiščio

G - žemė

+ - teigiama „aukšta“įtampa iš papildomo modulio

4 žingsnis: Kodas

Kodas, „Arduino“eskizas, yra pridėtas ir turėtų būti įkeltas į „Arduino“.

Iš anksto nustatyta 20 bangų formų. Turėtų būti paprasta pridėti bet kokią kitą bangą. Atminkite, kad atsitiktinės bangos užpildo 256 verčių masyvą atsitiktinėmis reikšmėmis, tačiau tas pats modelis kartojasi kiekvieną laikotarpį. Tikri atsitiktiniai signalai skamba kaip triukšmas, tačiau ši bangos forma skamba labiau kaip švilpukas.

Kodas nustato 1 kHz signalą kaištyje D9 su TIMER1. Tai naudinga norint patikrinti analoginio signalo laiką. Taip supratau, kad laikrodžio ciklų skaičius yra 42: jei darau prielaidą, kad yra 41 arba 43 ir sukuriu 1 kHz signalą, jo dažnis akivaizdžiai skiriasi nuo signalo, esančio kaištyje D9. Su 42 verte jie puikiai dera.

Paprastai „Arduino“pertraukia kiekvieną milisekundę, kad galėtų sekti laiką naudodami funkciją „millis“(). Tai sutrikdytų tikslų signalo generavimą, todėl tam tikras pertraukimas yra išjungtas.

Kompiliatorius sako: "Sketch naudoja 7254 baitus (23%) programos saugyklos vietos. Daugiausia - 30720 baitų. Visuotiniai kintamieji naudoja 483 baitus (23%) dinaminės atminties, paliekant 1565 baitus vietiniams kintamiesiems. Daugiausia yra 2048 baitai." Taigi yra daug vietos sudėtingesniam kodui. Saugokitės, kad norint sėkmingai įkelti į „Nano“gali tekti pasirinkti „ATmega328P (senas įkrovos įkroviklis)“.

5 žingsnis: naudojimas

Signalas generatorius gali būti maitinamas tiesiog per „Arduino Nano“mini USB kabelį. Tai geriausia padaryti naudojant maitinimo bloką, kad nebūtų atsitiktinio įžeminimo kilpos su aparatu, prie kurio jis gali būti prijungtas.

Įjungus jis sukels 100 Hz sinusinę bangą. Pasukus rankenėlę, galima pasirinkti vieną iš kitų 20 bangų tipų. Sukant, kai spaudžiamas, žymeklį galima nustatyti į bet kurį dažnio skaitmenį, kurį galima pakeisti į norimą vertę.

Amplitudę galima reguliuoti potenciometru ir naudoti buferinį arba sustiprintą signalą.

Tikrai naudinga naudoti osciloskopą signalo amplitudei patikrinti, ypač kai signalas tiekia srovę kitam įrenginiui. Jei pritraukiama per daug srovės, signalas suskaido ir signalas yra labai iškraipytas

Esant labai žemiems dažniams, išvestį galima vizualizuoti naudojant serijinį šviesos diodą su 10 kOhm rezistoriumi. Garso dažnius galima išgirsti naudojant garsiakalbį. Įsitikinkite, kad signalas yra labai mažas ~ 0,5 V, kitaip srovė tampa per didelė ir signalas pradeda karpyti.

Rekomenduojamas: