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:iot-open:practical:hardware:sut:stm32:emb1a_1 [2024/03/03 09:01] – [Start] ktokarzen:iot-open:practical:hardware:sut:stm32:emb1a_1 [2024/03/25 08:23] (current) – [Project information] pczekalski
Line 25: Line 25:
 #include <HardwareTimer.h> #include <HardwareTimer.h>
 </code> </code>
-The hardware timer uses internal timer modules and allows us to define channels attached to the timer. We will use 1 channel per colour (R, G and B, so 3 in total). A PWM frequency is controlled with the timer to be shared for all 3 R, G and B channels. Channels control the PWM duty cycle.+The hardware timer library uses internal timer modules and allows us to define channels attached to the timer. In this example, we will use 1 channel only for the fan. A PWM frequency is controlled with the timer shared with the servo motor. Channels control the PWM duty cycle.
 === Step 1 === === Step 1 ===
-Include the library, and define PIN assignments to channels and PWM frequency (100Hz):+Include the library, and define PIN assignments to channels and PWM frequency (50Hz):
 <code c> <code c>
 #include <HardwareTimer.h> #include <HardwareTimer.h>
  
-// Pins definition for RGB LED +// Pin definition for the fan 
-#define LED_PWM_GREEN D3  //Arduino numbering D3, STM numbering PA_10 +#define FAN_PWM_PIN   PA1 //Arduino numbering A2, STM numbering PA_1
-#define LED_PWM_BLUE  D6  //Arduino numbering D6, STM numbering PA_8 +
-#define LED_PWM_RED   D9  //Arduino numbering D9, STM numbering PA_9+
  
-#define PWM_freq 100+#define PWM_fan_freq 50
 </code> </code>
-GPIO pins controlling  LEDS are D9 (Red), D3 (Green) and D6 (Blue), respectively.+The GPIO pin controlling the fan is A2 (PA_1 in STM-type numbering).
  
 === Step 2 === === Step 2 ===
Line 44: Line 42:
 <code c> <code c>
 // PWM variables definitions // PWM variables definitions
-HardwareTimer *MyTimLED              //Hardware Timer for PWM +HardwareTimer *MyTimFan //Hardware Timer class for Fan 
-uint32_t channelR, channelG, channelB; //RGB channels+uint32_t channelFAN     //1 channel
 </code> </code>
  
-Instantiate the timer object and initialise the 3 channels for PWM and make them dark (1duty cycle):+Instantiate the timer object and initialise the fan channel for PWM, no rotation (0%):
 <code c> <code c>
-//Create Timer instance type based on the chosen LED pin (the same timer is used for all LEDs).   +//Create Timer instance type based on the fan pin (the same timer is used for servo if needed).   
-TIM_TypeDef *Instance = (TIM_TypeDef *)pinmap_peripheral(digitalPinToPinName(LED_PWM_RED), PinMap_PWM);+TIM_TypeDef *FanInstance = (TIM_TypeDef *)pinmap_peripheral(digitalPinToPinName(FAN_PWM_PIN), PinMap_PWM);
          
-//Define three separate channels for LEDs +//Define the channel for fan 
-channelR = STM_PIN_CHANNEL(pinmap_function(digitalPinToPinName(LED_PWM_RED), PinMap_PWM)); +channelFAN = STM_PIN_CHANNEL(pinmap_function(digitalPinToPinName(FAN_PWM_PIN), PinMap_PWM));
-channelG = STM_PIN_CHANNEL(pinmap_function(digitalPinToPinName(LED_PWM_GREEN), 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 'new' instantiation, HardwareTimer is not destructed when setup() function is finished. 
-MyTimLED = new HardwareTimer(Instance);+MyTimFan = new HardwareTimer(FanInstance);
  
-// Configure and start PWM +//Configure and start PWM 
-MyTimLED->setPWM(channelR,LED_PWM_RED,PWM_freq,1);   /* 100 Hertz, 1% dutycycle. */ +MyTimFan->setPWM(channelFANFAN_PWM_PIN500);   // 50 Hertz, 0% dutycycle.
-MyTimLED->setPWM(channelG,LED_PWM_GREEN,PWM_freq,1); /* 100 Hertz, 1% dutycycle. */ +
-MyTimLED->setPWM(channelB,LED_PWM_BLUE,PWM_freq,1);  /* 100 Hertz, 1% dutycycle. */+
 </code> </code>
  
-To modify the intensity of the chosen LED after initialisation use the setCaptureCompare function. In the following example, the duty_cycle_value can vary between 0 and 100.+To modify the fan's rotation speed after initialisation use the setCaptureCompare function. 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+MyTimFan->setCaptureCompare(channelFAN, duty_cycle_value, PERCENT_COMPARE_FORMAT); //modify duty cycle 
 +};
 </code> </code>
  
 === Step 3 === === Step 3 ===
-Write a loop for each colour (R, G, then B) to light the colour from dark to max value+Write a loop to change the rotation from stop to max, and then from max to stop
-<note important> Full duty cycle (100%) will be too bright for the remote access video camera to handle itUse some reasonable range such as 0..50% is strongly advised.</note> +<note important> Too low duty cycle (1%) will not cause the fan to rotateYou can do some experiments on the minimal duty cycle which starts the fan to rotate.</note> 
-Mind to compose code to increase and decrease each colour. A hint is below (for channelR):+Mind to compose the code for cyclic speed changes up and down. A hint is below (for increasing the speed):
 <code c> <code c>
-  // Increase brightness +  // Increase fan speed 
-  for (int duty_cycle_value = 0; duty_cycle_value <= 50; duty_cycle_value++) { +  for (int duty_cycle_value = 0; duty_cycle_value <= 100; duty_cycle_value++) { 
-    // Gradually increase duty cycle for Red LED +    // Gradually increase duty cycle for fan speed 
-    MyTimLED->setCaptureCompare(channelR, duty_cycle_value, PERCENT_COMPARE_FORMAT);+    MyTimFan->setCaptureCompare(channelFAN, duty_cycle_value, PERCENT_COMPARE_FORMAT);
     delay(20); // Delay for smooth transition     delay(20); // Delay for smooth transition
   }   }
- 
-  delay(100); 
- 
-  // Decrease brightness 
-  for (int duty_cycle_value = 50; duty_cycle_value >= 0; duty_cycle_value--) { 
-    // Gradually decrease duty cycle for Red LED 
-    MyTimLED->setCaptureCompare(channelR, duty_cycle_value, PERCENT_COMPARE_FORMAT); 
-    delay(20); // Delay for smooth transition 
-  } 
- 
 </code> </code>
 ==== Result validation ==== ==== Result validation ====
-You should be able to observe the pulsing colours of the RGB LED, increasing and decreasing brightness linearly.+You should be able to observe the changes in the fan's rotation speed. It is advisable to connect this scenario with the scenario for reading the pressure measurements.
  
 ===== 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 (connected to our RGB LED) and timer 2 with 4 PWM channels (with two of them connected to the servo and fan described in other scenarios). 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 (connected to RGB LED described in another scenario) and timer 2 with 4 PWM channels (with two of them connected to the servo and fan). 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 be also expressed in ticks, microseconds, and 1-16 bits 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 handIn the example abovewe propose 100Hz, but this MCU can easily handle higher frequencies.+**What PWM frequency should I use?**: It depends on the signal useFor the fan or LEDsno specific frequency is required, but for the servo, the frequency needs to be precisely 50Hz. If you use a servo and fan in the same project set the timer frequency at 50Hz.
  
 +<WRAP noprint>
 ===== Project information ===== ===== Project information =====
 {{:en:iot-open:logo_iot_200_px.png?200|}}\\ {{:en:iot-open:logo_iot_200_px.png?200|}}\\
Line 120: Line 106:
 {{:en:iot-open:ccbync.png?100|}} {{:en:iot-open:ccbync.png?100|}}
 </figure> </figure>
- +</WRAP>
- +
en/iot-open/practical/hardware/sut/stm32/emb1a_1.1709456505.txt.gz · Last modified: 2024/03/03 09:01 by ktokarz
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0