# PWM with analogWrite — Arduino & Embedded C

Source: https://www.geekswithgeeks.com/en/arduino-embedded-c/pwm-out

> Duty cycle, dimming and speed control.

## Duty cycle

Most MCUs cannot output a true analog voltage on ordinary pins. **Pulse-width modulation (PWM)** switches a pin on and off rapidly; the fraction of time it is HIGH is the **duty cycle**. An LED or motor averages these pulses, so 25 % duty looks dim and 100 % is full on. `analogWrite(pin, value)` takes 0 to 255 by default. On the Uno R3 only pins marked with `~` (3, 5, 6, 9, 10, 11) support it, at roughly 490 Hz (about 980 Hz on pins 5 and 6). Other boards have different PWM pins and frequencies, and some ESP32 core versions use the LEDC peripheral underneath; check your board's pinout and core documentation.

## Fade an LED in and out

Uno R3: LED with 330 Ω resistor on PWM pin 9.

```cpp
const uint8_t LED_PIN = 9;   // must be a PWM-capable pin
int level = 0, step = 5;
unsigned long last = 0;

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  if (millis() - last >= 20) {
    last = millis();
    analogWrite(LED_PIN, level);        // 0 = off, 255 = fully on
    level += step;
    if (level <= 0 || level >= 255) step = -step;
  }
}
```

## Flicking a light switch very fast

PWM is like flicking a light switch so quickly that your eye only sees the average brightness; leaving it on longer each cycle makes the room look brighter.

**Quiz:** What does analogWrite(pin, 64) roughly produce on an Uno R3 PWM pin?

- [ ] A 64 Hz sine wave
- [ ] A steady 1.25 V DC voltage
- [x] A square wave HIGH about 25 % of the time
- [ ] Nothing, because analogWrite is for inputs

*Answer:* A square wave HIGH about 25 % of the time. 64/255 is about a quarter duty cycle.
