0
0
Raspberry Piprogramming~5 mins

Software PWM with RPi.GPIO in Raspberry Pi

Choose your learning style9 modes available
Introduction

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.

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.