Ynt: 6 ayaklı hareket platformu

Başlatan muhittin_kaplan, 20 Ağustos 2013, 15:48:41

LukeSkywalker

evet sitenizde asm'yi işin içerisine katarak hassas bir hesaplama yapmışsınız.
saygılar.

LukeSkywalker

muhittin bey, z'nin anlattığı mantık aşağı yukarı şöyle;
char duty_0=5;
char duty_1=10;
char duty_2=15;
char duty_3=20;
char duty_4=25;

char cnt=0;
void InitTimer0(){
  OPTION_REG     = 0x80;
  TMR0           = 13;   // 3.2 us kesme de harcandığı için 96.8us lik bir kesme kuruldu.
  INTCON         = 0xA0;
}


void main() {
InitTimer0();
trisb=0;
portb=0xff;
while(1)
        {
         if(cnt>=duty_0)portb.f0=0;
         if(cnt>=duty_1)portb.f1=0;
         if(cnt>=duty_2)portb.f2=0;
         if(cnt>=(duty_3))portb.f3=0;
         if(cnt>=(duty_4))portb.f4=0;
         if(cnt==199){cnt=0;portb=0xff;}
        }
}

void Interrupt(){
    TMR0IF_bit   = 0;
    TMR0         = 13;
    cnt++;
    //portb.f0=~portb.f0;
}


Tabi bu PIC ile yapmış olduğum eski bir 5 kanal servo kontrolcüsünün bir parçası. Hızlı bir işlemci ile çok fazla sayıda servoyu istediğiniz gibi kontrol edebilirsiniz. Burada timer 96.8 us'ye kurulu. Gecikmeler ile birlikte 100uS ediyor tam olarak (20MHZ osilatör). Mesela Duty_0  değeri 15 ise 1,5 ms'lik pals uygulanıyor 1. servoya.

Tanrın Oğlu

yazılımsal pwm e tamam ama işlemci başka şeyler yapması gerekirken, sürekli kesilmeler olmayacakmı? mesela yazılım şuan timer kesmesi yüzünden sürekli kesilmelere uğramakta. öyle değilmi?

LukeSkywalker

#63
100us'de bir kesmeye dallanıyor. Başka şeylerle uğraşmaktan kastınız nedir?  MEsela 6 ayaklı bir böcekte her bacakta 3 servodan toplam 18 servo eder. Ya 18 PWM kanalına sahip bir mikrodenetleyici kullanacaksınız ya da yazılımsal PWM kullanacaksınız.

Tanrın Oğlu

şunu demek istedim. işlemci işlem yaparken sürekli (sizin örneğinize göre 100u sn de bir, diğerini kaça kurdular bilmiyorum) kesmeye ile yaptığı işi bırakıp, timer int. ile çalışıp, ardından yeniden kaldığı işleri yapmaya devam ediyor. yaptığı işin kesilmesi ilerleyen zamanlarda muhittin e sorun yaratırmı ki? bu soft pwm işlemcinin çalışmasını nasıl etkiler?

LukeSkywalker

#65
Yaptığı işlemler eğer zamanlaması çok önemli işler ise sorun yaratabilir. Zamanlaması önemli işler de sonuçta bir while döngüsü içerisinde yapılmamalı. O tür işler için de ayrıca kesmeler kurulup öncelik ataması yapılabilir. Mesela uart üzerinden veri alınacaksa uart kesmesi kullanılabilir.  Bir de eğer buradaki 100uS'lik kesmenin süresi 500 us'ye ayarlanırsa o zaman servonun hareket edeceği açılar o kadar azalır. Ne kadar kısa sürelik kesmeler kurulursa daha hassas pozisyonlama yapılabilir.

Tanrın Oğlu

birde şu kısmı;

while(1)
        {
         if(cnt>=duty_0)portb.f0=0;
         if(cnt>=duty_1)portb.f1=0;
         if(cnt>=duty_2)portb.f2=0;
         if(cnt>=(duty_3))portb.f3=0;
         if(cnt>=(duty_4))portb.f4=0;
         if(cnt==199){cnt=0;portb=0xff;}
        }

interrupt rutini içersinde halletmeniz, daha mantıklı olmazmı?

LukeSkywalker

#67
5 motor için evet interrupt rutini içerisinde yapılabilir. Fakat motor sayısı artınca 100 us'lik kesme interrupt rutini bitmeden tekrar oluşabilir. Bu sebepten sinyalde kaçırmalar meydana gelir. Bunu önlemenin en güzel yolu hızlı işlemci kullanıp sizin de dediğiniz gibi kesme rutini içerisinde halletmek.

z

Yazılımsal PWM rutinini interrupt rutini içine alırsanız ana programda dilediğiniz işi yapar ve PWM rutininin zamanlamasına herhangi bir etkiniz olmaz.
PWM rutinini yazdığınız interrupt rutinine en yüksek önceliği verirseniz bu durumda diğer interruptlar da PWM zamanlamasına müdahalede bulunmaz.
PWM rutinini çok çok çok optimize etmelisiniz. Aksi takdirde diğer interruptların cevaplanması gecikir.

Olmaz, bulunmaz iddiları tamamen işlemcinin "interrupt latency" yani interrupta verdiği gecikme değeri ile alakalı.

Eğer 72Mhz gibi uçuk bir hızda koçan işlemcide 20ms peryoda sahip 100 çözünürlüklü bir pwm yazılımı yazarsanız her şey ihmal edilebilir hale gelir.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

LukeSkywalker

Yani.

Ana program içindeki kod 100us yanında çok küçük sürelerde kalabilir.

z

Her 100 mikrosaniyede bir int üretilirse ve int rutinini 10 mikrosaniyede terkedebilirsen 90 mikrosaniye  sana kalmış olur. Yani işlemcinin %90 ı senin demektir. Böyle durumlarda interrupt rutininde fazladan kullanılmış her fazla komut geri kazanıldığında bu komutların süresi kar hanesine (ana program vs tarafına) geçer.

Bir de şöyle bir durum var. Diyelimki 64 tane servo kumanda edeceksin ve CPU nun donanımı buna izin vermiyor.

Sadece ve sadece yazılımsal PWM ile uğraşan bir işlemci kullan. Herhangi bir iletişim kanalı ile asıl işlemcinden Duty değerlerini talep etsin. Yada tersine Duty değerlerini beklesin.

Eskiden işlemcilerin içinde her şey yoktu. LCD bağlar gibi işlemciye timer, CIA, PIA, PWM, Encoder gibi birimleri harici olarak bağlardık.

Bu tip projelerde CPLD gibi çipleri kullanmayı bilmek avantaja dönüşür. ARM çipine bir çip yapıştırırsın platformun bir anda o işe özel hale gelir.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tanrın Oğlu

cpld bilmeyenler için int osc si ve uart ı olan ucuz bir işlemci seçip onu sadece soft pwm için kullanabilirler. uart ile hızlı bir şekilde bilgiler işlemciye yazılabilir. böyle ana işlemcide kamera, usb, rf vs ağır yongalar rahatlıkla kullanılabilir. (ben olsam cpld yi tercih ederdim tabi)

muhittin_kaplan

pwm için ayrı bir işlemcimi kullanayım. mantıklı ama rtos (CoOS) felanda kullanacağım kontrolde. nasıl olur?

Tanrın Oğlu

ben işlemcinizi olabildiğince rahatlamak için söyledim bunu. bir kartta birden fazla işlemci olması taraftarı değilim. (bu yünden ben cpld kullanırdım)
ana işlemci ilede yaparsınız. kesinlikle yapılamaz, olamaz demiyorum. mesela 12f675 ile pal video sinyelide üreten kimseler var ama madalyaları yok :) ben olsam ana işlemciyi olabildiğince rahatlatmaya çalışırdım ki ileride sıkıntı yaşamıyayım.

z

Alıntı yapılan: muhittin_kaplan - 10 Eylül 2013, 15:37:57
pwm için ayrı bir işlemcimi kullanayım. mantıklı ama rtos (CoOS) felanda kullanacağım kontrolde. nasıl olur?

En son çare olarak 2. işlemciyi düşün ancak senin ihtiyacın yok gibi görünüyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com