ana sayfa > Microchip, Projelerim, Yazılım > Pic16F628 ile Açı ölçer

Pic16F628 ile Açı ölçer

Salı, 11 Şub 2014 yorum ekle yorumlara git
Pic16F628 ile Açı ölçer

Merhaba Arkadaşlar

Bu yazımda incremental enkoderlerin kullanımına değineceğim. Bu enkoderler ile hassas bir şekilde nasıl açı ölçümü veya konum tespiti yapılacağını anlatacağım.

Piyasada Absolute(Mutlak) Enkoderler ve İncremental(Artımsal) Enkoderler olmak üzere iki çeşit enkoder bulunmaktadır.

Absolute Enkoderler her pozisyona göre farklı çıkışlar verirler. Bu tip enkoderlerde Gray ve Binary olmak üzere kendi aralarında ikiye ayrılırlar. Haberleşme açısından aralarında fark yoktur. Tek fark kodlamada dır. Absolute enkoderlerin genelde çıkışları paralel olmakla birlikte piyasada 0-10V analog çıkış veren modellerde mevcuttur.

Bu enkoderlerin en büyük artısı enkoderin enerjisi kesilse dahi çıkıştaki konumunu korur.
Eksi tarafı ise fiyatlarının daha pahalı olmasıdır.

2. olarak piyasada incremental enkoderler kullanılır. Bu tip enkoderler Absolute Enkoderler’de olduğu gibi paralel çıkış vermez. Enkoder her pozisyonda benzer kare dalga sinyalleri üretir.
İncremental enkoderlerde enkoderin çözünürlüğünü bir başka deyişle hassasiyetini belirleyen faktör enkoderin PPR(pulse per rotation) değeridir. Bu değer nekadar yüksek olursa enkoder okadar hassastır diyebiliriz.

Aşağıdaki resimde incremental enkoder ile Absolute enkoder arasındaki farkı görebilirsiniz.

Encoder Disk

Piyasada 100 puls’den 4096 puls’e kadar encoder bulunmaktadır. Hatta ihtiyaca göre daha yüksek çözünürlükte enkoderlerde yapılabilmektedir.

Absolute enkoderlerde enkoderin konumu direk alındığı için enkoderin ne tarafa döndüğünü öğrenmek kolaydır. Konum zaten her zaman bellidir. Enkoderin sıfır noktası herzaman sabittir. İncremental enkoderlerde ise böyle bir durum söz konusu değildir. Enkoder ilk enerjilendiği andan itibaren sıfırdan saymaya başlar. Enkoderi okuyacak olan donanım kaç puls geldiğini sayarak ne kadar döndüğünü hesaplamalıdır.

İncremental enkoderlerde birde Quadrature denen bir terim vardır. Endüstriyel olarak üretilen bütün incremental enkoderler bu özelliğe sahiptir diyebiliriz. Quadrature enkoderlerden iki adet kare dalga sinyal çıkar. Bunlar A ve B sinyalleri olarak isimlendirilir. Bu sinyaller arasında 90 derece faz farkı vardır. Enkoderi okuyacak olan donanım bu iki kare dalgayı karşılaştırarak hangi tarafa döndüğünü kolaylıkla tespit edebilir. Quadrature enkoderlerdeki temel amaç budur.

Son olarak incremental enkoderlerde birde Z(veya INDEX) sinyali bulunurki bu çıkıştan A ve B sinyallerinden farklı olarak tur başına 1 puls üretilir. Puls’ın üretildiği nokta herzaman sabittir. Dolayısıyla sabit referans noktası gereken yerlerde bu sinyalden faydalanılır.

Aşağıdaki resimde incremental enkoderden çıkan A, B ve Z sinyalleri gösterilmiştir.
Encoder
A ve B sinyalleri birbirinden 90derece kayık olduğunu görebilirsiniz.

İncremental enkoderleri okumak için yeni nesil işlemcilerde hazır donanımlar bulunur. Örneğin 18F4431’de QEI modülü bulunmakta. STM32’lerde ise timer donanımları ile yapılmakta. Bu tür donanımlarda yön tayini donanımsal olarak yapılmaktadır. Fakat mikrodenetleyici olarak Pic16F628 gibi düşük seviye bir mikroişlemci kullanılıyorsa yön tayini konusunda birkaç seçenek mevcuttur.

Eğer düşük çözünürlüğe sahip enkoderler kullanılıyorsa bu işlem kesmeyle veya yazılımlada yapılabilir fakat hem işlemciyi çok meşgul eder hemde de yüksek hızlarda puls kaçırmalar yaşanabilir. Bu yüzden yön tespitini donanımla yapmak işlem açısından büyük bir külfeti ortadan kaldırıyor.

Ben yön tespiti için basitçe bir D tipi flip-flop kullandım. Örnek bağlantı aşağıdaki gibidir
Encoder

Bu bağlantıya göre Flip-Flop’un Çıkışı dönüş yönüne göre 1 veya 0 olur. Bu sayede yön tayini yapabilir. Enkoderin A veya B sinyalinden herhangi biri ilede gelen puls’lar sayılır.

Açıkçası yön kısmını bu enteğreye hallettikten sonra geriye kalan kısım timer ile puls saymaktan başka birşey değil. Yön tayininin donanımsal olarak yapmamızın en büyük artısı işlem yükünü çok azaltması. Bu sayede herhangi bir timer donanımı barındıran mikrodenetleyici ile açı ölçümü yapılabilir. Yapılan işlemler hız gerektirmiyor.

Piyasadaki herhangi bir D tipi flip-flop burada iş görür. Ben 4013 kullandım ama isteyen başka enteğreleri kullanabilir.

Enkoderler hakkında bu kadar bilgi yeterli sanırım. Şimdi yaptığımız uygulamaya bakalım.

Yaptığım uygulamada Pic16F628 kullandım. Sistemden kısaca bahsetmek gerekirse Enkoderden gelen puls’ları 4013’den geçirip ne tarafa döndüğünü tespit ediyorum. Ayrıca Gelen puls’ları timer donanımına girip pulsları saydırıyorum. Yazılımla enkoderin kunumunu tespit açısını hesapladıktan sonra 7 Segment display de gösteriyorum.

Devre şemamız aşağıdaki gibidir.
Sema

Devreyi simülasyonda test etmek için motor tipi enkoderler den kullanmak gerekiyor. Yukarıdaki şemada kutu içerisine aldığım bölüm sadece simülasyon amaçlı kullanılıyor. Gerçekte bu devre kullanılmaz.

Yaptığım devrede Enkoderin Z yani referans sinyalini kullanmadım. Bunun yerine devreye bir adet buton ekledim. Bu buton sayesinde istenilen zamanda bütün değerler sıfırlanabilmektedir. Bu sayede istenilen nokta referans alınabilir.

Ayrıca sisteme bir adet menü ekledim. Menüden istenildiği taktirde enkoder çözünürlüğü değiştirilebilmektedir. Şimdilik ben  menüye 100, 256, 360, 400, 512, 600, 720, 1000, 1024, 1800, 2048, 3000, 3600, 4000, 4096 değerlerini ekledim. Enkoder çözünürlüğü kaç puls ise menüden o değer seçilmelidir.

Menüye giriş işlemi için Sıfırlama butonuna yaklaşık 2 sn basmanız gerekmektedir. Menüye girdiği zaman girişte ufak bir yazı geçer. Sonra en son seçtiğiniz değer ekrana gelir. Burada yine butona basarak değerleri değiştirebilirsiniz. Seçtiğiniz değeri kaydetmek için yine aynı butona 2 sn civarı basmanız gerekir.

Şimdi açı ölçümünün yazılım tarafına bakalım.
Yazılımı CCS C ile yazdım.

Önemli olan main programı, Gerisi Teferruat. Bu yüzden sadece main programını anlatacağım.
Şimdi donanım kısmında 4013 ile yön tespiti yaptık. Ayrıca enkoderden gelen puls’lar Timer1 in external clock girişine bağladık.(16F628 için RB6) Timer ayarlarınıda yaptıktan sonra Geriye kalan tek şey enkoderin konumunu hesaplamak.

Bunu yapabilmek için ilk başta enkoderin hareketi esnasında enkoderde kaç puls lık bir hareket olduğunu bulmak gerekiyor. Bunu yapmadan önce ilerideki işlemlerde bize kolaylık sağlaması açısından Timer1 değerinin enkoder çözünürlüğüne bölümünden kalanını buluyoruz.

Buradaki encoder_res parametresi bizim menüden seçtiğimiz değerdir. Eğer menüden 1024’ü seçdiysek bu işlem sonucunda counter değeri 0-1023 arası bir değer alır.

Bundan sonraki yapılan işlem sayaçta bir değişim varmı yokmu onu yoklamak.

Sayaçta değişim yoksa enkoderde hareket yok demektir. Enkoderin konumunu hesaplamayada gerek yok bu yüzden bütün işlemler es geçilir.

Eğer sayaçta değişim var ise sonraki işlem ne kadarlık bir değişim var onu bulmak. Bu işlem için bir önceki timer değeri ile yeni timer değerini birbirinden çıkartıyoruz. Bu sayede fark hesaplanıyor.

Bundan sonraki işlem enkoderin ne tarafa döndüğüne bakmak. Eğer sağa dönüyorsa Asıl konum sayacına fark kadar ekleme yaparız.

Tabi bu sırada konum sayacının Enkoder çözünürlüğünü aşmamasına dikkat etmeliyiz. Yazılım bu sırada bunuda kontrol eder. Eğer sayaç değeri enkoder çözünürlüğünden büyük ise sayaç sıfırdan saymaya başlar.

Eğer sola dönüyorsa bu işlemin tam tersi yapılır. Yani konum sayacından fark kadar çıkarma yaparız. Eğer konum sayacı sıfırdan küçük olursa tekrar alabileceği max. değerden geriye saymaya başlar.

Yapılan işlemler bundan ibaret diyebiliriz. Bundan sonrası enkoderin konumuna denk gelecek olan açıyı hesaplayıp ekrana yazmak. Açı hesaplama dediğim işlem orantıdan başka birşey değil.

Sistemi denemek için ben ufak bir kart hazırladım.
Encoder
Encoder
Encoder

Devredeki display’ler ortak katot’dur ve multiplex olarak sürülüyor. Displaylerin seğment bilgilerini vermek için 74HC595 yani port çoğullayıcı kullandım.

Dediğim gibi sistemin en büyük artılarından biri kesme kullanılmaması ve hata yapmaması olduğunu söyleyebilirim. Daha önce kesme kullanarak bir iki test yaptım ama fark ettimki enkoder hızlandıkça sistem puls kaçırmaya başlıyor. Bu sistemde sayım işlemi timer ile yapıldığı için kaçırma gibi problemler olmuyor.

Ekteki videoda sistemin çalışmasını görebilirsiniz.

Projeyle ilgili dosyaları Buradan indirebilirsiniz.
Sağlıcakla kalın…

  1. Mehmet
    Pazar, 02 Mar 2014 zamanında 00:34 | #1

    Eline sağlık kardeşim çok güzel bir anlatım ve uygulama. Allah razı olsun, başarılar.

  2. Çarşamba, 07 May 2014 zamanında 16:27 | #2

    Hello,that is a good post.Thanks for sharing!

  3. Cuma, 29 Ağu 2014 zamanında 22:41 | #3

    Merhaba,
    Bir kaç ay önce bu konuyu ciddi bir şekilde araştırmış fakat çok iyi türkçe kaynak bulamamıştım. gezinirken fark ettiğim bu site de böyle güzel bir yazı bulmak çok sevindirici. gayet güzel bir yazı hazırlamışsınız
    başarılarınızın devamını dilerim

    • Ferhat YOL
      Pazartesi, 01 Eyl 2014 zamanında 19:44 | #4

      Teşekkürler

  4. RASEL
    Pazar, 07 Ara 2014 zamanında 14:28 | #5

    Не понятно назначение этого устройства. Счетчик? я могу подключить к этому устройству магнитный энкодер AS5040. у него инкрементальный выход 256 импульсов на оборот и PWM 0-5v. А у AS5045 абсолютный интерфейс с http://www.skbis.ru/index.php?p=17 вот таким интерфейсом. А можно сделать инкрементальный выход после конвертации количества импульсов?
    ————————————————————————————————-
    Do not understand the purpose of this device. Counter? I can connect to this device magnetic encoder AS5040. he incremental output 256 pulses per revolution and PWM 0-5v. And AS5045 absolute interface http://www.skbis.ru/index.php?p=17 like this interface. And you can make incremental output after conversion of the number of pulses?
    ————————————————————————————————–
    Bu cihazın amacını anlamıyorum. Sayaç? Ben bu cihaz manyetik enkoder AS5040 bağlanabilirsiniz. devrim ve PWM 0-5V başına o artan çıkış 256 bakliyat. Bu arayüzü gibi Ve AS5045 mutlak arayüz http://www.skbis.ru/index.php?p=17. Ve darbe sayısı dönüşümünden sonra artan çıkış yapabilir?

  5. Ferhat YOL
    Pazar, 07 Ara 2014 zamanında 21:47 | #6

    @RASEL

    You can only use incremental rotary encoders with this circuit. AS5045 is a 12-bit position sensor. So you can’t use.

  6. RASEL
    Pazartesi, 08 Ara 2014 zamanında 15:16 | #7

    @Ferhat YOL
    I see you have an addictive personality. I wanted to ask for what purpose this device? Do you wash your counter or the converter in an incremental encoder of SSI interface for AS5045? For you, it will not be difficult! Unless of course there is interest. Yet these encoders can receive a gift from the manufacturer. http://www.ams.com/eng/Products/Position-Sensors there need to order a sampler of different magnets will not work correctly. Sorry for my English.

  7. Ferhat YOL
    Salı, 09 Ara 2014 zamanında 00:14 | #8

    @RASEL

    I’m sorry but I can’t understand you. This sensor is very different. You can get position data with this sensor. SSI communication protocol being used.

    Please see;
    http://www.ams.com/eng/content/download/1288/7223/496
    http://www.ams.com/eng/content/download/548583/1536477

    You can get support from the manufacturer.

    http://www.ams.com/eng/Support/Technical-Support/Application-Support-Request

  8. RASEL
    Salı, 09 Ara 2014 zamanında 11:31 | #9

    http://www.qsl.net/oe5jfl/ant_cont.htm Hello. this device is used in the converter SSI absolute in increment 4096 SSI – 1024 inc, but used what that ancient microcontroller and it is not very convenient. I thought when you combine your design and develop it get the right device in the laboratory hams. Thank you for your attention.

  9. paimei
    Pazar, 29 Mar 2015 zamanında 04:19 | #10

    Merhaba.Lisans öğrencisiyim tasarım projemde bende enkoderden gelen pulsları sayıyorum.Ama enkoder1 turda yaklaşık 8000 puls vermesi gerekirken ben 2000 puls sayıyorum.Bunun nedeni ne olabilir yardımlarınız için şimdiden teşekkürler.

  10. Ferhat YOL
    Pazar, 29 Mar 2015 zamanında 18:32 | #11

    Bunun birkaç sebebi olabilir

    1-)Enkoderiniz 2000 puls’lık olabilir. Zira ben şimdiye kadar 1 turda 8000 puls veren enkoder görmedim. Özel yapım olabilir. Bu kadar hassas bir enkoder ne amaçla kullanılır bilmiyorum
    2-) Timer ön bölücüsü 1/1 yerine farklı bir değer yapılmış olabilir. Mesela bölücü değeri 1/1 yerine 1/4 gelse gelen puls’lar 4’e bölüneceğinden 8000 yerine 4000 okuyabilirsiniz.

  11. Kazım Uğur
    Pazartesi, 18 Oca 2016 zamanında 20:32 | #12

    FF ile yapılan yön belirleyiciler hassas işlere uygun değil.
    Hızdan bağımsız , adım kaçırdığı “sıralamalar” var.
    Aynı durum QEI lerde de var !
    Motor encoder yerine 2 adet basit sw kullanırsanız görebilirsiniz.
    Verilen devrede önemli değil sanırım , zaten sadece A kanalı kullanılmış .
    Bu durumda ” Quadrature ” kavramı söz konusu değil.

  12. Ferhat YOL
    Cumartesi, 23 Oca 2016 zamanında 00:39 | #13

    @Kazım Uğur

    Kazım abi selamlar,

    Hızdan bağımsız , adım kaçırdığı “sıralamalar” var derken bu tip extrem durumlar hangiler? Benim aklıma gelen tek olasılık yön değiştirme esnasında ölü noktanın meydana gelmesidir.

    FF lerin özellikle kontak sıçramalarına karşı hassas olduklarını biliyorum. Timer’de bundan etkilenir. Dediğiniz gibi Motor enkoder yerine basit butonlu tip enkoderler kullanılırsa devrenin düzgün çalışacağını sanmam. Yada çok iyi bir filtreleme yapmak gerekir. Zaten o tip mekanik çalışan enkoderlerde timer kullanmanın mantığı yok.

    STM32’lerde daha önce timeri Enkoder modunda kullandım. Timerlarda enkoder için ekstra olarak XOR, Edge Detector ve Encoder Interface gibi yapılar var. “Quadrature” kavramından tam olarak faydalanabilmek için bu tip donanımlara ihtiyaç var. Bu iş bayağı sıkıntılı. Özellikle yüksek frekanslarda.

    Lakin sizde görüyorsunuzki 16F628 gibi bir MCU ile bu iş yapılmaya çalışıyor.

  1. şimdilik geri bağlantı yok