Software PWM lets you control devices like LEDs by turning a pin on and off very fast. This makes the device look like it is dimmed or at different power levels.
0
0
Software PWM with RPi.GPIO in Raspberry Pi
Introduction
You want to dim an LED connected to your Raspberry Pi.
You need to control the speed of a small motor using your Pi.
You want to create different brightness levels for a light without extra hardware.
You want to generate sound tones by turning a pin on and off quickly.
Syntax
Raspberry Pi
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(pin_number, GPIO.OUT) pwm = GPIO.PWM(pin_number, frequency) pwm.start(duty_cycle) # To change brightness or speed pwm.ChangeDutyCycle(new_duty_cycle) # To stop PWM pwm.stop() GPIO.cleanup()
pin_number is the GPIO pin you connect your device to.
frequency is how fast the pin switches on and off (in Hertz).
Examples
This example sets GPIO 18 to output PWM at 1000 Hz with half brightness for 2 seconds.
Raspberry Pi
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(18, GPIO.OUT) pwm = GPIO.PWM(18, 1000) # 1000 Hz frequency pwm.start(50) # 50% brightness time.sleep(2) pwm.stop() GPIO.cleanup()
This example gradually increases brightness on GPIO 12 from 0% to 100% in steps.
Raspberry Pi
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(12, GPIO.OUT) pwm = GPIO.PWM(12, 500) # 500 Hz frequency pwm.start(0) # Start with LED off for dc in range(0, 101, 20): pwm.ChangeDutyCycle(dc) # Increase brightness time.sleep(1) pwm.stop() GPIO.cleanup()
Sample Program
This program smoothly increases and then decreases the brightness of an LED connected to GPIO 17 using software PWM.
Raspberry Pi
import RPi.GPIO as GPIO import time # Use BCM pin numbering GPIO.setmode(GPIO.BCM) # Set GPIO 17 as output GPIO.setup(17, GPIO.OUT) # Create PWM instance at 500 Hz pwm = GPIO.PWM(17, 500) # Start PWM with 0% duty cycle (off) pwm.start(0) try: # Gradually increase brightness for duty_cycle in range(0, 101, 10): pwm.ChangeDutyCycle(duty_cycle) print(f"Brightness: {duty_cycle}%") time.sleep(0.5) # Gradually decrease brightness for duty_cycle in range(100, -1, -10): pwm.ChangeDutyCycle(duty_cycle) print(f"Brightness: {duty_cycle}%") time.sleep(0.5) finally: pwm.stop() GPIO.cleanup() print("PWM stopped and GPIO cleaned up.")
OutputSuccess
Important Notes
Always call GPIO.cleanup() to reset pins after your program ends.
Software PWM is not perfect for very high precision or very fast signals.
Use try-finally to ensure PWM stops even if your program crashes.
Summary
Software PWM lets you control brightness or speed by switching pins on and off fast.
Use RPi.GPIO.PWM to create and control PWM on Raspberry Pi pins.
Always clean up GPIO pins after use to avoid issues.