Satura rādītājs:

Īpaši ātri analogie spriegumi no Arduino: 10 soļi (ar attēliem)
Īpaši ātri analogie spriegumi no Arduino: 10 soļi (ar attēliem)

Video: Īpaši ātri analogie spriegumi no Arduino: 10 soļi (ar attēliem)

Video: Īpaši ātri analogie spriegumi no Arduino: 10 soļi (ar attēliem)
Video: How to use ESP32 WiFi and Bluetooth with Arduino IDE full details with examples and code 2024, Jūlijs
Anonim
Image
Image

Šī pamācība parāda, kā ģenerēt īpaši ātras analogā sprieguma izmaiņas no Arduino un vienkārša rezistora un kondensatora pāra. Viena no lietojumprogrammām, kur tas ir noderīgi, ir grafikas ģenerēšana osciloskopā. Ir vairāki citi projekti, kas to ir paveikuši. Johngineer parāda vienkāršu Ziemassvētku eglīti, izmantojot impulsa platuma modulāciju (PWM). Citi ir uzlabojuši šo projektu, izmantojot pretestības kāpnes vai īpašu digitālā-analogā pārveidotāja mikroshēmu.

PWM izmantošana izraisa daudz mirgošanas, savukārt, izmantojot rezistoru kāpnes vai digitālā-analogā pārveidotāju, ir vajadzīgas vairāk izejas tapas un komponenti, kas var nebūt viegli pieejami. Shēma, kuru izmantoju, ir tas pats mirušais vienkāršais rezistoru un kondensatoru pāris, ko izmanto Ziemassvētku eglītes demonstrācijā, taču darbojas ar ievērojami mazāku mirgošanu.

Pirmkārt, es jums pastāstīšu par ķēdes veidošanas procesu. Tad es iemācīšu, kā pievienot savu attēlu. Visbeidzot, es iepazīstināšu ar teoriju par to, kas padara to ātrāku.

Ja jums patika šī pamācība, lūdzu, apsveriet iespēju balsot par to!:)

1. darbība: ķēdes izveide

Ķēdes veidošana
Ķēdes veidošana

Lai izveidotu ķēdi, jums būs nepieciešams:

a) Arduino, kura pamatā ir Atmel 16MHz ATmega328P, piemēram, Arduino Uno vai Arduino Nano.

b) Divi rezistori ar vērtību R, kas ir vismaz 150Ω.

c) Divi kondensatori ar vērtību C, lai C = 0,0015 / R, piemēri:

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

Šo vērtību izvēles iemesli ir divi. Pirmkārt, mēs vēlamies, lai strāva uz Arduino tapām būtu zemāka par maksimālo nominālo strāvu 40 mA. Izmantojot vērtību 150Ω, strāva tiek ierobežota līdz 30 mA, ja to izmanto ar 5 V Arduino barošanas spriegumu. Lielākas R vērtības samazinās strāvu un tāpēc ir pieņemamas.

Otrs ierobežojums ir tāds, ka mēs vēlamies saglabāt nemainīgu laiku, kas ir R un C produkts, vienāds ar aptuveni 1,5 ms. Programmatūra ir īpaši pielāgota šai laika konstantei. Lai gan programmatūrā ir iespējams pielāgot R un C vērtības, ir šaurs diapazons, ap kuru tas darbosies, tāpēc izvēlieties komponentus pēc iespējas tuvāk ieteicamajai attiecībai.

Rūpīgāks skaidrojums par to, kāpēc RC konstante ir svarīga, tiks sniegts teorijas sadaļā pēc tam, kad esmu parādījis, kā salikt demonstrācijas shēmu.

2. darbība: Osciloskopa uzstādīšana

Osciloskopa uzstādīšana
Osciloskopa uzstādīšana

Demonstrēšanai nepieciešams osciloskops, kas iestatīts X/Y režīmā. Testa vadi ir jāpievieno, kā parādīts shēmā. Jūsu osciloskops atšķirsies no manējā, bet es veikšu nepieciešamos soļus, lai ierīcē iestatītu X/Y režīmu:

a) Iestatiet horizontālo slaucīšanu, lai to kontrolētu kanāls B (X ass).

b) Iestatiet osciloskopu divkanālu režīmā.

c) Iestatiet voltus/div abos kanālos, lai tie varētu parādīt spriegumu no 0V līdz 5V. Es iestatīju savu 0,5V/div.

d) Iestatiet savienojuma režīmu uz DC abos kanālos.

e) Noregulējiet X un Y pozīciju tā, lai punkts būtu ekrāna apakšējā kreisajā stūrī, kad Arduino ir izslēgts.

3. darbība: lejupielādējiet un palaidiet programmatūru

Image
Image

Lejupielādējiet programmatūru no Arduino krātuves ātrā vektoru displeja. Programmatūra ir licencēta saskaņā ar GNU Affero Public License v3, un to var brīvi izmantot un modificēt saskaņā ar šīs licences noteikumiem.

Atveriet failu "fast-vector-display-arduino.ino" Arduino IDE un augšupielādējiet savā Arduino. Uz brīdi osciloskopa ekrānā redzēsit animāciju “Laimīgu Jauno gadu”.

Es izstrādāju šo projektu kā personisku hakatonu nedēļās pirms Ziemassvētkiem, tāpēc ir Ziemassvētku un Jaungada tematiskais ziņojums, ko varat redzēt, modificējot kodā mainīgo PATTERN.

4. solis: izveidojiet savu pielāgoto zīmējumu

Izprotiet, kāpēc PWM ir tik lēns
Izprotiet, kāpēc PWM ir tik lēns

Ja vēlaties izveidot savu zīmējumu, varat ielīmēt punktu koordinātas Arduino skicē uz līnijas, kas nosaka USER_PATTERN.

Es atklāju, ka Inkscape ir diezgan labs rīks pielāgota zīmējuma izveidošanai:

  1. Izveidojiet tekstu, izmantojot lielu, drosmīgu fontu, piemēram, Impact.
  2. Atlasiet teksta objektu un izvēlnē "Ceļš" atlasiet "Objekts līdz ceļam".
  3. Atlasiet atsevišķus burtus un pārklājiet tos, lai izveidotu savienotu formu
  4. Izvēlnē “Ceļš” atlasiet “Savienība”, lai tos apvienotu vienā līknē.
  5. Ja kādos burtos ir caurumi, izgrieziet nelielu iecirtumu, ar taisnstūra rīku uzzīmējot taisnstūri un atņemot to no kontūras, izmantojot rīku "Difference".
  6. Veiciet dubultklikšķi uz ceļa, lai parādītu mezglus.
  7. Taisnstūris atlasiet visus mezglus un noklikšķiniet uz rīka Izveidot atlasītos mezglus.
  8. Saglabājiet SVG failu.

Svarīgi ir tas, ka jūsu zīmējumam jābūt vienam slēgtam ceļam un bez caurumiem. Pārliecinieties, vai jūsu dizainā ir mazāk par aptuveni 130 punktiem.

5. darbība: ielīmējiet koordinātas no SVG faila Arduino IDE

  1. Atveriet SVG failu un nokopējiet koordinātas. Tie tiks iegulti "ceļa" elementā. Pirmo koordinātu pāri var ignorēt; aizstājiet tos ar 0, 0.
  2. Ielīmējiet koordinātas Arduino skicē iekavās tūlīt pēc "#define USER_PATTERN".
  3. Aizstājiet visas atstarpes ar komatiem, pretējā gadījumā tiks parādīta kompilācijas kļūda. Var būt noderīgs rīks "Aizstāt un atrast".
  4. Apkopojiet un palaidiet!
  5. Ja rodas problēmas, skatieties sērijas konsolē, vai nav kļūdu. Jo īpaši jūs redzēsit ziņojumus, ja jūsu modelim ir pārāk daudz punktu iekšējam buferim. Šādos gadījumos attēlā parādīsies pārmērīga mirgošana.

6. darbība. Izprotiet, kāpēc PWM ir tik lēna

Lai sāktu, pārskatīsim kondensatora uzvedību uzlādes laikā.

Kondensators, kas ir pievienots sprieguma avotam Vcc, palielinās spriegumu saskaņā ar eksponenciālu līkni. Šī līkne ir asimptotiska, kas nozīmē, ka tā palēnināsies, tuvojoties mērķa spriegumam. Praktiskos nolūkos spriegums ir "pietiekami tuvu" pēc 5 RC sekundēm. RC sauc par "laika konstanti". Kā redzējām iepriekš, tas ir jūsu ķēdes rezistora un kondensatora vērtību produkts. Problēma ir tā, ka 5 RC ir diezgan ilgs laiks, lai atjauninātu katru grafiskā displeja punktu. Tas noved pie daudz mirgošanas!

Ja mēs izmantojam impulsa platuma modulāciju (PWM), lai uzlādētu kondensatoru, mums nav labāk. Ar PWM spriegums strauji pārslēdzas starp 0V un 5V. Praksē tas nozīmē, ka mēs strauji pārmaiņus spiežam lādiņu kondensatorā un atkal mazliet izvelkam to ārā - šis grūdiens un vilkšana drīzāk ir tāds pats kā mēģinājums noskriet maratonu, sperot lielu soli uz priekšu un tad nelielu soli atpakaļ atkal un atkal.

Kad jūs to visu aprēķināt vidēji, kondensatora uzlāde, izmantojot PWM, ir tieši tāda pati kā tad, ja kondensatora uzlādēšanai būtu izmantots vienmērīgs Vpwm spriegums. Joprojām ir vajadzīgas apmēram 5 RC sekundes, lai mēs varētu "pietiekami tuvu" vēlamajam spriegumam.

7. solis: nokļūstiet no a līdz B, tad Tad ātrāk

Nokļūstiet no a līdz B, tad Tad ātrāk
Nokļūstiet no a līdz B, tad Tad ātrāk

Pieņemsim, ka mums ir kondensators, kas jau ir uzlādēts līdz Va. Pieņemsim, ka mēs izmantojam analogWrite (), lai izrakstītu jauno b vērtību. Kāds ir minimālais laiks, kas jāgaida, līdz tiek sasniegts spriegums Vb?

Ja uzminējāt 5 RC sekundes, tas ir lieliski! Gaidot 5 RC sekundes, kondensators tiks uzlādēts līdz gandrīz Vb. Bet, ja mēs vēlamies, mēs varam gaidīt mazliet mazāk.

Apskatiet uzlādes līkni. Redzi, kondensators jau bija pie Va, kad mēs sākām. Tas nozīmē, ka mums nav jāgaida laiks t_a. Mums tas būtu jādara tikai tad, ja mēs uzlādētu kondensatoru no nulles.

Tātad, negaidot šo laiku, mēs redzam uzlabojumu. Laiks t_ab patiesībā ir nedaudz īsāks par 5 RC.

Bet pagaidi, mēs varam daudz labāk! Apskatiet visu šo vietu virs v_b. Tā ir atšķirība starp Vcc, maksimālo mums pieejamo spriegumu un Vb, kuru mēs plānojam sasniegt. Vai redzat, kā šis papildu spriegums var palīdzēt mums nokļūt tur, kur mēs vēlamies, daudz ātrāk?

8. solis: nokļūstiet no a līdz B, izmantojot Turbo lādētāju

Nokļūstiet no a līdz B ar turbo lādētāju!
Nokļūstiet no a līdz B ar turbo lādētāju!

Tieši tā. Tā vietā, lai izmantotu PWM pie mērķa sprieguma V_b, mēs to noturēsim pie nemainīga Vcc daudz, daudz īsāku laiku. Es to saucu par Turbo Charger metodi, un tas mūs tiešām, ļoti ātri noved pie tā, kur mēs vēlamies! Pēc laika aiztures (kas mums jāaprēķina), mēs ieslēdzam bremzes, pārslēdzoties uz PWM pie V_b. Tas neļauj spriegumam pārspēt mērķi.

Izmantojot šo metodi, ir iespējams nomainīt spriegumu kondensatorā no V_a uz V_b daļēji, nekā izmantojot tikai PWM. Tādā veidā jūs iegūstat vietas, bērniņ!

9. darbība. Izprotiet kodu

Izprotiet kodeksu
Izprotiet kodeksu

Attēls ir tūkstoš vārdu vērts, tāpēc diagramma parāda datus un darbības, kas tiek veiktas kodā. No kreisās uz labo:

  • Grafikas dati tiek saglabāti programmā PROGMEM (tas ir, zibatmiņa) kā punktu saraksts.
  • Jebkura tulkošanas, mērogošanas un rotācijas darbību kombinācija tiek apvienota afīnu transformācijas matricā. Tas tiek darīts vienu reizi katra animācijas kadra sākumā.
  • Punkti tiek nolasīti pa vienam no grafikas datiem, un katrs tiek reizināts ar saglabāto transformācijas matricu.
  • Pārveidotie punkti tiek padoti, izmantojot šķērveida algoritmu, kas apgriež visus punktus ārpus redzamās zonas.
  • Izmantojot RC aizkaves uzmeklēšanas tabulu, punkti tiek pārvērsti braukšanas spriegumos un laika kavējumos. RC aizkaves uzmeklēšanas tabula tiek saglabāta EEPROM, un to var atkārtoti izmantot vairākām koda darbībām. Startēšanas laikā tiek pārbaudīta RC uzmeklēšanas tabulas precizitāte un tiek atjauninātas visas nepareizās vērtības. EEPROM izmantošana ietaupa vērtīgu RAM atmiņu.
  • Braukšanas spriegumi un kavējumi tiek ierakstīti kadra buferī esošajā neaktīvajā rāmī. Rāmja buferis satur vietu aktīvam kadram un neaktīvam kadram. Kad viss kadrs ir uzrakstīts, neaktīvais rāmis tiek aktivizēts.
  • Pakalpojuma pārtraukšanas rutīna nepārtraukti pārzīmē attēlu, nolasot sprieguma vērtības un aizkavi no aktīvā kadra bufera. Pamatojoties uz šīm vērtībām, tas pielāgo izejas tapu darba ciklus. Taimeris 1 tiek izmantots laika aiztures mērīšanai līdz dažām nanosekundēm ar precizitāti, savukārt taimeris 2 tiek izmantots, lai kontrolētu tapu darba ciklu.
  • Tapas ar vislielākajām sprieguma izmaiņām vienmēr ir "turbokompresors" ar nulles vai 100%darbības ciklu, nodrošinot ātrāko uzlādes vai izlādes laiku. Tapas ar mazākām sprieguma izmaiņām tiek darbinātas ar darba ciklu, kas izvēlēts atbilstoši pirmā tapas pārejas laikam-šī laika saskaņošana ir svarīga, lai nodrošinātu, ka līnijas tiek vilktas taisni uz osciloskopa.

10. solis: ar lielu ātrumu ir liela atbildība

Tā kā šī metode ir daudz ātrāka nekā PWM, kāpēc analogWrite () to neizmanto? Tā kā tikai PWM izmantošana ir pietiekami laba lielākajai daļai programmu un ir daudz piedodošāka. Tomēr "Turbo Charger" metode prasa rūpīgu kodēšanu un ir piemērota tikai īpašos gadījumos:

  1. Tas ir ārkārtīgi jutīgs pret laiku. Kad esam sasnieguši mērķa sprieguma līmeni, piedziņas tapa nekavējoties jāpārslēdz parastajā PWM režīmā, lai izvairītos no mērķa sprieguma pārsniegšanas.
  2. Tas prasa zināšanas par RC konstanti, tāpēc šīs vērtības ir jāievada iepriekš. Ja ir nepareizas vērtības, laiks būs nepareizs un spriegums būs nepareizs. Izmantojot regulāru PWM, ir garantija, ka pēc kāda laika jūs atradīsit pareizo spriegumu, pat ja RC konstante nav zināma.
  3. Lai aprēķinātu precīzu laika intervālu kondensatora uzlādēšanai, nepieciešami logaritmiskie vienādojumi, kas ir pārāk lēni Arduino reālā laika aprēķinam. Tie ir iepriekš jāaprēķina pirms katra animācijas rāmja un kaut kur jāglabā kešatmiņā.
  4. Programmām, kas nodarbojas ar šo metodi, ir jācīnās ar to, ka kavēšanās ir ļoti nelineāra (patiesībā tās ir eksponenciālas). Mērķa sprieguma sasniegšana Vcc vai GND tuvumā prasīs daudz lielākas kārtas, nekā spriegums pie viduspunkta.

Lai pārvarētu šos ierobežojumus, mans vektorgrafikas kods veic šādas darbības:

  1. Tas izmanto 1. taimeri 16 kHz frekvencē un pārtraukuma pakalpojumu rutīnu precīzai izvades manipulācijai un laika noteikšanai.
  2. Tam nepieciešama īpaša RC laika konstantes vērtība, ierobežojot kondensatora un rezistora vērtību izvēli.
  3. Tas saglabā laika aizkavi visiem punktiem animācijas rāmī atmiņas buferī. Tas nozīmē, ka rutīna, kas aprēķina aizkavēšanos, darbojas daudz lēnāk nekā pārtraukuma pakalpojumu rutīna, kas atjaunina izvades tapas. Jebkurš rāmis var tikt krāsots vairākus desmitus reižu, pirms jauna aizkaves kopa nākamajam kadram ir gatava lietošanai.
  4. Atmiņas bufera izmantošana ierobežo ierobežojumu, ko var uzzīmēt vienā kadrā. Es izmantoju kosmosa ziņā efektīvu kodējumu, lai maksimāli izmantotu pieejamo RAM, taču tas joprojām ir ierobežots līdz aptuveni 150 punktiem. Vairāk nekā simts punktu displejs jebkurā gadījumā sāks mirgot, tāpēc tas ir strīdīgs jautājums!

Ieteicams: