Stm32 pwm hakkında

Başlatan halil82ist, 01 Mart 2018, 00:47:07

halil82ist

Merhaba ;  sitede aradım ama bulamadım . Benim ihtiyacım stm32 pwm modülünü tl494 v.s. gibi kullanmak . Misalen 3ms 1 kanal aktif 2ms boşluk 3 ms 2 kanal aktif 2 ms boşluk sonra tekrar başa dönecek .  İnternette bulunan tüm örneklerde duty %30 yapınca kanalın biri %30 aktif diğer kanal % 70 aktif oluyor .

apsis

Complementary kullanımda biri %30 olunca diğeri %70 olur. Bağımsız kullanacaksan ayarlarını buna göre yaparsın. İnternette complementary'siz kullanım örneği mutlaka vardır.
"Makineye Beyin" MEKATRONİK

halil82ist

Bence de mutlaka olması lazım ama bulamıyorum .

devrecii

#3
PWM interrupt ile mümkün ve Gpio çıkış ile.

Tim1 de updown counter var bununla iki çıkışlı alabilrsinz pwm çıkıştan




halil82ist

stm32f0 kullanıyorum seçenekler arasında up down counter yok , up ve down var  . pwm kesmesinde sayım yönü değiştirilebilir , ama 45 khz civarı bir frekansta çalışacak interrupta değiştirsem başka işlere pek vakit kalacağını sanmıyorum , hiç çözüm bulamazsam öyle deneyeceğim ama işlemcinin yetişeceğini sanmadığım için uğraşmak istemedim . bir seçeneği olmalı

halil82ist

Alıntı yapılan: iboibo - 01 Mart 2018, 17:46:13
PWM interrupt ile mümkün ve Gpio çıkış ile.

Tim1 de updown counter var bununla iki çıkışlı alabilrsinz pwm çıkıştan




center aligned mode seçince up down sayıyor fakat iki çıkışın merkez noktası aynı .  Çıkışları resimdeki gibi birbirinden ayıramıyorum .

devrecii

Diyelim 1000 e kadar sayıyorsun  yüzde 10 pwm 


Birinci kanal kontrol registerine 900 verirsen sayaç 900dan sonra çıkış 1 olacak

İkinci kanala 100 verirsen ve tersini alısan 100 e kadar 1 100 den sonra sıfır.


Ben stm8 interrupt ve gpio ile yaptım işlemci hızı 16mhz  500khz hassabiyetinde çıkış alabildim.

halil82ist

1. kanaldan 2. inci kanala geçerken dediğin gibi aradaki süre ayarlanabilir ama 2 den tekrar 1. kanala geçerkenki süreyi nasıl ayarlayacağız . 2 dalga birbirine yapışık olacak sanırım .

Kesme ile yapma şansım yok kart hali hazırda çalışan bir kart ve baya bir iş yapıyor .




devrecii

Alıntı yapılan: halil82ist - 01 Mart 2018, 21:46:18
1. kanaldan 2. inci kanala geçerken dediğin gibi aradaki süre ayarlanabilir ama 2 den tekrar 1. kanala geçerkenki süreyi nasıl ayarlayacağız .

Birinciden ikinciye geçme diye bişey yok dostum keşke öyle bi şansımız olsaydı. stm32f0 elimde yok stm32f103 ile ve cubemx il hemen bi deneyeceğim.

halil82ist

Alıntı yapılan: iboibo - 02 Mart 2018, 19:42:42
Birinciden ikinciye geçme diye bişey yok dostum keşke öyle bi şansımız olsaydı. stm32f0 elimde yok stm32f103 ile ve cubemx il hemen bi deneyeceğim.

Memnun olurum . f1 ve f0 pwm modülleri aynı gibi f3 serisinde ek özellikler geliyor . 

devrecii

static void MX_TIM1_Init(void)
{

  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_OC_InitTypeDef sConfigOC;
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 1;
  htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1;
  htim1.Init.Period = 500;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  {
    Error_Handler();
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 100;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;  !!!!!!!!!
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW;   !!!!!!!!!
  sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }

  sConfigOC.Pulse = htim1.Init.Period-sConfigOC.Pulse;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; !!!!!!!!!!!!!!!!!
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; !!!!!!!!!!!!!
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }

  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 0;
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  {
    Error_Handler();
  }

  HAL_TIM_MspPostInit(&htim1);

  HAL_TIM_MspPostInit(&htim1);
   HAL_TIM_Base_Start(&htim1);
  
   HAL_TIM_PWM_Start  (&htim1,TIM_CHANNEL_1  ); 
  HAL_TIM_PWM_Start  (&htim1,TIM_CHANNEL_2  );
  
  
}


Cubemxin ürettiği tim fonksiyonu bikaç şey değiştirdim sadece  500 e kadar sayıyor mcu 72mhz prescalar= 1

frekans 40khz gibi

compare 20 iken yani her tepe 1us




compare 200 iken



compare 100 iken






SMPS yapımında mı kullanacaksın ? Eğer öyle ise, güç elektroniği bölümünde benim açtığım  kaynak makinası başlığında ki devrede  igbt gate nasıl sürülüyor incele istersen.





halil82ist

Alıntı yapılan: iboibo - 02 Mart 2018, 20:19:14
static void MX_TIM1_Init(void)
{

  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_OC_InitTypeDef sConfigOC;
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 1;
  htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1;
  htim1.Init.Period = 500;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  {
    Error_Handler();
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 100;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;  !!!!!!!!!
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW;   !!!!!!!!!
  sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }

  sConfigOC.Pulse = htim1.Init.Period-sConfigOC.Pulse;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; !!!!!!!!!!!!!!!!!
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; !!!!!!!!!!!!!
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }

  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 0;
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  {
    Error_Handler();
  }

  HAL_TIM_MspPostInit(&htim1);

  HAL_TIM_MspPostInit(&htim1);
   HAL_TIM_Base_Start(&htim1);
  
   HAL_TIM_PWM_Start  (&htim1,TIM_CHANNEL_1  ); 
  HAL_TIM_PWM_Start  (&htim1,TIM_CHANNEL_2  );
  
  
}


Cubemxin ürettiği tim fonksiyonu bikaç şey değiştirdim sadece  500 e kadar sayıyor mcu 72mhz prescalar= 1

frekans 40khz gibi

compare 20 iken yani her tepe 1us




compare 200 iken



compare 100 iken






SMPS yapımında mı kullanacaksın ? Eğer öyle ise, güç elektroniği bölümünde benim açtığım  kaynak makinası başlığında ki devrede  igbt gate nasıl sürülüyor incele istersen.






usta sağol işyerini kapatmadan önce denedim , stm32f0 içinde büyük ihtimalle oluyor  . gözümden bir şey kaçmadıysa düzgün istediğim gibi . Tekrar teşekkürler .