Turinys:

Itin greita analoginė įtampa iš „Arduino“: 10 žingsnių (su nuotraukomis)
Itin greita analoginė įtampa iš „Arduino“: 10 žingsnių (su nuotraukomis)

Video: Itin greita analoginė įtampa iš „Arduino“: 10 žingsnių (su nuotraukomis)

Video: Itin greita analoginė įtampa iš „Arduino“: 10 žingsnių (su nuotraukomis)
Video: Output DC or AC Voltage using MCP4725 DAC with LCD and PWM to Voltage Converter with Arduino 2024, Liepa
Anonim
Image
Image

Ši instrukcija parodo, kaip generuoti itin greitus analoginės įtampos pokyčius iš „Arduino“ir paprastos rezistoriaus ir kondensatoriaus poros. Viena iš programų, kur tai naudinga, yra grafikos generavimas osciloskopu. Yra keletas kitų projektų, kurie tai padarė. Johngineer rodo paprastą Kalėdų eglutę, naudojant impulsų pločio moduliaciją (PWM). Kiti patobulino šį projektą naudodami rezistoriaus kopėčias arba specialų skaitmeninio-analoginio keitiklio lustą.

Naudojant PWM atsiranda daug mirgėjimo, o naudojant rezistoriaus kopėčias arba skaitmeninį-analoginį keitiklį reikia daugiau išvesties kaiščių ir komponentų, kurie gali būti nepasiekiami. Mano naudojama grandinė yra ta pati negyva paprasto rezistoriaus ir kondensatoriaus pora, kaip ir Kalėdų eglutės demonstracijoje, tačiau veikia žymiai mažiau mirgėjimo.

Pirma, aš jums padėsiu sukurti grandinės kūrimo procesą. Tada aš išmokysiu jus pridėti savo įvaizdį. Galiausiai pristatysiu teoriją apie tai, kas daro ją greitesnę.

Jei jums patiko ši instrukcija, apsvarstykite galimybę balsuoti už ją!:)

1 žingsnis: sukurkite grandinę

Grandinės kūrimas
Grandinės kūrimas

Norėdami sukurti grandinę, jums reikės:

a) „Arduino“, pagrįstas „Atmel 16MHz ATmega328P“, pvz., „Arduino Uno“arba „Arduino Nano“.

b) Du rezistoriai, kurių vertė R, ne mažesnė kaip 150Ω.

c) Du C vertės kondensatoriai, tokie kaip C = 0,0015 / R, pavyzdžiai:

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

Šių verčių pasirinkimo priežastys yra dvi. Visų pirma, norime, kad „Arduino“kaiščių srovė būtų mažesnė už didžiausią vardinę 40 mA srovę. Naudojant 150Ω vertę, srovė ribojama iki 30 mA, kai naudojama su 5 V „Arduino“maitinimo įtampa. Didesnės R vertės sumažins srovę, todėl yra priimtinos.

Antrasis apribojimas yra tas, kad norime, kad laikas, kuris yra R ir C produktas, būtų pastovus apie 1,5 ms. Programinė įranga buvo specialiai pritaikyta šiai laiko konstantai. Nors programinėje įrangoje galima koreguoti R ir C reikšmes, yra siauras diapazonas, kuriame jis veiks, todėl rinkitės komponentus kuo arčiau siūlomo santykio.

Išsamesnis paaiškinimas, kodėl RC konstanta yra svarbi, bus pateiktas teorijos skyriuje, kai aš jums parodysiu, kaip surinkti demonstracinę grandinę.

2 žingsnis: Osciloskopo nustatymas

Osciloskopo nustatymas
Osciloskopo nustatymas

Demonstracijai reikalingas osciloskopas, nustatytas į X/Y režimą. Bandymo laidai turi būti prijungti, kaip parodyta schemoje. Jūsų osciloskopas skirsis nuo mano, tačiau aš atliksiu būtinus veiksmus, kad nustatyčiau X/Y režimą savo įrenginyje:

a) Nustatykite horizontalų šlavimą, kurį valdytų kanalas B (X ašis).

b) Nustatykite osciloskopą į dviejų kanalų režimą.

c) Abiejuose kanaluose nustatykite voltus/div, kad jie galėtų rodyti įtampą nuo 0V iki 5V. Aš nustatiau savo 0,5 V/div.

d) Abiejuose kanaluose nustatykite sujungimo režimą į nuolatinę srovę.

e) Sureguliuokite X ir Y padėtį, kad taškas būtų apatiniame kairiajame ekrano kampe, kai „Arduino“yra išjungtas.

3 veiksmas: atsisiųskite ir paleiskite programinę įrangą

Image
Image

Atsisiųskite programinę įrangą iš „Fast Vector Display For Arduino“saugyklos. Programinė įranga yra licencijuota pagal „GNU Affero Public License v3“ir gali būti laisvai naudojama bei modifikuojama pagal tos licencijos sąlygas.

Atidarykite „fast-vector-display-arduino.ino“failą „Arduino IDE“ir įkelkite į „Arduino“. Akimirksniu osciloskopo ekrane pamatysite animaciją „Laimingų Naujųjų metų“.

Šį projektą sukūriau kaip asmeninį hakatoną keliomis savaitėmis iki Kalėdų, todėl yra Kalėdų ir Naujųjų metų tema, kurią galite pamatyti pakeisdami kodo kintamąjį PATTERN.

4 žingsnis: sukurkite savo pasirinktinį piešinį

Supraskite, kodėl PWM yra toks lėtas
Supraskite, kodėl PWM yra toks lėtas

Jei norite sukurti savo piešinį, galite įklijuoti taško koordinates į „Arduino“eskizą tiesėje, kuri apibrėžia USER_PATTERN.

Radau, kad „Inkscape“yra gana geras įrankis, skirtas individualiam piešiniui kurti:

  1. Kurkite tekstą naudodami didelį, paryškintą šriftą, pvz., „Impact“.
  2. Pasirinkite teksto objektą ir meniu „Kelias“pasirinkite „Objektas į kelią“.
  3. Pasirinkite atskiras raides ir sutapkite jas, kad sukurtumėte sujungtą formą
  4. Meniu „Kelias“pasirinkite „Sąjunga“, kad sujungtumėte juos į vieną kreivę.
  5. Jei bet kurioje raidėje yra skylių, iškirpkite mažą įpjovą, stačiakampio įrankiu nubrėžę stačiakampį ir atimdami jį iš kontūro naudodami įrankį „Skirtumas“.
  6. Dukart spustelėkite kelią, kad būtų parodyti mazgai.
  7. Stačiakampiu pasirinkite visus mazgus ir spustelėkite įrankį „Padaryti pasirinktų mazgų kampą“.
  8. Išsaugokite SVG failą.

Svarbu tai, kad jūsų piešinys turėtų turėti vieną uždarą kelią ir be skylių. Įsitikinkite, kad jūsų dizainas turi mažiau nei apie 130 taškų.

5 veiksmas: įklijuokite koordinates iš SVG failo į „Arduino IDE“

  1. Atidarykite SVG failą ir nukopijuokite koordinates. Jie bus įtraukti į „kelio“elementą. Pirmosios koordinačių poros galima nepaisyti; pakeiskite juos 0, 0.
  2. Įklijuokite koordinates į „Arduino“eskizą skliausteliuose iškart po „#define USER_PATTERN“.
  3. Pakeiskite visas tarpus kableliais, kitaip gausite kompiliavimo klaidą. Gali būti naudingas įrankis „Pakeisti ir rasti“.
  4. Surinkite ir paleiskite!
  5. Jei kyla problemų, stebėkite serijos konsolę, ar nėra klaidų. Visų pirma matysite pranešimus, jei jūsų šablonas turi per daug taškų vidiniam buferiui. Tokiais atvejais vaizdas bus per daug mirgėjęs.

6 žingsnis: supraskite, kodėl PWM yra toks lėtas

Norėdami pradėti, apžvelkime kondensatoriaus elgesį įkrovimo metu.

Kondensatorius, prijungtas prie įtampos šaltinio Vcc, padidins įtampą pagal eksponentinę kreivę. Ši kreivė yra asimptotinė, tai reiškia, kad ji sulėtės, kai artėja prie tikslinės įtampos. Visais praktiniais tikslais įtampa yra „pakankamai arti“po 5 RC sekundžių. RC vadinamas „laiko konstanta“. Kaip matėme anksčiau, tai yra jūsų grandinės rezistoriaus ir kondensatoriaus verčių sandauga. Problema ta, kad 5 RC yra gana ilgas laikas atnaujinti kiekvieną grafinio ekrano tašką. Tai sukelia daug mirgėjimo!

Kai kondensatoriui įkrauti naudojame impulsų pločio moduliaciją (PWM), mums ne ką geriau. Naudojant PWM, įtampa greitai keičiasi tarp 0V ir 5V. Praktiškai tai reiškia, kad mes greitai pakaitomis įkrauname įkrovą į kondensatorių ir vėl ištraukiame šiek tiek jo - šis stūmimas ir traukimas yra panašus į bandymą nubėgti maratoną žengiant didelį žingsnį į priekį, o po to - šiek tiek atgal vėl ir vėl.

Kai visa tai apskaičiuojate vidutiniškai, įkraunant kondensatorių naudojant PWM elgsena yra tokia pati, lyg kondensatoriui įkrauti būtumėte naudoję pastovią Vpwm įtampą. Vis tiek užtrunka apie 5 RC sekundes, kol mes „pakankamai priartėsime“prie norimos įtampos.

7 žingsnis: greičiau iš „A“į „B“

Iš „a“į „B“- Tadas šiek tiek greičiau
Iš „a“į „B“- Tadas šiek tiek greičiau

Tarkime, kad turime kondensatorių, kuris jau įkrautas iki Va. Tarkime, kad mes naudojame analogWrite (), kad užrašytume naują b reikšmę. Kiek mažiausiai laiko turite laukti, kol bus pasiekta įtampa Vb?

Jei atspėjote 5 RC sekundes, tai puiku! Laukiant 5 RC sekundes, kondensatorius bus įkrautas beveik iki Vb. Bet jei norime, galime palaukti šiek tiek mažiau.

Pažvelkite į įkrovos kreivę. Matote, kondensatorius jau buvo Va, kai pradėjome. Tai reiškia, kad mums nereikia laukti laiko t_a. Mums tektų tik tuo atveju, jei įkrautume kondensatorių nuo nulio.

Taigi nelaukdami to laiko matome pagerėjimą. Laikas t_ab iš tikrųjų yra šiek tiek trumpesnis nei 5 RC.

Bet palaukite, mes galime padaryti daug geriau! Pažvelkite į visą erdvę virš v_b. Tai yra skirtumas tarp Vcc, didžiausios mums prieinamos įtampos ir Vb, kurį ketiname pasiekti. Ar galite pamatyti, kaip ši papildoma įtampa gali padėti mums pasiekti tai, kur norime, daug greičiau?

8 žingsnis: eikite iš „A“į „B“su „Turbo“įkrovikliu

Su „Turbo“įkrovikliu pereikite iš „a“į „B“!
Su „Turbo“įkrovikliu pereikite iš „a“į „B“!

Teisingai. Užuot naudoję PWM esant tikslinei įtampai V_b, mes laikome jį pastoviu Vcc daug daug trumpesnį laiką. Aš tai vadinu „Turbo Charger“metodu ir tikrai greitai pasiekiame ten, kur norime! Po laiko atidėjimo (kurį turime apskaičiuoti), mes stabdome stabdžius, perjungdami į PWM ties V_b. Tai neleidžia įtampai viršyti tikslo.

Taikant šį metodą, per trumpą laiką galima pakeisti įtampą kondensatoriuje iš V_a į V_b nei naudojant tik PWM. Taip gauni vietas, mažute!

9 žingsnis: supraskite kodą

Suprasti kodeksą
Suprasti kodeksą

Paveikslėlis vertas tūkstančio žodžių, todėl schema rodo duomenis ir operacijas, kurios atliekamos kodu. Iš kairės į dešinę:

  • Grafiniai duomenys saugomi PROGMEM (tai yra „flash“atmintyje) kaip taškų sąrašas.
  • Bet koks vertimo, mastelio keitimo ir sukimosi operacijų derinys sujungiamas į afininę transformacijos matricą. Tai atliekama vieną kartą kiekvieno animacijos kadro pradžioje.
  • Taškai skaitomi po vieną iš grafikos duomenų ir kiekvienas padauginamas iš išsaugotos transformacijos matricos.
  • Transformuoti taškai tiekiami naudojant žirklių algoritmą, kuris apkarpo visus taškus, esančius už matomos srities ribų.
  • Naudojant RC atidėjimo paieškos lentelę, taškai konvertuojami į važiavimo įtampą ir laiko vėlavimą. RC uždelsimo peržiūros lentelė saugoma EEPROM ir gali būti pakartotinai naudojama daugkartiniam kodo paleidimui. Paleidžiant tikrinama RC peržiūros lentelės tikslumas ir atnaujinamos visos neteisingos vertės. Naudojant EEPROM sutaupoma vertingos RAM atminties.
  • Važiavimo įtampa ir vėlavimai įrašomi į neaktyvų rėmelį rėmo buferyje. Rėmelio buferyje yra vietos aktyviam kadrui ir neaktyviam kadrui. Parašius visą kadrą, neaktyvus kadras suaktyvinamas.
  • Pertraukos aptarnavimo tvarka nuolat piešia vaizdą, nuskaitydama įtampos vertes ir vėlavimus iš aktyvaus kadro buferio. Remdamasi šiomis vertėmis, ji koreguoja išvesties kaiščių darbo ciklus. 1 laikmatis naudojamas laiko vėlavimui matuoti iki kelių nanosekundžių tikslumo, o 2 laikmatis - kaiščių veikimo ciklui valdyti.
  • Smeigtukas su didžiausiu įtampos pokyčiu visada yra „turbokompresorinis“, kurio darbo ciklas lygus nuliui arba 100%, užtikrinant greičiausią įkrovimo ar iškrovimo laiką. Smeigtukas, kurio įtampa yra mažesnė, yra varomas pagal darbo ciklą, pasirinktą taip, kad atitiktų pirmojo kaiščio perėjimo laiką-šis laiko atitikimas yra svarbus siekiant užtikrinti, kad linijos būtų nubrėžtos tiesiai ant osciloskopo.

10 žingsnis: Didelis greitis - didelė atsakomybė

Kadangi šis metodas yra daug greitesnis nei PWM, kodėl „analogWrite ()“jo nenaudoja? Na, nes tik PWM naudojimas yra pakankamai geras daugumai programų ir yra daug atlaidesnis. Tačiau „Turbo Charger“metodas reikalauja kruopštaus kodavimo ir tinka tik konkrečiais atvejais:

  1. Jis yra labai jautrus laikui. Pasiekus tikslinį įtampos lygį, pavaros kaištis turi būti nedelsiant perjungtas į įprastą PWM režimą, kad būtų išvengta tikslinės įtampos perviršio.
  2. Tam reikia žinoti RC konstantą, todėl šias vertes reikia įvesti iš anksto. Esant neteisingoms vertėms, laikas bus neteisingas, o įtampa - neteisinga. Naudojant įprastą PWM, yra garantija, kad po kurio laiko nusistovės teisinga įtampa, net jei RC konstanta nežinoma.
  3. Norint apskaičiuoti tikslų kondensatoriaus įkrovimo laiko intervalą, reikalingos logaritminės lygtys, kurios yra per lėtos „Arduino“skaičiavimui realiuoju laiku. Jie turi būti iš anksto apskaičiuoti prieš kiekvieną animacijos kadrą ir kažkur išsaugoti atmintyje.
  4. Programos, susijusios su šiuo metodu, turi kovoti su tuo, kad vėlavimai yra labai nelinijiniai (jie iš tikrųjų yra eksponentiški). Tikslinė įtampa šalia Vcc arba GND užtruks daug kartų ilgiau nei įtampa šalia vidurio taško.

Siekdamas įveikti šiuos apribojimus, mano vektorinės grafikos kodas atlieka šiuos veiksmus:

  1. Jis naudoja 1 laikmatį esant 16 kHz dažniui ir pertraukos aptarnavimo tvarką, kad būtų galima tiksliai valdyti išvestį ir nustatyti laiką.
  2. Tam reikia naudoti tam tikrą RC laiko konstantos vertę, ribojančią kondensatoriaus ir rezistoriaus verčių pasirinkimą.
  3. Jis išsaugo visų animacijos rėmelio taškų vėlavimą atminties buferyje. Tai reiškia, kad tvarka, apskaičiuojanti laiko vėlavimą, veikia daug lėčiau nei pertraukimo paslaugos, kuri atnaujina išvesties kaiščius. Bet kuris rėmas gali būti nudažytas kelias dešimtis kartų, kol bus paruoštas naudoti naujas vėlesnio kadro rinkinys.
  4. Atminties buferio naudojimas apriboja taškų, kuriuos galima nubrėžti kiekviename kadre, skaičių. Aš naudoju erdvinį kodavimą, kad galėčiau maksimaliai išnaudoti turimą RAM, tačiau jis vis tiek ribojamas iki maždaug 150 taškų. Virš šimto ar daugiau taškų ekranas vis tiek pradės mirgėti, todėl tai ginčytinas dalykas!

Rekomenduojamas: