STM32F4 Discovery TIM1 Complementary PWM with Dead Time Örneği

Başlatan seyityildirim, 05 Aralık 2016, 20:10:49

seyityildirim

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/

baran123

Kodumu açıklamalardan tanıdım. :)
Ben dead timesız yapmıştım.
Güzel olmuş hocam eline sağlık.

seyityildirim

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