İçindekiler:

PIC ile Dijital Döner Anahtardan Dönüş Yönü Nasıl Yorumlanır: 5 Adım
PIC ile Dijital Döner Anahtardan Dönüş Yönü Nasıl Yorumlanır: 5 Adım

Video: PIC ile Dijital Döner Anahtardan Dönüş Yönü Nasıl Yorumlanır: 5 Adım

Video: PIC ile Dijital Döner Anahtardan Dönüş Yönü Nasıl Yorumlanır: 5 Adım
Video: Fun with Music and Programming by Connor Harris and Stephen Krewson 2024, Temmuz
Anonim
PIC ile Dijital Döner Anahtardan Dönme Yönü Nasıl Yorumlanır
PIC ile Dijital Döner Anahtardan Dönme Yönü Nasıl Yorumlanır

Bu Eğitilebilir Tablonun amacı, dijital (dörtlü kodlu) bir döner anahtarın bir mikro denetleyici ile nasıl arayüzleneceğini göstermektir. Merak etmeyin, kareleme kodlamanın bizim için ne anlama geldiğini açıklayacağım. Bu arayüz ve beraberindeki yazılım, mikrodenetleyicinin bir kilitten diğerine her hareket için dönüş yönünü tanımasını sağlayacaktır. Son zamanlarda, 16'lı bir düğme kullanılarak bir basınç ayar noktasının girilmesini gerektiren bir mikrodenetleyici projesinde bu tür anahtarı kullandım. yukarı/aşağı düğmeleri yerine tetikler. Buradaki fikir, kullanıcının istenen basıncı "çevirmesine" izin vermekti. Sonuç olarak, ana sistem için basınç ayar noktasını artırmak veya azaltmak için anahtardan konum bilgisini almak ve dönüş yönünü çıkarmak için bir yazılım rutini geliştirmek zorunda kaldık. Bu Talimatta, fiziksel arayüzü ele alacağım. mikrodenetleyiciye, döner anahtar için çalışma teorisi, yazılım için çalışma teorisi ve kesinti rutini. Son olarak, size kesinti rutini uygulamamı göstereceğim. İlerledikçe, fikrin mümkün olduğu kadar çok platformda uygulanabilmesi için işleri biraz genel tutmaya çalışacağım, ancak belirli bir uygulamayı görebilmeniz için yaptıklarımı da paylaşacağım.

Adım 1: Parçalar

Parçalar
Parçalar

Bunu uygulamak için ihtiyacınız olacak: Bir döner anahtar (dörtlü kodlu) Çekme dirençleriUygun mikro denetleyici platformuProjem için bir Grayhill 61C22-01-04-02 optik kodlayıcı kullandım. Döner anahtarın veri sayfası, anahtardan gelen iki veri hattında 8.2k ohm yukarı çekme dirençlerini gerektirir. Kullanmayı tercih ettiğiniz kodlayıcının veri sayfasını kontrol etmek isteyeceksiniz. Kullandığım döner anahtar, eksenel basmalı düğme anahtarıyla da sipariş edilebilir. Bu, çevrilmiş seçimleri vb. işlemek için kullanışlı bir özellik ama burada arayüzünden bahsetmeyeceğim. Listelenen "uygun bir mikrodenetleyici platformu" var çünkü (bence) bu birden fazla platformda uygulanabilir. Instructables için başka mikrodenetleyiciler kullanan birçok insan gördüm, bu yüzden genel yaklaşımı da göstermek istiyorum. Tüm kodu bir Microchip PIC16F877A ile kullanmak için PIC Basic Pro'da yazdım. Gerçekten, mikrodenetleyicide ihtiyacınız olan en önemli şey, iki pinden birinde mantık değişikliği olduğunda kesme yeteneğidir. PIC16F877A'da buna PORTB değişiklik kesmesi denir. Diğer kontrolörlerde bunun için başka isimler olabilir. Bu mikrodenetleyici kesme özelliği, bu uygulamayı bu kadar zarif yapan şeyin bir parçasıdır.

Adım 2: Donanım Arayüzü

Donanım Arayüzü
Donanım Arayüzü

"Basit" bir çözüm, mikrodenetleyiciye 16 bağlantılı "tek kutuplu-16 atış" anahtarına sahip olmak olacaktır. Her bir anahtar çıkışı daha sonra mikrodenetleyici üzerindeki bir pime bağlanır, böylece her kadran konumu mikrodenetleyici tarafından kontrol edilebilir. Bu, G/Ç pinlerinin aşırı kullanımıdır. Anahtarda 16'dan fazla konumun (tutucu) kullanılabilir olmasını istiyorsak işler daha da kötüleşir. Anahtar üzerindeki her ekstra konum, mikrodenetleyiciye ekstra bir giriş gerektirecektir. Bu, hızlı bir şekilde bir mikrodenetleyici üzerindeki girişlerin çok verimsiz bir kullanımı haline gelir. Döner anahtarın güzelliğini girin. Döner anahtarın, veri sayfasında A ve B olarak listelenen mikro denetleyiciye yalnızca iki çıkışı vardır. Bu hatların alabileceği sadece dört olası mantık seviyesi vardır: AB = 00, 01, 10 ve 11. Bu, anahtarı mikrodenetleyiciye bağlarken kullanmanız gereken giriş hatlarının sayısını büyük ölçüde azaltır. Böylece, giriş satırlarının sayısını sadece ikiye indirdik. Şimdi ne olacak? Görünüşe göre gerçekten 16 farklı duruma ihtiyacımız var ama bu yeni anahtarın sadece dördü var. Kendi ayağımıza mı kurşun sıktık? Hayır. Okumaya devam etmek. Açıklamak için döner anahtar işleminin arkasındaki teoriyi biraz ele alacağız.

Adım 3: Donanım Çalışma Teorisi

Donanım Çalışma Teorisi
Donanım Çalışma Teorisi
Donanım Çalışma Teorisi
Donanım Çalışma Teorisi
Donanım Çalışma Teorisi
Donanım Çalışma Teorisi

Yukarıda bahsedilen "tek kutuplu-16 atış" anahtarı kullanılarak dönüş yönü algılaması mümkündür, ancak mikrodenetleyicide çok fazla giriş kullanır. Döner anahtar kullanmak mikrodenetleyiciye giriş sayısını azaltır ama şimdi anahtardan gelen sinyalleri yorumlamamız ve bunları bir dönüş yönüne çevirmemiz gerekiyor. Daha önce anahtarın kareleme kodlu olduğundan bahsetmiştim. Bu aynı zamanda bu çözümdeki anahtar zarafetlerden biridir. Bu, anahtarın konumuna karşılık gelen anahtarın verdiği 2 bitlik bir kod olduğu anlamına gelir. Şunu düşünüyor olabilirsiniz: "Mikrodenetleyiciye iki bitlik bir giriş varsa, 16 konumun tümünü nasıl temsil ederiz?" Bu iyi bir soru. Hepsini temsil etmiyoruz. Dönme yönünü belirleyebilmek için düğmenin göreceli konumlarını bilmemiz yeterlidir. Düğmenin mutlak konumu önemsizdir. Saat yönünde dönüş için, anahtarın verdiği kod her dört tetikte bir tekrar eder ve gri kodludur. Gri kodlu, her konum değişikliği için yalnızca bir bit değişikliği olduğu anlamına gelir. AB girişinin ikili sistemde saat yönünde dönüş için şu şekilde sayılması yerine: 00, 01, 10, 11, şu şekilde değişir: 00, 10, 11, 01. İkinci model için, arasında değişen yalnızca bir giriş olduğuna dikkat edin. kümeler. Mikrodenetleyiciye AB girişi için saat yönünün tersine değerler şöyle görünecektir: 00, 01, 11, 10. Bu, AB = 00'ın ilk sıralandığı saat yönündeki modelin basitçe tersidir. Daha görsel bir açıklama için şemalara bir göz atın..

Adım 4: Yazılımın Çalışma Teorisi

Yazılım Çalışma Teorisi
Yazılım Çalışma Teorisi

Dönme yönünü çıkaran rutin, kesintiye dayalıdır. Seçtiğiniz mikro denetleyicinin, kesme etkinleştirildiğinde (en az) iki pinden herhangi birinde bir değişiklik olduğunda herhangi bir zamanda kesinti yapabilmesi gerekir. Buna PIC16F877A üzerinde PORTB değişiklik kesmesi denir. Anahtar her döndürüldüğünde, mikrodenetleyici kesintiye uğrayacak ve program yürütmesi Kesinti Hizmeti Rutinine (ISR) gönderilecektir. ISR, anahtarın hangi yöne çevrildiğini hızlı bir şekilde anlayacak, uygun şekilde bir bayrak ayarlayacak ve hızlı bir şekilde ana programa dönecektir. Kullanıcının düğmeyi çok hızlı çevirmesi durumunda bunun hızlı bir şekilde gerçekleşmesine ihtiyacımız var. Gri kodlu AB modelinin her dört konumda bir tekrar ettiğini biliyoruz, bu nedenle bu dört konum arasındaki geçişler için rutin çalışmayı yaparsak, diğerlerinin tümü için işe yarayacaktır. Dört konumlu bir çevrimde dört kenar olduğuna dikkat edin. A girişi ve B girişi için yükselen kenar ve düşen kenar. Mikroişlemci, her kenar olduğunda kesintiye uğrayacaktır, bu da, düğme her çevrildiğinde mikro denetleyicinin kesintiye uğrayacağı anlamına gelir. Sonuç olarak, ISR'nin düğmenin hangi yöne çevrildiğini bulması gerekir. Bunu nasıl yapacağımızı anlamamıza yardımcı olması için saat yönünde dönüş için dalga biçimine dönüyoruz. A'nın bir kenarı olduğunda, yeni değerinin her zaman B'ninkinden farklı olduğuna dikkat edin. Düğme 1 konumundan 2 konumuna gittiğinde, A mantık-0'dan mantık-1'e geçiş yapar. Bu geçiş için B hala 0'dır ve A'nın yeni değeriyle eşleşmez. Düğme 3 konumundan 4 konumuna gittiğinde, B mantık-1'de kalırken A düşen bir kenara sahiptir. B ve A'nın yeni değerinin farklı olduğuna tekrar dikkat edin. Şu anda, A'nın saat yönünde dönüş sırasında herhangi bir kesintiye neden olduğunu görebiliriz, yeni değerinin B'ninkinden farklı olduğunu görebiliriz. Ne olduğunu görmek için B'yi kontrol edelim. Anahtar 2 konumundan 3 konumuna geçtiğinde B yükselen bir kenara sahiptir. Burada B'nin yeni değeri A ile aynıdır. Saat yönünde dönüş için kalan son kenara bakıldığında, B'nin 4 konumundan 5 konumuna hareket eden bir düşen kenarı vardır. (Konum 5, konum 1 ile aynıdır) B'nin yeni değeri burada da A ile aynıdır! Artık bazı kesintiler yapabiliriz! A kesmeye neden oluyorsa ve A'nın yeni değeri B'ninkinden farklıysa, dönüş saat yönündeydi. Ayrıca, kesmeye B neden oluyorsa ve B'nin yeni değeri A ile aynıysa, dönüş saat yönünde olmuştur. Saat yönünün tersine dönüş durumunu hızlıca inceleyelim. Saat yönünde dönüş gibi, saat yönünün tersine dönüş de bir döngüde dört kesintiye neden olur: ikisi A girişi için ve ikisi B girişi için. A girişi, düğme 4 konumundan 3 konumuna hareket ettiğinde yükselen bir kenara ve 2 konumundan 1 konumuna hareket eden bir düşen kenara sahiptir. Düğme 4 konumundan 3 konumuna hareket ettiğinde, A'nın yeni değeri B'nin değeriyle aynıdır. Şimdi, A kesmeye neden olduğunda ve yeni değeri B ile eşleştiğinde, dönüşün saat yönünün tersine olduğunu görebiliriz. Her şeyi doğrulamak için hızlıca B girişine bakacağız. Düğme, konum 5'ten (1 ile aynı olan) 4'e ve düğme 3'ten 2'ye hareket ettiğinde B bir kesintiye neden olur. Bu iki durumda da, B'nin yeni değeri mevcut değerle eşleşmez. Bu, B'nin saat yönünde dönüş için kesintiye neden olduğu durumların tersidir. Bu iyi haber. Her şey olması gerektiği gibi kontrol edilir. Özetlemek gerekirse, A kesmeye neden olursa ve yeni değeri B'nin değeriyle eşleşmiyorsa veya B kesmeye neden oluyorsa ve B'nin yeni değeri A'nın değeriyle eşleşiyorsa saat yönünde dönüş olduğunu biliyoruz. Yazılımda saat yönünün tersine dönüş için diğer durumları kontrol edebiliriz veya saat yönünde dönüş olmadığı için saat yönünün tersine olduğunu varsayabiliriz. Rutinim sadece varsayımda bulundu.

Adım 5: Yazılım

Yazılım
Yazılım
Yazılım
Yazılım

PIC Basic Pro'da yerleşik kesmeleri kullanmadım. Rutini yürütmek için Darrel Taylor'dan koduma eklediğim birkaç dosya kullandım. Darrel için büyük bir itibarın ait olduğu yer burasıdır! Dosyalar ücretsizdir. Daha fazla bilgi, diğer uygulamalar ve dosyaları indirmek için web sitesini ziyaret etmeniz yeterlidir. Darrel Taylor kesintileri olan bir PIC kullanmıyorsanız bu bölümü atlayabilirsiniz. Kullanmakta olduğunuz platformda kesintileri gerektiği gibi ayarlayın. Darrel Taylor (DT) kesintilerini ayarlamak için yapmanız gereken iki şey var: 1.) DT_INTS-14.bas ve ReEnterPBP.bas dosyalarını dosyanıza ekleyin. code.2.) Bunu kopyalayıp code. ASMINT_LIST makronuza yapıştırın;IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, yes endm INT_CREATEENDASMIKodunuzda işleri biraz daha kolay görebilmeniz için Eğitilebilir Tablonun sonundaki grafik gibi sekmeler ve boşluklar ekleyin. İhtiyaçlarınıza uyacak şekilde biraz değiştirmeniz gerekecek. Etiket altında, ISR'yi ISR'niz olan alt yordamın adıyla değiştirin. Alt çizgiyi unutmayın! Buna ihtiyacınız var! Kesintilerin çalışmasını sağlamak için yapılacak iki şey daha var: 1.) ISR'yi yazın. Bunu tıpkı bir PBP alt yordamı yazar gibi yazacaksınız, ancak alt yordamın sonuna RETURN yerine @ INT_RETURN eklemeniz gerekecek. Bu, kesmeyi onaylayacak ve program yürütmesini ana döngüde kaldığı yere geri döndürecektir. ISR'nin içinde, programınızın özyinelemeli bir kesmeye yakalanmaması için kesme bayrağını temizlemeniz gerekir. PIC16F877A üzerindeki kesme bayrağını temizlemek için yapılması gereken tek şey PORTB'yi okumaktır. Her farklı mikrodenetleyicinin kesme bayraklarını temizlemenin farklı bir yolu vardır. Mikrodenetleyicinizin veri sayfasını kontrol edin.2.) Kodunuzda kesmeyi etkinleştirmek istediğiniz noktaya ulaştığınızda, bu kod satırını kullanın:@ INT_ENABLE RBC_INTKesmeyi devre dışı bırakmak istediğinizde şunu kullanın:@ INT_DISABLE RBC_INTBirçok şey var az önce ele aldıklarımın içine paketlenmiş şeyler, bu yüzden çabucak özetleyeceğim. Şimdiye kadar, programınız şöyle görünmelidir:; Gerekli herhangi bir kurulum veya kodINCLUDE "DT_INTS-14.bas"INCLUDE "ReEnterPBP.bas"ASMINT_LIST makrosu;IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, evet endm INT_CREATEENDASM; Diğer gerekli kurulum veya kod@ INT_ENABLE RBC_INT; Düğmenin hangi yöne döndüğünü bilmesi gereken kod@ INT_DISABLE RBC_INT; Diğer kodEND; ProgrammyISR'nin sonu:;ISR kodu burada@ INT_RETURN(Interrupt Handler Set Up Table)Sanırım burası PIC veya DT kesmeleri kullanmayan herkesin tekrar katılabileceği yer. Şimdi, mikrodenetleyicinin düğmenin hangi yöne döndüğünü bilmesi için ISR'yi gerçekten yazmamız gerekiyor. Kesmeye neden olan girişi, yeni değerini ve diğer girişin değerini biliyorsak, dönüş yönünü çıkarabileceğimizi yazılım teorisi bölümünden hatırlayın. İşte sözde kod: Kesinti bayrağını temizlemek için PORTB'yi bir sıfırdan değişkene okuyun. A'nın kesintiye neden olup olmadığını kontrol edin. Doğruysa, A ve B'yi karşılaştırın. Farklı olup olmadığını kontrol edin, farklıysa, Saat yönünde dönüyordu Else, Saat yönünün tersineydi EndifCheck, B'nin kesintiye neden olup olmadığını kontrol edin. Doğruysa, A ve B'yi karşılaştırın Farklı olup olmadığını kontrol edin, eğer aynıysa, Saat yönünde dönüyordu Aksi, Saat yönünün tersineydi Endif Kesintiden geri dön A veya B'deki bir değişikliğin kesintiye neden olup olmadığını nasıl anlarız? Değiştirilen girişin ve diğer (değişmeyen) girişin yeni değerini keşfetmek kolaydır çünkü bunları ISR içinde okuyabiliyoruz. İnfaz ISR'ye gönderilmeden önce her birinin durumunun ne olduğunu bilmemiz gerekiyor. Bu ana rutinde olur. Ana rutin oturur ve CWflag dediğimiz bir bayt değişkeninin ISR tarafından 1'e ayarlanmasını veya 0'a temizlenmesini bekler. Düğmenin onaylanan her değişikliğinden sonra veya düğme etkinliği yoksa, boşta bir durumu belirtmek için değişken 5'e ayarlanır. Bayrak ayarlanırsa veya temizlenirse, ana rutin dönüşe bağlı olarak ayar noktası basıncını hemen artırır veya azaltır ve ardından düğme şimdi tekrar boşta olduğundan CWflag değişkenini tekrar 5'e ayarlar. Ana rutin CW bayrağını kontrol etmek olduğundan, aynı zamanda A ve B döner anahtar değerlerinin durumunu da belgeliyor. Bu gerçekten basit ve şuna benziyor:oldA = AoldB = BBurada gerçekten süper süslü bir şey yok. Döngü için CW bayrağını kontrol eden döngünün başına bu iki satırı eklemeniz yeterlidir. ISR yürütüldüğünde hangi girişin kesintiye neden olduğunu görebilmemiz için ana rutindeki artış/azaltma döngüsü içindeki döner düğmeden girişlerin mantık değerlerini güncelliyoruz. İşte ISR kodu: ABchange: scrap = PORTB ' Kesme bayrağını temizlemek için PORTB'yi okuyun ' Eğer A kesintiye neden oluyorsa, B'nin dönüş yönünü kontrol edin EĞER eskiA != A SONRA ' A ve B farklıysa, saat yönünde dönüş EĞER A != B THEN GOTO CW ' Aksi takdirde, saat yönünün tersine dönüş olmuştur ELSE GOTO CCW ENDIF ENDIF ' Eğer B kesmeye neden oluyorsa, A'nın dönüş yönünü kontrol edin IF eskiB != B THEN ' A ve B aynı ise, IF A == B THEN GOTO CW ' Aksi takdirde, saat yönünün tersine dönüş oldu ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@INT_RETURNI, ISR kodunu bir AB_ISR.bas dosyasına dahil ettik çünkü koddaki sekmeler olması gerektiği gibi görünmüyor. Şimdi, ISR, A ve B girişleri için eski değerlere sahip olduğundan, hangi girişin kesintiye neden olduğunu belirleyebilir, diğer (değişmemiş) girişle karşılaştırabilir ve yönü belirleyebilir. rotasyon. Tüm ana rutinin yapması gereken, topuzun hangi yöne döndüğünü (varsa) görmek için CW bayrağını kontrol etmek ve bir sayacı, ayar noktasını veya istediğiniz veya ihtiyacınız olan her şeyi artırmak veya azaltmaktır. Umarım bu yardımcı olur ve çok olmamıştır. kafa karıştırıcı. Bu arabirim türü, özellikle sisteminiz zaten kesmeler kullanıyorsa yararlıdır, çünkü bu yalnızca eklenecek bir kesme dahadır. Eğlence!

Önerilen: