Mündəricat:

PIC ilə Rəqəmsal Dönər Açarından Fırlanma istiqamətini necə şərh etmək olar: 5 addım
PIC ilə Rəqəmsal Dönər Açarından Fırlanma istiqamətini necə şərh etmək olar: 5 addım

Video: PIC ilə Rəqəmsal Dönər Açarından Fırlanma istiqamətini necə şərh etmək olar: 5 addım

Video: PIC ilə Rəqəmsal Dönər Açarından Fırlanma istiqamətini necə şərh etmək olar: 5 addım
Video: NƏ ÜÇÜN KANALIM YOUTUBE-yə müraciət etmir? # EDVALDO CURSO ELETRICISTA - 05/17/2020 2024, Noyabr
Anonim
PIC ilə Rəqəmsal Dönər Açarından Fırlanma istiqamətini necə şərh etmək olar
PIC ilə Rəqəmsal Dönər Açarından Fırlanma istiqamətini necə şərh etmək olar

Bu Təlimatın məqsədi, rəqəmsal (dördqat kodlu) dönər açarın mikro nəzarətçi ilə necə əlaqələndirilməsini göstərməkdir. Narahat olmayın, dördbucaqlı kodlaşdırmanın bizim üçün nə demək olduğunu izah edəcəyəm. Bu interfeys və onu müşayiət edən proqram mikrokontrolörün hər bir hərəkətin fırlanma istiqamətini tanımasına imkan verəcəkdir. Bu yaxınlarda bir mikrokontroller layihəsində bu tip bir keçiddən istifadə edərək 16 ilə bir düymə istifadə edərək bir təzyiq təyin etməliyik. yuxarı/aşağı düymələri əvəzinə tıxaclar. Fikir istifadəçiyə istədiyi təzyiqi "yığmağa" icazə vermək idi. Nəticədə, əsas sistem üçün təzyiqin təyin olunan nöqtəsini artırmaq və ya azaltmaq üçün açardan mövqe məlumatını almaq və fırlanma istiqamətini çıxarmaq üçün bir proqram rutini hazırlamalı olduq. mikro nəzarətçiyə, fırlanan açar üçün əməliyyat nəzəriyyəsi, proqram təminatı üçün əməliyyat nəzəriyyəsi və çıxılma qaydası. Nəhayət, sizə endirim prosedurunun tətbiqini göstərəcəyəm. Biz irəlilədikcə fikri mümkün qədər çox platformada tətbiq etmək üçün bir qədər ümumi şeyləri saxlamağa çalışacağam, amma konkret bir tətbiq görə biləcəyiniz üçün etdiyimi də paylaşacam.

Addım 1: hissələr

Hissələri
Hissələri

Bunu həyata keçirmək üçün sizə lazım olacaq: Dönər açarı (dördqat kodlu) Rezistorlar çəkin Uyğun mikrokontrolör platforması Layihəm üçün Grayhill 61C22-01-04-02 optik kodlayıcıdan istifadə etdim. Döner açar üçün məlumat vərəqəsi, açardan gələn iki məlumat xəttində 8.2k ohm müqavimət tələb edir. İstifadə etməyi seçdiyiniz kodlayıcı üçün məlumat vərəqini yoxlamaq istəyəcəksiniz. İstifadə etdiyim fırlanan açarı eksenel düymə açarı ilə də sifariş etmək olar. Daxil edilmiş və s. Seçmələr etmək üçün faydalı bir xüsusiyyətdir, amma burada onun interfeysini müzakirə etməyəcəyəm. Siyahıda "uyğun bir mikro nəzarət platforması" var, çünki (düşünürəm) bu birdən çox platformada tətbiq oluna bilər. Bir çox insanın Instructables üçün digər mikrokontrolörlərdən istifadə etdiyini gördüm, buna görə də ümumi yanaşmanı göstərmək istəyirəm. Microchip PIC16F877A ilə istifadə etmək üçün bütün kodu PIC Basic Pro -da yazdım. Həqiqətən, mikrokontrolördə ehtiyac duyduğunuz əsas şey, iki sancaqdan birində məntiq dəyişikliyi olduqda kəsmə qabiliyyətidir. PIC16F877A -da buna PORTB dəyişikliyi kəsilməsi deyilir. Digər nəzarətçilərdə bunun başqa adları ola bilər. Bu mikrokontrolör kəsmə xüsusiyyəti, bu tətbiqetməni bu qədər zərif edən bir hissəsidir.

Addım 2: Hardware Interface

Avadanlıq İnterfeysi
Avadanlıq İnterfeysi

"Sadə" bir həll, mikro nəzarətçiyə 16 əlaqəsi olan "tək dirək-16 atma" açarının olmasıdır. Hər bir keçid çıxışı daha sonra mikrokontrolördəki bir pinə bağlanacaq ki, hər bir yığma mövqeyi mikro nəzarətçi tərəfindən yoxlanılsın. Bu, I/O pinlərinin həddindən artıq istifadəsidir. Keçiddə bizə 16 -dan çox mövqe (gözləmə) verilməsini istəsək işlər daha da pisləşər. Şalterin hər bir əlavə mövqeyi mikro nəzarətçiyə əlavə giriş tələb edir. Bu, tez bir zamanda mikrokontrolördəki girişlərin çox səmərəsiz istifadəsinə çevrilir. Fırlanan açarın gözəlliyinə daxil olun. Döner açarın məlumat vərəqində A və B olaraq qeyd olunan mikro nəzarətçiyə yalnız iki çıxışı var. Bu xətlərin götürə biləcəyi yalnız dörd mümkün məntiq səviyyəsi var: AB = 00, 01, 10 və 11. Bu, keçidi mikro nəzarətçiyə bağlayarkən istifadə etməli olduğunuz giriş xətlərinin sayını xeyli azaldır. Beləliklə, giriş xətlərinin sayını yalnız ikiyə endirdik. İndi nə? Həqiqətən 16 fərqli ştata ehtiyacımız var, amma bu yeni keçiddə yalnız dörd var. Özümüzü ayağımızdan vurduqmu? Xeyr. Oxuyun. Açıqlamaq üçün fırlanan keçid əməliyyatının arxasındakı bir az nəzəriyyəni əhatə edəcəyik.

Addım 3: Avadanlıq Əməliyyat Nəzəriyyəsi

Avadanlıq Əməliyyat Nəzəriyyəsi
Avadanlıq Əməliyyat Nəzəriyyəsi
Avadanlıq Əməliyyat Nəzəriyyəsi
Avadanlıq Əməliyyat Nəzəriyyəsi
Avadanlıq Əməliyyat Nəzəriyyəsi
Avadanlıq Əməliyyat Nəzəriyyəsi

Dönmə istiqaməti, yuxarıda qeyd olunan "tək dirək-16 atma" açarı ilə mümkündür, lakin mikrokontrolördə çoxlu giriş istifadə edir. Döner keçiddən istifadə mikrokontrolörə girişlərin sayını azaldır, amma indi keçiddən gələn siqnalları şərh etməliyik və onları fırlanma istiqamətinə çevirməliyik. Əvvəldə qeyd etdim ki, keçid dördqat kodlu idi. Bu da bu həllin əsas zərifliklərindən biridir. Bu o deməkdir ki, açarın keçid mövqeyinə uyğun gələn 2 bitlik kodu var. Düşünürsən: "Mikro nəzarətçiyə iki bitlik giriş varsa, bütün 16 mövqeyi necə təmsil edirik?" Yaxşı sualdır. Hamısını təmsil etmirik. Dönmə istiqamətini təyin etmək üçün düymənin nisbi mövqelərini bilmək lazımdır. Düymənin mütləq mövqeyi heç bir əhəmiyyət kəsb etmir. Saat əqrəbi istiqamətində dönmə üçün açarın verdiyi kod hər dörd detenti təkrarlayır və boz rəngdədir. Boz kodlu, hər bir mövqe dəyişikliyi üçün yalnız bir az dəyişiklik olduğunu bildirir. AB daxilində, saat yönünün əksinə saat yönündə döndüyünü saymaq olar: 00, 01, 10, 11, belə dəyişir: 00, 10, 11, 01. Diqqət yetirin ki, sonuncu model üçün yalnız bir giriş dəyişir dəstlər. AB girişinin mikrokontrolörün saat əqrəbinin əks istiqamətindəki dəyərləri belə görünəcək: 00, 01, 11, 10. Bu, əvvəlcə AB = 00 ilə göstərilən saat əqrəbinin tərs tərzidir. Daha əyani izah üçün diaqramlara baxın..

Addım 4: Əməliyyat Proqramı nəzəriyyəsi

Əməliyyat Proqramı nəzəriyyəsi
Əməliyyat Proqramı nəzəriyyəsi

Dönmə istiqamətini təyin edən rutin fasilələrlə idarə olunur. Seçdiyiniz mikro nəzarətçinin, kəsilmə aktiv olduqda iki pindən birində (ən azı) hər hansı bir dəyişiklik olduqda istənilən vaxt kəsə bilməsi lazımdır. Buna PIC16F877A üzərindəki PORTB dəyişiklik kəsilməsi deyilir. Anahtarı döndərdiyiniz zaman mikrokontrolör kəsiləcək və proqramın icrası Interrupt Service Routine (ISR) -ə göndəriləcək. ISR, keçidin hansı istiqamətdə döndüyünü tez bir zamanda anlayacaq, uyğun bir bayraq qoyacaq və tez ana proqrama qayıdacaq. İstifadəçinin açarı çox tez döndərməsi halında bunun tez bir zamanda baş verməsi lazımdır. Boz kodlu AB modelinin hər dörd mövqedə təkrarlandığını bilirik, buna görə də bu dörd mövqe arasında keçid üçün rutin iş görsək, digərləri üçün işləyəcək. Diqqət yetirin ki, bir dörd mövqedə dörd kənar var. A girişi və B girişi üçün yüksələn və düşən bir kənar. Mikroprosessor hər dəfə bir kənar olduqda kəsiləcək, bu da düyməni hər dəfə çevirdikdə mikrokontrolörün kəsiləcəyini bildirir. Nəticədə, ISR düymənin hansı tərəfə döndüyünü anlamalıdır. Bunun necə ediləcəyini anlamağımıza kömək etmək üçün saat yönünde fırlanma üçün dalğa formasına müraciət edirik. Diqqət yetirin ki, A-nın hər zaman bir kənarı varsa, onun yeni dəyəri həmişə B-dən fərqlənir. Düymə 1-dən 2-ci mövqeyə keçəndə, A məntiqdən-0-dan məntiqə-1-ə keçir. B bu keçid üçün hələ də 0-dır və A-nın yeni dəyərinə uyğun gəlmir. Düymə 3-cü mövqedən 4-ə keçdikdə, A məntiq-1-də olarkən A düşən bir kənara malikdir. Yenə qeyd edək ki, B və A -nın yeni dəyəri fərqlidir. Hal -hazırda görə bilərik ki, A hər hansı bir zamanda saat əqrəbi fırlanma zamanı kəsilməyə səbəb olarsa, onun yeni dəyəri B -dən fərqlidir. Nə olduğunu görmək üçün B -ni yoxlayaq. Keçid 2 -dən 3 -ə keçdikdə B -nin yüksələn kənarı var. Burada, B -nin yeni dəyəri A ilə eynidir. Saat əqrəbinin fırlanması üçün qalan son kənarına baxsaq, B -nin 4 -cü mövqedən 5 -ə hərəkət edən bir kənarı var. (Vəzifə 5 mövqe 1 ilə eynidir.) B -nin yeni dəyəri burada da A ilə eynidir! İndi bəzi endirimlər edə bilərik! Əgər A kəsilməyə səbəb olarsa və A -nın yeni dəyəri B -dən fərqli olarsa, fırlanma saat yönünde idi. Bundan əlavə, əgər B kəsilməyə səbəb olarsa və B -nin yeni dəyəri A ilə eynidirsə, fırlanma saat yönünün əksinə idi. Eynilə saat əqrəbi istiqamətində olduğu kimi, saat əqrəbinin əksinə fırlanma bir dövrədə dörd kəsilməyə səbəb olacaq: A girişi üçün ikisi və B girişi üçün iki ədəd, düymə 4 -dən 3 -ə keçdikdə A girişinin yüksələn kənarı var və düşən bir kənar 2 -dən 1 -ə hərəkət edir. Düymə 4 -cü mövqedən 3 -ə keçdikdə, A -nın yeni dəyəri B -nin dəyəri ilə eynidir. A -nın 2 -dən 1 -ə keçdiyi zaman onun yeni dəyərinin də B ilə eyni olduğunu unutmayın. İndi görə bilərik ki, A kəsilməyə səbəb olduqda və onun yeni dəyəri B ilə eyni olduqda fırlanma saat əqrəbinin əksinə oldu. Hər şeyi yoxlamaq üçün B girişinə tez baxacağıq. B düyməsi 5 -ci mövqedən (1 -ə bərabər olan) 4 -ə keçdikdə və 3 -cü mövqedən 2 -yə keçdikdə kəsilməyə səbəb olacaq. Hər iki halda da B -nin yeni dəyəri mövcud dəyərə uyğun gəlmir. A, B -nin saat yönünde dönməsinə səbəb olan halların əksidir. Bu yaxşı xəbərdir. Xülasə etmək üçün, əgər A kəsilməyə səbəb olarsa və onun yeni dəyəri B dəyərinə uyğun gəlmirsə və ya B kəsilməyə səbəb olarsa və B -nin yeni dəyəri A istiqamətinə uyğun olarsa, saat əqrəbi istiqamətində fırlanma olduğunu bilirik. Digər halları proqram təminatında saat əqrəbinin əksinə fırlatmaq üçün yoxlaya bilərik və ya saat əqrəbi istiqamətində olmadığına görə saat yönünün əksinə olduğunu düşünə bilərik. Rutinim sadəcə fərziyyəni irəli sürdü.

Addım 5: Proqram təminatı

Proqram təminatı
Proqram təminatı
Proqram təminatı
Proqram təminatı

PIC Basic Pro -da quraşdırılmış fasilələrdən istifadə etmədim. Rutini idarə etmək üçün Darrel Taylor koduma daxil etdiyim bir neçə fayldan istifadə etdim. Darrel üçün böyük bir kreditin olduğu yer budur! Fayllar pulsuz. Daha çox məlumat, digər tətbiqlər və faylları yükləmək üçün veb saytına daxil olun. Darrel Taylor ilə PIC istifadə etməsəniz bu hissəni atlaya bilərsiniz. Darrel Taylor (DT) fasilələrini qurmaq üçün iki şeyi etməlisiniz: 1.) DT_INTS-14.bas və ReEnterPBP.bas fayllarını daxil edin. kodu.2.) Bunu kopyalayın və kodunuza yapışdırın. ASMINT_LIST makrosu; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, yes endm INT_CREATEENDASMIİşlətmənin sonundakı qrafik kimi nişanlar və boşluqlar daxil edin, beləliklə kodunuzda bir az daha asan işlər görə bilərsiniz. Ehtiyaclarınıza uyğun olaraq onu bir az dəyişdirməlisiniz. Etiket altında, ISR -ni ISR -iniz olan alt proqramın adı ilə əvəz edin. Alt xəttini unutmayın! Fasilələrin işləməsi üçün daha iki şeyi etməlisiniz: 1.) ISR yazın. Bunu PBP alt proqramını yazacağınız kimi yazacaqsınız, ancaq RETURN əvəzinə alt proqramın sonuna @ INT_RETURN daxil etməlisiniz. Proqramın kəsilməsini qəbul edəcək və proqramın əsas döngədə qaldığı yerə qayıdacaq. ISR -in içərisində, proqramınızın rekursiv kəsilməyə düşməməsi üçün kəsmə bayrağını təmizləməlisiniz. Sadəcə PORTB oxumaq, PIC16F877A üzərindəki kəsmə bayrağını silmək üçün edilməlidir. Hər bir fərqli mikro nəzarətçinin kəsmə bayraqlarını təmizləmək üçün fərqli bir yolu var. Mikro nəzarətçiniz üçün məlumat vərəqini yoxlayın.2.) Kodunuzda kəsilməni aktiv etmək istədiyiniz nöqtəyə çatdığınız zaman bu kod xəttindən istifadə edin:@ INT_ENABLE RBC_INTSözəlməni deaktiv etmək istədiyiniz zaman sadəcə istifadə edin:@ INT_DISABLE RBC_INT Çox şey var tezliklə ümumiləşdirəcəyim şeyləri əhatə etdiyim şeylərə yığdım. İndiyə qədər proqramınız belə görünməlidir:; Lazım olan hər hansı bir quraşdırma və ya kod "DT_INTS-14.bas" DAHİLDİR "ReEnterPBP.bas" ASMINT_LIST makrosunu; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, bəli INT_CREATEENDASM; Hər hansı digər lazımlı qurulma və ya kod@ INT_ENABLE RBC_INT; Düymənin hansı istiqamətdə döndüyünü bilməli olan kod@ INT_DISABLE RBC_INT; Digər kodEND; ProgrammyISR -in sonu:; ISR kodu burada@ INT_RETURN (Kesme İşleyicisi Ayarlama Cədvəli) Düşünürəm ki, PIC və ya DT kəsintilərindən istifadə etməyən hər kəs yenidən qoşula bilər. İndi ISR yazmalıyıq ki, mikrokontrolör düymənin hansı tərəfə döndüyünü bilsin. Proqram nəzəriyyəsi bölməsindən xatırlayın ki, kəsilməyə səbəb olan girişi, yeni dəyərini və digər girişin dəyərini bilsək, fırlanma istiqamətini çıxara bilərik. Pseudocode budur: PORTB -i kəsilmə bayrağını təmizləmək üçün sıfır dəyişəninə oxuyun A -nın kəsilməyə səbəb olub -olmadığını yoxlayın. Doğru olarsa, A və B -ni müqayisə edin. Fərqli olub olmadığını yoxlayın, əks halda saat yönünün əksinə döndüyünü yoxlayın, B -nin kəsilməyə səbəb olub -olmadığını saat yönünün əksinə EndifCheck edin. Əgər doğrudursa, A və B -ni müqayisə edin Fərqli olub -olmadığını yoxlayın, əgər eyni deyilsə, Başqa saat yönündə fırlanma idi, Saat yönünün əksinə idi EndifFasilədən qayıt A və ya B -də bir dəyişikliyin kəsilməyə səbəb olub -olmadığını necə bilirik? Dəyişmiş girişin və digər (dəyişməz) girişin yeni dəyərini tapmaq asandır, çünki onları ISR daxilində oxuya bilərik. Edamın ISR -ə göndərilməzdən əvvəl hər birinin vəziyyətinin nə olduğunu bilmək lazımdır. Bu, əsas iş rejimində baş verir. Əsas rutin oturur və CWflag adlandırdığımız bayt dəyişəninin 1 -ə və ya ISR tərəfindən 0 -a təmizlənməsini gözləyir. Düymənin hər bir təsdiq edilmiş dəyişikliyindən sonra və ya heç bir düymə hərəkəti olmadıqda, boş bir vəziyyəti göstərmək üçün dəyişən 5 olaraq təyin olunur. Bayraq qurulursa və ya silinirsə, əsas qayda, fırlanma səbəbindən təyin olunan təzyiqi dərhal artırır və ya azaldır və sonra düymə yenidən boş olduğu üçün CWflag dəyişənini 5 -ə qaytarır. Əsas rutin CWflag -ı yoxlayarkən, A və B fırlanan açar dəyərlərinin vəziyyətini də sənədləşdirir. Bu həqiqətən sadədir və belə görünür: oldA = AoldB = B Burada həqiqətən çox fantastik bir şey yoxdur. Dönüş üçün CWflag -ı yoxlayan döngənin əvvəlinə bu iki xətti daxil edin. ISR icra edildikdə hansı girişin kəsilməyə səbəb olduğunu görə bilmək üçün əsas rejimdəki artım/azalma döngəsindəki dönər düymədən girişlərin məntiq dəyərlərini yeniləyirik. Budur ISR kodu: ABchange: scratch = PORTB 'PORTB -i oxuyun, kəsilmə bayrağını silin' Əgər A kəsilməyə səbəb olarsa, B -nin fırlanma istiqamətini yoxlayın, əgər oldA! = A SONRA 'A və B fərqlidirsə, saat yönünde fırlanma idi A! = B SONRA GOTO CW 'Əks təqdirdə, saat yönünün əksinə fırlanırdı ELSE GOTO CCW ENDIF ENDIF' B fasiləyə səbəb olarsa, əgər oldB! = B SONRA 'A və B eyni olarsa, A istiqamətini yoxlayın. A == B SONRA GOTO CW 'İLƏ saat yönünde fırlanma idi ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURN ISR kodunu AB_ISR.bas faylına daxil etdiyim üçün Koddakı nişanlar lazım olduğu kimi görünmür. İndi, ISR A və B girişləri üçün köhnə dəyərlərə malik olduğu üçün hansı girişin kəsilməyə səbəb olduğunu təyin edə bilər, digər (dəyişməmiş) girişlə müqayisə edə və istiqaməti təyin edə bilər. fırlanma. Əsas iş rejiminin hamısı, düymənin hansı istiqamətə döndüyünü görmək üçün CWflag -ı yoxlamaq və sayğacı, təyin olunan nöqtəni və ya istədiyiniz və ya ehtiyac duyduğunuz hər şeyi artırmaq və ya azaltmaqdır. qarışıq Bu tip bir interfeys, xüsusən sisteminiz artıq kəsmələr istifadə edərsə faydalıdır, çünki bu əlavə etmək üçün yalnız bir fasilədir. Zövq alın!

Tövsiyə: