stm32f407 pwm frekansını ayarlayamıyorum

Başlatan ttg, 13 Ekim 2013, 20:05:46

Klein

Tamam. Gayeti güzel.  Bu durumda APB1 bus hızın 42Mhz. CLK hızın da 84MHZ.

Ben sorunu tam olarak anlayamadım.
Prescaler = 840 (Hesap kolaylığı olsun diye  -1 olması gerektiğini ihmal adiyorum.)
ARR = 2000 iken, 50HZ alamıyor musun?

ttg

Hocam malesef alamıyorum, ARR'yi 4000 yapınca ancak alabiliyorum.

Ayrıca Muhittin Kaplan'ın kodu ve benim 4000 yaptığımdaki kodların her ikisi de motoru 90 derece kadar ancak döndürüyor. Motor 180 derecelik. %5'tir %10'dur demeden sınırları arttırınca %5 ile %30 arasında 180 dereceyi bulabildim. Tabi yaptığım iş ne kadar sağlıklı bilmiyorum.
4 Buçuk Saatlik Python Eğitimi [Ücretsiz] www.youtube.com/gryyldrm

muhittin_kaplan

Simdi problemi ortaya tam koyalim.  Sen 50hz aliyor ama motoru tam donduremiyormusun?
Eger oyleyse freq degil duty ile oynaman gerekir. Birde olcecek birsey lazim sinyali

ttg

Ölçme işini birkaç gün sonra ancak yapabilirim, tatil günü fakülteye giriş yapamıyorum.

Ben duty cycle ile oynayıp bir şekilde kodu çalıştırıyorum.

Lazım olan şey ne yaptığımızı anlamam. 168 MHz'de nasıl çalıştığını hala anlamadım TIM3'ün, APB1 max 42 mhz, tim3 de max 84 mhz iken 168 de çalışıyor. Hesapları 168'e göre yapınca 50 Hz frekans elde ediyorum, servo çalışıyor.

Servo için gereken %5-%10 arası Duty cycle olayı işi bozuyor.

Çalışan kod için değerlerim şunlar:
  TIM_TimeBaseStructure.TIM_Period = 3999;
  TIM_TimeBaseStructure.TIM_Prescaler = 83;


Bu değerlere göre ARR=4000 ve servo motor sürmek için 200 ile 400 arası değer girmem gerekiyor.

Sorun burda başlıyor. 200 ile 400 arası değer girersem 90 derece dönüyor servo. 120 ile 480 arası gibi bir maksimum aralık belirledim deneye deneye. Bu aralıkta 180 dereceyi ancak alabiliyorum.

Yani yapmak istediğim dönüşü aldım ama anlamayınca bana bir faydası yok, projeyi öğrenme amaçlı geliştiriyorum çünkü.

Son olarak da dünden beri oldukça zamanınızı aldım, ilgilendiğiniz için çok teşekkür ederim.
4 Buçuk Saatlik Python Eğitimi [Ücretsiz] www.youtube.com/gryyldrm

Klein

#19
Muhtemelen Osilatör ayarlarında bir sorun var. 
Eğer CooCox kullanıyorsan; CooCox tarafından otomatik oluşturulan startup dosyasında SysInit()   çağrıı yok.Bu yüzden osilatör internal osilatör olarak kalıyor.
Bu fonksiyonu senin çağırman gerek.

1- Main rutininin başında  SystemInit()  fonksiyonunu çağır.
2- "System_stm32f4xx.h" dosyasında aşağıdaki satırdaki 25 sayısın 8 olarak değiştir. ( Kitin üzerindeki osilatör 8 MHz)
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M      25

3- "stm32f4xx.h" dosyasında aşağıdaki satırdaki 25000000 değerini 8000000 olarak değiştir.
#if !defined  (HSE_VALUE)
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */


Internal osilatör  16Mhz.  @Muhittin senin örnekte de muhtemelen osilatör internal. 

Üşenmedim test ettim.  aşağıdaki ayarlarla frekans  50.00Hz.
int main(void)
{
  SystemInit();
  TIM_Config();

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 1999; // 200000 Hz/4000 = 50 Hz
  TIM_TimeBaseStructure.TIM_Prescaler = 839; // 84E6/420 = 200000 Hz
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_Pulse = 1000;

  TIM_OC4Init(TIM3, &TIM_OCInitStructure);

  TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
  TIM_ARRPreloadConfig(TIM3, ENABLE);

  /* TIM3 enable counter */
  TIM_Cmd(TIM3, ENABLE);

  while (1)
  {}
}

ttg

#20
Evet CooCox ile çalışıyorum, ağzınıza sağlık hocam sorunumu çözdünüz.
Tam system_stm32f4xx.c de update clock fonksiyonunu çağırıp tmp değişkeninin 0 olduğunu farketmiştim, mesajınızı da okuyunca anladım, o sıfırken internal osilatör çalışıyormuş. Dediklerinizi denedim çalıştı.

Tekrardan çok çok teşekkür ederim. Sanırım CooCox ile anlaşmak için oldukça zaman harcamam gerekecek:)


mesaj birleştirme:: 14 Ekim 2013, 17:28:13

Benden sonra sorunu yaşayacak olanlara ek olarak yazayım:
Sizin kodunuza ek olarak duty cycle hassasiyetini artırmak için ben şu şekilde kullanıyorum:
  TIM_TimeBaseStructure.TIM_Period = 19999;
  TIM_TimeBaseStructure.TIM_Prescaler = 83;
4 Buçuk Saatlik Python Eğitimi [Ücretsiz] www.youtube.com/gryyldrm

muhittin_kaplan

Hocam
Coocox un oluşturduğu dosyada HSE olarak 25Mhz ayarlanmış, bizim kart 8mhz bu işlemi düzeltmek için

https://www.picproje.org/index.php/topic,48120.0.html.



ve doğrusun Klein Hocam systeminit i çağırmamışım.

Klein

Alıntı yapılan: muhittin_kaplan - 14 Ekim 2013, 18:00:07
Hocam
Coocox un oluşturduğu dosyada HSE olarak 25Mhz ayarlanmış, bizim kart 8mhz bu işlemi düzeltmek için

https://www.picproje.org/index.php/topic,48120.0.html.



ve doğrusun Klein Hocam systeminit i çağırmamışım.
Örneklerde HSE değeri gibi bazı değerleri yeniden tanımlamak yerine , Tanımın nerede ve nasıl yapıldığının görülmesi açısından default değerleri modifiye etmeyi tercih ediyorum.