Kazalo:

Super hitre analogne napetosti iz Arduina: 10 korakov (s slikami)
Super hitre analogne napetosti iz Arduina: 10 korakov (s slikami)

Video: Super hitre analogne napetosti iz Arduina: 10 korakov (s slikami)

Video: Super hitre analogne napetosti iz Arduina: 10 korakov (s slikami)
Video: 🛜Neil Degrasse Tyson, WRONG about Tesla?!? 🛜 ​⁠@joerogan (30min) 2024, November
Anonim
Image
Image

Ta Instructable prikazuje, kako ustvariti super hitre analogne spremembe napetosti iz Arduina in preprostega para uporov in kondenzatorjev. Ena aplikacija, kjer je to uporabno, je ustvarjanje grafike na osciloskopu. To je uspelo pri več drugih projektih. Johngineer prikazuje preprosto božično drevo z uporabo pulzno širinske modulacije (PWM). Drugi so ta projekt izboljšali z uporabo uporovne lestve ali z uporabo namenskega digitalno-analognega pretvorniškega čipa.

Uporaba PWM povzroča veliko utripanja, medtem ko uporaba uporne lestve ali digitalno-analognega pretvornika zahteva več izhodnih zatičev in komponent, ki morda niso na voljo. Vezje, ki ga uporabljam, je enak par mrtvih preprostih uporov in kondenzatorjev kot v predstavitvi božičnega drevesa, vendar deluje z bistveno manj utripanja.

Najprej vas bom vodil skozi postopek izgradnje vezja. Nato vas bom naučil, kako dodati svojo podobo. Na koncu bom predstavil teorijo o tem, kaj to naredi hitreje.

Če vam je bil ta Instructable všeč, razmislite o glasovanju zanj!:)

1. korak: Izdelava vezja

Gradnja vezja
Gradnja vezja

Za izdelavo vezja boste potrebovali naslednje:

a) Arduino na osnovi Atmelove 16MHz ATmega328P, na primer Arduino Uno ali Arduino Nano.

b) Dva upora vrednosti R, ki sta najmanj 150Ω.

c) Dva kondenzatorja vrednosti C, tako da je C = 0,0015 / R, primeri:

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

Razlogi za izbiro teh vrednosti so dvojni. V prvi vrsti želimo ohraniti tok na zatičih Arduina pod največjim nazivnim tokom 40 mA. Uporaba vrednosti 150Ω omeji tok na 30 mA, če se uporablja z napajalno napetostjo Arduino 5V. Večje vrednosti R bodo zmanjšale tok in so zato sprejemljive.

Druga omejitev je, da želimo ohraniti časovno konstanto, ki je produkt R in C, približno 1,5 ms. Programska oprema je bila za ta čas konstantno prilagojena. Čeprav je v programski opremi mogoče prilagoditi vrednosti R in C, obstaja ozek razpon, okoli katerega bo delovala, zato izberite komponente čim bližje predlaganemu razmerju.

Podrobnejša razlaga o tem, zakaj je RC konstanta pomembna, bo podana v razdelku o teoriji, potem ko sem vam pokazal, kako sestaviti predstavitveno vezje.

2. korak: Nastavitev osciloskopa

Namestitev osciloskopa
Namestitev osciloskopa

Za predstavitev je potreben osciloskop, nastavljen na način X/Y. Preskusne kable je treba priključiti, kot je prikazano na shemi. Vaš osciloskop se bo razlikoval od mojega, vendar bom izvedel potrebne korake za nastavitev načina X/Y na svoji enoti:

a) Vodoravno pometanje nastavite na kanal B (os X).

b) Nastavite osciloskop na dvokanalni način.

c) Na obeh kanalih nastavite volt/div tako, da lahko prikazuje napetosti od 0V do 5V. Mojega sem nastavil na 0,5V/div.

d) Na obeh kanalih nastavite način spajanja na DC.

e) Prilagodite položaj X in Y tako, da je pika v spodnjem levem kotu zaslona, ko je Arduino izklopljen.

3. korak: Prenesite in zaženite programsko opremo

Image
Image

Prenesite programsko opremo iz skladišča Fast Vector Display For Arduino. Programska oprema je licencirana pod GNU Affero Public License v3 in jo je mogoče prosto uporabljati in spreminjati pod pogoji te licence.

Odprite datoteko "fast-vector-display-arduino.ino" v Arduino IDE in jo naložite v svoj Arduino. Kmalu boste na zaslonu osciloskopa videli animacijo "Srečno novo leto".

Ta projekt sem razvil kot osebni hekaton v tednih pred božičem, zato je božično -novoletno tematsko sporočilo, ki ga lahko vidite s spreminjanjem spremenljivke PATTERN v kodi.

4. korak: Ustvarite svojo risbo po meri

Razumeti, zakaj je PWM tako počasen
Razumeti, zakaj je PWM tako počasen

Če želite ustvariti svojo risbo, lahko prilepite koordinate točk v skico Arduino na vrstici, ki definira USER_PATTERN.

Ugotovil sem, da je Inkscape precej dobro orodje za izdelavo risbe po meri:

  1. Ustvarite besedilo z veliko, krepko pisavo, kot je Impact.
  2. Izberite besedilni objekt in v meniju "Pot" izberite "Objekt na pot".
  3. Izberite posamezne črke in jih prekrijte, da ustvarite povezano obliko
  4. V meniju "Pot" izberite "Union", da jih združite v eno samo krivuljo.
  5. Če so v črkah luknje, izrežite majhno zarezo tako, da z orodjem za pravokotnik narišete pravokotnik in ga z orodjem "Razlika" odštejete od konture.
  6. Dvokliknite pot, da prikažete vozlišča.
  7. Pravokotnik izberite vsa vozlišča in kliknite orodje "Make selected nodes corner".
  8. Shranite datoteko SVG.

Pomembno je, da mora imeti vaša risba eno samo zaprto pot in brez lukenj. Poskrbite, da bo vaš dizajn imel manj kot približno 130 točk.

5. korak: Prilepite koordinate iz datoteke SVG v Arduino IDE

  1. Odprite datoteko SVG in kopirajte koordinate. Ti bodo vdelani v element "pot". Prvega para koordinat lahko zanemarimo; zamenjajte z 0, 0.
  2. Koordinate prilepite v skico Arduino v oklepaju takoj za "#define USER_PATTERN".
  3. Vse presledke zamenjajte z vejicami, sicer boste dobili napako pri sestavljanju. Orodje »Zamenjaj in poišči« je lahko v pomoč.
  4. Sestavite in zaženite!
  5. Če imate težave, poglejte serijsko konzolo za napake. Zlasti boste videli sporočila, če ima vaš vzorec preveč točk za notranji vmesni pomnilnik. V takih primerih bo slika pretirano utripala.

6. korak: Razumeti, zakaj je PWM tako počasen

Za začetek si oglejmo vedenje kondenzatorja med polnjenjem.

Kondenzator, ki je priključen na vir napetosti Vcc, bo povečal svojo napetost v skladu z eksponentno krivuljo. Ta krivulja je asimptotična, kar pomeni, da se bo upočasnila, ko se približa ciljni napetosti. Za vse praktične namene je napetost po 5 RC sekundah "dovolj blizu". RC se imenuje "časovna konstanta". Kot smo videli prej, je to produkt vrednosti upora in kondenzatorja v vašem vezju. Težava je v tem, da je 5 RC precej dolg čas za posodabljanje vsake točke grafičnega zaslona. To vodi v veliko utripanja!

Ko za polnjenje kondenzatorja uporabljamo pulzno širinsko modulacijo (PWM), nismo nič bolje. S PWM se napetost hitro preklopi med 0V in 5V. V praksi to pomeni, da hitro izmenjujemo potiskanje naboja v kondenzator in ponovno izvlečenje njegovega dela - ta pritisk in vlečenje je podoben poskusu teka maratona z velikim korakom naprej in nato še malo nazaj vedno znova.

Ko vse povprečite, je vedenje polnjenja kondenzatorja z uporabo PWM popolnoma enako, kot če bi za polnjenje kondenzatorja uporabili enakomerno napetost Vpwm. Še vedno traja približno 5 RC sekund, da se "dovolj približamo" želeni napetosti.

7. korak: Pojdite od a do B, tedaj malo hitreje

Pojdi od a do B, tedaj malo hitreje
Pojdi od a do B, tedaj malo hitreje

Recimo, da imamo kondenzator, ki je že napolnjen do Va. Denimo, da z analogWrite () izpišemo novo vrednost b. Koliko časa morate čakati, da dosežete napetost Vb?

Če ste uganili 5 RC sekund, je to super! Če počakate 5 RC sekund, se bo kondenzator napolnil do skoraj skoraj Vb. Če pa želimo, lahko dejansko počakamo nekoliko manj.

Poglejte krivuljo naboja. Vidite, kondenzator je bil že pri Va, ko smo začeli. To pomeni, da nam ni treba čakati na čas t_a. Morali bi le, če bi kondenzator polnili od nič.

Če torej ne čakamo na ta čas, vidimo izboljšanje. Čas t_ab je dejansko nekoliko krajši od 5 RC.

Ampak počakaj, lahko naredimo veliko bolje! Poglejte ves tisti prostor nad v_b. To je razlika med Vcc, največjo napetostjo, ki nam je na voljo, in Vb, ki ga nameravamo doseči. Ali vidite, kako nam lahko ta dodatna napetost veliko hitreje prispe do cilja, kamor želimo?

8. korak: Pojdite od a do B s turbopolnilnikom

Pojdite od a do B s turbopolnilnikom!
Pojdite od a do B s turbopolnilnikom!

Tako je. Namesto da uporabljamo PWM pri ciljni napetosti V_b, ga držimo pri stalnem Vcc veliko, veliko krajše časovno obdobje. To imenujem metoda Turbo Charger in nas pripelje tja, kamor želimo iti zelo, zelo hitro! Po časovni zakasnitvi (ki jo moramo izračunati) pritisnemo na zavore s preklopom na PWM pri V_b. To preprečuje, da bi napetost presegla cilj.

S to metodo je mogoče v delčku časa spremeniti napetost v kondenzatorju z V_a na V_b, kot pa samo s PWM. Tako dobiš mesta, srček!

9. korak: Razumeti kodo

Razumeti kodeks
Razumeti kodeks

Slika je vredna tisoč besed, zato diagram prikazuje podatke in operacije, ki se izvajajo v kodi. Od leve proti desni:

  • Grafični podatki so shranjeni v PROGMEM (to je v flash pomnilniku) kot seznam točk.
  • Vse kombinacije operacij prevajanja, skaliranja in rotacije so združene v matriko afinih transformacij. To se naredi enkrat na začetku vsakega okvirja animacije.
  • Točke se eno za drugo berejo iz grafičnih podatkov in vsaka se pomnoži s shranjeno transformacijsko matrico.
  • Preoblikovane točke se napajajo s škarjastim algoritmom, ki obreže vse točke zunaj vidnega območja.
  • Z uporabo tabele iskanja zamud RC se točke pretvorijo v pogonske napetosti in časovne zamude. Iskalna tabela zakasnitve RC je shranjena v EEPROM-u in jo je mogoče znova uporabiti za večkratni zagon kode. Ob zagonu se pregleda natančnost iskalne tabele RC in posodobijo vse napačne vrednosti. Uporaba EEPROM -a prihrani dragocen pomnilnik RAM.
  • Pogonske napetosti in zamude so zapisane v neaktiven okvir v medpomnilniku okvirja. Medpomnilnik okvirja vsebuje prostor za aktivni okvir in neaktiven okvir. Ko je napisan celoten okvir, se neaktivni okvir aktivira.
  • Servisna rutina prekinitev nenehno nariše sliko z odčitavanjem vrednosti napetosti in zamud iz aktivnega medpomnilnika okvirja. Na podlagi teh vrednosti prilagodi obratovalne cikle izhodnih zatičev. Časovnik 1 se uporablja za merjenje časovne zakasnitve do nekaj nanosekund natančnosti, časovnik 2 pa za nadzor obratovalnega cikla nožic.
  • Zatič z največjo spremembo napetosti je vedno "turbo napolnjen" z obratovalnim ciklom nič ali 100%, kar zagotavlja najhitrejši čas polnjenja ali praznjenja. Zatič z manjšo spremembo napetosti poganja delovni cikel, izbran tako, da se ujema s časom prehoda prvega zatiča-to časovno ujemanje je pomembno za zagotovitev, da so črte potegnjene naravnost na osciloskopu.

10. korak: Z veliko hitrostjo prihaja velika odgovornost

Ker je ta metoda veliko hitrejša od PWM, zakaj je ne uporablja analogWrite ()? No, ker je uporaba samo PWM dovolj dobra za večino programov in je veliko bolj prizanesljiva. Metoda "Turbo Charger" pa zahteva skrbno kodiranje in je primerna le za posebne primere:

  1. Je zelo občutljiv na čas. Ko dosežemo ciljno raven napetosti, moramo pogonski zatič takoj preklopiti v običajni način PWM, da se izognemo prekoračitvi ciljne napetosti.
  2. Zahteva poznavanje konstante RC, zato je treba te vrednosti vnesti vnaprej. Pri napačnih vrednostih bo čas napačen, napetosti pa napačne. Z običajnim PWM -jem imate garancijo, da boste čez nekaj časa dosegli pravilno napetost, tudi če konstanta RC ni znana.
  3. Izračun natančnega časovnega intervala za polnjenje kondenzatorja zahteva logaritmične enačbe, ki so prepočasne za izračun v realnem času na Arduinu. Te je treba pred vsakim okvirjem animacije vnaprej izračunati in jih nekje predpomniti.
  4. Programi, ki obravnavajo to metodo, se morajo spoprijeti z dejstvom, da so zamude zelo nelinearne (v resnici so eksponentne). Ciljne napetosti v bližini Vcc ali GND bodo trajale veliko več časa, da bodo dosežene kot napetosti blizu sredine.

Za premagovanje teh omejitev moja koda vektorske grafike naredi naslednje:

  1. Uporablja Timer 1 pri 16 kHz in rutino prekinitvenih storitev za natančno manipulacijo izhoda in merjenje časa.
  2. Za uporabo je potrebna posebna vrednost časovne konstante RC, ki omejuje izbiro vrednosti kondenzatorja in upora.
  3. Shrani časovne zamude za vse točke v okvirju animacije v pomnilniku. To pomeni, da rutina, ki izračuna časovne zamude, teče veliko počasneje kot rutina storitve prekinitve, ki posodobi izhodne zatiče. Vsak okvir je lahko naslikan več desetkrat, preden bo nov niz zamud za naslednji okvir pripravljen za uporabo.
  4. Uporaba pomnilniškega vmesnika omejuje število točk, ki jih je mogoče narisati na okvir. Za izkoriščanje razpoložljivega RAM -a uporabljam prostorsko učinkovito kodiranje, vendar je še vedno omejeno na približno 150 točk. Pri več kot sto točkah bi zaslon vseeno začel utripati, zato je sporno!

Priporočena: