PWM (Pulse Width Mod) in STM32

Pulse Width Modulation is one of the important functions of timer. PWM is a technique to control analogue circuits with digital output from microcontroller.

As you all know that an Analog signal is the one whose value varies continuously with time whereas digital signals can only be either high or low. PWM is used for generating an analogue signal using a digital source.
PWM consist of two main components:-
1.) Duty cycle
2.) Frequency

By cycling a digital signal ON and OFF at a fast enough rate and at a certain duty cycle, the output will appear like a constant voltage analogue signal. For eg: To create a 2V signal from a digital source which is either HIGH(5V) or low (0). We can use PWM with duty cycle of 40% here. This 40% duty cycle would yield an average voltage of 5×0.4=2V.

25% Duty
75% Duty


CubeMX Setup

The clock setup is as follows

  • External Crystal is used to provide the clock via the PLL.
  • I am going to use the TIM1 for the PWM, which is connected to the APB2 Bus
  • The APB2 Timer clock is at 72MHz right now.
  • Select the PWM channel for the Timer, I am using Channel 1.
  • Set the Clock source as internal clock.
  • Pin PA8 is set as the PWM output Pin.

As I mentioned above that Timer 1 clock is at 72 Mhz. Using the Prescaler of 72 will bring the clock down to 1 Mhz.

Further using the ARR of 100 will set the PWM Frequency = 10 KHz. This is shown in the image below



Why do we need to use -1 ?

This is the setup as per the registers in STM32. The Prescaler Register and the ARR Registers are setup in a way, that they add a 1 to the value.

So whatever value we enter for the PSC, 1 will be added to that value. This is why we enter 1 less than the actual value.



Some Insight into the Code

Below is the code for the main function.

 int main()
{
  ....
  TIM1->CCR1 = 30;
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  while (1)
  {}
}
  • Inside the main function, we will first set the pulse value in the Capture Compare Register (CCR).
  • Since I am using Channel 1, the Register is CCR1.
  • And we will start the Timer in PWM mode

The value set in the CCR decides the width of the pulse. The formula to calculate the duty cycle is shown below



RESULT

Duty cycle 30%, freq = 10 KHz

As we configured the Timer 1 clock at 10 KHz, our signal period is 100us. Also the CCR1 value is set to 30, so we got the duty cycle of 30%.

You can check the video to see the detailed output.

Check out the Video Below




Info

You can help with the development by DONATING Below.
To download the project, click the DOWNLOAD button.

Subscribe
Notify of

20 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
keyboard_arrow_up