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 .
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.
Bence de mutlaka olması lazım ama bulamıyorum .
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/)
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ı
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 .
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.
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 .
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.
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 .
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.
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 .