Skip to main content
Explorer II
May 8, 2024
Question

Changing Pulse makes the frequency half of the original one

  • May 8, 2024
  • 2 replies
  • 942 views

Hi,

 

I have this function to simulate a quadrature output

void TIM3_Configuration_positive_quadrature(void)
{
	TIM_OCInitTypeDef TIM_OCInitStructure;
	int Period;
	Period = 1000 / 1; // 1 Hz - 1 second on, 1 second off duty

	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_Pulse = (Period * 1) / 4; // CH3 at 25%
	TIM_OC3Init(TIM3, &TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_Pulse = (Period * 3) / 4; // CH4 at 75%, ie half cycle later
	TIM_OC4Init(TIM3, &TIM_OCInitStructure);
}

 

When I set 1000 Hz as frequency (controlled by oscilloscope that is correctly set) after calling the quadrature function above the frequency becomes half.

 

Any idea on why of this behaviour?

    This topic has been closed for replies.

    2 replies

    ST Employee
    May 8, 2024

    Hello @EmbeddedPepe

    I think this is related to the toggle match behavior, since a full square wave cycle requires two toggles (low to high and high to low) and the timer only toggles once per counter match, the frequency of the output signal will be half the rate at which the counter matches the TIM_Pulse value.

    The workaround is to adjust the period or the PSC value to compensate for the toggle behavior

    Graduate II
    May 8, 2024

    Toggling will implicitly half frequency, it's a DIV2, as you're now describing the individual mark and space duty times, not the period.

    Where

    TIM->PSC = x - 1;

    use

    TIM->PSC = ((x / 2) - 1);

    Explorer II
    May 8, 2024

    Sorry, I didn't understand how to workaround it.

     

    Does the function in the initial post work with mode PWM1?

    Graduate II
    May 8, 2024

    Toggle is good for phase shifted square waves

    My notation was one for halving the Prescaler (TIM->PSC) to get back to the higher (double) frequency to overcome the halving on the Period (TIM->ARR)