W

Servo motoru yüzdeli hareket ettirmek

Başlatan wishes, 27 Mart 2012, 21:01:17

wishes

merhaba arkadaşlar. elimde 16f877a ve servo motor var. potansiyometre kullanmadan, pic'in içindeki değişkenlerle servo motoru yüzdeli şekilde döndürmek mümkün mü?

mesela 10 bitlik (0-1023) bir adc girişte ham değer=204 olunca çıkışı 1 volt yapsın, o gelen 1 volt da servoyu yüzde 20 açsın.

ham değer=1023 olunca çıkışa 5 volt gelsin, servo yüzde yüz açılsın..

bunun bir yöntemi var mıdır? ETE hocamızın notlarında potansiyometre ile ilgili bir örnek var ama bunun gibi bir sorunun cevabı zannediyorum yok. en ufak bir yorum bile işime yarayabilir. teşekkürler.

ete

Potansiyometre bir araç yalnızca . Senin söylediğin değişken değerlerini elde etmeye yarıyor. Sen pot olmadan o değişkenleri elde edebiliyor isen zaten sorun olmayacak ve servo istediğin gibi çalışacaktır.

Ete

wishes

#2
yani

IF degisken=100 THEN HAM=1023
IF degisken=50 THEN HAM=512

demem sorunu çözer mi hocam. HAM değeri doğrudan bu yöntemle belirleyebildiğimiz bir örneğe rastlamadım da o yüzden bu kadar kolay olmamalı diye düşündüm.

ete

Dediklerinden  pek bir şey anlamadım.
Neden ADC okuma değerlerine saplandın acaba?
Bir servo motor konum değiştirmek için 500us ile 2000us arasında bir HIGH puls'i ister. ADC den gelen değerin bu sürelere çevrilmeleri gerekir. Ben genelde senin dediğin gibi yapmam. İşi daima bir formüle dönüştürürüm.
Formül dönüştürme işi şöyle yapılır.
Bize lazım olan süre 500 ile 2000 arası bir değer olacaktır. Teorik olarak ADC değeri sıfır ise 500 us ve ADC değeri 1023 ise 2000 us puls süresi hesaplamalıyım. 2000-500=1500 us lik net süre var elimizde.
ADC maksimum değeri 1023 olup sıfır ile birlikte 1024 kademe eder.  O halde;
1500/1024=1,46484375  bulunur. Bu birim ADC başına hesaplanması gereken süreyi bize verir.
Bu sayıyı virgülden kurtarmak ve hesabı kolaylaştırmak için 256 ile çarparız.
1,46484375 * 256 = 375 bulunur. Bu bizim sabit çarpanımız olacaktır. İşte formülümüz;
Sure=(Ham+1)*/375+500

Diyelimki ADC den okunan değer 205 oldu. O halde motora verilecek puls süresi,
Sure=(205+1)*/375+500 = 801us olarak bulunur.
(Bu hesabın açık şekli şöyledir.  206 * 375/256 +500)

Ete

wishes

çok teşekkür ederim hocam. dediklerinizi uygulamaya geçeceğim.

wishes

#5
hocam ben biraz araştırma daha yaptım. aradığım tam olarak HPWM komutuymuş. 16f877a'da ccp1 pinine bağladım. çıkışa da RC filtresi ekledim (10K-1uF). proteus derlemesinde istedigim gibi çıkış üretebiliyorum.

IF degisken= 100 THEN HPWM 1,255,1000
IF degisken= 50 THEN HPWM 1,128,1000
IF degisken= 25 THEN HPWM 1,64,1000

ete

Servo motorlarda bir prensip daha vardır. Verilen pulslerin üst üste verilme aralığı 20ms olmalıdır denilir.
Bu ise frekansın 50 Hz dolayında olmasını gerektirir. Senin kullandığın HPWM komutlarında frekansı 1000 Hz almışsın ki bunda peryod 1 ms dolayındadır. Buda sistemde aksaklıklara yol açabilir. Açabilir diyorum çünki bunları uzun boylu denemedim.
Komutlar gerçek motor ile çalışıyorsa sorun yok demektir. Akaklık yakalayıncaya kadar çalıştır .

Ete

wishes

teşekkür ederim hocam. komutları üst üse vermiyorum. lcd ekrandan "servoyu ne kadar yüzdeyle açma" seçenegi geliyor. yüzde 100 mü açayım, yüzde 50 mi açayım diye soruyor. eger 50'yi seçersek

IF degisken= 50 THEN HPWM 1,128,1000

seçeneğine dallanıyor.

şimdi de istenilen şartın dışında olsam bile verdiğim gerilim değeri takılı kalıyor, onu çözmekle uğraşıyorum :)

ete

Bende onu anlatmaya çalışıyorum ya;
HPWM 1,128,1000   komutu 1000 hz lik ve duty değeri %50 olan PWM sinyalini açar ve o sinyal sürekli çıkar. Mani olmazsın.
1000 hz lik sinyalin %50 duty değerine sahip kısmının HIGH süresi 500 us dir. Aslında sen 500us tutarında bir puls veriyorsun ama bunu her 1 ms  de bir veriyorsun halbuki her 20 ms de bir vermen gerekiyor.

Şayet yapabilse idin komutu  ;
  IF degisken= 50 THEN HPWM 1,128,50  şeklinde verebilirdin olur biterdi. Çünki böylece 50 Hz lik bir sinyal verirdin ve bunun duty değeri de % 50 olurdu ve her 20 ms de bir bu sinyali vermiş olurdun. ANcak ne yazıkki HPWM komutu en düşük 245 Hz ile çalışabiliyor. Bundan daha aşağı düşmen için Pic'in çalışma frekansını düşürmen gerekiyor.

Bana kalırsa sen PULSOUT PORTX.z , 50      komutunu ver bu sana 500 us lik bir puls verir.
kısaca 50 değeri 10 ile çarpılarak bulunan değer kadar us puls süresi verir. PORTX diye yazdım sinyal nereden çıkacak ise oraya port ismi (PORTB veya PORTA her neyse), ve z yerinede o portda hangi pinden çıakcak ise onu yazacaksın.
1000us puls çıkarmak için PULSOUT PORTX.z , 100 yazman gerkeyor.
Sonra bir yerlere Pause 18 yada Pause 19 yazarsın böylece yaklaşık 20 ms de bir puls çıkarmış olursun.

Ete

 

Powered by EzPortal