Mundarija:

PIC yordamida raqamli aylanadigan kalitdan aylanish yo'nalishini qanday izohlash mumkin: 5 qadam
PIC yordamida raqamli aylanadigan kalitdan aylanish yo'nalishini qanday izohlash mumkin: 5 qadam

Video: PIC yordamida raqamli aylanadigan kalitdan aylanish yo'nalishini qanday izohlash mumkin: 5 qadam

Video: PIC yordamida raqamli aylanadigan kalitdan aylanish yo'nalishini qanday izohlash mumkin: 5 qadam
Video: How to use Mosfet Optocoupled HW-532 to control up to 30V DC Motor Speed or load using Arduino 2024, Iyul
Anonim
PIC bilan raqamli aylanadigan kalitdan aylanish yo'nalishini qanday izohlash mumkin
PIC bilan raqamli aylanadigan kalitdan aylanish yo'nalishini qanday izohlash mumkin

Ushbu yo'riqnomaning maqsadi - raqamli (to'rtburchaklar kodli) aylantiruvchi kalitni mikrokontroller bilan qanday bog'lanishini ko'rsatish. Xavotir olmang, men to'rtburchaklar kodli biz uchun nimani anglatishini tushuntirib beraman. Bu interfeys va unga tegishli dasturiy ta'minot mikrokontrollerga har bir harakatdan ikkinchisiga o'tish yo'nalishini aniqlashga imkon beradi, men yaqinda bu turdagi kalitni mikrokontroller loyihasida ishlatardim, bu esa 16 -sonli tugma yordamida bosimni sozlash nuqtasini kiritishni talab qildi. yuqoriga/pastga tugmachalari o'rniga cheklovlar. Bu g'oya foydalanuvchiga kerakli bosimni "terishga" ruxsat berish edi. Natijada, biz asosiy tizim uchun bosimni sozlash nuqtasini oshirish yoki kamaytirish uchun kalitdan joylashuv ma'lumotlarini olish va aylanish yo'nalishini aniqlash uchun dasturiy ta'minot dasturini ishlab chiqishimiz kerak edi. mikrokontrollerga, aylanadigan kalitning ishlash nazariyasi, dasturiy ta'minotning ishlash nazariyasi, shuningdek ajratish tartibi. Nihoyat, men sizga chegirish tartibini qo'llashimni ko'rsataman. Biz borgan sari, men g'oyani iloji boricha ko'proq platformalarda qo'llash uchun bir oz umumiy narsalarni saqlashga harakat qilaman, lekin men ham ma'lum bir ilovani ko'rish uchun qilgan ishlarim bilan bo'lishaman.

1 -qadam: qismlar

Qismlar
Qismlar

Buni amalga oshirish uchun sizga kerak bo'ladi: aylanadigan kalit (to'rtburchaklar kodli) qarshiliklarni torting mos mikrokontroller platformasi Mening loyiham uchun Grayhill 61C22-01-04-02 optik kodlovchi ishlatilgan. Aylanadigan kalit uchun ma'lumot varag'i, kalitdan keladigan ikkita ma'lumot uzatish liniyasida 8,2k ohmli rezistorlarni tortib olishni talab qiladi. Siz foydalanmoqchi bo'lgan kodlovchi uchun ma'lumotlar varag'ini tekshirishni xohlaysiz. Men foydalanadigan aylanadigan kalitni eksenel tugmachali kalit bilan ham buyurtma qilish mumkin. Bu terilgan va hokazolarni tanlash uchun foydali xususiyat, lekin men bu erda uning interfeysini muhokama qilmayman. Menda "mos keladigan mikrokontroller platformasi" bor, chunki (menimcha) buni bir nechta platformalarda amalga oshirish mumkin. Men ko'p odamlarni Instructables uchun boshqa mikrokontrolderlardan foydalanganini ko'rdim, shuning uchun men ham umumiy yondashuvni ko'rsatmoqchiman. Men barcha kodlarni Microchip PIC16F877A bilan ishlatish uchun PIC Basic Pro -da yozdim. Haqiqatan ham, mikrokontrolderda sizga kerak bo'lgan asosiy narsa - bu ikkita pinning birida mantiq o'zgarganda, uzilish qobiliyati. PIC16F877A -da, bu PORTB o'zgarishining uzilishi deb ataladi. Boshqa nazoratchilarda boshqa nomlar bo'lishi mumkin. Bu mikrokontroller uzilish xususiyati, bu dasturni shunchalik oqlangan qiladigan qismidir.

2 -qadam: Uskuna interfeysi

Uskuna interfeysi
Uskuna interfeysi

"Oddiy" yechim-bu mikrokontrolderga 16 ta ulanadigan "bitta qutb-16 otish" kalitiga ega bo'lish. Keyin har bir kalit chiqishi mikrokontrollerning piniga ulanadi, shunda har bir terish holati mikrokontroller tomonidan tekshiriladi. Bu kirish -chiqish pinlarini haddan tashqari ko'p ishlatishdir. Agar biz kommutatorda 16 pozitsiyadan ko'proq ushlab turishni xohlasak, vaziyat yanada yomonlashadi. Kommutatorning har bir qo'shimcha pozitsiyasi mikrokontrollerga qo'shimcha kirishni talab qiladi. Bu tezlik bilan mikrokontroldagi kirishni juda samarasiz ishlatilishiga olib keladi, aylanuvchi kalitning chiroyliligini ko'rsating, aylantiruvchi kalitda ma'lumotlar varag'ida A va B deb ko'rsatilgan mikrokontrollerga faqat ikkita chiqish bor. Bu chiziqlar faqat to'rtta mumkin bo'lgan mantiqiy darajaga ega: AB = 00, 01, 10 va 11. Bu kalitni mikrokontrollerga ulashda foydalanish kerak bo'lgan kirish liniyalari sonini sezilarli darajada kamaytiradi. Shunday qilib, biz kirish satrlari sonini ikkitagacha qisqartirdik. Endi nima? Bizga haqiqatan ham 16 xil shtat kerakdek tuyuladi, lekin bu yangi kalitda faqat to'rttasi bor. Biz o'zimizni oyoqqa otdikmi? Yoq. O'qing. Tushuntirish uchun biz aylantirish tugmachasining ishlash nazariyasi haqida bir oz gaplashamiz.

3 -qadam: Uskuna ishlash nazariyasi

Uskunaning ishlash nazariyasi
Uskunaning ishlash nazariyasi
Uskunaning ishlash nazariyasi
Uskunaning ishlash nazariyasi
Uskunaning ishlash nazariyasi
Uskunaning ishlash nazariyasi

Aylanish yo'nalishini sezish yuqorida aytib o'tilgan "bitta qutb-16-otish" tugmasi yordamida mumkin, lekin u mikrokontrolderga ko'p kirishni ishlatadi. Aylanadigan kalitdan foydalanish mikrokontrollerga kirishlar sonini kamaytiradi, lekin hozir biz kalitdan keladigan signallarni talqin qilishimiz va ularni aylanish yo'nalishiga o'tkazishimiz kerak. Bu, shuningdek, ushbu echimdagi asosiy zeb -ziynatlardan biridir. Bu shuni anglatadiki, kalitning holatiga mos keladigan kalit beradigan 2 bitli kod mavjud. Siz o'ylayotgandirsiz: "Agar mikrokontrolderga ikki bitli kirish bo'lsa, biz qanday qilib 16 pozitsiyani ifodalay olamiz?" Bu yaxshi savol. Biz ularning hammasini ko'rsatmaymiz. Biz faqat burilish yo'nalishini aniqlashimiz uchun tugunning nisbiy pozitsiyalarini bilishimiz kerak. Tugmaning mutlaq pozitsiyasi ahamiyatsiz. Soat yo'nalishi bo'yicha aylanish uchun, kalit bergan kod har to'rt detentda takrorlanadi va kulrang kodlangan. Kulrang kodli, har bir pozitsiya o'zgarishi uchun faqat bitta o'zgarish bo'ladi. 00, 01, 10, 11 kabi ikkilikli soat yo'nalishi bo'yicha aylanishni hisoblaydigan AB kiritish o'rniga, u shunday o'zgaradi: 00, 10, 11, 01. E'tibor bering, oxirgi naqsh uchun faqat bitta kirish o'zgaradi. to'plamlar. AB kirishining mikrokontroller uchun soat miliga teskari yo'nalishdagi qiymatlari quyidagicha bo'ladi: 00, 01, 11, 10. Bu soat yo'nalishi bo'yicha teskari bo'lib, birinchi bo'lib AB = 00 ro'yxati berilgan. Vizual tushuntirish uchun diagrammalarga qarang..

4 -qadam: dasturiy ta'minotning ishlash nazariyasi

Ishlash dasturiy nazariyasi
Ishlash dasturiy nazariyasi

Qaytish yo'nalishini aniqlaydigan tartib uzilishlar bilan boshqariladi. Siz tanlagan mikrokontroler har qanday vaqtda (hech bo'lmaganda) ikkita pim o'zgarganda, uzilishi mumkin. Bu PIC16F877Ada PORTB o'zgarishining uzilishi deb ataladi. Kommutator aylantirilganda, mikrokontroller to'xtatiladi va dasturning bajarilishi Interrupt Service Routine (ISR) ga yuboriladi. ISR tezda kalit qayerga burilganligini aniqlaydi, bayroqni mos ravishda o'rnatadi va tezda asosiy dasturga qaytadi. Agar biz foydalanuvchi kalitni juda tez aylantirsa, biz buni tezda amalga oshirishimiz kerak, biz bilamizki, kulrang kodli AB naqsh har to'rt pozitsiyani takrorlaydi, shuning uchun agar biz bu to'rt pozitsiya orasidagi o'tish uchun muntazam ish qilsak, u hamma uchun ishlaydi. E'tibor bering, bitta to'rt pozitsiyali tsiklda to'rtta qirrasi bor. A kirish uchun, shuningdek B kirish uchun ko'tariladigan va tushadigan qirralar. Mikroprosessor har safar chekka bo'lganda to'xtab qoladi, ya'ni tugma har qanday burilganda mikrokontroller uzilib qoladi. Natijada, ISR tugmachaning qaysi tomonga burilganligini aniqlashi kerak. Buni qanday qilish kerakligini aniqlashga yordam berish uchun biz soat yo'nalishi bo'yicha aylanish uchun to'lqin shakliga o'tamiz. E'tibor bering, har qanday vaqtda A chekka bo'lsa, uning yangi qiymati har doim B qiymatidan farq qiladi. Tugma 1-pozitsiyadan 2-holatga o'tganda, A mantiq-0dan mantiq-1ga o'tadi. B bu o'tish uchun hali 0 ga teng va A ning yangi qiymatiga mos kelmaydi. Tugma 3-dan 4-o'ringa o'tganda, A tushadigan qirraga ega, B esa mantiq-1da qoladi. Yana e'tibor bering, B va A ning yangi qiymati boshqacha. Hozirda biz A har qanday vaqtda soat yo'nalishi bo'yicha uzilishga olib kelishini ko'rsak bo'ladi, uning yangi qiymati B qiymatidan farq qiladi. B tugmasi 2 -pozitsiyadan 3 -o'ringa o'tganda ko'tarilgan qirraga ega. Bu erda B ning yangi qiymati A bilan bir xil bo'ladi. Soat yo'nalishi bo'yicha oxirgi qolgan chetiga qarasak, B tushgan qirrasi 4 -dan 5 -o'ringa siljiydi. (5 -pozitsiya 1 -pozitsiya bilan bir xil.) B ning yangi qiymati bu erda ham A bilan bir xil! Endi biz ba'zi chegirmalar qilishimiz mumkin! Agar A uzilishni keltirib chiqarsa va A ning yangi qiymati B qiymatidan farq qilsa, aylanish soat yo'nalishi bo'yicha edi. Bundan tashqari, agar B uzilishni keltirib chiqarsa va B ning yangi qiymati A bilan bir xil bo'lsa, u holda soat yo'nalishi bo'yicha aylandi. Xuddi soat yo'nalishi bo'yicha aylantirilgandek, soat yo'nalishi bo'yicha teskari burilish bitta tsiklda to'rtta uzilishga olib keladi: ikkitasi A kirish uchun va ikkitasi B kirish uchun. Ikki tugma 4 -dan 3 -chi pozitsiyaga o'tganda, A kirishi ko'tariladi. Tugma 4 -dan 3 -pozitsiyaga o'tganda, A -ning yangi qiymati B -ning qiymati bilan bir xil bo'ladi. E'tibor bering, A 2 -pozitsiyadan 1 -o'ringa o'tganda, uning yangi qiymati ham B qiymatiga teng bo'ladi. Endi biz ko'rishimiz mumkinki, A uzilishni keltirib chiqarganda va uning yangi qiymati B qiymatiga to'g'ri kelganda, aylanish soat sohasi farqli o'laroq edi. Hamma narsani tekshirish uchun biz B kirishini ko'rib chiqamiz. B tugmachasi 5 -pozitsiyadan (1 bilan bir xil) 4 -ga o'tganda va tugma 3 -dan 2 -holatga o'tganda uzilishga olib keladi. Bu ikkala holatda ham B -ning yangi qiymati mavjud qiymatga mos kelmaydi. A - bu soat yo'nalishi bo'yicha aylanish uchun uzilishni keltirib chiqaradigan holatlarning aksi. Bu yaxshi xabar. Xulosa qilib aytish mumkinki, agar A uzilishni keltirib chiqarsa va uning yangi qiymati B qiymatiga mos kelmasa yoki B uzilishga olib kelsa va B ning yangi qiymati A qiymatiga mos kelsa, biz bilamizki, soat yo'nalishi bo'yicha aylanma bo'lgan. Biz boshqa holatlarni dasturiy ta'minotda soat sohasi farqli o'laroq aylanishini tekshirib ko'rishimiz mumkin yoki bu soat yo'nalishi bo'yicha emas, balki soat sohasi farqli o'laroq, deb taxmin qilishimiz mumkin. Mening odatim shunchaki taxminni yaratdi.

5 -qadam: dasturiy ta'minot

Dasturiy ta'minot
Dasturiy ta'minot
Dasturiy ta'minot
Dasturiy ta'minot

Men PIC Basic Pro -da o'rnatilgan uzilishlardan foydalanmadim. Men tartibni boshqarish uchun Darrel Teylor kodimga kiritgan bir nechta fayllardan foydalandim. Bu erda Darrelning ulkan obro'si bor! Fayllar bepul. Qo'shimcha ma'lumot, boshqa ilovalar va fayllarni yuklab olish uchun uning veb -saytiga tashrif buyuring. Agar siz Darrel Teylorning uzilishlari bilan PIC ishlatmasangiz, bu qismni o'tkazib yuborishingiz mumkin. Darrel Teylor (DT) uzilishlarini o'rnatish uchun ikkita ishni bajarish kerak: 1.) DT_INTS-14.bas va ReEnterPBP.bas fayllarini o'z ichiga kiriting. kod.2.) Buni nusxa ko'chiring va kodingizga qo'ying. ASMINT_LIST so'l; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, ha endm INT_CREATEENDASMI Yo'riqnomaning oxiridagi grafik kabi yorliqlar va bo'shliqlarni joylashtiring, shunda siz kodingizda narsalarni biroz osonroq ko'rasiz. Siz uni ehtiyojlaringizga mos ravishda biroz o'zgartirishingiz kerak bo'ladi. Yorliq ostida ISR -ni ISR -ni subroutine nomi bilan almashtiring. Pastki chiziqni unutmang! Sizga kerak! Uzilishlar ishlashi uchun yana ikkita narsani qilish kerak: 1) ISR yozing. Siz buni xuddi PBP dasturini yozmoqchi bo'lganingizdek yozasiz, faqat RETURN o'rniga pastki dastur oxiriga @ INT_RETURN kiritishingiz kerak bo'ladi. Bu tanaffusni tan oladi va dasturning bajarilishini asosiy tsiklda qolgan joyiga qaytaradi. ISR ichida, sizning dasturingiz rekursiv uzilishga tushib qolmasligi uchun, uzilish bayrog'ini tozalash kerak. PIC16F877A -dagi uzilish bayrog'ini tozalash uchun PORTB -ni o'qish kifoya. Har bir mikrokontroller uzilish bayroqlarini tozalashning boshqa usuliga ega. Sizning mikrokontroleringiz uchun ma'lumotlar varag'ini tekshiring.2.) Siz kodni uzilishni yoqmoqchi bo'lgan nuqtaga etib kelganingizda, quyidagi kod satridan foydalaning:@ INT_ENABLE RBC_INT Agar uzilishni o'chirmoqchi bo'lsangiz:@ INT_DISABLE RBC_INT Ko'p narsa bor. Men o'zim yopgan narsalarga to'planganman, shuning uchun men tezda xulosa qilaman. Hozircha sizning dasturingiz shunday bo'lishi kerak:; "DT_INTS-14.bas" INCLUDE "ReEnterPBP.bas" ASMINT_LIST so'lini kiriting; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, ha endm INT_CREATEENDASM; Boshqa kerakli sozlash yoki kod@ INT_ENABLE RBC_INT; @ INT_DISABLE RBC_INT tugmasi qay tomonga burilishini bilishi kerak bo'lgan kod; Boshqa kodEND; ProgrammyISR tugashi:; ISR kodi bu erda@ INT_RETURN (Interrupt Handler Setting Table) Menimcha, bu erda PIC yoki DT uzilishlaridan foydalanmaganlar yana qo'shilishlari mumkin. Endi biz ISRni yozishimiz kerak, shuning uchun mikrokontroller tugmachaning qaysi tomonga burilishini biladi. Agar dasturiy ta'minot nazariyasi bo'limidan eslaylikki, agar biz uzilishga olib kelgan kirishni, uning yangi qiymatini va boshqa kirishni qiymatini bilsak, aylanish yo'nalishini aniqlashimiz mumkin. Mana psevdokod: uzilish bayrog'ini tozalash uchun chizilgan o'zgaruvchiga PORTB ni o'qing Agar rost bo'lsa, A va B ni solishtiring, agar farq qilsa, boshqasi soat yo'nalishi bo'yicha aylanayotganini, soat yo'nalishi bo'yicha teskari bo'lganini tekshiring, agar B uzilishga sabab bo'lgan bo'lsa. Agar rost bo'lsa, A va B ni taqqoslang, agar farq qilsa, xuddi shunday bo'lsa, bu soat yo'nalishi bo'yicha teskari edi, aksincha, soat sohasi farqli o'laroq edi. O'zgartirilgan kirishning boshqa qiymatini va boshqa (o'zgarishsiz) kirishni aniqlash oson, chunki biz ularni ISR ichida o'qishimiz mumkin. ISRga ijro etilishidan oldin har birining ahvoli qandayligini bilishimiz kerak. Bu asosiy tartibda sodir bo'ladi. Asosiy tartib biz CWflag deb nomlangan bayt o'zgaruvchisini 1 ga o'rnatishni yoki ISR tomonidan 0 ga tozalashni kutadi. Tugmachaning har bir tasdiqlangan o'zgarishidan keyin yoki tugmachaning hech qanday faolligi bo'lmasa, bo'sh holatni ko'rsatish uchun o'zgaruvchi 5 ga o'rnatiladi. Agar bayroq o'rnatilsa yoki o'chirilsa, asosiy tartib aylanishga qarab belgilangan bosim bosimini darhol oshiradi yoki kamaytiradi, keyin CWflag o'zgaruvchisini 5 ga qaytaradi, chunki tugma endi bo'sh. Asosiy tartib CWflagni tekshirganda, u A va B aylanadigan kalitlarning holatini hujjatlashtiradi. Bu juda sodda va shunday ko'rinadi: oldA = AoldB = B Bu erda haqiqatan ham ajoyib narsa yo'q. CWflagning aylanishini tekshiradigan pastadirning boshiga faqat ikkita qatorni kiriting. Biz faqat ISR bajarilganda uzilish nima sababdan uzilib qolganini ko'rishimiz uchun asosiy tartibda aylantirish tugmachasidagi kirishni mantiqiy qiymatlarini yangilaymiz. Bu erda ISR kodi: ABchange: scratch = PORTB 'PORTBni o'qing, uzilish bayrog'ini tozalash uchun' Agar A uzilishni keltirib chiqarsa, agar burilish yo'nalishini tekshiring, agar oldA! A! = B SON GOTO CW 'Aks holda, bu soat sohasi farqli o'laroq teskari yo'nalish edi, aks holda B uzluksizlikka olib keladi, agar burilish yo'nalishini A tekshiring, agar oldB! = B SON' A va B bir xil bo'lsa, u A == B SON GOTO CW bo'lsa soat yo'nalishi bo'yicha aylantirildi ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURN ISR kodini AB_ISR.bas fayliga kiritganim uchun koddagi yorliqlar kerakli tarzda ko'rinmayapti. Endi, chunki ISR A va B kirishlar uchun eski qiymatlarga ega, u qaysi kirishni uzilishiga olib kelganini aniqlay oladi, uni boshqa (o'zgarmagan) kirishga solishtirib, yo'nalishni aniqlaydi. aylanish. Asosiy vazifa - CWflag -ni tekshirish, tugmachaning qaysi tomonga burilganligini ko'rish (agar u bo'lsa) va hisoblagichni, belgilangan nuqtani yoki sizga yoqqan yoki kerak bo'lgan narsani ko'paytirish yoki kamaytirish. chalkash. Bu turdagi interfeys ayniqsa foydalidir, agar sizning tizimingiz uzilishlardan foydalanayotgan bo'lsa, chunki bu faqat bitta uzilish. Xursand bo'ling!

Tavsiya: