Ynt: 6 ayaklı hareket platformu

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

gumush

#45




Hikmet Gumus  izmir

z

#46
Alıntı yapılan: muhittin_kaplan - 06 Eylül 2013, 10:25:55
@Z
hocam peryot 20ms olacak yani her20ms de bir duty yi göndermem gerekiyor. duty 1-2 ms aralığında olmak zorunda.
max pwm(~>2ms) de, peryoda en fazla 10 adet sığıyor.

Örneğin şöyle yapacaksın.

Bir timer her 200us de bir int üretecek.
Peryod 20ms olduğuna göre max duty 100 olacak.

Int rutininde 16 adet Duty değişkeninin içeriğini her int oluştuğunda bir artan 100 olduğunda sıfırlayan Soft PWM sayıcı içeriğiyle mukayese edeceksin.
Küçük olanları 0, büyük olanları da 1 olarak Portun ilgili pinlerinden çıkacaksın.

16 dan fazla pwm gerektiğine göre 2. bir port daha kullanacaksın. Bu şekilde 32 pwm de yaparsın 64 pwm de.

Int rutinini ne kadar iyi yazarsan işlemcinin pwm yükünü o kadar hafifletirsin.

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

muhittin_kaplan

Hocam daha önce verdiğiniz örneği inceledim. ama pek birşey anlamadım işin açıkcası birde 200us de kesme sistem kaynakları açısından nasıl olur ?

muhittin_kaplan


Kabil ATICI

Sanki ayağın açısını ölçmek için oyun çubuğu bağlamışlar.
ambar7

z

#50
Alıntı yapılan: muhittin_kaplan - 06 Eylül 2013, 16:16:22
Hocam daha önce verdiğiniz örneği inceledim. ama pek birşey anlamadım işin açıkcası birde 200us de kesme sistem kaynakları açısından nasıl olur ?

Hocam 16 kanal pwm (72Mhz CM3 islemci icin) denemek istersen http://www.cncdesigner.com/wordpress/?p=3147

Islemciye ne kadar yuk getiriyor dersen lafi bile olmaz ama sen cevap ver. Scopla olcebilirsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan


Kazım

Hocam zevkle takip ediyorum. Ayrıca modellemede oldukça güzel..Gelişmeleri bekliyorum kendi adıma. Heyecanınızı paylaşıyorum ( Bir hobici olarak ).

muhittin_kaplan


muhittin_kaplan

@Z
Hocam Şu Yazılımsal PWM oluşturmanın Mantığından Bahsedermisiniz
(Malum Zor Öğrenen Biriyim.  :-[ )

z

ARM dersleri sirasinda pwm ornegi vermistim. Asagiya da tekrardan kopyaliyorum.
void TIM7_IRQHandler()
{
unsigned short d,i,j;
 
    TIM7->SR=0;                       // Timer Int Flagini silelim 
    d=GPIOD->ODR & 0x00FF;
    CNTR++;
    if(CNTR>=1000)
      {
        CNTR=0;
        for(i=0;i<8;i++) 
         { 
           if(PWM[i]>1000) PWM[i]=1000;
           SRG[i]=PWM[i]; 
         }  
      }
    j=0x8000;
    for(i=0;i<8;i++)
      {
       if (CNTR>=SRG[i]) d|=j;
       j=j>>1;
      } 
    GPIOD->ODR=d;
} 

int main()
{
    
    PWM[0]=100;
    PWM[1]=200;
    PWM[2]=300;
    PWM[3]=400;
    PWM[4]=500;
    PWM[5]=600;
    PWM[6]=700;
    PWM[7]=800;
    
    while(1);
}


CNTR degiskenimiz, her timer int gelisinde yazilimsal olarak 1 artirilan ve peryod degerimize ulastiysa icerigi sifirlanan PWM counterimiz yerine kullaniliyor.

Pwm cikisimizi, PWM registerimize yazilan degerin CNTR'nin o anki degerinden buyuk olup olmadigina bakarak belirliyoruz.

Eger buyukse pwm cikisi 1 degilse 0 diyoruz. (Istersen tersini ver sadece pwm sinyalini invert etmis olursun)

En basit yol bu. Verdigim ornekge iki  ozellik ekledim.

Normalde PWM degerinizi gelisiguzel bir anda degistiremezsiniz (degistirmemelisiniz). Eger degistirirseniz o anki pwm sinyali bozulur. Bu nedenle golge registerler tanimladim.

Siz istediginiz pwm degerini CNTR ile karsilastirmada kullanilan pwm registerine degil golge registere yaziyorsunuz. CNTR degeri 0 oldugunda golge register icerigi PWM register icerigine kopyaliniyor. (Tabiki burada bahsettigim registerler aslinda degiskenler)

Boyle olunca siz ne kadar pwm degerini degistirirsenin degistirin pwm yazilimi sadece CNTR=0 oldugunda gecerli olan degeri kullaniyor. Boylece pwm sinyali, pwm degerinin gelisguzel zamanlarda degistirilmesinden bozulmaya ugramiyor.

Yazilima ekledigim bir diger ozellik ise tum pwm cikislarinin ayni fazda olmasi. Bunu da soyle hallettim.

Her bir pwm degeri icin o anki PWM cikisimizin 1 mi 0 mi olacagini buluyor ama bunu porta yazmiyorum.
Porta yazma isini tum pwm sinyallerinin ne olmasi gerektigini buluyor ardindan hepsini tek hamlede porta yaziyorum.

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

LukeSkywalker

@z işte tam burada da her komutun ne kadar süreye ihtiyaç duyduğu kesin olarak hesaplanmalı. Çünkü çok hassas bir iş bu servo işi. 100us gecikme herşeyi alt üst eder. Timer'a yüklenecek değer iyi hesaplanmalıki diğer komutlarda geçen süre de göz önünde bulundurulmalı.

z

16 yada 32 tane 20ms lik peryoda sahip soft PWM kodlarini 72 Mhz CM3 islemcide sorunsuz kosturamazsak ayip olur degilmi?

http://www.cncdesigner.com/wordpress/?p=3147 de verdigim kodlari denemelisin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

Evet Ayıp Olur, Anlarsam Bir Ne Yaptığını Koşturacağım Deli Taylar gibi.

z

Hocam neyini anlamadim.

Kendi algoritmani kurarak  2 cikisli (2 kanal) soft pwm kodu yazip yayinlarmisin?

3 asagi 5 yukari ayni kodlari yazacaksin.

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