Mundarija:

Arduino -dan juda tezkor analog kuchlanish: 10 qadam (rasmlar bilan)
Arduino -dan juda tezkor analog kuchlanish: 10 qadam (rasmlar bilan)

Video: Arduino -dan juda tezkor analog kuchlanish: 10 qadam (rasmlar bilan)

Video: Arduino -dan juda tezkor analog kuchlanish: 10 qadam (rasmlar bilan)
Video: 13-Mavzu: Nasos stansiyalaridan foydalanishdagi texnik-iqtisodiy hisoblar. 2024, Iyul
Anonim
Image
Image

Ushbu yo'riqnoma Arduino va oddiy rezistor va kondansatkich juftidan analog kuchlanishning qanday tez o'zgarishini ishlab chiqarishni ko'rsatadi. Bu foydali bo'lgan bitta dastur - bu osiloskopda grafikalar yaratish. Buni amalga oshirgan yana bir qancha loyihalar mavjud. Johngineer puls kengligi modulyatsiyasi (PWM) yordamida oddiy Rojdestvo daraxti ko'rsatadi. Boshqalar rezistorli zinapoyadan yoki maxsus raqamli-analogli konvertor chipidan foydalanib, ushbu loyihani takomillashtirdilar.

PWM-dan foydalanish juda ko'p miltillashga olib keladi, rezistorli zinapoyadan yoki analog-raqamli konvertorni ishlatganda, chiqish pimi va komponentlari kerak bo'lmaydi. Men foydalanadigan sxema - bu Rojdestvo daraxti demosida ishlatilgan oddiy rezistor va kondansatör jufti, lekin u kamroq miltillash bilan ishlaydi.

Birinchidan, men sizga sxemani qurish jarayonida yo'l ko'rsataman. Keyin men sizga o'z rasmingizni qanday qo'shishni o'rgataman. Nihoyat, men nazariyani tezroq nima qilishini tanishtiraman.

Agar sizga bu ko'rsatma yoqqan bo'lsa, iltimos, unga ovoz bering!:)

1 -qadam: O'chirish tizimini yaratish

O'chirish davri
O'chirish davri

Devorni qurish uchun sizga quyidagilar kerak bo'ladi:

a) Atmel 16MHz ATmega328P ga asoslangan Arduino, masalan Arduino Uno yoki Arduino Nano.

b) R qiymati kamida 150Ω bo'lgan ikkita rezistor.

c) C qiymatining ikkita kondansatörü, C = 0.0015 / R, misollar:

  • R = 150Ω va C = 10µl
  • R = 1,5 kΩ va C = 1 mk
  • R = 15kΩ va C = 100nF
  • R = 150kΩ va C = 10nF

Bu qiymatlarni tanlashning sabablari ikki xil. Birinchidan, biz Arduino pimidagi oqimni maksimal nominal oqim 40mA ostida ushlab turishni xohlaymiz. 150Ω qiymatini ishlatib, Arduino 5V kuchlanish bilan ishlatilganda, oqim 30mA bilan chegaralanadi. R ning katta qiymatlari tokni kamaytiradi va shuning uchun qabul qilinadi.

Ikkinchi cheklov shundaki, biz R va C mahsuloti bo'lgan vaqtni 1,5 ms ga teng ushlab turishni xohlaymiz. Dastur bu vaqt uchun maxsus sozlangan. Dasturiy ta'minotda R va C qiymatlarini sozlash mumkin bo'lsa -da, uning atrofida ishlaydigan tor doirasi bor, shuning uchun komponentlarni taklif qilingan nisbatga iloji boricha yaqinroq qilib tanlang.

RC doimiyligi nima uchun muhimroq ekanligi haqida batafsil tushuntirish, men sizga ko'rsatuv sxemasini qanday yig'ishni ko'rsatganimdan so'ng, nazariya bo'limida beriladi.

2 -qadam: Osiloskopni sozlash

Osiloskopni sozlash
Osiloskopni sozlash

Namoyish X/Y rejimiga o'rnatilgan osiloskopni talab qiladi. Sinov o'tkazgichlari sxemada ko'rsatilgandek ulanishi kerak. Sizning osiloskopingiz menikidan farq qiladi, lekin men qurilmamda X/Y rejimini o'rnatish uchun kerakli qadamlarni bajaraman:

a) B kanali (X o'qi) tomonidan boshqariladigan gorizontal tozalashni o'rnating.

b) Osiloskopni ikki kanalli rejimga o'rnating.

c) Ikkala kanalda ham volt/divni shunday o'rnating, u 0V dan 5V gacha bo'lgan kuchlanishni ko'rsatishi mumkin. Men o'zimni 0,5 V/div ga o'rnatdim.

d) Har ikkala kanalda ulash rejimini DC ga o'rnating.

e) Arduino o'chirilganida nuqta ekranning chap pastki burchagida bo'lishi uchun X va Y holatini o'rnating.

3 -qadam: Dasturiy ta'minotni yuklab oling va ishga tushiring

Image
Image

Dasturni Arduino uchun tezkor vektorli displeydan yuklab oling. Dastur GNU Affero Public License v3 litsenziyasiga ega va shu litsenziya shartlariga muvofiq erkin ishlatilishi va o'zgartirilishi mumkin.

Arduino IDE-dagi "fast-vector-display-arduino.ino" faylini oching va Arduino-ga yuklang. Bir zumda siz osiloskop ekranida "Yangi yilingiz bilan" animatsiyasini ko'rasiz.

Men ushbu loyihani Rojdestvo oldidan bir necha hafta ichida shaxsiy xakaton sifatida ishlab chiqdim, shuning uchun koddagi PATTERN o'zgaruvchisini o'zgartirish orqali ko'rishingiz mumkin bo'lgan Rojdestvo va Yangi yil mavzusidagi xabar bor.

4 -qadam: O'zingizning shaxsiy rasmingizni yarating

PWM nima uchun juda sekin ekanligini tushuning
PWM nima uchun juda sekin ekanligini tushuning

Agar siz o'zingizning chizilgan rasmingizni yaratmoqchi bo'lsangiz, nuqta koordinatalarini Arduino eskiziga USER_PATTERN belgilaydigan qatorga joylashtirishingiz mumkin.

Men Inkscape shaxsiy rasm chizish uchun juda yaxshi vosita ekanligini aniqladim:

  1. Impact kabi katta, qalin shrift yordamida matn yarating.
  2. Matn ob'ektini tanlang va "Path" menyusidan "Object to Path" -ni tanlang.
  3. Alohida harflarni tanlang va ularni bir -biriga bog'lab shakl hosil qiling
  4. Ularni bitta egri chiziqqa birlashtirish uchun "Path" menyusidan "Union" -ni tanlang.
  5. Agar biron -bir harfda teshiklar bo'lsa, to'rtburchaklar vositasi yordamida to'rtburchaklar chizish orqali kichik chuqurchani kesib oling va "Farq" vositasi yordamida konturdan chiqarib oling.
  6. Tugunlarni ko'rsatish uchun yo'lni ikki marta bosing.
  7. To'rtburchak barcha tugunlarni tanlang va "Tanlangan tugunlar burchagini yaratish" asbobini bosing.
  8. SVG faylini saqlang.

Eng muhimi shundaki, sizning chizilgan rasmingizda bitta yopiq yo'l bo'lishi va teshiklar bo'lmasligi kerak. Sizning dizayningiz taxminan 130 balldan kam ekanligiga ishonch hosil qiling.

5 -qadam: SVG faylining koordinatalarini Arduino IDE -ga joylashtiring

  1. SVG faylini oching va koordinatalarni nusxalash. Ular "yo'l" elementiga joylashtiriladi. Birinchi juft koordinatalarni e'tiborsiz qoldirish mumkin; ularni 0, 0 bilan almashtiring.
  2. "#Define USER_PATTERN" belgisidan so'ng, koordinatalarni qavs ichidagi Arduino eskiziga joylashtiring.
  3. Barcha bo'shliqlarni vergul bilan almashtiring, aks holda kompilyatsiya xatosi paydo bo'ladi. "O'zgartirish va topish" vositasi foydali bo'lishi mumkin.
  4. Kompilyatsiya qiling va ishga tushiring!
  5. Agar sizda muammolar bo'lsa, xatoliklar uchun ketma -ket konsoliga qarang. Xususan, sizning namunangizda ichki bufer uchun juda ko'p nuqta bo'lsa, siz xabarlarni ko'rasiz. Bunday holda, tasvir haddan tashqari miltillashni ko'rsatadi.

6 -qadam: PWM nima uchun juda sekin ekanligini tushuning

Boshlash uchun, keling, kondansatör zaryad olayotgan paytda uning xatti -harakatlarini ko'rib chiqaylik.

Vcc kuchlanish manbaiga ulangan kondansatör o'z kuchlanishini ekspansional egri chizig'iga ko'ra oshiradi. Bu egri chiziq asimptotikdir, ya'ni maqsad kuchlanishiga yaqinlashganda sekinlashadi. Barcha amaliy maqsadlar uchun kuchlanish 5 RC soniyadan keyin "etarlicha yaqin" bo'ladi. RC "vaqt doimiy" deb nomlanadi. Yuqorida ko'rib turganimizdek, bu sizning kontaktlarning zanglashiga olib keladigan qarshilik va kondansatör qiymatlari mahsulotidir. Muammo shundaki, 5 RC - bu grafik displeydagi har bir nuqtani yangilash uchun juda uzoq vaqt. Bu juda ko'p chayqalishga olib keladi!

Kondensatorni zaryad qilish uchun puls kengligi modulyatsiyasidan (PWM) foydalansak, biz bundan yaxshiroq emasmiz. PWM bilan kuchlanish tezda 0V dan 5V gacha o'zgaradi. Amalda, bu shuni anglatadiki, biz zaryadni kondansatkichga surish bilan uni biroz tortib olamiz - bu surish va tortish marafonni oldinga, keyin bir oz orqaga qadam tashlashga o'xshaydi. qayta -qayta.

Agar siz hamma narsani o'rtacha hisoblasangiz, PWM yordamida kondansatkichni zaryad qilish xatti -harakati, xuddi kondansatörni zaryad qilish uchun Vpwmning doimiy kuchlanishidan foydalanganingizdek, xuddi shunday. Kerakli kuchlanishga "etarlicha yaqin" bo'lishimiz uchun hali ham taxminan 5 RC soniya kerak bo'ladi.

7 -qadam: a -dan B -ga, Tad -Bit -ga tezroq

A dan B gacha, Tad -Bit tezroq
A dan B gacha, Tad -Bit tezroq

Faraz qilaylik, bizda Va ga qadar zaryadlangan kondansatör bor, b ning yangi qiymatini yozish uchun analogWrite () dan foydalanamiz deylik. Vb kuchlanishini kutish uchun minimal vaqt qancha bo'lishi kerak?

Agar siz 5 RC soniyasini taxmin qilgan bo'lsangiz, bu ajoyib! 5 RC sekundini kutib, kondansatör deyarli Vb ga zaryadlanadi. Ammo, agar xohlasak, biroz kutishimiz mumkin.

Zaryad egri chizig'iga qarang. Ko'ryapsizmi, biz boshlaganimizda kondansatör allaqachon Va da edi. Bu shuni anglatadiki, biz t_a vaqtini kutishimiz shart emas. Agar biz kondansatkichni noldan zaryad olsak, buni qilishimiz kerak edi.

Shunday qilib, bu vaqtni kutmasdan, biz yaxshilanishni ko'ramiz. Vaqt t_ab aslida 5 RC dan biroz qisqaroq.

Lekin kutib turing, biz bundan ham yaxshiroq qila olamiz! V_b ustidagi bo'shliqqa qarang. Bu Vcc, biz uchun mavjud bo'lgan maksimal kuchlanish va biz erishmoqchi bo'lgan Vb o'rtasidagi farq. Ko'ryapsizmi, bu qo'shimcha kuchlanish biz xohlagan joyga tezroq borishga yordam beradi?

8 -qadam: Turbo zaryadlovchi bilan Adan Bgacha

Turbo zaryadlovchi bilan A dan Bgacha
Turbo zaryadlovchi bilan A dan Bgacha

Bu to'g'ri. PWMni maqsadli V_b kuchlanishida ishlatishning o'rniga, biz uni VCda ancha qisqa vaqt davomida ushlab turamiz. Men buni Turbo zaryadlash usuli deb atayman va bu bizni haqiqatan ham tez boradigan joyga olib keladi! Vaqt kechiktirilgandan so'ng (biz hisoblashimiz kerak), biz V_b da PWM -ga o'tish orqali tormozni bosamiz. Bu kuchlanishning maqsaddan oshib ketishiga yo'l qo'ymaydi.

Ushbu usul yordamida kondansatkichdagi kuchlanishni faqat PWMdan ko'ra V_a dan V_b ga o'zgartirish mumkin. Shunday qilib, siz joy olasiz, bolam!

9 -qadam: Kodni tushunish

Kodni tushunish
Kodni tushunish

Rasm ming so'zga teng, shuning uchun diagrammada ma'lumotlar va kodda bajariladigan amallar ko'rsatilgan. Chapdan o'ngga:

  • Grafik ma'lumotlari PROGMEMda (ya'ni flesh xotira) nuqta ro'yxati sifatida saqlanadi.
  • Tarjima, masshtablash va aylantirish operatsiyalarining har qanday kombinatsiyasi afinani o'zgartirish matritsasiga birlashtirilgan. Bu har bir animatsion kadr boshida bir marta amalga oshiriladi.
  • Ballar grafik ma'lumotlardan birma-bir o'qiladi va ularning har biri saqlangan transformatsiya matritsasi bilan ko'paytiriladi.
  • O'zgartirilgan nuqtalar har qanday nuqtani ko'rinadigan maydondan tashqariga chiqaradigan qaychi algoritmi orqali oziqlanadi.
  • RC kechiktirishni qidirish jadvalidan foydalanib, ballar haydash kuchlanishlari va vaqt kechikishlariga aylanadi. RC kechiktirishni qidirish jadvali EEPROMda saqlanadi va kodni bir necha marta ishlatish uchun qayta ishlatilishi mumkin. Ishga tushganda, RC qidirish jadvali aniqligi tekshiriladi va noto'g'ri qiymatlar yangilanadi. EEPROM -dan foydalanish qimmatli RAM xotirasini tejaydi.
  • Haydash kuchlanishlari va kechikishlar ramka buferidagi faol bo'lmagan kadrga yoziladi. Ramka tamponida faol ramka va inaktiv ramka uchun joy mavjud. To'liq ramka yozilgandan so'ng, faol bo'lmagan kadr faol bo'ladi.
  • To'xtatish xizmati muntazam ravishda kuchlanish qiymatlarini o'qish va faol ramka tamponidan kechikish orqali rasmni qayta chizadi. Ushbu qiymatlarga asoslanib, u chiqish pimlarining ishlash davrlarini moslashtiradi. Taymer 1 vaqtni bir necha nanosaniyagacha aniqlikda o'lchash uchun ishlatiladi, taymer 2 esa pinlarning ish aylanishini nazorat qilish uchun ishlatiladi.
  • Voltajning eng katta o'zgarishi bo'lgan pin har doim "turbo zaryadlangan" nol yoki 100%ish aylanishiga ega bo'lib, eng tez zaryadlash yoki tushirish vaqtini ta'minlaydi. Voltajning oz o'zgarishi bo'lgan pin, birinchi pinning o'tish vaqtiga mos keladigan tanlangan ish tsikli bilan boshqariladi-bu safar mos keladigan chiziqlar osiloskopda to'g'ri chizilganligini ta'minlash uchun muhimdir.

10 -qadam: Katta tezlik bilan, katta mas'uliyat yuklanadi

Bu usul PWMga qaraganda ancha tezroq bo'lgani uchun, nima uchun analogWrite () uni ishlatmaydi? Xo'sh, chunki PWM -dan foydalanish ko'pchilik dasturlar uchun etarlicha yaxshi va ancha kechirimlidir. "Turbo zaryadlovchi" usuli ehtiyotkorlik bilan kodlashni talab qiladi va faqat muayyan holatlarga mos keladi:

  1. Vaqtga juda sezgir. Maqsadli kuchlanish darajasiga yetganimizdan so'ng, maqsadli kuchlanishdan oshib ketmaslik uchun haydovchi pinini darhol oddiy PWM rejimiga o'tkazish kerak.
  2. Bu RC konstantasini bilishni talab qiladi, shuning uchun bu qiymatlarni oldindan kiritish kerak. Noto'g'ri qiymatlar bilan, vaqt noto'g'ri bo'ladi va kuchlanish noto'g'ri bo'ladi. Oddiy PWM yordamida, ma'lum vaqtdan keyin, agar RC doimiyligi noma'lum bo'lsa ham, siz to'g'ri voltajga kirishingizga kafolat bor.
  3. Kondensatorni zaryad qilish uchun aniq vaqt oralig'ini hisoblash Arduino-da real vaqtda hisoblash uchun juda sekin bo'lgan logarifmik tenglamalarni talab qiladi. Bular har bir animatsiya kadridan oldin oldindan hisoblanishi va biror joyda xotirada saqlanishi kerak.
  4. Ushbu usul bilan shug'ullanadigan dasturlar kechikishlar juda chiziqli emasligi bilan bahslashishi kerak (ular, aslida, eksponensial). Vcc yoki GND yaqinidagi maqsadli kuchlanishlar o'rta nuqtaga yaqin bo'lgan kuchlanishlarga qaraganda kattaroq buyurtmalarga erishish uchun ko'proq vaqt talab etadi.

Ushbu cheklovlarni bartaraf etish uchun mening vektorli grafik kodim quyidagi amallarni bajaradi:

  1. U 16 kHz chastotali 1 -taymerdan va aniq chiqish manipulyatsiyasi va vaqtini uzilish uchun uzilish xizmatidan foydalanadi.
  2. Bu kondansatör va qarshilik qiymatlarini tanlashni cheklab, RC vaqtining ma'lum bir qiymatini ishlatishni talab qiladi.
  3. U barcha nuqtalar uchun kechikish vaqtini xotira buferida animatsiya ramkasida saqlaydi. Bu shuni anglatadiki, vaqtni kechiktirishni hisoblaydigan tartib, chiqish pimlarini yangilaydigan uzilish xizmatiga qaraganda ancha sekin ishlaydi. Keyingi ramka uchun kechikishlarning yangi to'plami tayyor bo'lgunga qadar, har qanday ramka o'nlab marta bo'yalgan bo'lishi mumkin.
  4. Xotira buferidan foydalanish har bir kadrga chizish mumkin bo'lgan nuqtalar sonini cheklaydi. Mavjud RAMdan maksimal darajada foydalanish uchun men bo'sh joyni samarali kodlashni qo'llayman, lekin u hali ham taxminan 150 ball bilan cheklangan. Yuz yoki undan ko'p nuqtadan oshib, displey baribir miltillay boshlaydi, shuning uchun bu muhim nuqta!

Tavsiya: