background preloader

Secrets of Arduino PWM

Secrets of Arduino PWM
Pulse-width modulation (PWM) can be implemented on the Arduino in several ways. This article explains simple PWM techniques, as well as how to use the PWM registers directly for more control over the duty cycle and frequency. This article focuses on the Arduino Diecimila and Duemilanove models, which use the ATmega168 or ATmega328. If you're unfamiliar with Pulse Width Modulation, see the tutorial. PWM has several uses: Dimming an LED Providing an analog output; if the digital output is filtered, it will provide an analog voltage between 0% and 100% . Simple Pulse Width Modulation with analogWrite The Arduino's programming language makes PWM easy to use; simply call analogWrite(pin, dutyCycle), where dutyCycle is a value from 0 to 255, and pin is one of the PWM pins (3, 5, 6, 9, 10, or 11). Probably 99% of the readers can stop here, and just use analogWrite, but there are other options that provide more flexibility. Bit-banging Pulse Width Modulation Using the ATmega PWM registers directly Related:  Voice Synthesis in Arduino

How to Configure Arduino Timer 2 Registers to Drive an Ultrasonic Transducer with a Square Wave | Fiz-ix The Arduino IDE has many built-in commands to produce PWM outputs but directly setting the timer registers gives you much more flexibility and power. Below I show how to configure the 8-bit Timer/Counter2 on the ATmega328 (Ardunio UNO) to generate a 40 kHz square wave on Arduino digital pin 11. Why 40 kHz? I want to use it to drive a 40 kHz ultrasonic transducer for a project I am working on. void startTransducer() { TCCR2A = _BV(COM2A0) | _BV(WGM21) | _BV(WGM20); TCCR2B = _BV(WGM22) | _BV(CS20); OCR2A = B11000111; // 199, so timer2 counts from 0 to 199 (200 cycles at 16 MHz) } void setup() { pinMode(11, OUTPUT); startTransducer(); } void loop() { } The _BV(XXX) function sets the XXX bit of whatever register you are working with to one. #define _BV(bit) (1 << (bit)) The TCCR2A and TCCR2B 8-bit registers have the following structures: TCCR2A - [COM2A1, COM2A0, COM2B1, COM2B0, reserved, reserved, WGM21, WGM20] TCCR2B - [FOC2A, FOC2B, reserved, reserved, WGM22, CS22, CS21, CS20]

PWM Learning Examples | Foundations | Hacking | Links The Fading example demonstrates the use of analog output (PWM) to fade an LED. It is available in the File->Sketchbook->Examples->Analog menu of the Arduino software. Pulse Width Modulation, or PWM, is a technique for getting analog results with digital means. Digital control is used to create a square wave, a signal switched between on and off. This on-off pattern can simulate voltages in between full on (5 Volts) and off (0 Volts) by changing the portion of the time the signal spends on versus the time that the signal spends off. In the graphic below, the green lines represent a regular time period. Once you get this example running, grab your arduino and shake it back and forth. Written by Timothy Hirzel Foundations

Simple Arduino audio samples This tutorial explains how to do simple playback of short (~4 second), low-bitrate (8 KHz) audio samples from Arduino using only a speaker. It’s based on the PCMAudio code by Michael Smith. Pre-Requisites You’ll need: An Arduino Uno or Duemilanove A speaker with wires soldered to it. Explanation The audio playback works using two of the Arduino board’s timers, hardware functionality of the AVR (ATmega328) microcontroller that’s normally used to generate PWM output with the analogWrite() function. Download and Install the PCM Library for Arduino Download: damellis-PCM- something .zip Install: Unzip the file. Upload the Example Launch the Arduino software. Library Functions The library only has two functions: startPlayback() and stopPlayback(). The stopPlayback() function doesn’t take any arguments and will stop playback of the current sample. Note that the example also uses a couple of unusual Arduino constructions. Encode Your Own Audio Sample Download: Unzip and run the application.

AnalogWrite Reference Language | Libraries | Comparison | Changes Description Writes an analog value (PWM wave) to a pin. On most Arduino boards (those with the ATmega168 or ATmega328), this function works on pins 3, 5, 6, 9, 10, and 11. The Arduino Due supports analogWrite() on pins 2 through 13, plus pins DAC0 and DAC1. You do not need to call pinMode() to set the pin as an output before calling analogWrite(). The analogWrite function has nothing to do with the analog pins or the analogRead function. Syntax analogWrite(pin, value) Parameters pin: the pin to write to. value: the duty cycle: between 0 (always off) and 255 (always on). Returns nothing Notes and Known Issues The PWM outputs generated on pins 5 and 6 will have higher-than-expected duty cycles. Example Sets the output to the LED proportional to the value read from the potentiometer. int ledPin =9;// LED connected to digital pin 9int analogPin =3;// potentiometer connected to analog pin 3int val =0;// variable to store the read value See also

PWM - an overview PWM sometimes seems to be a misunderstood and complicated topic. This tutorial will cover the basics of what PWM is, what it can be used for, and how to use the AVR controllers to generate PWM. PWM stands for Pulse Width Modulation. The digital world Since microcontrollers live in a digital world then their output pins can be either low (0v) or high (5v). AVR microcontrollers have Analogue To Digitals Convertors (ADC) to convert a voltage from the analogue world to a number but do not have Digital to Analogue Convertors (DAC) to convert digital numbers back into variable voltages. PWM is the closest solution. By turning an output pin repeatedly high and low very quickly then the result is an average of the amount of time the output is high. Why does this work? For example: if you connect a motor to a battery then it will, eventually, rotate at full speed. Servos are another example. How do we create a PWM signal Microcontrollers are very good with whole (integer) numbers. Frequency Duty Cycle

PWM - La modulation de la largeur d'impulsion Introduction Arduino permet de faire du contrôle de sortie en digital (tout ou rien) ou en analogique (de 0 à 5v en 256 paliers). Cela peu sembler amplement suffisant... mais présente néanmoins des limites importantes. Arduino est également capable de faire du contrôle de sortie par "modulation de largeur d'impulsion". Cette méthode permet de combler les manquements du contrôle analogique. Les limitations du contrôle analogique Lorsque l'on désire contrôler la luminosité d'une Led ou encore la vitesse d'un moteur DC, le fait d'appliquer une tension plus faible ou plus importante (contrôle analogique) n'implique une obtention des résultats voulu. Le contrôle par longueur d'impulsion Reprenons l'exemple de la led. Cela fonctionnerait à l'identique pour un moteur DC. Le graphique ci-dessous montre la modulation du signal de sortie (PWM) en fonction du pourcentage du cycle de service. Contrôle PWM avec Arduino Activation du mode PWM Cycle de service Plus d'informations

Frequency | Aquaticus General rule for choosing frequency for PWM signal: higher is better. Use as high frequency as you can. This rule is not valid only if you need low frequency wave e.g. for blinking LED. Maximum frequency is often limited by the external components, basically for elements like MOSFETs number of switches in 1 second is limited. For example, if you use popular L298 to control motor speed, you can use up to 40kHz. Timers can be clocked directly by the system clock or by the prescaler. For ATmega16/32 timer0 and timer1 share the same prescaler module and can divide frequency to: F/1, F/8, F/64, F/256 or F/1024, where F is system clock frequency. If prescaler divider is 1, timer is clocked directly by the system clock. Frequency in this mode can be calculated by the following equation: Here is the table of PWM frequency for 1MHz, 8MHz and 16Mhz (timer1 prescaler values shown). Here are the table of PWM frequency for 1MHz, 8MHz and 16MHz (timer1 prescaler values shown).

Introduction to Pulse Width Modulation (PWM) by Michael Barr Pulse width modulation (PWM) is a powerful technique for controlling analog circuits with a processor's digital outputs. PWM is employed in a wide variety of applications, ranging from measurement and communications to power control and conversion. Analog electronics An analog signal has a continuously varying value, with infinite resolution in both time and magnitude. Analog voltages and currents can be used to control things directly, like the volume of a car radio. As intuitive and simple as analog control may seem, it is not always economically attractive or otherwise practical. Digital control By controlling analog circuits digitally, system costs and power consumption can be drastically reduced. In a nutshell, PWM is a way of digitally encoding analog signal levels. Figure 1 shows three different PWM signals. Figure 1. Figure 2 shows a simple circuit that could be driven using PWM. Figure 2. PWM controllers Many microcontrollers include on-chip PWM controllers.