cancel
Showing results for 
Search instead for 
Did you mean: 

3 Phase Motor Control PWM with dead time and phase shift

christiaan2
Associate II
Posted on July 15, 2015 at 16:12

Hi

I have adapted the program found below from the example 7PWM_Output in the StdPeriph library examples. My aim is to create 3 PWM channels each with it's respective complimentary output as well as inserted dead time and a 60 degree phase shift between each channel:

Channel 1 PWM = 0�

Channel 2 PWM = 60�

Channel 3 PWM = 120�

As the program stands the 3 PWM signals and the complementary signals are correct as well as the dead time. My problem is that I cannot figure out how to insert the phase shifts. I am also having trouble identifying the current clock speed.

I am using the STM32F103RBT6 Nucleo board with the Cortex M4 @72MHz

Code:

&sharpinclude ''stm32f10x.h''

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

TIM_OCInitTypeDef  TIM_OCInitStructure;

TIM_BDTRInitTypeDef TIM_BDTRInitStructure;

uint16_t TimerPeriod = 0;

uint16_t Channel1Pulse = 0, Channel2Pulse = 0, Channel3Pulse = 0;

void RCC_Configuration(void);

void GPIO_Configuration(void);

int main(void)

{

    /* System Clocks Configuration */

  RCC_Configuration();

  /* GPIO Configuration */

  GPIO_Configuration();

  /* TIM1 Configuration --------------------------------------------------- */

    /* Compute the value to be set in ARR regiter to generate signal frequency at 10 Khz */

  TimerPeriod = (SystemCoreClock / 90000 ) - 1;

  /* Compute CCR1 value to generate a duty cycle at 50% for channel 1 and 1N */

  Channel1Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);

  /* Compute CCR2 value to generate a duty cycle at 50%  for channel 2 and 2N */

  Channel2Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);

  /* Compute CCR3 value to generate a duty cycle at 50%  for channel 3 and 3N */

  Channel3Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);

  /* Time Base configuration */

  TIM_TimeBaseStructure.TIM_Prescaler = 0;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseStructure.TIM_Period = TimerPeriod;

  TIM_TimeBaseStructure.TIM_ClockDivision = 0;

  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  /* Channel 1, 2,3 and 4 Configuration in PWM mode */

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;

  TIM_OCInitStructure.TIM_Pulse = Channel1Pulse;

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;

  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

  TIM_OC1Init(TIM1, &TIM_OCInitStructure);

  TIM_OCInitStructure.TIM_Pulse = Channel2Pulse;

  TIM_OC2Init(TIM1, &TIM_OCInitStructure);

  TIM_OCInitStructure.TIM_Pulse = Channel3Pulse;

  TIM_OC3Init(TIM1, &TIM_OCInitStructure);

  /* Dead time configuration (3.7 us) */

  TIM_BDTRInitStructure.TIM_DeadTime = 30;

  TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

    

    /* TIM1 counter enable */

  TIM_Cmd(TIM1, ENABLE);

  /* TIM1 Main Output Enable */

  TIM_CtrlPWMOutputs(TIM1, ENABLE);

  while (1)

  {

    }

}

void RCC_Configuration(void)

{

  /* TIM1, GPIOA, GPIOB and AFIO clocks enable */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);

}

/* Configure the TIM1 Pins. */

void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

  /* GPIOA Configuration: Channel 1, 2 and 3 as alternate function push-pull */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* GPIOB Configuration: Channel 1N, 2N and 3N as alternate function push-pull */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

}

Any help will be appreciated. Thank you!

#stm32-nucleo
0 REPLIES 0