CCS C de pwm ile servo kontrolü

suat35160

Üye
Katılım
17 Kas 2008
Mesajlar
11
Puanları
1
merhaba arkadaşlar,

yapmak istediğim çalışmayı önce anlatayım sizlere;
pot lar la servo kontrolü yani servoyu istenilen açıda döndürebilmeyi sağlayabilmek ama bazı eksiklerimden dolayı yapamadım nasıl yapacağıma dair siz değerli arkadaşlarımdan yardım bekliyorum...
16F877 20Mhz'lik PIC kullanıyorum

yapmaya çalıştığım deneme de ise öyle olmuyor. Pot ile sadece çok belli döndürmeleri yapıyor (örn: -90derece , -79.9derece , +90derece başkada bi döndürme sağlayamadım) denedim uğraştım ama bir türlü çözüm üretemedim linkte isis devresi , hex dosyası ve C source file mevcut yardımcı olan olursa çok sevinirim...
 
servoyu 360 derece döndürmek istiyorsun sanırım.İnternetde "servo hackleme" diye arat
videoları izlersen nasıl yapıldığı hakkında bilgi sahibi olursun.
 
servoyu 360 derece döndürmek istiyorsun sanırım.İnternetde "servo hackleme" diye arat
videoları izlersen nasıl yapıldığı hakkında bilgi sahibi olursun.

hayır 360 derece döndürmek istemiyorum sadece servoyu döndürmeyi pot ile yapmak istiyorum
 
Donanımsal pwm ile rc servo motor sürmeniz zor. Ya timer kesmesi kullanıcaksınız yada programda bekleme yaparak bu frekansı üretmeniz gerekiyor. Örnek çıkış portunu high yapıp 1ms bekle çıkışı low yap 19ms bekle gibi. Aşağıda servonun çalışma prensibi var.
 

Ekli dosyalar

  • Hobi Servo Sürelim (Bilgisayar Kontrollü).zip
    388.5 KB · Görüntüleme: 76
Donanımsal pwm ile rc servo motor sürmeniz zor. Ya timer kesmesi kullanıcaksınız yada programda bekleme yaparak bu frekansı üretmeniz gerekiyor. Örnek çıkış portunu high yapıp 1ms bekle çıkışı low yap 19ms bekle gibi. Aşağıda servonun çalışma prensibi var.

teşekkürler. ama değeri analog olarak okutturup, 0-255 arasında okunan değeri 0.6-2.6 arasına indirgeyip yani giriş 0 iken değer 0.6, giriş 255 iken değer 2.6 olarak ayarlarsam ( değer dediğim görev periyodu ) ve bunu da pwm üretirken kullanırsan pot'un değerine göre ilgili açıya döndürmüş olmam gerek ama yapamıyorum bunu bi türlü
 
Programda şöyle bir ekleme yapman gerekabilir. Her döngüde 1 defa servo için sinyal üretiliyor. ADC okuma için bir zaman gerekiyor ve bu nedenle servoya gönderilen 18 ila 19ms arasındaki low sinyalinde değişmeler oluyor.
Bunun için bir döngü komutu ile adc okudukadan sonraya servoya sinyali birden fazla tekrarlatarak göndererirsen sorun çözülebilir.
 
Programda şöyle bir ekleme yapman gerekabilir. Her döngüde 1 defa servo için sinyal üretiliyor. ADC okuma için bir zaman gerekiyor ve bu nedenle servoya gönderilen 18 ila 19ms arasındaki low sinyalinde değişmeler oluyor.
Bunun için bir döngü komutu ile adc okudukadan sonraya servoya sinyali birden fazla tekrarlatarak göndererirsen sorun çözülebilir.

ccs c de yeni olduğum için bazı söylediklerini tam anlayamıyorum sorun çözmeleri yapabilecek kadar tam bilmiyorum öğrenme aşamasındayım şu an msn/hotmail/gmail adresini verirsen sevinirim. iyi günler
 
teşekkürler. ama değeri analog olarak okutturup, 0-255 arasında okunan değeri 0.6-2.6 arasına indirgeyip yani giriş 0 iken değer 0.6, giriş 255 iken değer 2.6 olarak ayarlarsam ( değer dediğim görev periyodu ) ve bunu da pwm üretirken kullanırsan pot'un değerine göre ilgili açıya döndürmüş olmam gerek ama yapamıyorum bunu bi türlü

burada ben anlatmıştım zaten nasıl olacağını.
adc okuma için adc_read() ı kullanarak 0-255 arasındaki veriyi almış olacaktın.
daha sonra bu veriyi 0.6 ile 2.6 arasında indirgemek için bir formül türetecektin. yani 0.6 ve 2.6 dediğim, ms olarak değerlerdi. buna da us olarak 600us ve 2600 us diyebilirdin.

bu aralıkta değer elde etmek için de analog değerini şu şekilde formülize edebilirdin en basitinden,

a = ( potval * 10 + 600 );

potval dediğim, ölçülen analog değer, a dediğim ise us cinsinden görev periyodu oluyor. burada deier, 600us ile 3150 arasında oluyordu. sen de onu

IF (a > 2600)
{
a = 2600;
}

bu şekilde kontrol ettirip maksimum değerini 2600 us olarak sabitleyebilirdin. sonuç, 600us ile 2600us arasında değer olurdu. ve toplam periyodu 20ms=20000us olarak belirleyince, a değeri kadar ( delay_us ile ) 1, periyot-a değeri kadar da 0 gönderebilirdin. bunu da yukarıda arkadaşların söylediği gibi mesela 50 defa gönderebilirdin, o da şöyle olurdu. ( mesela PORTA.0 çıkışımız olsun )

for(i=0; i<=50; i++){
output_high (PIN_A0);
delay_us (a);
output_low (PIN_A0);
delay_us (periyot - a);
}

böylece istenen işlem gerçekleşmiş olurdu ve pot'un değerine göre işlem yapılırdı. tabi formül daha da iyi hale getirilebilinir ama basit olarak bu şekilde kullanmıştım ben.

anlattığım şey de buydu yukarıda. bu kadar da zor değil.
 
Bildiğimiz gibi 16f877 de 8 adc kanalı var. Bu yöntemle ayrı ayrı 8 potla 8 servoyu kontrol edebilir miyiz?

Sayın mberkanbicer ilk önce size dargınım önceden selam verdim soru sordum cevap vermedin :D
Bu geniş açıklama için çok teşekkür ederim.
Denemelerime devam etmekteyim mutlaka orta yolu bulacağım yardımlarınız için teşekkür ederim.
 
zaten senin yazdığın mesaj, benim facebooktan gönderdiğim mesajdı :)
ve onun açıklanmış halini de buraya yazdım. bir fark yok yani ikisi de aynı şey.

8 kanaldan veri alır istediğin kadar servo kontrol edebilirsin ancak 4 tane servo için 24 farklı kombinasyon yazmıştım yazılımsal pwm için. uzun olmuştu. 8 tane için artık sen düşün ne kadar yazman gerektiğini.

ne kadar az servo, o kadar kısa kod olur. ama kesme falan kullanarak yapabilirsin.
 

Forum istatistikleri

Konular
129,806
Mesajlar
930,280
Kullanıcılar
452,608
Son üye
murat620

Yeni konular

Geri
Üst