0

DC Servo Motor - Encoder

Başlatan 0nur, 10 Temmuz 2013, 18:33:32

0nur

Merhaba,

Çok ufak aralıklarla motorun açısal kontrolünü yapmam gerekiyor, bununla ilgili sonsuz tur durumu söz konusu olduğu için sıklıkla kullanmış olduğumuz 0-180' lik servoları kullanamıyorum. Bu durumda alternatif olarak aklıma redüktörlü dc motor kullanarak encoder ile pozisyon kontrolünü sağlamak geldi. Bu konu ile ilgili deneme yapmak amacı ile bulmuş olduğum bir motorun kendi bünyesinde manyetik encoder yer alıyor. Datasheet'i http://www.faulhaber-group.com/uploadpk/EN_IE2-16_DFF.pdf linkinde yer alıyor.

Projeyi gerçekleştirmek için düşündüğüm tasarım şu şekilde;

PIC16F877'de RB0 kesmesini kullanarak encoder'dan her veri geldiğinde değişken içeriğini 1 arttırmak ve motor istenen pozisyondaki değere geldiğinde durdurmak.

Bu konuda önerileriniz nelerdir ? Encoder'ı bu şekilde kullanabilirmiyim? Çift kanal bulunuyor. Sadece A kanalını kullansam yeterli olurmu?


ete

Tek kanal tek yönde kontrol sağlar. Motoru hep aynı yöne çavireceksen sorun yok. Ama benim bildiğim pozisyon kontrolünde çift yönlü çalışma olur genellikle.
Ete

0nur

Yapmak istediğim projede motor tek yönde hareket edecek. Bu şekilde açısal kontrol yapabilirmiyim ?

ete

Teorik olarak evet. Her şey motorun dönüş hızına ve senin encoderi eşzamanlı olarak okumana bağlı.

Ete

0nur

Merhaba,

Birkaç deneme yaptıktan sonra B0 kesmesi ile encoder'ın tek kanalını kullanarak bu işi yapmanın pek mantıklı olmayacağı kanaatine vardım. Sebebi ise;

B0 kesmesini kullanmamız için her konum değişikliğinde _|-|_|-|_ şeklinde lojik bir değişiklik durumu olması gerekiyor. Fakat encoder'ın kanallarındaki çıkış ise ;

AB
__
01
11
10
00
şeklinde değişiyor. (dönüş yönüne göre terside olabilir ). Burada B0 kesmesi kullanarak encoder kontrolü yapıldığında 2 kat high 2 kat low genlik süresi uzun olacağından hassas bir ölçüm yapmak pekte mümkün görünmüyor.

Bu konuda sizler ne düşünüyorsunuz ?..

 

ete

Haklısın. dönüş olup olmadığını anlamak için iki A ve B girişlerini test etmen gerekiyor.

Ete

0nur

#6
Şu şekilde bir yazılım yaparak sayi değişkenini 1'er arttırıp konum kontrolu yapmaya çalıştım. Fakat bazı durumlarda hala sapmalar meydana geliyor. Sorunu nasıl giderebilirim , fikriniz varmı ?

Device 16F877   
Config HS_OSC , WDT_OFF, PWRTE_ON,  BODEN_OFF , LVP_OFF, CP_OFF 
Declare XTAL 20

LCD_DTPIN = PORTD.4
LCD_RSPIN = PORTE.0
LCD_ENPIN = PORTE.1
LCD_INTERFACE = 4 ' 4-bit Interface
LCD_LINES = 4
LCD_TYPE  = alpha
LCD_COMMANDUS = 2000
LCD_DATAUS = 50
ALL_DIGITAL TRUE


                         
'On_Hardware_Interrupt GoTo Kesme     'Hardware İnterrupt Oluşunca INT ye git   
'OPTION_REG.6=0
       
Cls

Symbol INTF = INTCON.1      'RB0 KESME BARAĞI
Symbol INTE = INTCON.4      'RB0 KESME YETKİ
Symbol GIE = INTCON.7       'GLOBAL INT. YETKI
CCP1CON=%00001100
CCP1_PIN = PORTC.2   ' Select HPWM port and bit for CCP1 module. i.e. channel 1
CCP2_PIN = PORTC.1   ' Select HPWM port and bit for CCP2 module. i.e. channel 2       
GIE=0                       'tüm kesmeler kapalı
INTE=0                     'RB0 Kesmesi aktif
Input PORTB                 'portb giriş
TRISC=0


Dim Sayi As Word           'Sayi adında byte değişken
Dim Durum As Word           'Durum adında byte değişken
Dim DEGER As Byte           'Durum adında byte değişken
Dim A As Word           'Durum adında byte değişken
Dim tur As Byte           'Durum adında byte değişken


Symbol mi=PORTC.0
Symbol mg=PORTC.1
Symbol led=PORTC.3
Symbol led2=PORTC.4   
Symbol BUT=PORTB.0
Symbol BUT2=PORTB.1   

Clear

A=62


Durum=100

Sayi=0
'================================================================================================
basla:
mi=1
mg=0
led=0

Print At 1,1,"SAYI DEGERI ",@Sayi,"   "
Print At 2,1,"motor hizi ",@Durum,"    "
Print At 3,1,"kombinasyon ",@BUT,"  ",@BUT2,"  "
Print At 4,1,"TUR ",@tur,". tur  "

HPWM 1,Durum,1000

If BUT=0 And BUT2=1 Then
Inc Sayi
EndIf

If BUT=1 And BUT2=1 Then
Inc Sayi
EndIf

If BUT=1 And BUT2=0 Then
Inc Sayi   
EndIf

If BUT=0 And BUT2=0 Then
Inc Sayi   
EndIf



If Sayi>0  And Sayi<=(a-30) Then
Durum=90
EndIf


If Sayi>(a-30) And Sayi<=(a-15) Then
Durum=120
EndIf


If Sayi>(a-15) And Sayi<=(a-5) Then
Durum=20
EndIf

If Sayi>(a-5) And Sayi<=(a-1) Then
Durum=120
EndIf


If Sayi>=A Then
Durum=0
Sayi=0
Print At 1,1,"SAYI DEGERI ",@Sayi,"   "
Print At 2,1,"motor hizi ",@Durum,"    "
Print At 3,1,"kombinasyon ",@BUT,"  ",@BUT2,"  "

mi=0
mg=1
DelayMS 20
mi=1
led=1

Inc tur
DelayMS 2000
EndIf





GoTo basla                 
     


Satır sonunda motoru istenen konumda durdurmak için 20 msn'ye geri dönme bilgisi uyguluyorum. Sonrasında motorun 2 bitini 1 yaparak motoru kitliyorum.

Powered by EzPortal