avatar_ete

Servo Motor Kontrolü

Başlatan ete, 04 Eylül 2011, 19:25:57

ete

Servo motorların kullanımına örnek olmak üzere iki ayrı proje hazırlamıştım.
Projeleri ve simulasyon dosyalarını ilişikteki rar dosyasında bulabilirsiniz.

Ete

semihelmali


SK

ete hocam, program çok kararlı çalışıyor ancak ben başka bir denetleyici kullanmak zorundayım, programın kodalarına ihtiyacım var, rica etsem ekleyebilir misiniz?

ete

Rar dosyasında var zaten neyi  istiyorsun anlamadım doğrusu.

Ete

SK

pardon hocam, ben ccs c kullanıyorum, .bas dosyasını blinmeyen dosya biçimi olarak gösterdiği için gözden kaçırmışım, kusura bakmayın.

SK

hocam devreyi kurup çalıştırmayı denedim ancak sonuç aşağıdaki gibi oldu. Devreye extra olarak 4 Mhz kristal ekledim. Belki programda internal olarak kullandınız bilmiyorum, o yüzden osilotörü çıkarttım ancak gene olmadı. Bir de 16F877 değil 16F877A kullandım. Çalışmamasının sebebi bunlardan birimidir yoksa başka bi sorunmu var? Pic Basic bilmediğim program üzerinde yorum yapamadım ancak bu gece öğrenmeye başlıyorum kısmetse :)

02072014008

onurinci

Entegrenin 1 nolu pin'i MCLR yani reset ayağını bir 4k7 direnç yada düz bağlı olarak +5 volt verdinizmi ? .

A versiyonundan farkedermi bilemem fakat bu entegrenin 2 adet gnd ve +5 volt besleme ayağı var ikisinide kullanmak gerekir.

sigorta ayarları XTAL osc olacak .

ete

Her ne hikmetse programda sigorta ayarını göremedim. Demek ben koymamışım. Yada bir şekilde silmişim.
Bu işlemci dahili OSC si olmayan işlemcidir ve zaten kristal yada rezonatör ile çalışması gerekir.

İkincisi program 16F876 ya göre yazılmıştır. 16F876A veya 16F877A kullanırsan programda komparatörleri iptal edecek komut yer almalıdır.

İlişikte 17F877A için yazılmış programı ve hex dosyasını bulabilirsin. Onları bir dene bakalım.
Birde isisde çalışıpta gerçekte çalışmayan devreler konusundaki yazımı oku istersen. Sana yararı olacaktır.
Ete

SK

@onurinci entegrenin MCLR bacağına 10k lık bir pull up direnci bağlı, devrenin groundları içinde ortaktır diye düşünüp 20 ve 19 numaralı bacakları kullanmıştım ancak ikisini de kullanman gerek diyince diğer vss yi de 19 nolu bacakla kısa devre yaptım, değişen bişey olmadı. @ete hocam yeni derlediğiniz programı denedm ancak gene olmadı, hatta bu sefer hiç hareket olmadı. yazınızı okudum,

beslemeyi ölçtüm, (4,8 v) ve +/- ucalarını kontrol etttim.
kristal bağlantıları da tamam
bağlantıları da kontrol ettim ancak düzelmedi.
en son belki PIC bozulmuştur ya da bozuktur diye PIC i değiştirdim ama sonuç değişmedi.

önerebileceğiniz başka bir yol varmı hocam?

ete

Önerebileceğm bir şey yok maalesef. O programları bende 16F877 ile deneyip çalıştırmış idim.
Sorun devam ettiğine göre üç sebep olabilir.;
- Ya pice program atamıyorsunuz
- Ya devrenizde kusur var
- Ya da kullandığınız motorlar bu işe uygun değiller.
Motorların çalışma aralıklarını puls genişliği olarak biliyormusunuz.? Motorlar digital servo olmasınlar?

Basit bir program yazıp aynı devre ile led yakılabilir. Çalışıyor ise devrede en azından sorun yoktur diyebilirsin. Bu aynı zamanda Pice program yazabildiğinide gösterecektir.
Bu durumda geriye yalnızca motor alternatifi kalır.

Ete


SK

#10
hocam programmer olarak PICKIT3 kullanıyorum, successful dediyse sorun yok. kullandığım motorlar bu işe uygun olduğunu biliyorum sadece 0.21 / 60deg zamanı biraz fazla, bunun dışında sorun yok. devreyi de 3 defa kontrol ettim aslında. Ben sizin projenizden önce servoları test ettim kendi yazdığım programla ancak biraz sorun oldu. sorun da su sekilde idi.

isiste potu birer birer artırdığımda derecesi (atıyorum) bi 7 derece bi 15 derece bi 3 derece gibi dönüyordu, pratikte bu kadar büüyk bi fark olmadı ancak pratikteki sorun ise şu şekilde idi. potu %0 konumuna getirdiğimde vızıvızıvızıvızı diye ses çıkartıp titriyordu, %0 dan %100 konumuna doğru yavas yavas getirisem sorun olmuyordu ancak bi adna %0 dan %100 e getirirsem 90 derece dönüyor ve %100 konumundan hafif sola (%95 civarı) çevirdiğimde bir 90 derece daha dönüp %100 e tamamlıyordu ve bunları 16F877A ile yapmıştım. Sizin programı denememin sebebi isiste bu pot değişimlerine karşı lineer bi dönüş aşısı olmasıydı.

CCS C de yazdığım program şu şekilde idi;

#include <16F877A.h>
#device adc=8
#fuses XT,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP
#use delay(clock=4000000)

//================================
void main()
{
int8 value;

setup_ccp1(CCP_PWM);

setup_timer_2(T2_DIV_BY_16, 255, 1);

setup_port_a(AN0);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);
delay_us(20);

while(1)
  {
   value = read_adc();

   set_pwm1_duty(value);
  }

}


16f877a ve CCS C yazılmış olan programla aldığım sonuç yukarıda anlattığım gibi şu şekilde idi;
Potansiyometre ile PWM üretme (konum sorunu)

devresi ise su sekilde;


benim asıl amacım ise;
Animatronic Hand

ancak bu projeyi flex sensörlerle denemeden önce adc ile kararlı bir pwm sinyali oluşturduğumdan emin olmam gerek.
yardımlarını sunabilecek arkadaşlara ve ete hocam sizden yardım rica ediyorum. yapabileceğim alternatifler veya değişiklikler neler olabilir, nasıl halledebilirim bu sorunu?

bu arada yukarıdaki videoda kullanılan servo ise;
http://www.servodatabase.com/servo/power-hd/hd-3001hb
teşekkürler / SK

Mucit23

Donanımsal Pwm kullanma, Pwm çözünürlüğü yetmiyor.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

SK

ADC den okunan değer ile PWM üretmek zorundayım. Nasıl halledeceğiz bu sorunu peki?

ete

Servo pulsları her 20 ms de bir tekrarlanmaalıdır. Her nekadar bu tekrarlamayı yapmasanda motor yine pozisyon alsada doğrusu tekrarlanmasıdır her 20 ms de bir sinyalin tekrarlanması demek senin her 20 ms de bir kesme oluşturmanla mümkündür. Zira 20 ms lik peryot frekans olarak 50 hz ye denk gelirki işlemci bu frekansta donanımsal pwm üretemez ( 4 mhz de min frekans 244 hz dir)
Bu durumda işini kesme ile halledeceksin demektir.
Servo motora 500-2000 us lik puls aralığı gerektiği için bu süre olarak  0 - 1500 us lik bir peryoda tekabül eder. O halde Adc kanalından okuyacağın 0-1023 arası değerleri 0-1500 arası değere dönüştüreceksin ve buna 500 ekleyeceksin demektir. Basic de bu işi şu formül ile yaparım,
1500/1024=1,46434875 bunu 256 ile çarparak rakamı virgülden kurtarırım. Sonuç 375 olarak bulunur. O halde sabit çarpanım 375 olacaktır. Puls=adc_ham*375)/256+500

Şimdi bir deneme yapalım. Okunan değer 511 olsun bu adc den okunacak maksimum değerin yarısıdır o halde hesap bize , puls=512 * 375/256+500=1.250 sonucunu verecektir.
Buradan elde edlecek puls süresi her kesme olıştuğunda oluşturulacak pulsin süresini sana verecektir.
Böylece pot dan okunan değeri süreye dönüştürmüş olduk.
Şimdi gelelim kesme içinde yapılacaklara,
Kesme oluşunca, servo pinini high yapacaksın, puls süresi kadar bekleyeceksin ardından aynı pini low a çekip kesmeden çıkacaksın. Böylece her 20 ms de tekrarlanan bir puls üreteci elde etmiş olacaksın.
Ete

mokan42

merhabalar hocam,
bu servo konusuyla bir süredir uğraşıyordum, (ccs c dilinde) ancak potansiyometre ile yapmak istediğimde sorunlarla karşılaştım. sizin pbp ile yaptığınız örneği (12. ders servo1) görünce incelemeye başladım ve bu programı anlamaya çalışıyorum. verdiğiniz servo1 örneğini incelerken isis'te 876 kullanmışsınız, ancak programı incelediğimde 877 ayarları yapılmış. ve ilginç tarafı kod çalışıyor isis'te. kodlara göre yerine 877 bağlamayı denediğimde ise çalışmıyor. 877'ye çevirmem için ne yapmam gerektiğini çözemedim. yardımlarınız için şimdiden teşekkür ederim.

Powered by EzPortal