STM32F4 PWM outputs do not have the same frequency after updated

OP (Company: Hanoi University of Science an) #3977515
Rate this post
• ▲ useful
▼ not useful
Hello.
I have a problem. I'm using Kit STM32F407VG Discovery to control 
frequency of FullBridge LLC Converter. I use 50kHz Interrupt TIM2 and 
CH1,1N,3,3N PWM TIM1. The PWM frequency band is 80-140kHz.
When updating new frequency (TIM1->ARR), the frequency of 4 PWM outputs 
is randomly not the same, shortcircuiting my converter.
Might anybody have any idea for me to fix this problem, please?!
Thank you so much.

P/S: I post my PWM configuration below if anyone need to see.

static void TIM1_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Enable the TIM2 Update Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel           = TIM1_UP_TIM10_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority     = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd         = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  /* Time Base configuration */
  TIM_TimeBaseStructure.TIM_Prescaler       = 1;
  TIM_TimeBaseStructure.TIM_CounterMode     = TIM_CounterMode_Down;
  TIM_TimeBaseStructure.TIM_Period       = Timer_Period;
  TIM_TimeBaseStructure.TIM_ClockDivision     = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_RepetitionCounter   = 1; // update event is 
generated at each counter overflow
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  TIM1->EGR = TIM_PSCReloadMode_Update; // Update when over/under flow
  TIM1->CR1 |= TIM_CR1_URS; // = 1 Only counter overflow/underflow 
generates an update interrupt or DMA request if enabled.
  TIM1->CR1 &= (uint16_t)~TIM_OPMode_Single; // = 0 Counter is not 
stopped at update event

  /* Channel 1, 3 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     = Channel_Pulse;
  TIM_OCInitStructure.TIM_OCPolarity   = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_OCNPolarity   = TIM_OCNPolarity_High;
  TIM_OCInitStructure.TIM_OCIdleState   = TIM_OCIdleState_Reset;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
//  TIM_OC1PreloadConfig(TIM1, TIM_CCMR1_OC1PE);
//  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
//  TIM_OC3PreloadConfig(TIM1, TIM_CCMR2_OC3PE);
  TIM_OC3Init(TIM1, &TIM_OCInitStructure);
//  TIM1->CR1 |= TIM_CR1_ARPE; // Set the ARR Preload Bit

  /* Automatic Output enable, Break, dead time and lock configuration*/
  TIM_BDTRInitStructure.TIM_OSSRState   = TIM_OSSRState_Disable;
  TIM_BDTRInitStructure.TIM_OSSIState   = TIM_OSSIState_Disable;
  TIM_BDTRInitStructure.TIM_LOCKLevel   = TIM_LOCKLevel_OFF;
  TIM_BDTRInitStructure.TIM_DeadTime   = 0;
  TIM_BDTRInitStructure.TIM_Break     = TIM_Break_Disable;
//  Khi TIM_Break = Disable thi khong can quan tam den cai Polarity nay
//  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;// 
Sua High thanh Low de thu => khong chay duoc.
  TIM_BDTRInitStructure.TIM_AutomaticOutput = 
TIM_AutomaticOutput_Disable;
  TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

  // TIM1 TRGO selection
  TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);

  // TIM1 IT enable
  TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);

}

void TIM1_PWM_Freq_Update(void)
{
/*  tmpbdtr = TIM1->BDTR;
  tmpbdtr &= 0xFF00;
  tmpbdtr |= Dead_Time;
  tmparr  = Timer_Period;
  tmpccr  = Channel_Pulse;*/
//  TIM1->CR1 |= TIM_CR1_UDIS;
  TIM1->ARR   = Timer_Period;
//  TIM1->CCR3   = Channel_Pulse;
//  TIM1->CCR1   = Channel_Pulse;
//  TIM1->BDTR   = tmpbdtr;
//  TIM1->CR1 &= (uint16_t)~TIM_CR1_UDIS;
}

void TIM1_PWM_Freq_Update_SoftStart(void)
{
  tmpbdtr = TIM1->BDTR;
  tmpbdtr &= 0xFF00;
  tmpbdtr |= Dead_Time;
  TIM1->CR1 |= TIM_CR1_UDIS;
  TIM1->BDTR   = tmpbdtr;
  TIM1->CR1 &= (uint16_t)~TIM_CR1_UDIS;
}

void TIM2_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  /* Enable the TIM2 Update Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel           = TIM2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority     = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd         = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  /* Time Base configuration */
  TIM_TimeBaseStructure.TIM_Prescaler     = 1;
  TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_ClockDivision   = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_Period     = 1499; // fsamp = 50kHz
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  // TIM2 TRGO selection
  TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);

  // TIM2 IT enable
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

  // TIM2 enable counter
  TIM_Cmd(TIM2, ENABLE);

  /* TIM1 counter enable */
  TIM_Cmd(TIM1, ENABLE);//1Tcy

  /* Main Output Enable */
  TIM_CtrlPWMOutputs(TIM1, ENABLE);

}
Guest #3998719
Rate this post
• ▲ useful
▼ not useful
I am not sure but i remember on an timer reload values and using the Irq 
issue, that was descripted in an errata of ST related to the Cortex M4F 
controller. I would recommend that you do some recherche about errata's. 
They are often solve the Problems about the Controllers.

Reply

Note: the original post is older than 6 months. Please don't ask any new questions in this thread, but start a new one.

Formatting
  • [c]C-Code[/c]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]
  • [[Title]] – link to an article
  • Link to another post: right-click its post ID (#8078628), copy the address, paste it into the text

More about formatting

Post long source code as an attachment, not in the text.

Already registered? Log in

Not shown to anyone. We send you a link; your post appears once you confirm it there.

By submitting you create a free account and accept the terms of use.