Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Atmel => Konuyu başlatan: berkay_91 - 01 Ocak 2015, 12:58:30

Başlık: sürekli servo motor kontrol
Gönderen: berkay_91 - 01 Ocak 2015, 12:58:30
mrb, bu seferde elimde bulunan SM-S4303R kodlu continuous servo motoru 2 tur sağ 1 tur sola döndürmek istiyorum, eklediğim kodları daha önce sürekli olmayan (180 derecelik) normal servo motorda kullanmıştım nasıl bi değişiklik yapmam gerek


#include <avr/io.h>
#define F_CPU 8000000
#include <util/delay.h>

#define F_PWM (unsigned int) 50 // 50 Hz lik puls üretmek için
#define PRESCALAR 256
#define PWM_RESOLUTION (unsigned int) ( F_CPU / (PRESCALAR*F_PWM) )

volatile int i;

void pwm_init(){ // fast PWM mode 15

TCCR1A=(1<<WGM11)|(1<<WGM10)|(1<<COM1B1);
TCCR1B=(1<<WGM12)|(1<<WGM13)|(1<<CS12); // PRESCALAR 256
OCR1A = PWM_RESOLUTION - 1;

DDRB|=(1<<2); // OC1B PİN

}

void gecikme(int x){

for (i=0; i<=x; i++)
_delay_ms(1);

}

// (8.10^6)/256 = 31250 Hz
// (1/31250) = 32 us

int main(){

pwm_init();

while(1){

OCR1B=30; // (1x10^3)/32 = 31.25 for 1 ms (-90 derece)

gecikme(1500);

OCR1B=46; //(1.5x10^3)/32 = 46.875 for 1.5 ms (0 derece)

gecikme(1500);

OCR1B=62;  // (2x10^3)/32 = 62.5 for 2 ms (+90 derece)

gecikme(1500);

}

}

Başlık: Ynt: sürekli servo motor kontrol
Gönderen: Kabil ATICI - 03 Ocak 2015, 14:44:32
Buradaki konu bu alet nasıl bir çıkış veriyor. Analog ise işlemcinin ya adc "yavaş kalabilir" yada comparatör (işlemcinini içinde olacak) veya harici kullanılabilir.
İki değeri karşılaştırır belli bir değerin üzerinde lojik 1 verir. İşte bu geçiş noktası kullanılarak kesme oluşturalarak dönüşü sayılabilir.

Program olduğu gibi hatalı. Çünkü bu kod açısal dönüşlü servo için. Seninki tam dönüşlü...

Sağ sol dönüşü sağlamak için motorun H köprüsü denen bir bağlantıda olması gerekir. Önce bir yöne veya diğer yöne döndürme üzerinde bir çalış...
Başlık: Ynt: sürekli servo motor kontrol
Gönderen: iyildirim - 03 Ocak 2015, 15:11:49
Bu servo da pozisyona göre geri bildirim sağlayan bir pot yok.. Onun yerine iki eş direnç ile yapılmış bir gerilim bölücü kullanılır genellikle.. Yani normal bir servo da son dişlideki tırnağı kırılıp, potu çıkartılıp sonsuz dönüşlü hale getirilebilir.

Bu servo 1.5 ms duty li sinyal ile hareketsiz kalıyor. 1.5 ms den ne kadar çok uzaklaşırsanız o kadar hızlı sürekli döner.  Eğer ayrıca harici bir enkoder, manyetik sw. vs kullanmıyorsanız net olarak 1 tur sağa, sola dön demeniz zor. Çünkü geri besleme yok. Ancak deneyerek hız ve süre ile oynayıp yaklaşık bir pozisyon kontrolü sağlanabilir.

Normal servo için kullandığınız programı ise az bir değişiklikle kullanabilirsiniz.
Normal bir  servoyu döndürmek için 1.5ms yerine 1ms duty verir ve o şekilde tutarsınız. Bu servo da ise 1ms sinyali atıyorum, 500ms boyunca verip sonra tekrar 1.5ms sinyal vermeniz gerekir.
Kod fikir verir sanırım.


int main(){
   
    pwm_init();

    while(1){
        OCR1B=30; // (1x10^3)/32 = 31.25 for 1 ms (-90 derece)
        gecikme(xx); //burası servonun atanan PWM değerine bağlı bir hızda döneceği süre deneyerek bulunabilir.
        OCR1B=46; //(1.5x10^3)/32 = 46.875 for 1.5 ms (0 derece) doğru yere gelince duruyoruz..

        gecikme(1500);
       
        OCR1B=62;  // (2x10^3)/32 = 62.5 for 2 ms (+90 derece)
        gecikme( xx); //burası servonun atanan PWM değerine bağlı bir hızda döneceği süre deneyerek bulunabilir.
        OCR1B=46; //(1.5x10^3)/32 = 46.875 for 1.5 ms (0 derece) doğru yere gelince duruyoruz..
//burada orta nokta da olmalı       

        gecikme(1500);
       
        OCR1B=62;  // (2x10^3)/32 = 62.5 for 2 ms (+90 derece)
        gecikme(2 * xx); //burası servonun atanan PWM değerine bağlı bir hızda döneceği süre deneyerek bulunabilir.
        OCR1B=46; //(1.5x10^3)/32 = 46.875 for 1.5 ms (0 derece) doğru yere gelince duruyoruz..
//       
        gecikme(1500);
       
    }
   
}


Başlık: Ynt: sürekli servo motor kontrol
Gönderen: berkay_91 - 03 Ocak 2015, 17:14:55
sağolun tüm söylenilenleri deniycem