avatar_ete

Encoder ve Encoder Pot Kullanımı

Başlatan ete, 29 Şubat 2012, 17:22:35

Hattuşa

ete hocam;
Disable
KES:
    If YON=1 Then
inc sayac
if sayac =3 then
sayac =0
      VOLT=VOLT+EKLE
      If VOLT>300 Then volt=300
endif
    Else
inc sayan
if sayan =3 then
sayan =0

      volt=volt-EKLE
      If volt>300 Then volt=0
endif
    EndIf
    lcdout $fe,$02,"volt= ",Dec volt/10,",",Dec volt//10,"  "
   
INTCON.1=0   'komutu ile kesme bayrağı sıfırlanır.
Resume
Enable


yaparak geçtim, işe yaradu usta bu gary to binary işleri bize şimdilik uzak aşağıdaki sizin picprpjede verdiğiniz bilgiler ve burdaki bilgilerden yararlanarak int0 kesmesinde B nin high olduğu yerlerde sayacı çalıştırarak işi çözmeye çalıştım, ufak tefek sorunları var oda sanırım doğru dürüst pcb vs olmayışından kaynaklı olabilir şimdilik işimi görüyor

Hattuşa

slm ete hocam
kullandığım encoder 3 pozisyonlu, yani 3. pozisyon tepesinden basmalı ve bu basma işleminde menu arası geçişleri sağlatıyorum, bu pozisyonu INT1 kesmesi ile kullanıyorum. sorunum ise menu arası geçişlerle beraber bir alt menuye geçiş yapmak, yani tepesine kısa bastığımda menu arası geçişleri sağlatmak basılı tutunca bir süre sonra başka bir menuye geçmek istiyorum ama bir türlü algoritmayı beceremedim.

If InT1IF =1 Then               'INT1 kesmesi
    InT1IF =0
    rB0 =1
   
    EndIf   


bu şekilde buton şeklinde kullanıyorum, ana döngüde ise
if rBo=1 then
rB0=0
if portb.1 =0 then
inc msayac
if msayac >20 then goto altmenu
else
goto menu
endif
endif



şeklinde yapıyorum ama bir türlü beceremedim. bir öneriniz varmıdır?

ete

Bu açıklamalarla sistmeini çok iyi anlayamıyorum.
Encoder buton kesmesi (INT1) oluşunca RB0=1 yapıyorsun.
Peki neden ana döngüde hala IF portb.1=0 then şunu yap diyorsun.
Zaten PortB.1 basılmış ve ona karşılık RB0=1 olmuş
Bunu muhtemelen uzun basmayı onaylamak için yapıyorsun gerek varmı? bu buton yalnızca bir iş yapıyor zaten.
Dediğim gibi iyi anlayamıyorum amacını yada amacına bağlı olarak yapmak istediklerini.
Yazdıklarını anlamayınca öneri de yapmam zor.
Bir tuşun uzun veya kısa basılması arasındaki farkı ancak sayac saydırarak yapabilirsin.
IF TUS=0 then
  SAYAC=0:UZUN=0
  WHILE TUS=0 and SAYAC<2000
    SAYAC=SAYAC+1
    IF SAYAC=2000 THEN UZUN=1
  WEND
   IF UZUN=1 THEN GOTO ARA_GECIS
   ...
ENDIF
şeklinde olmalıdır.

Ete

hakıkat

Merhaba hocam projeniz güzel olmuş elinize sağlık yörütülen tartışmalarıda okudum.Bir süredir bende dijitalle uğraşıyorum
Bu encoder entegrelerle servo yönlendirmek istiyorum ama pot larla ancak yönlendirme gelişiyor ama sizin yaptığınız gibi buttunlarla bu gelişmiyor.Anladığım kadarıyla dijital entegreler ya 1 yada 0 olduğunda bilgi gönderiyor öyle pot larda olduğu gibi adım adım ilerleyip gerilemiyor ama sizin bu devre dikkatimi çekti acaba buna benzer devreyi servo yönlendirmede de kullana bilirmiyiz.Buna ilişkinde bilginiz var mı?

ete

Servo kontrolünde, motora 500us ile 2000 us arasında genliği olan pulslar gönderilir. Bu pulsların gönderilme sıklı 20 hz dir. Yani her 20 ms de bir bu palsin verilmesi gerekir. Tariften anlaşılacğaı üzere süre ayarı ile motora pozisyon verilir. Motor değişen süreyi algıladığında bir kere konum değiştirir. Bir sonraki değişiklikte bir başka pozisyona geçer.
Böylece motora verilecek bu sürelerin değiştirilmesi için POT , Button ve Encoder pot kullanılabilr.
Encoder pot kullanımı burada çok sağlıklı olurmu onu bilemem deneyip görmek gerekir.
Pot ile kontrolde sınırlarınız bellidir. Okuduğunuz ADC girişi ile sınırları 500-2000us arasında belirlersiniz. Buton kontrolünde yazılımla sınır belirlemek zorundasınız. Encoder pot kullanımında ise yine yazılımla sınır kontrolü yapmak zorundasınız.
Yapılacka iş önce yön tespiti ardından yöne göre süre artırımı yada azaltımı yapacak ve sınırları kontrol ederek limitler içinde kalmaya gayret edeceksiniz. Daha sonra bir kesme yardımı ile her 20 ms de bu süreyi tatbik edeceksiniz.
Hepsi bu.

Ete


Powered by EzPortal