Pulse Width Modulation with Arduino

Getting Started with Arduino PWM

Understanding Arduinos PWM Pins

PWM stands for Pulse Width Modulation, and it’s a technique used in electronics to simulate analog output using digital signals. PWM is commonly used in microcontroller platforms like the Arduino to control things like the brightness of an LED, the speed of a motor, or the position of a servo motor.

Pulse Generation:

  • When you use a PWM-enabled pin, you can set the analogWrite() function (in Arduino programming) to a value between 0 and 255. This value represents the duty cycle, where 0 means the signal is always off (0% duty cycle), and 255 means the signal is always on (100% duty cycle). Intermediate values represent varying degrees of on-off cycles.
PWM Duty Cycle Examples


  • The PWM frequency on Arduino boards is typically fixed, usually around 490Hz or 980Hz, depending on the specific board and pin used. This frequency is relatively high, which is suitable for most applications.


  • LED Brightness Control: PWM pins are often used to control the brightness of LEDs. By changing the duty cycle, you can make an LED appear dim or bright.
  • Motor Speed Control: PWM can be used to control the speed of DC motors. By adjusting the duty cycle, you can change the average voltage applied to the motor, thus altering its speed.
  • Servo Motor Control: Servo motors are commonly used in robotics and automation. PWM signals are used to set the position of the servo’s shaft.

Here’s a simple example of how to use PWM on an Arduino to control the brightness of an LED:

const int ledPin = 9; // PWM pin
int brightness = 0;   // initial LED brightness

void setup() {
  pinMode(ledPin, OUTPUT);

void loop() {
  // Increase brightness from 0 to 255 and back down to 0
  for (brightness = 0; brightness <= 255; brightness++) {
    analogWrite(ledPin, brightness);
    delay(10); // Add a small delay to see the effect
  for (brightness = 255; brightness >= 0; brightness--) {
    analogWrite(ledPin, brightness);

In this example, the PWM pin (pin 9) is used to control the brightness of an LED by varying the duty cycle of the PWM signal. The loop increases and decreases the brightness in a smooth manner.

Digital PWM:

Digital writes are a constant HIGH of 5V or a constant LOW of 0V, whereas Analog writes use PWM. Instead of being a constant HIGH of 5V PWM modulates between On and OFF.

Analog PWM:

If you looked at an analogWrite() value of 255 through an oscilloscope, you would see a constant high line. If the value was set to 0 you would then see a constant low line If the analogWrite() value was somewhere in between let’s say 125, you would see an almost equal square wave on the oscilloscope, high then low, then high then low, on then off, then on the off. The higher the analogWrite() value is, the longer the power is HIGH. The lower the analogWrite() value is the longer the power is LOW.

Digital Pins That use PWM:

Digital Pins 3, 5, 6, 9, 10, 11 on the Arduino Uno can be used as PWM pins also.

Components That use PWM:

Motors and servos need to be controlled by PWM signals. You can control a motor with a digital HIGH, but it would either be off or top speed, giving no control. Using PWM we can increase or decrease speed while its set to move. Most servos move 180 degrees you can pinpoint its movement with PWM. An LED when used with digitalWrite() is either on or off with no control, using PWM you can set the brightness value to be as bright or as dim as you need.


Pulse Width Modulation (PWM) pins on Arduino boards are versatile tools that allow you to simulate analog output with digital signals. They enable you to control the intensity, speed, or position of various components, such as LEDs, motors, and servo motors, by adjusting the duty cycle of the PWM signal. Understanding how to harness the power of PWM pins opens up a world of possibilities for creating dynamic and precise electronic projects with your Arduino. So, whether you’re crafting interactive LED displays, building a robot, or designing custom motor control systems, PWM pins are essential resources that empower you to bring your ideas to life.

Happy Tinkering!


If you don’t already own any Arduino hardware, we highly recommend purchasing the Elegoo Super Starter Kit. This kit has everything you need to start programming with Arduino.

You can find out more about this kit here: Elegoo Super Starter Kit

Luke Barber

Hello, fellow tech enthusiasts! I'm Luke, a passionate learner and explorer in the vast realms of technology. Welcome to my digital space where I share the insights and adventures gained from my journey into the fascinating worlds of Arduino, Python, Linux, Ethical Hacking, and beyond. Armed with qualifications including CompTIA A+, Sec+, Cisco CCNA, Unix/Linux and Bash Shell Scripting, JavaScript Application Programming, Python Programming and Ethical Hacking, I thrive in the ever-evolving landscape of coding, computers, and networks. As a tech enthusiast, I'm on a mission to simplify the complexities of technology through my blogs, offering a glimpse into the marvels of Arduino, Python, Linux, and Ethical Hacking techniques. Whether you're a fellow coder or a curious mind, I invite you to join me on this journey of continuous learning and discovery.

Leave a Reply

Your email address will not be published. Required fields are marked *

Verified by MonsterInsights