Picproje Elektronik Sitesi

PICPROJE PROGRAMLAMA DERSLERİ => STM32 Örnekleri => Konuyu başlatan: halil82ist - 01 Mart 2018, 00:47:07

Başlık: Stm32 pwm hakkında
Gönderen: halil82ist - 01 Mart 2018, 00:47:07
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 .
Başlık: Ynt: Stm32 pwm hakkında
Gönderen: apsis - 01 Mart 2018, 09:50:28
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.
Başlık: Ynt: Stm32 pwm hakkında
Gönderen: halil82ist - 01 Mart 2018, 11:18:19
Bence de mutlaka olması lazım ama bulamıyorum .
Başlık: Ynt: Stm32 pwm hakkında
Gönderen: devrecii - 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


(https://s10.postimg.cc/45pfmisut/weqwew.jpg) (https://postimg.cc/image/45pfmisut/)
Başlık: Ynt: Stm32 pwm hakkında
Gönderen: halil82ist - 01 Mart 2018, 19:59:30
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ı
Başlık: Ynt: Stm32 pwm hakkında
Gönderen: halil82ist - 01 Mart 2018, 20:42:29
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


(https://s10.postimg.cc/45pfmisut/weqwew.jpg) (https://postimg.cc/image/45pfmisut/)

center aligned mode seçince up down sayıyor fakat iki çıkışın merkez noktası aynı .  Çıkışları resimdeki gibi birbirinden ayıramıyorum .
Başlık: Ynt: Stm32 pwm hakkında
Gönderen: devrecii - 01 Mart 2018, 21:13:11
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.
Başlık: Ynt: Stm32 pwm hakkında
Gönderen: 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 . 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 .



Başlık: Ynt: Stm32 pwm hakkında
Gönderen: devrecii - 02 Mart 2018, 19:42:42
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.
Başlık: Ynt: Stm32 pwm hakkında
Gönderen: halil82ist - 02 Mart 2018, 19:59:19
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 . 
Başlık: Ynt: Stm32 pwm hakkında
Gönderen: devrecii - 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
(https://s9.postimg.cc/ihpq123cr/20180302_193235.jpg) (https://postimg.cc/image/ihpq123cr/)



compare 200 iken

(https://s9.postimg.cc/thaxcjbqj/20180302_193055.jpg) (https://postimg.cc/image/thaxcjbqj/)

compare 100 iken

(https://s9.postimg.cc/8x63e3tff/20180302_193202.jpg) (https://postimg.cc/image/8x63e3tff/)




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.




Başlık: Ynt: Stm32 pwm hakkında
Gönderen: halil82ist - 02 Mart 2018, 21:41:36
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
(https://s9.postimg.cc/ihpq123cr/20180302_193235.jpg) (https://postimg.cc/image/ihpq123cr/)



compare 200 iken

(https://s9.postimg.cc/thaxcjbqj/20180302_193055.jpg) (https://postimg.cc/image/thaxcjbqj/)

compare 100 iken

(https://s9.postimg.cc/8x63e3tff/20180302_193202.jpg) (https://postimg.cc/image/8x63e3tff/)




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 .