Bird
Raised Fist0
Arduinoprogramming~20 mins

analogWrite() and PWM output in Arduino - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
PWM Mastery Badge
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
What is the PWM duty cycle output by analogWrite()?
Consider the Arduino code below. What is the duty cycle percentage of the PWM signal on pin 9 after running this code?
Arduino
void setup() {
  pinMode(9, OUTPUT);
  analogWrite(9, 128);
}

void loop() {
  // empty
}
A50%
B25%
C75%
D100%
Attempts:
2 left
💡 Hint
The analogWrite() value ranges from 0 to 255, representing 0% to 100% duty cycle.
Predict Output
intermediate
2:00remaining
What happens if analogWrite() is called with 0?
What is the output signal on the pin after calling analogWrite(pin, 0)?
Arduino
void setup() {
  pinMode(6, OUTPUT);
  analogWrite(6, 0);
}

void loop() {
  // empty
}
APin outputs a constant HIGH (5V) signal
BPin outputs a constant LOW (0V) signal
CPin outputs a 50% duty cycle PWM signal
DPin outputs a 100% duty cycle PWM signal
Attempts:
2 left
💡 Hint
Think about what a PWM duty cycle of 0 means.
🔧 Debug
advanced
2:00remaining
Why does this analogWrite() code not produce PWM on pin 2?
The code below tries to output PWM on pin 2 but it doesn't work. Why?
Arduino
void setup() {
  pinMode(2, OUTPUT);
  analogWrite(2, 128);
}

void loop() {
  // empty
}
AanalogWrite() requires pinMode(INPUT) for PWM
BanalogWrite() only works on pins 0 and 1
CPin 2 does not support PWM on most Arduino boards
DThe value 128 is out of range for analogWrite()
Attempts:
2 left
💡 Hint
Check which pins support PWM on your Arduino board.
🧠 Conceptual
advanced
2:00remaining
How does PWM simulate analog voltage with digital pins?
Which statement best explains how PWM output from analogWrite() simulates an analog voltage?
ABy switching the pin rapidly between HIGH and LOW, varying the ON time ratio to control average voltage
BBy changing the voltage level of the pin between 0V and 5V continuously
CBy sending a serial data stream that the device interprets as voltage
DBy using a digital-to-analog converter inside the Arduino to output true analog voltage
Attempts:
2 left
💡 Hint
Think about how turning a light on and off quickly can look dimmer.
Predict Output
expert
2:00remaining
What is the output frequency of analogWrite() PWM on Arduino Uno?
What is the approximate frequency of the PWM signal generated by analogWrite() on pins 5 and 6 of an Arduino Uno?
A1 kHz
B31 kHz
C490 Hz
D980 Hz
Attempts:
2 left
💡 Hint
Arduino Uno uses different PWM frequencies on different pins.

Practice

(1/5)
1. What does the analogWrite() function do on an Arduino board?
easy
A. It sets a digital pin to HIGH or LOW.
B. It reads the voltage from an analog sensor.
C. It outputs a PWM signal to simulate an analog voltage on a digital pin.
D. It measures the frequency of a signal on a pin.

Solution

  1. Step 1: Understand the purpose of analogWrite()

    The analogWrite() function does not output a true analog voltage but uses PWM (Pulse Width Modulation) to simulate varying voltage levels on digital pins.
  2. Step 2: Compare options with function behavior

    It outputs a PWM signal to simulate an analog voltage on a digital pin. correctly describes this behavior. Options A, B, and D describe other functions or actions unrelated to analogWrite().
  3. Final Answer:

    It outputs a PWM signal to simulate an analog voltage on a digital pin. -> Option C
  4. Quick Check:

    analogWrite() = PWM output [OK]
Hint: Remember: analogWrite() controls brightness/speed via PWM [OK]
Common Mistakes:
  • Confusing analogWrite() with analogRead()
  • Thinking analogWrite() outputs true analog voltage
  • Assuming analogWrite() sets pin HIGH or LOW directly
2. Which of the following is the correct syntax to set pin 9 to half brightness using analogWrite()?
easy
A. analogWrite(9, 512);
B. analogWrite(9, 0);
C. analogWrite(9, 255);
D. analogWrite(9, 127);

Solution

  1. Step 1: Understand the value range for analogWrite()

    The analogWrite() function accepts values from 0 to 255, where 0 is off and 255 is full brightness.
  2. Step 2: Calculate half brightness value

    Half brightness is about half of 255, which is approximately 127. A uses 512 (out of range), B uses 0 (off), C uses 255 (full brightness), so D is correct.
  3. Final Answer:

    analogWrite(9, 127); -> Option D
  4. Quick Check:

    Half brightness ≈ 127 [OK]
Hint: Use values between 0-255; half is about 127 [OK]
Common Mistakes:
  • Using values above 255 (like 512)
  • Confusing digitalWrite() with analogWrite()
  • Using full brightness value instead of half
3. What will be the effect of the following code snippet on an LED connected to pin 6?
void setup() {
  pinMode(6, OUTPUT);
}

void loop() {
  analogWrite(6, 0);
  delay(1000);
  analogWrite(6, 255);
  delay(1000);
}
medium
A. The LED will blink on and off every second.
B. The LED will stay dimly lit.
C. The LED will stay fully on.
D. The LED will flicker rapidly.

Solution

  1. Step 1: Analyze analogWrite values and delays

    The code sets pin 6 to 0 (off) for 1 second, then to 255 (full brightness) for 1 second, repeatedly.
  2. Step 2: Understand LED behavior

    When the pin is 0, the LED is off; when 255, it is fully on. The delays cause the LED to stay in each state for 1 second, making it blink on and off every second.
  3. Final Answer:

    The LED will blink on and off every second. -> Option A
  4. Quick Check:

    0 and 255 with delays = blink [OK]
Hint: 0 means off, 255 means full on; delays cause blinking [OK]
Common Mistakes:
  • Thinking analogWrite(0) dims LED instead of off
  • Ignoring delay effects on LED timing
  • Assuming LED flickers rapidly without delay
4. Identify the error in this code snippet intended to fade an LED on pin 10:
void setup() {
  pinMode(10, OUTPUT);
}

void loop() {
  for (int i = 0; i <= 255; i++) {
    analogWrite(10, i);
    delay(10);
  }
  for (int i = 255; i >= 0; i--) {
    analogWrite(10, i);
    delay(10);
  }
}
medium
A. The code will work correctly and fade the LED in and out.
B. The for loop variable i should be declared outside the loop.
C. The pin 10 is not set as OUTPUT.
D. analogWrite() cannot be used with pin 10.

Solution

  1. Step 1: Check pinMode setup

    Pin 10 is correctly set as OUTPUT in setup().
  2. Step 2: Analyze the for loops and analogWrite usage

    The loops increase and then decrease the PWM value from 0 to 255 and back, with delays to create a smooth fade effect. This is a common and correct pattern.
  3. Final Answer:

    The code will work correctly and fade the LED in and out. -> Option A
  4. Quick Check:

    For loops with analogWrite create fade [OK]
Hint: For fading, increase then decrease PWM values smoothly [OK]
Common Mistakes:
  • Forgetting to set pinMode to OUTPUT
  • Thinking analogWrite can't be used on pin 10
  • Misunderstanding loop variable scope
5. You want to control the speed of a DC motor using PWM on pin 3. Which code snippet correctly sets the motor speed to 60% power?
hard
A. analogWrite(3, 60); // 60 is the percentage value
B. analogWrite(3, 153); // 60% of 255 is about 153
C. analogWrite(3, 0.6); // decimal value for 60%
D. analogWrite(3, 255); // full power always

Solution

  1. Step 1: Convert percentage to PWM value

    60% of the maximum PWM value 255 is 0.6 x 255 = 153.
  2. Step 2: Check the analogWrite parameter

    analogWrite() requires an integer between 0 and 255. analogWrite(3, 153); // 60% of 255 is about 153 uses 153, which is correct. analogWrite(3, 60); // 60 is the percentage value uses 60 which is too low, C uses a decimal which is invalid, and D sets full power.
  3. Final Answer:

    analogWrite(3, 153); // 60% of 255 is about 153 -> Option B
  4. Quick Check:

    60% x 255 = 153 [OK]
Hint: Multiply percentage by 255 for PWM value [OK]
Common Mistakes:
  • Passing percentage directly instead of scaled value
  • Using decimal numbers instead of integers
  • Always setting full power without scaling