STM32F407 Cortex M4 şamataları

Başlatan bunalmis, 16 Ekim 2011, 17:14:50

Klein

Teorik olarak 4 motor aynı devirde dönerse  , quadrocopter dengede kalır.
Ancak bunun olabilmesi için:
Tüm motorların tamı tamına aynı devirde dönmesi, tüm kolların pervane motor ve diğer aksamlarının tamı tamına aynı ağırlıkta olması ,pervanelerin kusursuz bir şekilde aynı geometriye sahip olması , ağırlık merkezinin hatasız olması vs.. gibi şartlar gerekir.
Bunun yanında rüzgar, basınç farkları gibi etkenlerin hiç olmaması gerekir. 

Pratikte bu şartlar hmen hemen hiç karşılanmaz. Bu yüzden  tüm kolların farklı devirde dönmesi gerekir.

cooldoubtless

elbette öle hocam hemen hemen teorik hiç bir bilgi pratiği tutmaz ama yakın olacağı kesindir..en azından 1.motorun %50, 2.sinin %25, 3. sünün %12.5 ,4.sünün %12.5 luk duty cycle ile kontrol ettiğinizde o quadrotoru dengede tutamayacağınız kesindir..yoksa zaten geri besleme, bozucu etkiler için ileri besleme gibi kavramlara kontrolde ihtiyaç kalmazdı :)

EMP_Otto

Merhaba arkadaslar.Kitle ilgili sorunum devam ediyor.Klein hocam paylaşmış lduğunuz programda çalıışmadı kitte.Fakat keil ile biri,likte gelen blinky programı sorunsuz çalışıyor :'(
Yardımcı olabilirseniz çok sevinirim.
Bu işler zordur,özveri ister...

Klein

Keil'i kaldırıp 4.22 versiyonu kurup bir dener misin?

cooldoubtless

#1009
TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles.
   
    In this example TIM3 input clock (TIM3CLK) is set to 2 * APB1 clock (PCLK1),
    since APB1 prescaler is different from 1.   
      TIM3CLK = 2 * PCLK1 
      PCLK1 = HCLK / 4
      => TIM3CLK = HCLK / 2 = SystemCoreClock /2
         
    To get TIM3 counter clock at 28 MHz, the prescaler is computed as follows:
       Prescaler = (TIM3CLK / TIM3 counter clock) - 1
       Prescaler = ((SystemCoreClock /2) /28 MHz) - 1
                                             
    To get TIM3 output clock at 30 KHz, the period (ARR)) is computed as follows:
       ARR = (TIM3 counter clock / TIM3 output clock) - 1
           = 665
                 
    TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%
    TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5%
    TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25%
    TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5%



ARKADAŞLAR BU AÇIKLAMALAR STM NİN PWM UYGULAMASINDAN...ŞİMDİ BU AÇIKLAMALARA BAKIP NEYİN NE OLDUĞUNU ANLAYAN VAR MI YOKSA BENDE Mİ SORUN VAR?:) 3 FARKLI DENKLEM VAR AMA ÇOK BİLİNMEYEN VAR GİBİ GÖZÜKÜYOR..DİYELİM Kİ %50 PWM İSTİYORUM..TIM3CLK=84MHz onu biliyoruz..O halde..
                  Prescaler = (84000000 / TIM3 counter clock) - 1
                   ARR = (TIM3 counter clock / TIM3 output clock) - 1
                   TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%

bu 3 denklemi nasıl çözebilirim burda TIM3CLK dışında başka bilinen bişey mi var da ben göremiyorum?
       

mesaj birleştirme:: 26 Ağustos 2012, 00:47:21

lütfen biri cevap verebilir mi?  ???

EMP_Otto

#1010
Tamam hocam denicem :) 
ACaba Keil 4.22 linki var mı??
Bu işler zordur,özveri ister...

Klein

@EMP_Otto
Keil linki sitede vardı. Keil kurulumu ile ilgili bir başlık vardı. oradaolabilir.

@cooldoubtless
Verdiğin açıklamalardan ben de bir şey anlaadım.
Amaç PWM meselesini halletmek ise,  daha önce bu başlıkta ve OOP başlığında PWM ile ilgili örnekler ve açıklamalar vermiştim.
Prescaler bildiğin gibi bölücü.
ARR  timerin yeniden yükleneceği nokta. Eğer ARR için 1000 değeri verdiysen ,  counter 1000 olduğunda  counter resetlenir, pwm çıkışın 0 olur.  CCRx registeri ise, compare değeridir. Yani duty-cycle oranını belirler.   Eğer ARR 1000 ise,  %50 oran almak için CCRx registerine 500 değeri yüklemelisin.

cooldoubtless

Hocam evt ben de o şekilde biliyorum ancak uygulamaya gelince kafa karıştıran çok şey oluyor demekki tam oturmamış mantığıma..Bunalmış hocamızın yaptığı pwm örneğinden aldığım bir kısımı sormak istiyorum...


RCC->APB1ENR|=0x00000020;       // Timer7 CLK'u aktif edelim (84 Mhz)
     TIM7->CR1=0x0080;               // Otomatik Reload
     TIM7->PSC =839;                 // Prescaler degerimiz 839, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) 84E6 / (840) = 100 KHz
     TIM7->ARR =1;                   // Counter, Decimal 1 olunca basa donsun. Her 20 mikrosaniye de bir timer int olusacak.
     TIM7->DIER=0x0001;              // Update Int enable
     NVIC->ISER[1] = 0X00800000;     // NVIC de Timer 7 interrupta izin verelim
     TIM7->CR1|=0x0001;              // Counter Enable
     
}



burada arr 1 olduğunda başa dönsün derken sadece 0 dan 1 e geçiş süresi var demektir..yani 1/100 Khz den 10us oluyor..ama bunalmış hocamız 20 us demiş..hatayı nerede yapıyorum acaba?:s

XX_CİHAN_XX

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;						//Extm
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOE, &GPIO_InitStructure);


Portu 100MHz e kurduktan sonra

while(1)			
		{
			  GPIO_SetBits(GPIOE, GPIO_Pin_4);	//EXTM			
			  GPIO_ResetBits(GPIOE, GPIO_Pin_4);	//EXTM
		}

Böyle bir döngü yapıp skopla çıkışı gözlemlediğimde düşenlar daha uzun (54nS) yükselen kenarlar daha kısa (42nS) sürdü.

while(1)			
		{
			  GPIO_ResetBits(GPIOE, GPIO_Pin_4);	//EXTM			
			  GPIO_SetBits(GPIOE, GPIO_Pin_4);	//EXTM
		}

Burada ise tam tersi oldu.
Burada aklıma takılan şey iki komut arasındaki değişim süresi daha kısa olması gerekmez miydi?

Ayrıca bu sürelere bakarsak hesaplanan frekans yaklaşık 13.157Mhz çıkıyor.
En başta set edilen 100MHz den bu frekans nasıl çıkıyor bununla ilgili bir bağıntı var mı?

Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

pisayisi

GPIO_ResetBits ve  GPIO _SetBits komutları st firmware library komut setine ait dolayısı ile pekçok alt komut işletiliyor bu satırlarda, çıkıştaki frekans ta bu gecikmelere bağlı olarak kestirilemeyebiliyor. En güzeli doğrudan asm ile hatta dma kullanarak port çıkışlarını kontrol ederseniz daha olası üst frekanslara çıkmak mümkün olabilir.

       while(1)         
        {
              GPIO_ResetBits(GPIOE, GPIO_Pin_4);   //EXTM         
              GPIO_SetBits(GPIOE, GPIO_Pin_4);   //EXTM
        }
Murat

XX_CİHAN_XX

Alıntı yapılan: pisayisi - 28 Ağustos 2012, 13:28:30
GPIO_ResetBits ve  GPIO _SetBits komutları st firmware library komut setine ait dolayısı ile pekçok alt komut işletiliyor bu satırlarda, çıkıştaki frekans ta bu gecikmelere bağlı olarak kestirilemeyebiliyor. En güzeli doğrudan asm ile hatta dma kullanarak port çıkışlarını kontrol ederseniz daha olası üst frekanslara çıkmak mümkün olabilir.

       while(1)         
        {
              GPIO_ResetBits(GPIOE, GPIO_Pin_4);   //EXTM         
              GPIO_SetBits(GPIOE, GPIO_Pin_4);   //EXTM
        }

Haklısınız st firmware kütüphanesindeki ResetBits ve SetBis fonksiyonlarının içine baktım.
Parametreleri kontrol eden assert_param fonksiyonları ile gereksiz yere kodu yavaşlatıyor.
Bu fonksiyonları kullanmak yerine kodu şu şekilde değiştirdiğimde olması gereken zamanlama ile karşılaştım.
GPIOE->BSRRL = GPIO_Pin_4;
				GPIOE->BSRRH = GPIO_Pin_4;


Bu assert param fonksiyonları st library deki tüm fonksiyonlarda var hıza önem veren arkadaşların kendi kütüphanesini oluşturmasını gerekirse asm kullanmasını birkez daha hatırlatalım :)
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

cooldoubtless

sonuç olarak cevap verildi mi anlayamadım 10us mi 20us mi?

XX_CİHAN_XX

Yaklaşık 8nS ye kadar inebildiğini gördüm.
Yani yaklaşık 100Mhz i buldum. Nasıl mı?
ST nin hazırladığı fonksiyonları kullanmayarak...

Alıntı yapılan: XX_CİHAN_XX - 28 Ağustos 2012, 14:05:41
Bu assert param fonksiyonları st library deki tüm fonksiyonlarda var hıza önem veren arkadaşların kendi kütüphanesini oluşturmasını gerekirse asm kullanmasını birkez daha hatırlatalım :)
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Yuunus

#1018
Peki CIHAN, GPIOE->ODR=0x10 yapsak "PE_4 High"
BSRR mi yoksa ODR mi daha hızlı deneme şansın var mı?

XX_CİHAN_XX

Alıntı yapılan: digiman - 29 Ağustos 2012, 00:56:17
Peki CIHAN, GPIOE->ODR=0x10 yapsak "PE_4 High"
BSRR mi yoksa ODR mi daha hızlı deneme şansın var mı?

Denedim hız olarak hiç bir fark yok.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.