Z

Servo 50 hz problemi

Başlatan zengar, 28 Eylül 2013, 17:30:39

zengar

Merhaba arkadaşlar,
Servo sürmeye çalışıyorum gönderilen puls'ı Frekansmetre ile ölçüp 50 hz'e ayarlamaya çalışıyorum ama  bir türlü tutturamıyorum. 50hz de çalıştığı zamanlarda bazen 49 hz oluyor. bu problem oluştururmu, veya tam nasıl tutturabilirim.
Selametle!


basla:
Adcin 7, ham
eee=(ham)*/190+50
pulsout PORTC.0,eee
x = eee*10
x = 15500 - x
pauseus x
LCDOut $FE,1,"servo" ,# ham
GOTO basla

ete

50 Hz lik sinyalin peryodu P=1000/50=20 ms dir.  Bunun servo açısından önemi şudur. Servoya her 20 ms de bir puls verilecektir.
Peki puls süresi ne anlama geliyor. Servo pozisyonunu puls genişliği ile ayarlar. Genel anlamda servolar 0,5 ms ile 2 ms lik genişliğe sahip pulslar ile çalışır. Bu aralıkta verilen puls'a göre motor pozisyon alır.
Şimdi tekrar 50 hz lik sinyale dönelim. Maksiumum puls süremiz 2 ms olduğuna göre 20 ms lik peryodun 2 ms lik kısmı HIGH 18 ms lik kısmı LOW olacak demektir. Bu bakımdan rastgele bir frekans 50 Hz lik olsa bile motora verilmemelidir.
Basit bir hesap yaparsak 2ms high süresi olan 50 Hzlik sinyalin %10 duty değerine sahip olduğunu söyleyebiliriz. Minimum puls süresini de 0,5ms kabul edersek sinyalin Duty değeri 0,5/20=%2,5 ile %10 arasında değişecek demektir.

Kullandığın yöntemde stabil bir frekans çıkışı elde etmek çok zor. Komut gecikmeleri bunu engeller.
Doğru metod kesme kullanmaktır.
Şimdi puls genişliğinide ayarlamamız gerekeceği için min puls genişliği kadar bir sürede kesme oluşturabiliriz. Ancak bunu yaparsak motora  (2/0,5=4) yalnızca 4 konum verebiliriz. O halde çözünürlüğü biraz artırmak gerekir. Onun içinde kesme süremizi  100 us 'ye düşürürsek (2/0,1=20) motora toplam 20 konum verebiliriz demektir.

4 Mhz kristal frekansında her 100 us de bir kesme oluşturmak için,
- OPTION_REG=%10001000
- INTCON=%10100000
- TMR0=163
- ON INTERRUPT GOTO KESME
CIKIS=1

komutlarını başla satırından evvel verip ,
Ana program kısmında
DUTY=500 (us)
veya
Duty=800 gibi 100 us ninkatları şeklinde değerler vermek motora konum vermek için yeterli olacaktır.
Ancak bu değeri 800 değilde 8 olarak vermek daha uygun olacaktır. Çünki kesme her 100us de bir oluşacaktır.
Yani 800us için 8x100=800 şeklinde 8 kesme oluşması yeterli olacaktır.
O halde DUTY=8 değerini verdik diyelim. Bu değeri bozmamak için karşılaştırma için ikinci bir değişken kullanalım.
Bunada ARA diyelim. ARA=DUTY olacak.

Kesme kısmında ise,
DISABLE
KESME:
            SAY=SAY+1
            IF SAY=ARA THEN
                 SAY=0
                 TOGGLE CIKIS
                 ARA=DUTY
                 IF CIKIS=0 THEN ARA=20-DUTY
             ENDIF
             INTCON.2=0
             RESUME
             ENABLE

şeklinde bir komut dizisi verilince sistemin çalışması gerekir.
Burada 50 hz lik sinyalin %100 hassas olması gerekmez. Sonuçta sinyalin tekrarlanma kriteri 50 Hz'e denk gelmektedir. Öncemli olan puls süreleridir.

Ete
                       


zengar


Powered by EzPortal