No ACL setup yet! Denying access to everyone.
en:edu:zmitac:macro:embedeed:lab:stm32-pwm

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
en:edu:zmitac:macro:embedeed:lab:stm32-pwm [2024/03/04 22:43] – ktokarzen:edu:zmitac:macro:embedeed:lab:stm32-pwm [2025/04/02 08:50] (current) – ktokarz
Line 1: Line 1:
-====== STM32 Control of build-in LEDs with PWM ===== +====== STM32 Control of built-in LEDs with PWM ===== 
-This exercise presents how to handle the brightness control of three LEDs mounted on the Nucleo STM32WB55 board. LEDs are electrically connected to microcontroller's pins. Those LEDs have 3 different colours (Red, Green, and Blue). The red LED is connected to the pin PB1, the green LED to the pin PB0, and the blue LED to the pin PB5. LED is lit when the pin state is "1", and dark when the pin state is "0". LEDs are easily accessible in the software as digital pins named LED_RED, LED_GREEN, and LED_BLUE respectively. Each LED can be controlled with the Arduino standard DigitalWrite() function to switch it on or off or control brightness using a PWM signal.+This exercise presents how to handle the brightness control of three LEDs mounted on the Nucleo STM32WB55 board. LEDs are electrically connected to the microcontroller's pins. Those LEDs are in 3 different colours (Red, Green, and Blue). The red LED is connected to pin PB1, the green LED to pin PB0, and the blue LED to pin PB5. LED is lit when the pin state is "1", and dark when the pin state is "0". LEDs are easily accessible in the software as digital pins named LED_RED, LED_GREEN, and LED_BLUE, respectively. Each LED can be controlled with the Arduino standard DigitalWrite() function to switch it on or off or control brightness using a PWM signal.
  
 ===== Prerequisites ===== ===== Prerequisites =====
Line 6: Line 6:
  
 ==== Tasks to be implemented ==== ==== Tasks to be implemented ====
-1. Write the program that will switch the red LED for one second, then the green LED for one second, and the blue LED for one second repeatedly. This part is to be familiar with the environment, GPIO controlling, and the STM32WB55 board.+1. Write the program that will switch the red LED for one second, then the green LED for one second, and the blue LED for one second repeatedly. This part is to recall the knowledge from the first STM laboratory, be familiar with the equipment, and confirm the proper operation of laboratory elements.
 \\ \\
 2. Implement a program that will light LEDs consecutively with red, green, and blue with a PWM signal. Every LED should start from dark, go up to the maximum brightness and then go down to dark. This must be implemented with the use of a timer. 2. Implement a program that will light LEDs consecutively with red, green, and blue with a PWM signal. Every LED should start from dark, go up to the maximum brightness and then go down to dark. This must be implemented with the use of a timer.
Line 28: Line 28:
  
 ==== Task 2 ==== ==== Task 2 ====
-To do the second task it is necessary to understand the timer operation. It is more complex task than the previous so some detailed explanation is provided below.+To do the second task it is necessary to understand the timer operation. It is a more complex task than the previous so some detailed explanation is provided below.
 === Hardware we use === === Hardware we use ===
-In the STM32WB55 there are two timers capable of generating the PWM signal for up to four channels per timer. Unfortunately, all three LEDs mounted on the Nucleo board are connected to pins which are not controlled directly by a timer. This situation requires using the interrupts to turn the LEDs on and off in the callback functions connected to interrupts signalled by the chosen timer instance. If we use one timer for all three LEDs they will operate with the same frequency. The duty cycle can be different for every LED if we use a separate channel for each of them.+In the STM32WB55, there are two timers capable of generating the PWM signal for up to four channels per timer. Unfortunately, all three LEDs mounted on the Nucleo board are connected to pins which are not controlled directly by a timer. This situation requires using the interrupts to turn the LEDs on and off in the callback functions connected to interrupts signalled by the chosen timer instance. If we use one timer for all three LEDs they will operate with the same frequency. The duty cycle can be different for every LED if we use a separate channel for each of them.
  
 === Software library === === Software library ===
Line 70: Line 70:
 channelB = STM_PIN_CHANNEL(pinmap_function(digitalPinToPinName(LED_PWM_BLUE), PinMap_PWM)); channelB = STM_PIN_CHANNEL(pinmap_function(digitalPinToPinName(LED_PWM_BLUE), PinMap_PWM));
  
-// Instantiate HardwareTimer object. Thanks to 'new' instantiation, HardwareTimer is not destructed when setup() function is finished.+// Instantiate HardwareTimer object. Thanks to the 'new' instantiation, HardwareTimer is not destroyed when the setup() function is finished.
 MyTimLED = new HardwareTimer(Instance); MyTimLED = new HardwareTimer(Instance);
  
Line 89: Line 89:
  
 === Step 4 === === Step 4 ===
-To modify the intensity of the chosen LED in the loop() function use the setCaptureCompare function. It changes the content of the capture compare register responsible for the duration of the duty cycle. In the following example, the duty_cycle_value can vary between 0 and 100.+To modify the intensity of the chosen LED in the loop() function, use the setCaptureCompare function. It changes the content of the capture compare register responsible for the duration of the duty cycle. In the following example, the duty_cycle_value can vary between 0 and 100.
 <code c> <code c>
 MyTimLED->setCaptureCompare(channelR, duty_cycle_value, PERCENT_COMPARE_FORMAT);   //modify duty cycle MyTimLED->setCaptureCompare(channelR, duty_cycle_value, PERCENT_COMPARE_FORMAT);   //modify duty cycle
Line 119: Line 119:
  
 ===== FAQ ===== ===== FAQ =====
-**What is the maximum number of channels?**: the MCU we use here is STM32WB55 on the Nucleo board. The pins available are connected to timer 1 with three PWM channels and timer 2 with 4 PWM channels. A single timer can generate PWM signals with independent duty cycles and identical frequency.+**What is the maximum number of channels?**: The MCU we use here is STM32WB55 on the Nucleo board. The pins available are connected to timer 1 with three PWM channels and timer 2 with 4 PWM channels. A single timer can generate PWM signals with independent duty cycles and identical frequency.
 \\ \\
-**What is the maximum bit resolution for PWM?**: Maximum resolution is 16 bits. Note that we can express the duty cycle in a variety of formats. In the presented example we expressed it in percentage so it varies between 1 and 100. It can be also expressed in ticks, Hertz, microseconds, and 1-16 bits numbers.+**What is the maximum bit resolution for PWM?**: Maximum resolution is 16 bits. Note that we can express the duty cycle in a variety of formats. In the presented example, we expressed it in percentage so it varies between 1 and 100. It can also be expressed in ticks, Hertz, microseconds, and 1-16 bit numbers.
 \\ \\
-**What PWM frequency should I use?**: there is no straightforward answer to this question: assuming you observe LED remotely with a camera, even 50Hz would be enough. But it would give a severe flickering experience to the live user, on the other hand. In the example above, we propose 100Hz, but this MCU can easily handle higher frequencies.+**What PWM frequency should I use?**: There is no straightforward answer to this question: assuming you observe the LED remotely with a camera, even 50Hz would be enough. But it would give a severe flickering experience to the live user, on the other hand. In the example above, we propose 100Hz, but this MCU can easily handle higher frequencies.
  
  
en/edu/zmitac/macro/embedeed/lab/stm32-pwm.1709588634.txt.gz · Last modified: by ktokarz