Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Cortex ARM => Konuyu başlatan: argelojik - 05 Nisan 2020, 12:48:10

Başlık: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 05 Nisan 2020, 12:48:10
Merhaba iyi günler.  STM32 timer konusunda  5 gündür takılıp kaldığım bir durum için yardım isteyecektim. Aslında yapmak istediğim şey çok basit ama olmuyor. Timer ile 2ms de bir 220us lik bir pulse üretmek istiyorum. Bunun için TIMER ONE PULSE MODE kullanmayı istedim.  Ama inanın bir türlü yapamıyorum. YA HAL kütüphanesin de bir sıkıntı var olmuyor. HAL kütüphanesine derin bakacak birikimim maalesef şu anda yok. Bana yardım edebilir misiniz?

Cubemx'ten şu şekilde ayar yapıyorum;
Timer3 kanalı için  Kanal1 girişi olarak input capture direct mode seçiyorum. Kanal2 çıkış için de PWM channel generation CH2 seçiyorum. Sonra one pulse mode tickini işaretliyorum. Yani KANAL2 Çıkış, KANAL1 Giriş.

HAL_TIM_OnePulse_Init(&htim3, TIM_OPMODE_SINGLE);
HAL_TIM_OnePulse_ConfigChannel(&htim3, &sConfig, TIM_CHANNEL_2, TIM_CHANNEL_1);
HAL_TIM_OnePulse_Start(&htim3, TIM_CHANNEL_2);

Yukarıdaki fonksiyonları da çağırıyorum ama olmuyor. Neden olmuyor anlamıyorum? Yardımınız için şimdiden teşekkür ederim.
(Neden PWM kullanmak istemiyorum çünkü istediğim pulse PWM ile olmuyor)
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: SB7 - 05 Nisan 2020, 13:38:45
Hocam timer kullanarak pwm üretmek istiyorsanız prescaler ve period değerleriyle  hesap yaparak ilerlemelisiniz.
Örneğin 72 MHz denetleyici kullanıyorsanız prescaler 71 ve period değerini 2000 seçerseniz 500 Hertzlik(2ms peryotlu) pwm sinyalini elde edersiniz.(72000000 / ((71+1)*2000)=500 Hertz)
2 us için de doluluk oranını değiştireceksiniz . Yani verdiğiniz 2000 değerine göre 2 4 gibi bir değer verirseniz olur gibi geliyor bana.

Edit: Period 2 olunca istediğiniz oluyor.

https://ibb.co/z6s36Xs

 (https://ibb.co/z6s36Xs)
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 05 Nisan 2020, 14:23:30
Alıntı yapılan: SB7 - 05 Nisan 2020, 13:38:45Hocam timer kullanarak pwm üretmek istiyorsanız prescaler ve period değerleriyle  hesap yaparak ilerlemelisiniz.
Örneğin 72 MHz denetleyici kullanıyorsanız prescaler 71 ve period değerini 2000 seçerseniz 500 Hertzlik(2ms peryotlu) pwm sinyalini elde edersiniz.(72000000 / ((71+1)*2000)=500 Hertz)
2 us için de doluluk oranını değiştireceksiniz . Yani verdiğiniz 2000 değerine göre 2 4 gibi bir değer verirseniz olur gibi geliyor bana.

Edit: Period 2 olunca istediğiniz oluyor.

https://ibb.co/z6s36Xs

 (https://ibb.co/z6s36Xs)
Cevap için teşekkür ederim ama aslında benim iki kanal PWM oluşturmam gerekiyor. Arasında faz farkı olan. Bu yüzden one pulse mode kullanmam gerekiyor. Sizin dediğiniz şekilde yapıyorum ama bu şekilde işime yaramıyor. Şekildeki gibi bir PWM sinyal istiyorum. STM32F415 kullanıyorum. Timer frekansım 60MHZ buralarda sorunum yok. Sadece pulse şeklinde bir sinyal oluşsun istiyorum. Buna da delay verebileyim. İstediğim tam olarak pulse sinyali.Bir de bu one pulse mode ben de gurur meselesi oldu. Yapamadıkça stres oldum. Teşekkür ederim.
(https://i.ibb.co/0fS6g8y/Untitled-1.jpg) (https://ibb.co/0fS6g8y)
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 05 Nisan 2020, 18:25:48
Korona günlerinde bugün Pazar. Günlerdir herkes evinde, birçok kişinin foruma girerek bu konuyu gördüğünü düşünüyorum. One pulse modunu projelerinde hiç kimse kullanmadı mı gerçekten? İnternette de bu mode ile ilgili de çok az bilgi var. Kullanan varsa yardımınızı bekliyorum.Teşekkürler.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: Mucit23 - 05 Nisan 2020, 22:22:50
Ben STD library ile kullandım. Dizel motorlarla uğraşırken enjektörün açılıp kapanma süresini ayarlıyordum one pulse modu ile.

Bunlar ayarlarım
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
// Enable clock
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  /* GPIOB clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  /* TIM2_CH1 pin (PA.00) configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* TIM2_CH2 pin (PA.01) configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

// Time Base configuration
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 72-1;//1uS each tick
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  /* TIM2 PWM2 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 65535;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

  TIM_OC1Init(TIM2, &TIM_OCInitStructure);

  /* TIM2 PWM2 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 65535;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OC2Init(TIM2, &TIM_OCInitStructure);

  /* One Pulse Mode selection */
  TIM_SelectOnePulseMode(TIM2, TIM_OPMode_Single);

Yukarıdaki init kodlarıyla 1uS çözünürlükte puls alabiliyorum. PSC ve ARR değerleri ile oynayarak bunu değiştirebilirsiniz. Yalnız Output Compare işlemi ters çalışıyordu. Farklı OC modlarını denemiştim ama çözememiştim. One Pulse Modunda hatırladığım kadarıyla Time Update Eventi olunca timer otomatik duruyordu.

Timeri Aktif etmek için aşağıdaki şekilde timeri kuruyorum.
   TIM2->CNT=65535-CH1_Pulse_Counter;
TIM2->CCR1=CH1_Pulse_Counter;
TIM_Cmd(TIM2,ENABLE);

CH1_Pulse_Counter değeri çıkmasını istediğim puls değeri. TIM->CNT değerini doğrudan 65535-CH1_Pulse_Counter değerinden başlatmak gerekiyor. Capture Compare registerine de puls değerini yüklemek gerekiyor. Bu şekilde çalıştırmıştım.

HAL ayarlarınıda bendeki ayarlara göre güncellersin.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 05 Nisan 2020, 23:00:29
Yardımınız için teşekkür ederim. Yarın tekrar deneyeceğim. Sonucu buradan yazarım.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: isoment01 - 06 Nisan 2020, 04:46:11
Neden input capture kullaniyorsun . Benim anladigim bir timer kullanilacak zaman guncellemeli modunda (timer update mode) sonra pwm den one pulse modu secilip pulse in frrkansi ayarlanacak ve bu kod timer interrupt rutinine gomulecek. Input capture secersen giristen birsey algilamadigin icin dolayisiyla bayragi set olmicak ve icine ne yazarsan yaz execute edilmicek. Ayrica Callback function kodlarini hic gormedim , input capture interrupt8ni enable ettigin set_nvicIRQ gibi bi fonksiyon vardi onu da goremedim. Belki mobilden girdigim içinde olabilir.
Interruptinin calisip calismadingini _Bool flag=reset; de callback fonksyonunda bunu set et debug modda da bu degiskeni izle bakalim. Resette kaliyorsa tetiklenmiyo demektir.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 06 Nisan 2020, 09:44:45
Sayın isoment01 Usta, input capture kullanıyorum çünkü "One Pulse Mode" bu şekilde kurgulanmış. Ben de bunun için Timer5'i master olarak kullandım ve 2ms(500Hz) ye ayarladım. Timer5'i, 2 ms de bir slave olan Timer3'ü tetikleyecek şekilde ayarladım. Timer3'ün Channel1'ini "input capture direct mode" ile giriş olarak ayarladım. Channel2'yi ise "PWM Generation CH2" çıkış olarak ayarlarım. Bu şekilde Timer5'ten 2 ms de bir gelen "Update Event"lar ile  Timer3'ten kendi belirlediğim delay ve periyod'da  pulse üreteceğini zannediyorum. Ama olmuyor. Karışık gibi görünüyor ama değil. Açıklayıcı olsun diye kodları ve cubemx ayarlarımı resimledim. Ama siz de lütfen One Pulse mod nasıl çalışıyor bir inceleyin.Cevap için yine de size teşekkür ederim.

(https://i.ibb.co/B6LhBJL/Untitled-1.png) (https://ibb.co/B6LhBJL)

(https://i.ibb.co/6YX0KHn/Cube.png) (https://ibb.co/6YX0KHn)
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 06 Nisan 2020, 09:54:16
Hocam sizin gönderdiğiniz kodlara baktım. Bu kodları Hal kütüphanesine göre benim düzenlemem çok zor. Bu konu altında kodlarımı ve ayarlarımı gönderdim. Eğer zamanınız olursa incelerseniz mutlu olurum.Teşekkür ederim. Bu konu sadece benim için değil ilerde projelerinde one pulse modunu kullacaklar içinde faydalı olacaktır. One pulse mode yazınca herkes rahatça bu konuya ulaşabilecekler diye düşünüyorum.
Alıntı yapılan: Mucit23 - 05 Nisan 2020, 22:22:50Ben STD library ile kullandım. Dizel motorlarla uğraşırken enjektörün açılıp kapanma süresini ayarlıyordum one pulse modu ile.

Bunlar ayarlarım
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 TIM_OCInitTypeDef  TIM_OCInitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
// Enable clock
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  /* GPIOB clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 
  /* TIM2_CH1 pin (PA.00) configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
 
  /* TIM2_CH2 pin (PA.01) configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
 
 // Time Base configuration
 TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
 TIM_TimeBaseStructure.TIM_Prescaler = 72-1;//1uS each tick
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
 TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
 TIM_TimeBaseStructure.TIM_ClockDivision = 0;
 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  /* TIM2 PWM2 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 65535;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

  TIM_OC1Init(TIM2, &TIM_OCInitStructure);
 
  /* TIM2 PWM2 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 65535;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OC2Init(TIM2, &TIM_OCInitStructure);

  /* One Pulse Mode selection */
  TIM_SelectOnePulseMode(TIM2, TIM_OPMode_Single);

Yukarıdaki init kodlarıyla 1uS çözünürlükte puls alabiliyorum. PSC ve ARR değerleri ile oynayarak bunu değiştirebilirsiniz. Yalnız Output Compare işlemi ters çalışıyordu. Farklı OC modlarını denemiştim ama çözememiştim. One Pulse Modunda hatırladığım kadarıyla Time Update Eventi olunca timer otomatik duruyordu.

Timeri Aktif etmek için aşağıdaki şekilde timeri kuruyorum.
  TIM2->CNT=65535-CH1_Pulse_Counter;
 TIM2->CCR1=CH1_Pulse_Counter;
 TIM_Cmd(TIM2,ENABLE);

CH1_Pulse_Counter değeri çıkmasını istediğim puls değeri. TIM->CNT değerini doğrudan 65535-CH1_Pulse_Counter değerinden başlatmak gerekiyor. Capture Compare registerine de puls değerini yüklemek gerekiyor. Bu şekilde çalıştırmıştım.

HAL ayarlarınıda bendeki ayarlara göre güncellersin.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 06 Nisan 2020, 10:18:04
İnternetten Stm32 anlatan bir elektronik kitap buldum.Yazarın adı Carmine Noviello. Kitabın adı Mastering STM32. Çok güzel bir kitap. Bu kitaptan faydalanmaya başladım. Kitapta size One Pulse Mode'un  anlatıldığı bölümü paylaşıyorum.
    (1) (https://i.ibb.co/0K7zDnt/one.png) (https://ibb.co/0K7zDnt)
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: muhittin_kaplan - 06 Nisan 2020, 10:23:38
onePulse da "2sn de bir" olmaz. Alınan bir tetikleme ile, Belirlediğiniz bir süre Bir Pulse Alırsınız
http://muhittinkaplan.com/blog/2020/01/26/stm32f0disco-timer17-oneshot/
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 06 Nisan 2020, 10:40:49
Sayın muhittin_kaplan hocam. Az önce göndermiş olduğum e-kitabın one pulse mode (OPM) anlatan bölümünde dışarıdan pulse ile delay ve periyod ayarlanarak pulse üretileceği yazıyor. Ya da ben mi yanlış yorumluyorum? Ayrıca 2 saniye değil 2ms olacak.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: muhittin_kaplan - 06 Nisan 2020, 10:44:02
Tamam işte,bir tetikleme lazım. Her 2ms de bir tetikleme vereceksiniz ki, belirlediğiniz DUTY de bir pulse olştursun.

Bunun yerine basit bir timer interrtup kuracaksınız 2ms lik. Böylece 2ms de bir puls oluşacak.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 06 Nisan 2020, 10:45:22
Sayın hocam bu tetiklemeyi Timer5 ile(ITR2 ile)içeriden yapıyorum. Ama bir şeyi atlıyorum ve olmuyor.Bulamadım, Lütfen gönderdiğim resimleri inceler misiniz?
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: muhittin_kaplan - 06 Nisan 2020, 10:47:28
Projenin Kodlarını vs yükleyeyim.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 06 Nisan 2020, 10:48:19
Sağolun hocam...
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: muhittin_kaplan - 06 Nisan 2020, 10:51:47
prescaler değerini (tim3) 0 dan farklı bir değer yapıp denermisiniz.
Ayrıca blogumdaki yazıda ben tetiklemeyi butondan almıştım düzenleyerek deneyebilirsiniz. ve neden tim5 den 2ms zamanlayıcı ile tim3 de 2ms zamanlayıcı yapmaya çalışıyorsunuz anlamadım.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 06 Nisan 2020, 10:54:01
(prescaler değerini (tim3) 0 dan farklı bir değer yapıp denermisiniz.)
Tamam denerim hocam. Timer5 ten 2ms de bir tetikleme olacak ama Timer3 200us  pulse üretecek. Ben bu pulse'a delay koyabileceğim.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 06 Nisan 2020, 10:56:29
Muhittin Hocam, Bu konudaki 3 numaralı mesajdaki resimde tam olarak ne yapmak istediğimi anlattığımı düşünüyorum.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: muhittin_kaplan - 06 Nisan 2020, 10:59:10
Bence Kodun Biraz düzenlenmesi lazım.
Önce onePulse ile çalışma yapılması, bu iş kavrandığında tim5 ile simpletimer çalışması yapılması (her 2ms de bir) Tabi bunların interrup ile yapılması lazım.
Sonra Tim5 in Tim3 ü tetiklemesi sağlanmalı.
Kodlarınızda gördüğüm, PWM_start lar felan var bunları anlamadım.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 06 Nisan 2020, 11:04:01
Hocam haklısınız. O pwm start kodlarını her şeyi denemek için koyduğum kodlardan kalmış.Görselde kalmış.Şimdi kaldırdım.  Hocam Timer5 (Master) interrupt kısmına kod yazmadan update event'ın ITR2 pini ile, Timer3 (Slave)  içeriden tetiklenemezmi? Anlamadım.
Alıntı yapılan: muhittin_kaplan - 06 Nisan 2020, 10:59:10Bence Kodun Biraz düzenlenmesi lazım.
Önce onePulse ile çalışma yapılması, bu iş kavrandığında tim5 ile simpletimer çalışması yapılması (her 2ms de bir) Tabi bunların interrup ile yapılması lazım.
Sonra Tim5 in Tim3 ü tetiklemesi sağlanmalı.
Kodlarınızda gördüğüm, PWM_start lar felan var bunları anlamadım.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 06 Nisan 2020, 11:06:21
Yani ben şimdi Timer5'in (master) her update event'ında yani interrupt kısmında, git Timer3'ü (slave)tetikle diye kod mu yazacağım?Bu otomatik olarak ITR2 pini ile gerçekleşmiyor mu?
Alıntı yapılan: argelojik - 06 Nisan 2020, 11:04:01Hocam haklısınız. O pwm start kodlarını her şeyi denemek için koyduğum kodlardan kalmış.Görselde kalmış.Şimdi kaldırdım.  Hocam Timer5 (Master) interrupt kısmına kod yazmadan update event'ın ITR2 pini ile, Timer3 (Slave)  içeriden tetiklenemezmi? Anlamadım. Bu otomatik olarak ITR2 pini ile gerçekleşmiyor mu?
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: muhittin_kaplan - 06 Nisan 2020, 11:17:32
Alıntı yapılan: argelojik - 06 Nisan 2020, 11:06:21Yani ben şimdi Timer5'in (master) her update event'ında yani interrupt kısmında, git Timer3'ü (slave)tetikle diye kod mu yazacağım?Bu otomatik olarak ITR2 pini ile gerçekleşmiyor mu?
Evet.

Ayrıca
https://community.st.com/s/question/0D50X00009sWbv9SAC/masterslave-problem-on-tim3-in-stm32l476-slave-not-counting-when-itr2-selected
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 06 Nisan 2020, 11:21:11
Sayın Muhittin Kaplan hocam. Sizin gönderdiğiniz linkteki yani bloğunuzdaki kodu inceledim. Sizin projenizde ne Main ne While ne de interrupt kısmında  HAL_TIM_OnePulse_Start(&htim3, TIM_CHANNEL_2); satırı bulunmuyor. Bu nedenle sizin uygulamanız one pulse mode değil bir interrupt uygulaması. Buton ile gelen tetikleme ile bir kere led yakıp söndürüyorsunuz.  One Pulse Mode uygulamasında,
HAL_TIM_OnePulse_ConfigChannel(&htim3, &sConfig, TIM_CHANNEL_2, TIM_CHANNEL_1);
HAL_TIM_OnePulse_Start(&htim3, TIM_CHANNEL_2);
kodları olmalıdır. Hal kütüphanesinin bu kısmını incelerseniz göreceksiniz.Ben kütüphane de hata olduğunu düşünüyorum ve bulmaya çalışıyorum.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 06 Nisan 2020, 11:32:33
Sayın hocam gönderdiğiniz linkte bu sorun konuşulmuş.Teşekkür ederim. Sorun Referance Manuel hatası gibi resimleri paylaşıyorum. TIM5 değil sanırım TIM15 olacakmış. Çok ilginç bir hata.  ITR2 ile  Tim5 e bağlı değilmiş yani. Bu hata Referance Manuelde nasıl olur anlamıyorum.Ben bu tabloya bakarak TIM5 seçmiştim.
(https://i.ibb.co/n1nv7PH/b-y-k.jpg) (https://ibb.co/n1nv7PH)
(https://i.ibb.co/41DZrF6/yanl.png) (https://ibb.co/41DZrF6)
 
Alıntı yapılan: muhittin_kaplan - 06 Nisan 2020, 11:17:32Evet.

Ayrıca
https://community.st.com/s/question/0D50X00009sWbv9SAC/masterslave-problem-on-tim3-in-stm32l476-slave-not-counting-when-itr2-selected
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: muhittin_kaplan - 06 Nisan 2020, 12:31:16
One Pulse Inıt Edip, Normal Int Çalıştırmışım.Haklısınız. Düzelteyim.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 06 Nisan 2020, 12:36:07
Sayın hocam dediğiniz gibi Timerlar arasındaki ITR bağlantısı yanlışmış. Timer8'i Master, Timer2'yi Slave yaptım.  Bu şekilde trigger olarak ITR1 olacakmış. Bunu yapınca Cubemx'te ITR1 için yeni bir Trigger bölümü açıldı. Hatayı sayenizde bulmuş oldum. Gün içinde bu modu çalıştırarak sonuçları buradan paylaşacağım. Tekrar çok teşekkür ederim. Referans Manuel hatasına kurban gittim. 5 günüm gitti.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: muhittin_kaplan - 06 Nisan 2020, 12:36:55
Birbirimize yardım ettik. Kolay gelsin.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 06 Nisan 2020, 13:02:36
Hocam soruma evet demişsiniz ama bence bu cevabınız da yanlış. Çünkü Master Timer'da (Timer8) meydana gelen Update Event,  ITR1 internal bağlantısı ile Slave Timer (Timer2) tetiklenecektir. Yani benim Timer8'in interrupt fonksiyonuna gidip, Timer2'yi tetikle diye kod yazmama gerek yok. Ne düşünüyorsunuz? 
Alıntı yapılan: muhittin_kaplan - 06 Nisan 2020, 11:17:32Evet.

Ayrıca
https://community.st.com/s/question/0D50X00009sWbv9SAC/masterslave-problem-on-tim3-in-stm32l476-slave-not-counting-when-itr2-selected
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: muhittin_kaplan - 06 Nisan 2020, 13:15:50
TIM5 ile alaklı olsaydı evet olacaktı.
GRID de TIM15 olunca herhangi bir kod a ihtiyacınız olmayacak.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 06 Nisan 2020, 13:22:08
Hocam STM32F415 kullanıyorum bu MCU'da TIM15 yok o yüzden TIM8 master yaptım.
Alıntı yapılan: muhittin_kaplan - 06 Nisan 2020, 13:15:50TIM5 ile alaklı olsaydı evet olacaktı.
GRID de TIM15 olunca herhangi bir kod a ihtiyacınız olmayacak.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: JKramer - 06 Nisan 2020, 13:31:06
Koyduğunuz ekran görüntüsünde ref. manual için rev5 yazıyor. Güncel olanı rev18: https://www.st.com/en/microcontrollers-microprocessors/stm32f405-415.html#resource
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 06 Nisan 2020, 14:32:15
Alıntı yapılan: JKramer - 06 Nisan 2020, 13:31:06Koyduğunuz ekran görüntüsünde ref. manual için rev5 yazıyor. Güncel olanı rev18: https://www.st.com/en/microcontrollers-microprocessors/stm32f405-415.html#resource
Haklısınız.Acemilik işte. İnternetten hemen gördüğümüz şeye inanıyoruz. Fazla araştırmaya uğraşmıyoruz. 5 günüm gitti ama Timer hakkında çok şeyler öğrendim. Şimdi yeni revizyon Application note ve datasheet indirdim.
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 06 Nisan 2020, 16:16:55
Bugün yine uğraştım olmuyor. >:(
HAL_TIM_OnePulse_Start(&htim2, TIM_CHANNEL_2);
Bu fonksiyon ile çalışmıyor. HAL kütüphanesinden baktım.
HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim)       HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim)
fonksiyonlarının içi boş oluşuyor. Oysa internetten yapan birkaç kişiye baktığımda bu fonksiyonların içinde Timer giriş tanımlamaları var.
Timer girişine kablo ile de tetikleme pulse'ı veriyorum yine olmuyor.
Bana yardım edecek bir Usta yok mu? Şu One Pulse Modu rafa kaldırsak. ;)
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: Mucit23 - 06 Nisan 2020, 17:35:37
Low level kodlayın
Başlık: Ynt: STM32 Timer One Pulse kullanımı hakkında
Gönderen: argelojik - 07 Nisan 2020, 09:33:42
One Pulse Mode nasıl çalışıyor sonunda anladım. Belki bir gün başkasına da lazım olabilir diye sonucu paylaşıyorum. One Pulse modu için bir Timer master, diğeri slave oluyor. Ben Timer8'i master, Timer2'yi ise slave olarak ayarlardım. Çünkü bu iki timer ITRx bağlantı yolu ile MCU içinde birbirine bağlı. Bunu iyi anlamak gerekiyor. Her Timer arasında böyle bir bağlantı yok. Timer8 ve Timer2 ITR1 bağlantı yolu ile birbirine bağlı. Mcu'da ki bu bağlantıyı en son revizyonlu Application Note'dan buluyoruz. Zaten Cubemx bize doğru ITRx yolu seçildiğinde bir alt menü olarak gösteriyor.

Timer8'i her 2ms'de bir update event oluşturacak şekilde ayarladım. Daha sonra slave olarak ayarladığım Timer2'den ihtiyacım olan 200us'lik pulse için timer (Psc ve ARR) ayarlarını yaptım. Slave mode olarak Trigger mode'u, Trigger Source olarak ta dediğim gibi ITR1'i seçtim. Timer'ın Channel1'ini "Input Capture direct mode" olarak giriş tanımladım. Master Timer'ım bu girişten tetikleyecek. Çıkış olarak ise timer'ın  Channel2'çıkışını  "PWM Generation CH2" olarak tanımladım ve duty cycle pulse genişliğimi ayarladım . Son olarak ise "One pulse mode" tick'ini işaretleyerek one pluse modunu aktif ettim.Cubemx ayarları bu şekilde yapılıyor.
Kod bölümüne geldiğimizde ise  master timer'ın (Timer8) "interrupt callback" fonksiyonunda hiçbir şey yazmıyoruz. Her update event'da otomatik olarak slave timer'ı (Timer2) tetikliyor. Main bölümüne sadece timer8'i çalıştıracak
HAL_TIM_Base_Start(&htim8); olan kodu yazıyoruz. One pulse mode'unu başlatmak için ise;
  HAL_TIM_OnePulse_Start(&htim2, TIM_CHANNEL_2); kodunu yazıyoruz.Başka hiçbir ayara gerek yok. Bu şekilde 2ms'de bir 200 us'lik pulse'larımız oluşuyor.
Beni hayal kırıklığına uğratan şey ise bu mod kullanılırken Timer2'nin diğer 2 pinini de (CH3 ve CH4) aynı şekilde kullanamamak oldu.Bu mode sadece bir çıkışa izin veriyormuş. Yani bir timer'da sadece bir tane one pulse kullanılıyor. Oysa benim farklı delaylarda iki adet pulse ihtiyacım vardı.Sadece Timer çalışma sistemini ve Cubemx ayarlarını güzelce öğrenmiş oldum. Bana yardım eden Muhittin Kaplan hocama da çok teşekkür ederim. Muhittin hocam isterse blog sayfasına da koyabilir. (Sayın hocam low level bilsem burada ne işim var?) Okuyup ama bana tek kelime yazmayan herkese çok teşekkürler.