INHOUDSOPGAWE:

Super vinnige analoge spannings van Arduino: 10 stappe (met foto's)
Super vinnige analoge spannings van Arduino: 10 stappe (met foto's)

Video: Super vinnige analoge spannings van Arduino: 10 stappe (met foto's)

Video: Super vinnige analoge spannings van Arduino: 10 stappe (met foto's)
Video: 12 крутых новых гаджетов от новейших технологий 2024, November
Anonim
Image
Image

Hierdie instruksies wys hoe u 'n super vinnige analoge spanningsverandering kan genereer vanaf 'n Arduino en 'n eenvoudige weerstands- en kapasitorpaar. Een toepassing waar dit nuttig is, is om grafika op 'n ossilloskoop te genereer. Daar is verskeie ander projekte wat dit gedoen het. Johngineer toon 'n eenvoudige kersboom met behulp van polswydte modulasie (PWM). Ander het die projek verbeter deur 'n weerstandsleer te gebruik of 'n toegewyde digitaal-analoog-omskakelaarskyfie te gebruik.

Die gebruik van PWM veroorsaak baie flikkering, terwyl die gebruik van 'n weerstandsleer of 'n digitaal-na-analoog-omskakelaar meer uitsetpenne en komponente verg wat moontlik nie geredelik beskikbaar is nie. Die stroombaan wat ek gebruik, is dieselfde dooie eenvoudige weerstand en kondensatorpaar as in die kersboom -demo, maar werk met aansienlik minder flikker.

Eerstens sal ek u lei deur die proses om die stroombaan te bou. Dan sal ek u leer hoe u u eie beeld kan byvoeg. Laastens sal ek die teorie bekendstel oor wat dit vinniger maak.

As u van hierdie Instructable gehou het, oorweeg dit om daarvoor te stem!:)

Stap 1: Bou die kring

Bou die kring
Bou die kring

Om die stroombaan te bou, benodig u die volgende:

a) 'n Arduino gebaseer op die Atmel 16MHz ATmega328P, soos 'n Arduino Uno of Arduino Nano.

b) Twee weerstande van waarde R wat minstens 150Ω is.

c) Twee kapasitors van waarde C sodat C = 0,0015 / R, voorbeelde:

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

Die redes vir die keuse van hierdie waardes is tweeledig. In die eerste plek wil ons die stroom op die penne van die Arduino onder die maksimum nominale stroom van 40mA hou. Deur 'n waarde van 150Ω te gebruik, beperk die stroom tot 30mA wanneer dit gebruik word met die Arduino -voedingsspanning van 5V. Groter waardes van R sal die stroom verlaag en is dus aanvaarbaar.

Die tweede beperking is dat ons die tyd konstant wil hou, wat die produk van R en C is, gelykstaande aan ongeveer 1.5ms. Die sagteware is spesifiek ingestel vir hierdie tydskonstante. Alhoewel dit moontlik is om die waardes van R en C in die sagteware aan te pas, is daar 'n beperkte reeks waarom dit sal werk, dus kies komponente so na as moontlik aan die voorgestelde verhouding.

'N Meer deeglike verduideliking van waarom die RC -konstante belangrik is, sal in die teorie -afdeling gegee word, nadat ek u gewys het hoe u die demonstrasiekring moet saamstel.

Stap 2: Die opstel van die ossilloskoop

Die opstel van die ossilloskoop
Die opstel van die ossilloskoop

Die demonstrasie vereis dat 'n ossilloskoop ingestel is op die X/Y -modus. Die meetkabels moet aangesluit word soos in die skemas getoon. U ossilloskoop sal verskil van myne, maar ek sal deur die nodige stappe gaan om die X/Y -modus op my eenheid op te stel:

a) Stel die horisontale sweep in wat deur kanaal B (die X -as) beheer moet word.

b) Stel die ossilloskoop in tweekanaalmodus.

c) Stel die volt/div op beide kanale in sodat dit spanning van 0V tot 5V kan vertoon. Ek stel myne op 0.5V/div.

d) Stel die koppelmodus op DC op beide kanale.

e) Pas die posisie van X en Y aan sodat die punt in die onderste linkerhoek van die skerm is wanneer die Arduino afgeskakel word.

Stap 3: Laai die sagteware af en voer dit uit

Image
Image

Laai die sagteware af van die Fast Vector Display For Arduino -bewaarplek. Die sagteware is gelisensieer onder die GNU Affero Public License v3 en kan vrylik gebruik en aangepas word onder die voorwaardes van die lisensie.

Open die lêer "fast-vector-display-arduino.ino" in die Arduino IDE en laai dit op na u Arduino. U sal 'n "gelukkige nuwe jaar" -animasie op u ossilloskoopskerm sien.

Ek het hierdie projek ontwikkel as 'n persoonlike hackaton in die weke voor Kersfees, so daar is 'n boodskap oor Kersfees en Nuwejaar wat u kan sien deur die PATTERN -veranderlike in die kode te verander.

Stap 4: Skep u eie tekening

Verstaan waarom PWM so stadig is
Verstaan waarom PWM so stadig is

As u u eie tekening wil maak, kan u puntkoördinate plak in die Arduino -skets op die lyn wat USER_PATTERN definieer.

Ek het gevind dat Inkscape 'n redelik goeie hulpmiddel is om 'n pasgemaakte tekening te maak:

  1. Skep teks met 'n groot, vet lettertipe, soos Impact.
  2. Kies die teksvoorwerp en kies "Object to Path" in die menu "Path".
  3. Kies individuele letters en oorvleuel hulle om 'n gekoppelde vorm te vorm
  4. Kies 'Unie' in die 'Pad' -kieslys om dit in 'n enkele kromme te kombineer.
  5. As daar gate in letters is, sny 'n klein gaatjie deur 'n reghoek met die reghoekgereedskap te teken en dit van die kontoer af te trek met die 'Verskil' -hulpmiddel.
  6. Dubbelklik op die pad om die nodusse te wys.
  7. Kies alle nodusse reghoekig en klik op die "Maak geselekteerde nodushoek" -gereedskap.
  8. Stoor die SVG -lêer.

Die belangrikste ding is dat u tekening 'n enkele geslote pad moet hê en geen gate moet hê nie. Maak seker dat u ontwerp minder as ongeveer 130 punte het.

Stap 5: Plak die koördinate uit die SVG -lêer in die Arduino IDE

  1. Maak die SVG -lêer oop en kopieer die koördinate. Dit word ingebed in die 'pad' -element. Die eerste paar koördinate kan geïgnoreer word; vervang hulle met 0, 0.
  2. Plak die koördinate in die Arduino -skets binne die hakies, net na "#define USER_PATTERN".
  3. Vervang al die spasies met kommas, anders kry u 'n opstelfout. Die hulpmiddel "Vervang en vind" kan nuttig wees.
  4. Stel saam en hardloop!
  5. As u probleme ondervind, kyk na die reekskonsole vir foute. U sal veral boodskappe sien as u patroon te veel punte het vir die interne buffer. In sulke gevalle sal die beeld te veel flikker.

Stap 6: Verstaan waarom PWM so stadig is

Om te begin, kyk na die gedrag van 'n kondensator terwyl dit laai.

'N Kondensator wat aan 'n spanningsbron Vcc gekoppel is, verhoog sy spanning volgens 'n eksponensiële kromme. Hierdie kromme is asimptoties, wat beteken dat dit sal vertraag as dit die teikenspanning nader. Vir alle praktiese doeleindes is die spanning na 5 RC sekondes "naby genoeg". Die RC word die "tydkonstante" genoem. Soos ons vroeër gesien het, is dit die produk van die waardes van die weerstand en kapasitor in u stroombaan. Die probleem is dat 5 RC 'n redelike lang tyd is om elke punt in 'n grafiese skerm op te dateer. Dit lei tot baie flikker!

As ons 'n pulswydte -modulasie (PWM) gebruik om 'n kondensator op te laai, is ons nie beter daaraan toe nie. Met PWM skakel die spanning vinnig tussen 0V en 5V. In die praktyk beteken dit dat ons vinnig wissel tussen lading in die kondensator druk en 'n bietjie daarvan weer uittrek - hierdie druk en trek is eerder soos om 'n marathon te probeer hardloop deur 'n groot stap vorentoe te neem en dan 'n klein tree agteruit oor en oor.

As u dit alles bereken, is die gedrag van die laai van 'n kondensator met behulp van PWM presies dieselfde asof u 'n konstante spanning van Vpwm gebruik het om die kapasitor te laai. Dit neem nog steeds ongeveer 5 RC sekondes voordat ons 'naby genoeg' by die gewenste spanning kom.

Stap 7: Gaan van a na B, 'n bietjie vinniger

Kom van a na B, 'n bietjie vinniger
Kom van a na B, 'n bietjie vinniger

Gestel ons het 'n kapasitor wat reeds tot Va gelaai is. Gestel ons gebruik analogWrite () om die nuwe waarde van b uit te skryf. Wat is die minimum tyd wat u moet wag totdat die spanning Vb bereik is?

As u 5 RC -sekondes raai, is dit wonderlik! Deur 5 RC sekondes te wag, word die kapasitor byna Vb laai. Maar as ons wil, kan ons eintlik 'n bietjie minder wag.

Kyk na die ladingskromme. U sien, die kondensator was reeds by Va toe ons begin. Dit beteken dat ons nie die tyd t_a hoef te wag nie. Ons sou dit net moes as ons die kondensator van nul laai.

Dus, deur nie die tyd te wag nie, sien ons 'n verbetering. Die tyd t_ab is eintlik 'n bietjie korter as 5 RC.

Maar wag, ons kan soveel beter! Kyk na al die spasie bo v_b. Dit is die verskil tussen Vcc, die maksimum spanning wat ons beskikbaar het en die Vb wat ons beoog om te bereik. Kan u sien hoe die ekstra spanning ons baie vinniger kan help bereik waarheen ons wil gaan?

Stap 8: Gaan van a na B, met 'n turbo -laaier

Gaan van a na B, met 'n turbo -laaier!
Gaan van a na B, met 'n turbo -laaier!

Dit is reg. In plaas daarvan om PWM teen die teikenspanning V_b te gebruik, hou ons dit vir 'n baie, baie korter tyd op 'n bestendige Vcc. Ek noem dit die Turbo Charger -metode en dit bring ons waarheen ons wil gaan, baie vinnig! Na die tydvertraging (wat ons moet bereken), slaan ons op die remme deur oor te skakel na PWM by V_b. Dit verhoed dat die spanning die teiken oorskry.

Met hierdie metode is dit moontlik om die spanning in die kapasitor in 'n breukdeel van die tyd van V_a na V_b te verander as om slegs PWM te gebruik. Dit is hoe jy plekke kry, skat!

Stap 9: Verstaan die kode

Verstaan die kode
Verstaan die kode

'N Foto is duisend woorde werd, dus die diagram toon die data en die bewerkings wat in die kode uitgevoer word. Van links na regs:

  • Die grafiese data word gestoor in PROGMEEM (dit wil sê, flitsgeheue) as 'n lys van punte.
  • Enige kombinasie van translasie-, skaal- en rotasiebewerkings word gekombineer tot 'n affiene transformasiematriks. Dit word een keer aan die begin van elke animasieraam gedoen.
  • Punte word een vir een uit grafiese data gelees en word elkeen vermenigvuldig met die gestoorde transformasiematriks.
  • Die getransformeerde punte word gevoer deur 'n skêr -algoritme wat enige punte buite die sigbare gebied opdoen.
  • Met behulp van 'n RC -vertragingstabel, word die punte omgeskakel in dryfspannings en vertragings. Die RC-vertraging-opsporingstabel word in EEPROM gestoor en kan hergebruik word vir verskeie lopies van die kode. By die aanvang word die RC -opzoektabel nagegaan op akkuraatheid en word die verkeerde waardes opgedateer. Die gebruik van EEPROM bespaar waardevolle RAM -geheue.
  • Die dryfspannings en vertragings word na die onaktiewe raam in die raambuffer geskryf. Die raambuffer bevat ruimte vir 'n aktiewe raam en 'n onaktiewe raam. Sodra 'n volledige raam geskryf is, word die onaktiewe raam aktief gemaak.
  • 'N Onderbrekingsdiensroetine teken die prentjie voortdurend deur die lees van spanningswaardes en vertragings van die aktiewe raambuffer. Op grond van hierdie waardes pas dit die insetsiklusse van die uitsetpenne aan. Timer 1 word gebruik vir die meting van die tydsvertraging tot 'n paar nanosekondes akkuraatheid, terwyl timer 2 gebruik word om die werksiklus van penne te beheer.
  • Die pen met die grootste spanningverandering is altyd 'turbo gelaai' met 'n dienssiklus van nul of 100%, wat die vinnigste laai of ontladingstyd bied. Die pen met 'n mindere spanningverandering word aangedryf met 'n dienssiklus wat gekies is om by die oorgangstyd van die eerste pen te pas-hierdie tydsaanpassing is belangrik om te verseker dat lyne reguit op die ossilloskoop getrek word.

Stap 10: Groot verantwoordelikheid kom met groot spoed

Aangesien hierdie metode soveel vinniger is as PWM, waarom gebruik analogWrite () dit dan nie? Omdat die gebruik van slegs PWM goed genoeg is vir die meeste programme en baie meer vergewensgesind is. Die "Turbo Charger" -metode vereis egter noukeurige kodering en is slegs geskik vir spesifieke gevalle:

  1. Dit is uiters sensitief vir tydsberekening. Sodra ons die teikenspanningsvlak bereik het, moet die dryfpen onmiddellik in die gewone PWM -modus oorgeskakel word om te voorkom dat die doelspanning oorskiet.
  2. Dit vereis kennis van die RC -konstante, dus hierdie waardes moet vooraf ingevoer word. Met verkeerde waardes is die tydsberekening verkeerd en die spannings verkeerd. Met gereelde PWM is daar 'n waarborg dat u na 'n geruime tyd op die regte spanning sal kom, selfs al is die RC -konstante nie bekend nie.
  3. Om die presiese tydsinterval vir die laai van die kondensator te bereken, vereis logaritmiese vergelykings wat te stadig is vir intydse berekening op die Arduino. Dit moet voor elke animasieraam vooraf bereken word en êrens in die geheue gestoor word.
  4. Programme wat hierdie metode hanteer, moet daarteen stry dat die vertragings baie nie-lineêr is (dit is eintlik eksponensiaal). Doelspannings naby Vcc of GND sal baie groter orde langer neem om te bereik as spannings naby die middelpunt.

Om hierdie beperkings te oorkom, doen my vektorgrafiese kode die volgende dinge:

  1. Dit gebruik Timer 1 by 16kHz en 'n onderbrekingsdiensroetine vir presiese uitsetmanipulasie en tydsberekening.
  2. Dit vereis dat 'n spesifieke waarde van RC -tydskonstante gebruik word, wat die keuses van die kapasitor- en weerstandswaardes beperk.
  3. Dit stoor die vertragings vir al die punte in 'n animasie raam in 'n geheue buffer. Dit beteken dat die roetine wat die vertragings bereken, baie stadiger loop as die onderbrekingsdiensroetine wat die uitvoerpenne opdateer. Elke gegewe raam kan 'n paar dosyn keer geverf word voordat 'n nuwe stel vertragings vir die volgende raam gereed is om gebruik te word.
  4. Die gebruik van 'n geheue buffer plaas 'n beperking op die aantal punte wat per raam getrek kan word. Ek gebruik 'n ruimte -effektiewe kodering om die meeste uit die beskikbare RAM te haal, maar dit is steeds beperk tot ongeveer 150 punte. Buiten die honderd of meer punte, sou die skerm in elk geval begin flikker, so dit is 'n punt!

Aanbeveel: