Sisukord:

Arduino ülikiired analoogpinged: 10 sammu (piltidega)
Arduino ülikiired analoogpinged: 10 sammu (piltidega)

Video: Arduino ülikiired analoogpinged: 10 sammu (piltidega)

Video: Arduino ülikiired analoogpinged: 10 sammu (piltidega)
Video: Уроки Ардуино #0 - что такое Arduino, куда подключаются датчики и как питать Ардуино 2024, Juuli
Anonim
Image
Image

Selles juhendis näidatakse, kuidas genereerida ülikiireid analoogpinge muutusi Arduino ning lihtsast takisti ja kondensaatori paarist. Üks rakendus, kus see on kasulik, on ostsilloskoobi abil graafika loomine. Seda on teinud veel mitu projekti. Johngineer näitab lihtsat jõulupuu, kasutades impulsi laiuse modulatsiooni (PWM). Teised on seda projekti paremaks muutnud, kasutades takistusredelit või spetsiaalset digitaal-analoogmuunduri kiipi.

PWM-i kasutamine põhjustab palju virvendust, samas kui takistusredeli või digitaal-analoogmuunduri kasutamine nõuab rohkem väljundtihvleid ja komponente, mis ei pruugi olla kergesti kättesaadavad. Minu kasutatav vooluahel on sama surnud lihtne takisti ja kondensaatoripaar, mida kasutati jõulupuu demos, kuid töötab märgatavalt väiksema värelusega.

Esiteks juhendan teid ahela ehitamise protsessis. Siis õpetan teile, kuidas oma pilti lisada. Lõpuks tutvustan teooriat selle kohta, mis muudab selle kiiremaks.

Kui teile see juhendamine meeldis, kaaluge selle hääletamist!:)

Samm: vooluringi ehitamine

Ringraja ehitamine
Ringraja ehitamine

Vooluahela ehitamiseks vajate järgmist:

a) Arduino, mis põhineb Atmel 16MHz ATmega328P -l, näiteks Arduino Uno või Arduino Nano.

b) kaks takistit väärtusega R, mis on vähemalt 150Ω.

c) Kaks kondensaatorit väärtusega C, nii et C = 0,0015 / R, näited:

  • R = 150Ω ja C = 10µ
  • R = 1,5 kΩ ja C = 1 µ
  • R = 15 kΩ ja C = 100 nF
  • R = 150 kΩ ja C = 10 nF

Nende väärtuste valimisel on kaks põhjust. Eelkõige tahame hoida Arduino tihvtide voolu alla maksimaalse nimivoolu 40 mA. Väärtuse 150Ω kasutamine piirab voolu 30 mA -ni, kui seda kasutatakse Arduino toitepingega 5 V. R suuremad väärtused vähendavad voolu ja on seetõttu vastuvõetavad.

Teine piirang on see, et me tahame hoida aja konstantsena, mis on R ja C tulemus, umbes 1,5 ms. Tarkvara on selle ajakonstandi jaoks spetsiaalselt häälestatud. Kuigi tarkvara R ja C väärtusi on võimalik reguleerida, on see kitsas vahemikus, mille ümber see töötab, seega valige komponendid soovitatud suhtele võimalikult lähedale.

Põhjalikum selgitus selle kohta, miks RC -konstand on oluline, antakse teooria osas pärast seda, kui olen näidanud teile, kuidas demonstratsiooniahelat kokku panna.

2. samm: ostsilloskoobi seadistamine

Ostsilloskoobi seadistamine
Ostsilloskoobi seadistamine

Demonstratsioon nõuab ostsilloskoopi, mis on seatud X/Y režiimi. Testijuhtmed tuleb ühendada, nagu on näidatud skeemil. Teie ostsilloskoop erineb minu omast, kuid ma lähen läbi vajalikud sammud X/Y režiimi seadistamiseks oma seadmes:

a) Seadke horisontaalne pühkimine kanali B (X -telg) juhtimiseks.

b) Lülitage ostsilloskoop kahe kanaliga režiimi.

c) Seadke mõlema kanali volti/div nii, et see näitaks pinget vahemikus 0V kuni 5V. Panin oma väärtuseks 0,5V/div.

d) Seadistage ühendusrežiim mõlemale kanalile alalisvooluks.

e) Reguleerige X ja Y asendit nii, et Arduino väljalülitamisel oleks punkt ekraani vasakus alanurgas.

Samm: laadige tarkvara alla ja käivitage see

Image
Image

Laadige tarkvara alla Arduino hoidlast Fast Vector Display. Tarkvara on litsentsitud GNU Affero avaliku litsentsi v3 alusel ja seda saab selle litsentsi tingimuste kohaselt vabalt kasutada ja muuta.

Avage Arduino IDE-s fail "fast-vector-display-arduino.ino" ja laadige see üles oma Arduino-sse. Hetkeks näete oma ostsilloskoobi ekraanil animatsiooni "Head uut aastat".

Arendasin seda projekti jõulude eelsetel nädalatel isikliku hackatonina, seega on jõulude ja uusaasta teemaline sõnum, mida näete, muutes koodis muutujat PATTERN.

Samm: looge oma kohandatud joonis

Mõista, miks PWM on nii aeglane
Mõista, miks PWM on nii aeglane

Kui soovite luua oma joonise, saate kleepida punkti koordinaadid Arduino visandile joonel USER_PATTERN.

Leidsin, et Inkscape on päris hea tööriist kohandatud joonise tegemiseks:

  1. Looge teksti, kasutades suurt rasvast fonti, näiteks Impact.
  2. Valige tekstiobjekt ja valige menüüst "Tee" "Objekt teele".
  3. Ühendatud kuju tegemiseks valige üksikud tähed ja kattuge nendega
  4. Nende ühendamiseks üheks kõveraks valige "Path" menüüst "Union".
  5. Kui mõnes tähes on auke, lõigake väike sälk, joonistades ristküliku tööriistaga ristküliku ja lahutades selle kontuurist tööriista "Erinevus" abil.
  6. Sõlmede kuvamiseks topeltklõpsake teed.
  7. Ristkülik valige kõik sõlmed ja klõpsake tööriista "Tee valitud sõlmede nurk".
  8. Salvestage SVG -fail.

Oluline on see, et teie joonisel peaks olema üks suletud tee ja aukudeta. Veenduge, et teie kujundusel oleks vähem kui umbes 130 punkti.

Samm: kleepige koordinaadid SVG -failist Arduino IDE -sse

  1. Avage SVG -fail ja kopeerige koordinaadid. Need sisestatakse elementi "tee". Esimest koordinaatide paari saab ignoreerida; asendage need 0, 0 -ga.
  2. Kleepige koordinaadid sulgudes olevasse Arduino visandisse kohe pärast "#define USER_PATTERN".
  3. Asendage kõik tühikud komadega, vastasel juhul kuvatakse kompileerimisviga. Abiks võib olla tööriist "Asenda ja otsi".
  4. Koosta ja käivita!
  5. Kui teil on probleeme, jälgige jadakonsooli võimalike vigade osas. Eelkõige näete teateid, kui teie mustril on sisemise puhvri jaoks liiga palju punkte. Sellistel juhtudel ilmub pildil liigne värelus.

Samm: mõistke, miks PWM on nii aeglane

Alustuseks vaatame üle kondensaatori käitumise laadimise ajal.

Pingeallikaga Vcc ühendatud kondensaator suurendab oma pinget vastavalt eksponentsiaalsele kõverale. See kõver on asümptomaatiline, mis tähendab, et see aeglustub, kui läheneb sihtpingele. Kõigil praktilistel eesmärkidel on pinge "piisavalt lähedal" 5 RC sekundi pärast. RC -d nimetatakse "ajakonstandiks". Nagu me varem nägime, on see teie vooluahela takisti ja kondensaatori väärtuste korrutis. Probleem on selles, et 5 RC on graafikakuva iga punkti värskendamiseks üsna pikk aeg. See toob kaasa palju virvendust!

Kui kasutame kondensaatori laadimiseks impulsi laiuse modulatsiooni (PWM), pole meil parem. PWM -iga lülitub pinge kiiresti 0V ja 5V vahele. Praktikas tähendab see seda, et me vaheldumisi laeme kondensaatorisse ja tõmbame selle natuke uuesti välja - see tõuge ja tõmme on pigem nagu prooviks maratoni joosta, astudes suure sammu edasi ja seejärel väikese sammu tagasi ikka uuesti ja uuesti.

Kui keskmistada kõik, on PWM -i abil kondensaatori laadimine täpselt sama, kui oleksite kondensaatori laadimiseks kasutanud ühtlast pinget Vpwm. Ikka kulub umbes 5 RC sekundit, et jõuda soovitud pingeni "piisavalt lähedale".

7. samm: liikuge punktist A punkti B, siis Tad natuke kiiremini

Liikuge punktist A punkti B, Tad natuke kiiremini
Liikuge punktist A punkti B, Tad natuke kiiremini

Oletame, et meil on kondensaator, mis on juba laetud Va -ni. Oletame, et kasutame b väärtuse uue väärtuse kirjutamiseks analogWrite (). Mis on minimaalne aeg, mille jooksul peate ootama pinge Vb saavutamist?

Kui arvasite 5 RC sekundit, on see suurepärane! Oodates 5 RC sekundit, laetakse kondensaator peaaegu Vb -ni. Aga kui me tahame, võime tegelikult natuke vähem oodata.

Vaadake laadimiskõverat. Näete, kondensaator oli juba Va juures, kui me alustasime. See tähendab, et me ei pea ootama aega t_a. Peaksime seda tegema ainult siis, kui laadiksime kondensaatorit nullist.

Nii et seda aega ootamata näeme paranemist. Aeg t_ab on tegelikult natuke lühem kui 5 RC.

Kuid oodake, me saame palju paremini hakkama! Vaadake kogu ruumi v_b kohal. See on erinevus Vcc, meie jaoks saadaoleva maksimaalse pinge ja Vb vahel, mida me kavatseme saavutada. Kas näete, kuidas see lisapinge aitab meil kiiremini jõuda sinna, kuhu tahame?

Samm 8: Turbolaadijaga liikumine punktist B punkti

Turbolaadijaga liikuge punktist B punkti!
Turbolaadijaga liikuge punktist B punkti!

See on õige. Selle asemel, et kasutada PWM -i sihtpingel V_b, hoiame seda stabiilsel Vcc -l palju -palju lühemat aega. Ma nimetan seda Turbo Chargeri meetodiks ja see viib meid sinna, kuhu me tahame jõuda tõesti väga kiiresti! Pärast ajaviivitust (mille peame arvutama) lööme pidurid sisse, lülitades VWM -i üle PWM -ile. See hoiab pinget sihtmärgi ületamast.

Selle meetodi abil on võimalik muuta kondensaatori pinge V_a -lt V_b -le murdosa ajaga, kui kasutada ainult PWM -i. Nii saate kohti, kallis!

Samm: mõistke koodi

Mõistke seadustikku
Mõistke seadustikku

Pilt on tuhande sõna väärt, seega näitab diagramm andmeid ja toiminguid, mida koodis tehakse. Vasakult paremale:

  • Graafikaandmed salvestatakse programmi PROGMEM (st välkmälu) punktide loendina.
  • Kõik tõlke-, skaleerimis- ja pöörlemistoimingute kombinatsioonid ühendatakse afiinse transformatsiooni maatriksiks. Seda tehakse üks kord iga animatsioonikaadri alguses.
  • Punkte loetakse graafikaandmetest ükshaaval ja need korrutatakse salvestatud teisendusmaatriksiga.
  • Teisendatud punktid söödetakse läbi käärimisalgoritmi, mis kärbib kõik punktid väljaspool nähtavat ala.
  • RC viivituse otsingu tabeli abil teisendatakse punktid sõidupingeks ja ajaviivituseks. RC viivituse otsingu tabel on salvestatud EEPROM-is ja seda saab uuesti kasutada koodi mitmeks käivitamiseks. Käivitamisel kontrollitakse RC otsingu tabeli täpsust ja värskendatakse valesid väärtusi. EEPROMi kasutamine säästab väärtuslikku RAM -mälu.
  • Sõidupinged ja viivitused kirjutatakse kaadripuhvrisse mitteaktiivsele raamile. Kaadripuhver sisaldab ruumi aktiivse ja mitteaktiivse kaadri jaoks. Kui täielik raam on kirjutatud, muudetakse mitteaktiivne kaader aktiivseks.
  • Katkestusteenuse rutiin joonistab pidevalt pilti, lugedes pinge väärtusi ja viivitusi aktiivsest kaadripuhverist. Nende väärtuste põhjal kohandab see väljundtihvtide töötsükleid. Taimerit 1 kasutatakse viivituse mõõtmiseks mõne nanosekundi täpsusega, taimerit 2 aga tihvtide töötsükli juhtimiseks.
  • Suurima pingemuutusega tihvt on alati "turboga laetud", töötsükkel null või 100%, pakkudes kiireimat laadimis- või tühjenemisaega. Väiksema pingemuutusega tihvti juhitakse töötsükliga, mis on valitud vastavalt esimese tihvti üleminekuajale-selle aja sobitamine on oluline, et tagada ostsilloskoobi sirgjooneline joon.

10. samm: suure kiirusega kaasneb suur vastutus

Kuna see meetod on palju kiirem kui PWM, siis miks ei kasuta analogWrite () seda? Noh, sest lihtsalt PWM -i kasutamine on enamiku programmide jaoks piisavalt hea ja palju andestavam. Turbolaadija meetod nõuab aga hoolikat kodeerimist ja sobib ainult teatud juhtudel:

  1. See on ajastuse suhtes äärmiselt tundlik. Kui jõuame sihtpinge tasemele, tuleb juhtpinge viivitamatult lülitada tavalisse PWM -režiimi, et vältida sihtpinge ületamist.
  2. See nõuab teadmisi RC konstandist, seega tuleb need väärtused eelnevalt sisestada. Valede väärtuste korral on ajastus vale ja pinged valed. Tavalise PWM -ga on garantii, et mõne aja pärast saate õigele pingele, isegi kui RC -konstant pole teada.
  3. Kondensaatori laadimise täpse ajavahemiku arvutamiseks on vaja logaritmilisi võrrandeid, mis on Arduino reaalajas arvutamiseks liiga aeglased. Need tuleb enne iga animatsioonikaadrit eelnevalt arvutada ja kuskil mällu vahemällu salvestada.
  4. Seda meetodit käsitlevad programmid peavad võitlema tõsiasjaga, et viivitused on väga mittelineaarsed (need on tegelikult eksponentsiaalsed). Sihtpinge Vcc või GND lähedal võtab palju suurusjärku kauem aega kui pinge keskpunkti lähedal.

Nende piirangute ületamiseks teeb minu vektorgraafika kood järgmist.

  1. See kasutab väljundi täpseks manipuleerimiseks ja ajastamiseks taimerit 1 sagedusel 16 kHz ja katkestusteenust.
  2. See nõuab konkreetse RC ajakonstandi väärtuse kasutamist, piirates kondensaatori ja takisti väärtuste valikut.
  3. See salvestab kõigi animatsiooniraami punktide viivitused mälupuhvrisse. See tähendab, et ajaviivitusi arvutav rutiin töötab palju aeglasemalt kui katkestusteenuse rutiin, mis värskendab väljundnööpe. Iga raami võib värvida mitukümmend korda, enne kui järgmise kaadri uus viivituste komplekt on kasutamiseks valmis.
  4. Mälupuhvri kasutamine seab piirangu kaadri kohta joonistatavate punktide arvule. Kasutan ruumisäästlikku kodeerimist, et saada saadaolevast RAM -ist maksimumi, kuid see on siiski piiratud umbes 150 punktiga. Üle saja punkti või nii hakkab ekraan niikuinii vilkuma, nii et see on vaieldav!

Soovitan: