sürekli servo motor kontrol

Başlatan berkay_91, 01 Ocak 2015, 12:58:30

berkay_91

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);
		
	}
	
}

Kabil ATICI

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ış...
ambar7

iyildirim

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);
        
    }
    
}

berkay_91

sağolun tüm söylenilenleri deniycem