Picproje Elektronik Sitesi

PICPROJE PROGRAMLAMA DERSLERİ => STM32 Örnekleri => Konuyu başlatan: seyityildirim - 05 Aralık 2016, 20:10:49

Başlık: STM32F4 Discovery TIM1 Complementary PWM with Dead Time Örneği
Gönderen: seyityildirim - 05 Aralık 2016, 20:10:49
Merhaba arkadaşlar...

STM32F4 discovery de yaptığım TIM1 üzerinden Complementary PWM uygulamasını paylaşmak istedim. Dead time ayarlaması mevcut.

Kodlar şu şekilde


#include "stm32f4xx_conf.h"
#include "stm32f4xx.h"                  // Device header


// SysTicks
uint8_t TimerTick_PWM = 0;

// Funtion Prototypes

void PWM_SetDutyCycle(TIM_TypeDef* TIMx, uint8_t Duty, uint8_t OCx);
void PWM_Handler(void);

// PWM Duty Values
uint16_t PWM_Duty = 5;

// PWM Frequncy : 10kHz
uint16_t PWM_Freq = 10000;

//

#define peryod 16799

//
uint8_t Flag = 1;

void SysTick_Handler(void)
{
if(TimerTick_PWM == 100)
PWM_Handler();
else
TimerTick_PWM++;
}

int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_BaseStruct;
TIM_OCInitTypeDef TIM_OCStruct;
  TIM_BDTRInitTypeDef     TIM_BDTRInitStructure;
// Enable HSE clock
RCC_HSEConfig(RCC_HSE_ON);
// Wait for clock to stabilize
while (!RCC_WaitForHSEStartUp());

// SystemTick Interrrupt – 1 miliSecond
SysTick_Config(SystemCoreClock / 1000);

// Clock configuration
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,  ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

// GPIO Configuration
GPIO_PinAFConfig(GPIOE, GPIO_PinSource8, GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource9, GPIO_AF_TIM1);
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);

// Timer 1 Configuration PWM Channels
TIM_BaseStruct.TIM_Period        = peryod;
TIM_BaseStruct.TIM_Prescaler     = 0;
TIM_BaseStruct.TIM_CounterMode   = TIM_CounterMode_Up;
TIM_BaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM1, &TIM_BaseStruct);
TIM_Cmd(TIM1, ENABLE);

// PWM_ Configuration
TIM_OCStruct.TIM_OCMode       = TIM_OCMode_PWM1;
TIM_OCStruct.TIM_OCPolarity   = TIM_OCPolarity_High;
TIM_OCStruct.TIM_OutputState  = TIM_OutputState_Enable;
TIM_OCStruct.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCStruct.TIM_OCNPolarity  = TIM_OCNPolarity_High;
TIM_OCStruct.TIM_Pulse        = 0;

TIM_OC1Init(TIM1, &TIM_OCStruct);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);


  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
  TIM_BDTRInitStructure.TIM_DeadTime = 0xFA;
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;

  TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

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);

TIM_CtrlPWMOutputs(TIM1, ENABLE);


// main Loop
while(1);
}




void PWM_SetDutyCycle(TIM_TypeDef* TIMx, uint8_t Duty, uint8_t OCx)
{
switch(OCx)
{
case 1: TIMx->CCR1 = (Duty * peryod) / 100; break;
case 2: TIMx->CCR2 = (Duty * peryod) / 100; break;
case 3: TIMx->CCR3 = (Duty * peryod) / 100; break;
case 4: TIMx->CCR4 = (Duty * peryod) / 100; break;
}
}

void PWM_Handler(void)
{
TimerTick_PWM = 0;

if(Flag)
PWM_Duty++;
else
PWM_Duty=PWM_Duty-1;

if(PWM_Duty == 100)
Flag = 0;
else if(PWM_Duty == 0)
Flag = 1;

PWM_SetDutyCycle(TIM1, PWM_Duty, 1);
}





uygulamaya ait video

https://www.youtube.com/watch?v=-f_0J-HaDRI

blogumda complementary pwm ve dead time kavramından azıcık bahsetmiş oldum https://artibesvolt.wordpress.com/2016/12/05/stm32f4-discovery-tim1-complementary-pwm-with-dead-time/
Başlık: Ynt: STM32F4 Discovery TIM1 Complementary PWM with Dead Time Örneği
Gönderen: baran123 - 05 Aralık 2016, 21:29:32
Kodumu açıklamalardan tanıdım. :)
Ben dead timesız yapmıştım.
Güzel olmuş hocam eline sağlık.
Başlık: Ynt: STM32F4 Discovery TIM1 Complementary PWM with Dead Time Örneği
Gönderen: seyityildirim - 05 Aralık 2016, 21:58:09
Alıntı yapılan: baran123 - 05 Aralık 2016, 21:29:32
Kodumu açıklamalardan tanıdım. :)
Ben dead timesız yapmıştım.
Güzel olmuş hocam eline sağlık.

Evet hocam sizinkilerden yararlandım. Bir tek dead time ekledim :)