Input/Output
analogWrite() (PWM)
Writes an analog value to a pin as a digital PWM (pulse-width modulated) signal. The default frequency of the PWM signal is 500 Hz.
Can be used to light a LED at varying brightnesses or drive a motor at various speeds. After a call to analogWrite(), the pin will generate a steady square wave of the specified duty cycle until the next call to analogWrite()
(or a call to digitalRead()
or digitalWrite()
on the same pin).
// SYNTAX
analogWrite(pin, value);
analogWrite(pin, value, frequency);
analogWrite()
takes two or three arguments:
pin
: the number of the pin whose value you wish to setvalue
: the duty cycle: between 0 (always off) and 255 (always on). Since 0.6.0: between 0 and 255 (default 8-bit resolution) or2^(analogWriteResolution(pin)) - 1
in general.frequency
: the PWM frequency (optional). If not specified, the default is 500 Hz.
NOTE: pinMode(pin, OUTPUT);
is required before calling analogWrite(pin, value);
or else the pin
will not be initialized as a PWM output and set to the desired duty cycle.
analogWrite()
does not return anything.
Gen 2 Devices (STM32) (E-Series, Electron, Photon, and P2; does not include E404X):
On the Photon, P1, Electron, and E-Series, pins A3 and A6 (DAC) are DAC (digital-to-analog converter) pins. The analogWrite() function sets an analog voltage, not a PWM frequency, when used on these pins.
When controlling LED brightness, you should always use PWM, not DAC.
// EXAMPLE USAGE
int ledPin = D1; // LED connected to digital pin D1
int analogPin = A0; // potentiometer connected to analog pin A0
int val = 0; // variable to store the read value
void setup()
{
pinMode(ledPin, OUTPUT); // sets the pin as output
}
void loop()
{
val = analogRead(analogPin); // read the input pin
analogWrite(ledPin, val/16); // analogRead values go from 0 to 4095,
// analogWrite values from 0 to 255.
delay(10);
}
NOTE: When used with PWM capable pins, the analogWrite()
function sets up these pins as PWM only.
Additional information on which pins can be used for PWM output is available on the pin information page.
Gen 3 Devices (nRF52) (B-Series SoM, Tracker SoM, Tracker One, Boron, Argon, and E404X):
On Gen 3 devices, the PWM frequency is from 5 Hz to analogWriteMaxFrequency(pin)
(default is 500 Hz).
On Gen 3 Feather devices (Argon, Boron), pins A0, A1, A2, A3, A4, A5, D2, D3, D4, D5, D6, D7, and D8 can be used for PWM. Pins are assigned a PWM group. Each group must share the same frequency and resolution, but individual pins in the group can have a different duty cycle.
- Group 3: Pins D2, D3, A4, and A5.
- Group 2: Pins A0, A1, A2, and A3.
- Group 1: Pins D4, D5, D6, and D8.
- Group 0: Pin D7 and the RGB LED. This must use the default resolution of 8 bits (0-255) and frequency of 500 Hz.
On the Boron SoM, pins D4, D5, D6, D7, A0, A1, A6, and A7 can be used for PWM. Pins are assigned a PWM group. Each group must share the same frequency and resolution, but individual pins in the group can have a different duty cycle.
- Group 2: Pins A0, A1, A6, and A7.
- Group 1: Pins D4, D5, and D6.
- Group 0: Pin D7 and the RGB LED. This must use the default resolution of 8 bits (0-255) and frequency of 500 Hz.
On the Tracker SoM, pins D0 - D9 can be used for PWM. Note that pins A0 - A7 are the same physical pin as D0 - D7. D8 is shared with TX (Serial1) and D9 is shared with RX (Serial1). When used for PWM, pins are assigned a PWM group. Each group must share the same frequency and resolution, but individual pins in the group can have a different duty cycle.
- Group 3: RGB LED
- Group 2: D8 (TX), D9 (RX)
- Group 1: D4, D5, D6, D7
- Group 1: D0, D1, D2, D3
On the E404X, the following groups are defined. Each group must share the same frequency and resolution, but individual pins in the group can have a different duty cycle. Group 0 is shared with the RGB LED and must use the default resolution of 8 bits (0-255) and frequency of 500 Hz, but can have its own duty cycle.
- Group 0: C5, RGBB, RGBG, RGBR
- Group 1: A3, C0, D0, D1, D2
- Group 2: B2, B3, RX, TX
- Group 3: A4, A5, A6, C4
Gen 4 Devices (RTL872x) (P2, Photon 2, and M-SoM):
On the P2, Photon 2, and M-SoM, all PWM pins and the RGB LED share the same PWM timer and must share the same PWM frequency, though each pin can have a separate duty cycle.
The PWM pins for the P2 and Photon 2 are:
Pin | Pin Name | Description | MCU |
---|---|---|---|
23 | A5 / D14 | A5 Analog in, GPIO, PWM. | PB[4] |
35 | D1 / A4 | D1 GPIO, PWM, I2C SCL, A4 Analog In | PB[5] |
40 | S0 / D15 | S0 GPIO, PWM, SPI MOSI, Serial3 TX, I2S MCLK. (Was P1S0 on P1.) | PA[12] |
41 | S1 / D16 | S1 GPIO, PWM, SPI MISO, Serial3 RX. (Was P1S1 on P1.) | PA[13] |
49 | A2 / D13 | A2 Analog in, PWM, GPIO | PB[7] |
The PWM pins for the M-SoM are:
Pin | Pin Name | Description | MCU |
---|---|---|---|
23 | A0 / D19 | A0 Analog in, GPIO, PWM | PB[4] |
33 | A1 / D18 | A1 Analog in, GPIO, PWM | PB[5] |
36 | TX / D9 | Serial TX, PWM, GPIO, SPI1 MOSI, I2S MCLK | PA[12] |
38 | RX / D10 | Serial RX, PWM, GPIO, SPI1 MISO | PA[13] |
43 | A5 / D14 | A5 Analog in, PWM, GPIO, shared with pin 53 | PB[3] |
45 | A6 / D29 | A6 Analog in, GPIO, PWM, M.2 eval PMIC INT | PB[7] |
50 | MISO / D11 | D11 GPIO, PWM, SPI MISO | PA[17] |
52 | MOSI / D12 | D12 GPIO, PWM, SPI MOSI | PA[16] |
53 | A5 / D14 | A5 Analog in, PWM, GPIO, SWCLK, shared with pin 43 | PB[3] |
66 | D4 | D4 GPIO, PWM | PB[18] |
68 | D5 | D5 GPIO, PWM, I2S TX | PB[19] |
70 | D6 | D6 GPIO, PWM, I2S CLK | PB[20] |
72 | D7 | D7 GPIO, PWM, I2S WS | PB[21] |
Gen 4 devices share a single timer for both PWM (analogWrite)
and Servo. If you are using Servo, you must set the analogWrite frequency to 50 Hz, which matches
Servo, or your servo will not function properly. For example: analogWrite(A2, 255, 50);
using the
optional third parameter to set the frequency to 50 Hz for compatibility with Servo.
Gen 2 Devices (STM32) (E-Series, Electron, Photon, and P2; does not include E404X):
On Gen 2 devices, the PWM frequency is from 1 Hz to analogWriteMaxFrequency(pin)
(default is 500 Hz).
- On the Photon, P1 and Electron, this function works on pins D0, D1, D2, D3, A4, A5, WKP, RX and TX with a caveat: PWM timer peripheral is duplicated on two pins (A5/D2) and (A4/D3) for 7 total independent PWM outputs. For example: PWM may be used on A5 while D2 is used as a GPIO, or D2 as a PWM while A5 is used as an analog input. However A5 and D2 cannot be used as independently controlled PWM outputs at the same time.
- Additionally on the Electron, this function works on pins B0, B1, B2, B3, C4, C5.
- Additionally on the P1, this function works on pins P1S0, P1S1, P1S6 (note: for P1S6, the WiFi Powersave Clock should be disabled for complete control of this pin.
The PWM frequency must be the same for pins in the same timer group.
- On the Photon, the timer groups are D0/D1, D2/D3/A4/A5, WKP, RX/TX.
- On the P1, the timer groups are D0/D1, D2/D3/A4/A5/P1S0/P1S1, WKP, RX/TX/P1S6.
- On the Electron, the timer groups are D0/D1/C4/C5, D2/D3/A4/A5/B2/B3, WKP, RX/TX, B0/B1.