PWM, which stands for Pulse Width Modulation, is a technique used extensively in Arduino projects to create analog effects using digital signals. Unlike a true analog voltage, a digital signal in Arduino is either HIGH (on) or LOW (off). PWM simulates an analog output by rapidly switching a digital pin between these states, varying the ratio of the on-time to the off-time.
Understanding the Basics of PWM
The core principle behind PWM is the duty cycle, which is expressed as a percentage. This percentage defines the proportion of time the signal is HIGH within a single cycle, known as the period. A 0% duty cycle means the signal is always LOW, while 100% means it is always HIGH. For instance, a 50% duty cycle keeps the signal ON for exactly half of the period, resulting in an average voltage roughly equal to half of the supply voltage. This method allows the Arduino to deliver varying amounts of power to a load without the complexity of generating a true analog voltage.
The Role of Frequency
Frequency is a critical factor that determines how smooth the output appears. If the frequency is too low, the user can observe the distinct ON and OFF switching, leading to visible flickering in an LED or audible noise in a motor. Arduino Uno and similar boards typically use a frequency of around 490 Hz or 980 Hz for PWM, which is high enough to be imperceptible to the human eye and ear. The specific frequency is determined by the internal clock of the microcontroller and the timer settings.
Hardware PWM Pins on Arduino
Not every digital pin on an Arduino board is capable of hardware PWM. Specific pins are designated for this function and are labeled with a tilde (~) symbol next to them on the board. On the Arduino Uno, for example, pins 3, 5, 6, 9, 10, and 11 are hardware PWM pins. Using these pins ensures that the PWM functionality is handled by dedicated hardware, resulting in more stable and accurate signals compared to software-generated alternatives.
Controlling LEDs and Motors
One of the most common applications of PWM is controlling the brightness of LEDs. By adjusting the duty cycle, you can make an LED dim gradually or shine at full intensity. Similarly, PWM is essential for controlling the speed and direction of DC motors. By varying the pulse width, you can regulate the average voltage delivered to the motor, allowing for precise speed control. This principle is fundamental in robotics and automation projects where smooth motion is required.
Implementing PWM with the analogWrite Function
In the Arduino programming environment, generating a PWM signal is straightforward thanks to the analogWrite() function. Despite its name, this function has nothing to do with analog voltages; it is specifically designed for PWM. The function requires two arguments: the pin number and a value between 0 and 255. A value of 0 corresponds to a 0% duty cycle (always off), and 255 corresponds to a 100% duty cycle (always on).
Example Code Structure
To use PWM, you must first configure the pin as an output in the setup() function. Then, within the loop() , you can call analogWrite() with your desired pin and value. This allows for dynamic control, enabling the program to change the brightness or motor speed based on sensor input or user commands. The ability to modify the duty cycle in real-time is what makes PWM such a powerful tool in interactive projects.