STM32 HAL kütüphanede Output Compare Modu hakkında

Başlatan Mucit23, 02 Eylül 2025, 13:40:24

Mucit23

Selamlar

STM32F0 da TIM1 ile Complemantary PWM üretiyorum. (CH1, CH1N) Blok komutasyon ile daha önce BLDC motor çalıştırmıştım. Benzer bir işi STM32F072 MCU ile TIM1 üzerinden yapmaya çalışıyorum. TIM PWM modunda Complementary PWM (CH1, CH1N) üretiyorum. Ama Timeri OC moduna alıp CH1N çıkışını Forced Active olarak ayarlayamıyorum.

Bununla ilgili örnek bir uygulama varmı?

sedronjames

hocam aynı örnek olmasa da TIMER üzerinde ben de sorun yaşadım. Update event tetikleme kısmında datasheette yazan gibi çalışmıyordu timer. cubeMX'ten mi kaynaklıydı yoksa datashette mi hata vardı bilmiyorum ama datashette yazan gibi çalışmıyordu update event kısmı. ben de başka bir şekilde çözmüştüm sorunumu.

Mucit23

Ben Timer de sorun yaşamıyorum. Output Compare modülünde problem yaşıyorum. Timer'i PWM Modundan çıkarıp CH1N çıkışını Forced Active Olarak nasıl ayarlarım? Bunu çözemiyorum.

RaMu

Başta aynı timerin bir kanalından PWM üretip diğer kanalını OC mod kullanmak istiyorsun diye düşündüm, istediğin bu değil galiba
ama olsun bunun için örnek olabilecek linki ekleyeyim:
https://controllerstech.com/stm32-timers-6-timer-synchronization-generate-3-phase-pwm/

Sorduğun şu mu:
Cubeide ile Timerx CH1 ve CH1N PWM modunda ayarlandı, mainde Timer complementary PWM kuruldu başlatıldı kanallar PWM üretiyor güzel
ve artık
runtime herhangi bir zamanda bu Timerx in CH1 ve CH1N kanalları PWM üretmeye durdursun ve üstüne
CH1N artık OC modda çalışmaya başlasın.

Tam hatırlamıyorum ama mod değiştirirken register kodlayarak yapmıştım,
  SET_BIT(TIM2->EGR,TIM_EGR_UG);   //      Update Generation is required to update the timer prescaler and auto reload register.
böyle bir not almışım.
Linkte son mesaj bununla alakalı ama çok eski şimdi daha farklı bir yolu çıkmıştır.
https://community.st.com/t5/stm32-mcus-products/reconfigure-the-timer-at-runtime/td-p/464834
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Mucit23

Aynen hocam. Şuan PWM Modunda CH1 ve CH1N çıkışlarından Complemantary PWM üretiyorum. CH1'de PWM üretilirken CH1N 'de PWM sinyalinin Tersi üretiliyor. CH1 ile CH1N arasındaki geçişlerde Dead Time da ekleniyor. Sorun yok.

Benim derdim CH1 PWM'i kapatıp CH1N çıkışını Forced olarak 1 yapmak istiyorum. Bunu yapamadım bir türlü. Daha önce bunu STD library'de yapmıştım. Ama tabi F103 kullanıyordum.

Alıntı Yapif (PMSM_STATE[UH])  //High Side FET: PWM Low Side FET:PWM
   {
      TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
      TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);
      TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable);
   }
   else
   {
      // High Side FET: OFF
      TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
      if (PMSM_STATE[UL]){
         // Low side FET: ON
         TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_ForcedAction_Active);
         TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable);
      } else {
         // Low side FET: OFF
         TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
      }
   }

   if (PMSM_STATE[VH])  //High Side FET: PWM Low Side FET:PWM
   {
      TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1);
      TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable);
      TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable);
   }
   else
   {
      // High Side FET: OFF
      TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
      if (PMSM_STATE[VL]){
         // Low Side FET: ON
         TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_ForcedAction_Active);
         TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable);
      } else {
         // Low Side FET: OFF
         TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
      }
   }

   if (PMSM_STATE[WH])  //High Side FET: PWM Low Side FET:PWM
   {
      TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);
      TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable);
      TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable);
   } else {
      // Low Side FET: OFF
      TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
      if (PMSM_STATE[WL]){
         // Low Side FET: ON
         TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_ForcedAction_Active);
         TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable);
      } else {
         // Low Side FET: OFF
         TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);
      }
   }

Yıllar önce bunu BLDC Motor çalıştırmak için STD library kullanarak yapmıştım. Aynı kodları HAL kütüphanede yapamıyorum.

HAL_TIM_PWM_Start, HAL_TIMEx_PWM_Start, HAL_TIM_PWM_Stop, HAL_TIMEx_PWM_Stop fonksiyonları dışında kanallara doğrudan müdahale edebileceğim fonksiyonlar yok. Yada ben bulamadım.


Benzer Konular (5)