Bird
Raised Fist0
Embedded Cprogramming~10 mins

PWM generation using timers in Embedded C - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to set the timer prescaler for PWM generation.

Embedded C
TIM_HandleTypeDef htim1;

void PWM_Init() {
    htim1.Init.Prescaler = [1];
    // Other initialization code
}
Drag options to blanks, or click blank then click option'
A65535
B79
C1000
D0
Attempts:
3 left
💡 Hint
Common Mistakes
Using 0 as prescaler causes no division, leading to very fast timer overflow.
2fill in blank
medium

Complete the code to set the PWM period by configuring the timer's auto-reload register.

Embedded C
void PWM_Init() {
    htim1.Init.Period = [1];
    // Other initialization code
}
Drag options to blanks, or click blank then click option'
A999
B79
C10000
D0
Attempts:
3 left
💡 Hint
Common Mistakes
Setting period to 0 disables counting, no PWM generated.
3fill in blank
hard

Fix the error in setting the PWM pulse width for 50% duty cycle.

Embedded C
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.Pulse = [1];
// Other PWM channel configuration
Drag options to blanks, or click blank then click option'
Ahtim1.Init.Period / 2
Bhtim1.Init.Period
Chtim1.Init.Prescaler
Dhtim1.Init.Period * 2
Attempts:
3 left
💡 Hint
Common Mistakes
Using full period as pulse causes 100% duty cycle, no off time.
4fill in blank
hard

Fill both blanks to configure the timer for PWM mode and enable the preload feature.

Embedded C
sConfigOC.OCMode = [1];
sConfigOC.OCPreload = [2];
Drag options to blanks, or click blank then click option'
ATIM_OCMODE_PWM1
BTIM_OCMODE_TIMING
CTIM_OCNORELOAD_ENABLE
DTIM_OCPRELOAD_ENABLE
Attempts:
3 left
💡 Hint
Common Mistakes
Using timing mode disables PWM output.
5fill in blank
hard

Fill all three blanks to start the PWM signal on channel 1 and enable the timer.

Embedded C
HAL_TIM_PWM_Start(&htim1, [1]);
__HAL_TIM_ENABLE(&htim1);
__HAL_TIM_SET_COUNTER(&htim1, [2]);
htim1.Instance->CR1 |= [3];
Drag options to blanks, or click blank then click option'
ATIM_CHANNEL_1
B0
CTIM_CR1_CEN
DTIM_CHANNEL_2
Attempts:
3 left
💡 Hint
Common Mistakes
Starting PWM on wrong channel disables output.

Practice

(1/5)
1. What does PWM stand for in embedded C programming when using timers?
easy
A. Pulse Width Modulation
B. Power Wave Management
C. Programmed Write Mode
D. Peripheral Watchdog Monitor

Solution

  1. Step 1: Understand the acronym PWM

    PWM is a common term in embedded systems related to signal control.
  2. Step 2: Match PWM with its full form

    PWM stands for Pulse Width Modulation, which controls signal timing using timers.
  3. Final Answer:

    Pulse Width Modulation -> Option A
  4. Quick Check:

    PWM = Pulse Width Modulation [OK]
Hint: Remember PWM controls signal timing by pulse width [OK]
Common Mistakes:
  • Confusing PWM with power management terms
  • Thinking PWM is a mode for writing data
  • Mixing PWM with watchdog timer functions
2. Which of the following is the correct way to start a timer for PWM in embedded C?
easy
A. TIM_StartPWM();
B. HAL_TIM_PWM_Start(&htim);
C. StartTimerPWM();
D. timer_pwm_start();

Solution

  1. Step 1: Identify standard embedded C HAL function

    HAL libraries use the prefix HAL_TIM_PWM_Start for starting PWM timers.
  2. Step 2: Check syntax correctness

    HAL_TIM_PWM_Start(&htim); uses correct syntax with a timer handle pointer, matching HAL style.
  3. Final Answer:

    HAL_TIM_PWM_Start(&htim); -> Option B
  4. Quick Check:

    HAL_TIM_PWM_Start(&htim) is correct syntax [OK]
Hint: HAL functions start with HAL_ prefix and use handles [OK]
Common Mistakes:
  • Using incorrect function names without HAL prefix
  • Missing the timer handle argument
  • Using lowercase or camelCase incorrectly
3. Given the following code snippet, what is the duty cycle percentage of the PWM signal?
uint32_t period = 1000;
uint32_t pulse = 250;
// Timer configured with period and pulse
// PWM output uses pulse width = pulse
medium
A. 100%
B. 75%
C. 50%
D. 25%

Solution

  1. Step 1: Understand duty cycle formula

    Duty cycle = (pulse / period) * 100%
  2. Step 2: Calculate duty cycle with given values

    Duty cycle = (250 / 1000) * 100% = 25%
  3. Final Answer:

    25% -> Option D
  4. Quick Check:

    Duty cycle = 25% [OK]
Hint: Duty cycle = pulse divided by period times 100% [OK]
Common Mistakes:
  • Confusing pulse with period
  • Calculating 1000/250 instead of 250/1000
  • Forgetting to multiply by 100 for percentage
4. Identify the error in this PWM timer initialization code snippet:
TIM_HandleTypeDef htim;
htim.Init.Period = 1000;
htim.Init.Pulse = 500;
HAL_TIM_PWM_Start(&htim);
medium
A. Missing call to HAL_TIM_PWM_ConfigChannel before starting PWM
B. The 'Pulse' field requires pointer syntax like htim->Init.Pulse
C. Period value should be set after starting PWM
D. Timer handle 'htim' must be a pointer, not a variable

Solution

  1. Step 1: Check PWM initialization sequence

    Before starting PWM, the channel must be configured with pulse value using HAL_TIM_PWM_ConfigChannel.
  2. Step 2: Identify missing configuration call

    The code sets pulse in Init (which is incorrect) and skips HAL_TIM_PWM_ConfigChannel call.
  3. Final Answer:

    Missing call to HAL_TIM_PWM_ConfigChannel before starting PWM -> Option A
  4. Quick Check:

    ConfigChannel call needed before HAL_TIM_PWM_Start [OK]
Hint: Always configure PWM channel before starting timer [OK]
Common Mistakes:
  • Setting pulse in Init structure instead of channel config
  • Starting PWM without configuring channel
  • Assuming timer handle must be pointer variable
5. You want to generate a PWM signal with a 60% duty cycle and a frequency of 1 kHz using a timer with a 72 MHz clock. Which timer period and pulse values should you set? Assume timer prescaler is set to 71 (divides clock by 72).
hard
A. Period = 1000, Pulse = 600
B. Period = 72000, Pulse = 43200
C. Period = 999, Pulse = 600
D. Period = 71, Pulse = 43

Solution

  1. Step 1: Calculate timer frequency after prescaler

    Timer clock = 72 MHz / (71 + 1) = 1 MHz (1 microsecond per tick)
  2. Step 2: Calculate period for 1 kHz PWM frequency

    Period = (Timer frequency / PWM frequency) - 1 = (1,000,000 / 1,000) - 1 = 999
  3. Step 3: Calculate pulse for 60% duty cycle

    Pulse = Period * 0.6 = 999 * 0.6 = 599.4 ≈ 600
  4. Final Answer:

    Period = 999, Pulse = 600 -> Option C
  5. Quick Check:

    Period 999 and pulse 600 give 60% duty cycle at 1 kHz [OK]
Hint: Divide clock by prescaler, then calculate period and pulse [OK]
Common Mistakes:
  • Not adding 1 to prescaler or period calculations
  • Using full clock without prescaler division
  • Rounding pulse incorrectly
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard