Sisällysluettelo:

Erittäin nopeat analogiset jännitteet Arduinolta: 10 vaihetta (kuvilla)
Erittäin nopeat analogiset jännitteet Arduinolta: 10 vaihetta (kuvilla)

Video: Erittäin nopeat analogiset jännitteet Arduinolta: 10 vaihetta (kuvilla)

Video: Erittäin nopeat analogiset jännitteet Arduinolta: 10 vaihetta (kuvilla)
Video: Using Digispark Attiny85 Mini Arduino boards: Lesson 108 2024, Marraskuu
Anonim
Image
Image

Tämä opas näyttää kuinka luoda erittäin nopeita analogisia jännitemuutoksia Arduinosta ja yksinkertaisesta vastuksen ja kondensaattorin parista. Yksi sovellus, jossa tämä on hyödyllistä, on grafiikan luominen oskilloskoopilla. On olemassa useita muita hankkeita, jotka ovat tehneet tämän. Johngineer näyttää yksinkertaisen joulukuusi käyttäen pulssileveysmodulaatiota (PWM). Toiset ovat parantaneet tätä projektia käyttämällä vastusportaita tai käyttämällä omaa digitaalista analogiamuunninsirua.

PWM: n käyttäminen aiheuttaa paljon välkkymistä, kun taas vastusportaiden tai digitaali-analogia-muuntimen käyttäminen vaatii enemmän lähtötappeja ja komponentteja, joita ei välttämättä ole helposti saatavilla. Käyttämäni piiri on sama kuollut yksinkertainen vastus ja kondensaattoripari kuin joulukuusi -esittelyssä, mutta toimii huomattavasti vähemmän välkkymistä.

Ensinnäkin opastan sinua piirin rakentamisessa. Sitten opetan sinulle oman kuvan lisäämisen. Lopuksi esitän teorian siitä, mikä tekee siitä nopeamman.

Jos pidit tästä Instructable -ohjelmasta, harkitse sen äänestämistä!:)

Vaihe 1: Piirin rakentaminen

Piirin rakentaminen
Piirin rakentaminen

Piirin rakentamiseksi tarvitset seuraavaa:

a) Arduino, joka perustuu Atmel 16MHz ATmega328P -laitteeseen, kuten Arduino Uno tai Arduino Nano.

b) Kaksi vastuksen arvoa R, joka on vähintään 150Ω.

c) Kaksi kondensaattoria arvolla C siten, että C = 0,0015 / R, esimerkkejä:

  • 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

Syyt näiden arvojen valintaan ovat kaksi. Ensisijaisesti haluamme pitää Arduinon nastojen virran alle 40 mA: n suurimman nimellisvirran. Käyttämällä arvoa 150Ω rajoittaa virran 30 mA: ksi, kun sitä käytetään 5 V: n Arduinon syöttöjännitteellä. Suuremmat R -arvot pienentävät virtaa ja ovat siksi hyväksyttäviä.

Toinen rajoitus on, että haluamme pitää ajan vakiona, joka on R: n ja C: n tulos, noin 1,5 ms. Ohjelmisto on viritetty erityisesti tätä aikavakioa varten. Vaikka ohjelmiston R- ja C -arvoja on mahdollista säätää, se toimii kapealla alueella, joten valitse komponentit mahdollisimman lähelle ehdotettua suhdetta.

Perusteellisempi selitys siitä, miksi RC -vakio on tärkeä, annetaan teoriaosassa sen jälkeen, kun olen näyttänyt sinulle, kuinka koota esittelypiiri.

Vaihe 2: Oskilloskoopin asennus

Oskilloskoopin asentaminen
Oskilloskoopin asentaminen

Esittely vaatii oskilloskoopin, joka on asetettu X/Y -tilaan. Mittajohdot on kytkettävä kaavion mukaisesti. Oskilloskooppi eroaa omastani, mutta käyn läpi tarvittavat vaiheet X/Y -tilan määrittämiseksi laitteeseeni:

a) Aseta vaakasuuntainen pyyhkäisy ohjattavaksi kanavalla B (X -akseli).

b) Aseta oskilloskooppi kaksikanavaiseen tilaan.

c) Aseta molemmat kanavat volttia/jakoa niin, että se voi näyttää jännitteet 0–5 V. Asetin omani 0,5V/div.

d) Aseta kytkentätilaksi DC molemmilla kanavilla.

e) Säädä X: n ja Y: n asentoa siten, että piste on näytön vasemmassa alakulmassa, kun Arduino sammutetaan.

Vaihe 3: Lataa ja suorita ohjelmisto

Image
Image

Lataa ohjelmisto Fast Vector Display For Arduino -varastosta. Ohjelmisto on lisensoitu GNU Affero Public License v3: n alla ja sitä voidaan käyttää ja muokata vapaasti kyseisen lisenssin ehtojen mukaisesti.

Avaa "fast-vector-display-arduino.ino" -tiedosto Arduino IDE: ssä ja lataa se Arduinoosi. Näet hetken "Hyvää uutta vuotta" -animaation oskilloskoopin näytöllä.

Kehitin tämän projektin henkilökohtaiseksi hackatoniksi joulua edeltävinä viikkoina, joten joulu- ja uudenvuodenaiheinen viesti näkyy muokkaamalla koodin PATTERN -muuttujaa.

Vaihe 4: Luo oma mukautettu piirustus

Ymmärrä, miksi PWM on niin hidas
Ymmärrä, miksi PWM on niin hidas

Jos haluat luoda oman piirustuksen, voit liittää pistekoordinaatit Arduino -luonnokseen rivillä, joka määrittää USER_PATTERN.

Huomasin, että Inkscape on melko hyvä työkalu mukautetun piirustuksen tekemiseen:

  1. Luo tekstiä käyttämällä suurta, lihavoitua fonttia, kuten Impact.
  2. Valitse tekstiobjekti ja valitse "Polku" -valikosta "Objekti polulle".
  3. Valitse yksittäiset kirjaimet ja limitä ne muodostaaksesi yhdistetyn muodon
  4. Valitse "Path" -valikosta "Union" yhdistääksesi ne yhdeksi käyräksi.
  5. Jos missä tahansa kirjaimessa on reikiä, leikkaa pieni lovi piirtämällä suorakulmio suorakulmion työkalulla ja vähennä se ääriviivasta "Ero" -työkalulla.
  6. Näytä solmut kaksoisnapsauttamalla polkua.
  7. Suorakulmio valitse kaikki solmut ja napsauta "Tee valitut solmukulmat" -työkalua.
  8. Tallenna SVG -tiedosto.

Tärkeintä on, että piirustuksessasi on yksi suljettu polku eikä reikiä. Varmista, että suunnittelussa on alle noin 130 pistettä.

Vaihe 5: Liitä koordinaatit SVG -tiedostosta Arduino IDE: hen

  1. Avaa SVG -tiedosto ja kopioi koordinaatit. Ne upotetaan "polku" -elementtiin. Ensimmäinen koordinaattipari voidaan jättää huomiotta; korvaa ne 0, 0.
  2. Liitä koordinaatit Arduino -luonnokseen hakasulkeisiin heti "#define USER_PATTERN" jälkeen.
  3. Korvaa kaikki välilyönnit pilkuilla, muuten saat kääntämisvirheen. Korvaa ja etsi -työkalu voi olla hyödyllinen.
  4. Kokoa ja aja!
  5. Jos sinulla on ongelmia, katso sarjakonsolista virheiden varalta. Näet erityisesti viestit, jos kuviossasi on liikaa pisteitä sisäiselle puskurille. Tällaisissa tapauksissa kuva välkkyy liikaa.

Vaihe 6: Ymmärrä, miksi PWM on niin hidas

Tarkastellaan aluksi kondensaattorin käyttäytymistä latauksen aikana.

Kondensaattori, joka on kytketty jännitelähteeseen Vcc, nostaa jännitettä eksponentiaalisen käyrän mukaisesti. Tämä käyrä on asymptoottinen, eli se hidastuu lähestyessään tavoitejännitettä. Käytännössä jännite on "tarpeeksi lähellä" 5 RC sekunnin kuluttua. RC: tä kutsutaan "aikavakioksi". Kuten aiemmin näimme, se on piirisi vastuksen ja kondensaattorin arvojen tulo. Ongelmana on, että 5 RC on melko pitkä aika päivittää jokainen piste grafiikanäytössä. Tämä aiheuttaa paljon välkkymistä!

Kun käytämme pulssileveysmodulaatiota (PWM) kondensaattorin lataamiseen, emme voi paremmin. PWM: llä jännite vaihtuu nopeasti välillä 0V ja 5V. Käytännössä tämä tarkoittaa sitä, että vaihdamme nopeasti varausta kondensaattoriin ja vedämme sen hieman ulos - tämä työntö ja vetäminen on pikemminkin kuin yrittää juosta maraton ottamalla iso askel eteenpäin ja sitten pieni askel taaksepäin uudelleen ja uudelleen.

Kun lasket kaiken keskimäärin, kondensaattorin lataaminen PWM: llä on täsmälleen sama kuin jos olisit käyttänyt tasaista Vpwm -jännitettä kondensaattorin lataamiseen. Kestää vielä noin 5 RC sekuntia, jotta pääsemme "riittävän lähelle" haluttua jännitettä.

Vaihe 7: Siirry paikasta a paikkaan B, Tad Bit nopeammin

Siirry paikasta a paikkaan B, Tad Bit nopeammin
Siirry paikasta a paikkaan B, Tad Bit nopeammin

Oletetaan, että meillä on kondensaattori, joka on jo ladattu arvoon Va. Oletetaan, että käytämme analogWrite (): ää kirjoittaaksesi b: n uuden arvon. Mikä on vähimmäisaika, jonka joudut odottamaan jännitteen Vb saavuttamista?

Jos arvasit 5 RC sekuntia, se on hienoa! Odottamalla 5 RC sekuntia kondensaattori ladataan lähes Vb: hen. Mutta jos haluamme, voimme todella odottaa hieman vähemmän.

Katso latauskäyrää. Kondensaattori oli jo Va: ssa, kun aloitimme. Tämä tarkoittaa, että meidän ei tarvitse odottaa aikaa t_a. Meidän olisi vain, jos lataisimme kondensaattorin nollasta.

Joten odottamatta sitä aikaa, näemme parannuksen. Aika t_ab on itse asiassa hieman lyhyempi kuin 5 RC.

Mutta odota, voimme tehdä paljon parempaa! Katsokaa koko tilaa yläpuolella v_b. Tämä on ero Vcc: n, käytettävissä olevan maksimijännitteen ja Vb: n välillä, jonka aiomme saavuttaa. Näetkö, kuinka tämä ylimääräinen jännite voi auttaa meitä pääsemään haluttuun paikkaan paljon nopeammin?

Vaihe 8: Siirry paikasta B paikkaan Turbolaturi

Päästä paikasta B turboahtimella!
Päästä paikasta B turboahtimella!

Oikein. Sen sijaan, että käytämme PWM: ää tavoitejännitteellä V_b, pidämme sitä vakaalla Vcc: llä paljon, paljon lyhyemmän ajan. Kutsun tätä Turbo Charger -menetelmäksi ja se vie meidät sinne, minne haluamme mennä todella, todella nopeasti! Aikaviiveen (joka meidän on laskettava) jälkeen iskeydymme jarruihin vaihtamalla PWM: ään kohdassa V_b. Tämä estää jännitteen ylittämästä kohdetta.

Tällä menetelmällä on mahdollista muuttaa kondensaattorin jännite arvosta V_a arvoon V_b murto -osassa ajasta kuin pelkällä PWM: llä. Näin saat paikkoja, kulta!

Vaihe 9: Ymmärrä koodi

Ymmärrä koodi
Ymmärrä koodi

Kuva on tuhannen sanan arvoinen, joten kaavio näyttää tiedot ja toiminnot, jotka suoritetaan koodissa. Vasemmalta oikealle:

  • Grafiikkatiedot tallennetaan PROGMEM -järjestelmään (eli flash -muistiin) pisteiden luettelona.
  • Mikä tahansa translaatio-, skaalaus- ja kiertotoimintojen yhdistelmä yhdistetään affiinimuunnosmatriisiksi. Tämä tehdään kerran jokaisen animaatiokehyksen alussa.
  • Pisteet luetaan yksi kerrallaan grafiikkatiedosta ja kukin kerrotaan tallennetulla muunnosmatriisilla.
  • Muunnetut pisteet syötetään sahausalgoritmin avulla, joka rajaa kaikki pisteet näkyvän alueen ulkopuolella.
  • RC -viivehakutaulukon avulla pisteet muunnetaan ajojännitteiksi ja aikaviiveiksi. RC-viivehakutaulukko on tallennettu EEPROMiin, ja sitä voidaan käyttää uudelleen useisiin koodiajoihin. Käynnistyksen yhteydessä RC -hakutaulukon tarkkuus tarkistetaan ja mahdolliset väärät arvot päivitetään. EEPROMin käyttö säästää arvokasta RAM -muistia.
  • Käyttöjännitteet ja viiveet kirjoitetaan kehyspuskurin passiiviseen kehykseen. Kehyspuskuri sisältää tilaa aktiiviselle kehykselle ja ei -aktiiviselle kehykselle. Kun koko kehys on kirjoitettu, passiivinen kehys aktivoidaan.
  • Keskeytyspalvelurutiini piirtää jatkuvasti kuvaa uudelleen lukemalla jännitearvot ja viiveet aktiivisesta kehyspuskurista. Näiden arvojen perusteella se säätää lähtötappien toimintajaksoja. Ajastinta 1 käytetään viiveen mittaamiseen muutaman nanosekunnin tarkkuudella, kun taas ajastinta 2 käytetään nastojen käyttöjakson säätämiseen.
  • Suurin jännitteenmuutosnappi on aina "turboahdettu", jonka toimintajakso on nolla tai 100%, mikä tarjoaa nopeimman lataus- tai purkausajan. Pistettä, jonka jännite muuttuu vähemmän, käytetään käyttöjaksolla, joka on valittu vastaamaan ensimmäisen nastan siirtymäaikaa-tällä kertaa sovitus on tärkeää sen varmistamiseksi, että viivat vedetään suoraan oskilloskoopille.

Vaihe 10: Suurella nopeudella on suuri vastuu

Koska tämä menetelmä on paljon nopeampi kuin PWM, miksi analogWrite () ei käytä sitä? No, koska vain PWM: n käyttäminen on tarpeeksi hyvä useimmille ohjelmille ja on paljon anteeksiantavampaa. "Turbolaturi" -menetelmä vaatii kuitenkin huolellista koodausta ja soveltuu vain erityistapauksiin:

  1. Se on erittäin herkkä ajoitukselle. Kun olemme saavuttaneet tavoitejännitetason, käyttötappi on välittömästi kytkettävä normaaliin PWM -tilaan, jotta vältetään tavoitejännitteen ylitys.
  2. Se edellyttää RC -vakion tuntemusta, joten nämä arvot on syötettävä etukäteen. Jos arvot ovat väärät, ajoitus on väärä ja jännitteet väärät. Säännöllisellä PWM: llä on takuu, että asetat oikean jännitteen jonkin ajan kuluttua, vaikka RC -vakio ei ole tiedossa.
  3. Tarkan aikavälin laskeminen kondensaattorin lataamiseen vaatii logaritmiset yhtälöt, jotka ovat liian hitaita reaaliaikaiseen laskentaan Arduinolla. Ne on laskettava etukäteen ennen jokaista animaatiokehystä ja tallennettava välimuistiin jonnekin.
  4. Tätä menetelmää käsittelevien ohjelmien on vastattava siihen, että viiveet ovat hyvin epälineaarisia (ne ovat itse asiassa eksponentiaalisia). Tavoitejännitteiden saavuttaminen Vcc: n tai GND: n lähellä kestää monta suuruusluokkaa kauemmin kuin jännitteet keskipisteen lähellä.

Näiden rajoitusten voittamiseksi vektorigrafiikkakoodini tekee seuraavat asiat:

  1. Se käyttää ajastinta 1 taajuudella 16 kHz ja keskeytyspalvelurutiinia tarkkaan tulostuksen käsittelyyn ja ajoitukseen.
  2. Se vaatii tietyn RC -aikavakion arvon käyttöä, mikä rajoittaa kondensaattorin ja vastuksen arvojen valintaa.
  3. Se tallentaa animaatiokehyksen kaikkien pisteiden aikaviiveet muistipuskuriin. Tämä tarkoittaa rutiinia, joka laskee aikaviiveet, kulkee paljon hitaammin kuin keskeytyspalvelurutiini, joka päivittää lähtönastat. Mikä tahansa kehys voidaan maalata useita kymmeniä kertoja, ennen kuin seuraavan viiveen uusi viivejoukko on valmis käytettäväksi.
  4. Muistipuskurin käyttö rajoittaa pisteiden määrää, jotka voidaan piirtää kehystä kohden. Käytän tilaa säästävää koodausta saadakseni kaiken irti käytettävissä olevasta RAM -muistista, mutta se on edelleen rajoitettu noin 150 pisteeseen. Noin sadan pisteen lisäksi näyttö alkaa välkkyä joka tapauksessa, joten se on kiistanalainen asia!

Suositeltava: