Pulse-Width-Modulation is a way of controlling voltage digitally to emulate an analog signal.

Although PWM is a modulation technique that can be used for communication, Netduino users are most likely to encounter this in three scenarios:

  • Limiting the voltage being supplied to a device
  • Dimming LEDs
  • Servo control

A PWM signal generated by a Netduino is a square wave. The two key parameters under the control of the developer are the frequency and the duty cycle.

PWM 50% Duty Cycle
PWM 50% Duty Cycle

In the above diagram, the time where the signal is high is the same as the time where the signal is low. The percentage of time the signal is on (high) is called the duty cycle. So, in the above, the signal is high 50% of the one cycle and so the duty cycle is 50%.

50% and 25% Duty Cycle
50% and 25% Duty Cycle

In the above diagram, the frequency is the same in both cases (note how the rising edges of the signal are aligned to the same point in time). However, the lower signal is high for only 25% of the time compared to 50% for the upper trace.

So the frequency is the same but the duty cycle is different.

PWM signals can be generated by hardware and software. The most efficient and reliable is hardware generated PWM.

Netduino PWM Pins

There are 6 hardware PWM pins on the Netduino:

N3 Pinout Diagram
N3 Pinout Diagram

Note that the onboard LED can also be configured as a PWM channel.

Practical Examples

As noted, there are three main uses for PWM that are most frequently encountered:

Power Control

The output voltage on a Netduino digital output pin is 3.3V. Creating a digital output pin (OutputPort) and turning the pin on will show 3.3V on a multimeter.

Changing the output port to a PWM port and setting the duty cycle to 10% will change the reading on the multimeter. Consider the following application:

using System.Threading;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware.NetduinoPlus;
using Microsoft.SPOT;

namespace PWMExample
	public class Program
		public static void Main()
            Debug.Print("Application starting...");
            PWM led1 = new PWM(PWMChannels.PWM_PIN_D9, 100d, 0.1d, false);

Running this results in the following output on a multimeter and oscilloscope:

100Hz Signal at 10% Duty Cycle
100Hz Signal at 10% Duty Cycle

The multimeter shows the average reading is 0.332V (10% of the output voltage of a pin on the Netduino). The oscilloscope is showing the actual waveform and the measurements, 100Hz signal with a 10% duty cycle and an output voltage of 3.32V.

Changing the Brightness of an LED

One of the most visible uses of PWM is to control the brightness of an LED. A low duty cycle results in a dim LED, a higher duty cycle produces a brighter LED.

Controlling a Servo

The next section of this guide demonstrates how to control the position of a servo using PWM.

Further Reading


These docs are open source. If you find an issue, please file a bug, or send us a pull request. And if you want to contribute, we'd love that too!