Arduino Mega is a beast when it comes to multitasking automation projects. Because of its fairly large number of digital and analog pins, Mega is the first priority in many complex projects including multiple output control. But the default frequency on PWM pins of Arduino Mega can be a limitation when it comes to High-frequency control circuits. Yes, the frequency on PWM pins is set to default and you can easily change the frequency by using a simple one-line code! Read below to know How To Change PWM Frequency Of Arduino Mega.
There are some cool facts about Arduino with which many students and makers are not familiar. And one of the facts is this: ” There is a certain default frequency for each PWM pin, which is called when the analogWrite command is used on that pin. And this default frequency can be changed to a value as high as 65Khz and as low as 30Hz by using just one line code without altering the shape of the PWM wave or attenuation.”.
Looking for Arduino UNO PWM frequency change? |
The default frequency on respective PWM pin of Arduino Mega:
Arduino Mega has a total of 15 PWM pins. 12 of them are from pin 2 to pin 13 whereas the remaining 3 are D44, D45, and D46. The default PWM frequency for all pins is 490 Hz, except pin 4 and 13 whose default frequency is 980Hz.
PWM frequency from D2 to D13:
490.20 Hz (The DEFAULT)
PWM frequency for D4 & D13:
976.56 Hz (The DEFAULT)
Now, these frequencies are optimum for low-frequency applications like fading an LED. But these default frequencies are not suitable for High-frequency circuits. For example, 1Khz is nothing when it comes to an S.M.P.S.
There are many projects in which we require high-frequency pulses, one such project is a Buck-Converter. So to achieve frequency lower or higher than the default frequency on PWM pins, the one-line code that we can use before initializing the PWM pin as output is given below:
CODE TO CHANGE ARDUINO MEGA PWM FREQUENCY:
Code for Available PWM frequency for D4 & D13:
TCCR0B = TCCR0B & B11111000 | B00000001; // for PWM frequency of 62500 Hz TCCR0B = TCCR0B & B11111000 | B00000010; // for PWM frequency of 7812.50 Hz TCCR0B = TCCR0B & B11111000 | B00000011; // for PWM frequency of 976.56 Hz (The DEFAULT) TCCR0B = TCCR0B & B11111000 | B00000100; // for PWM frequency of 244.14 Hz TCCR0B = TCCR0B & B11111000 | B00000101; // for PWM frequency of 61.04 Hz TCCR5B = TCCR5B & B11111000 | B00000101; // for PWM frequency of 30.64 Hz |
Code for Available PWM frequency for D11 & D12:
TCCR1B = TCCR1B & B11111000 | B00000001; // for PWM frequency of 31372.55 Hz TCCR1B = TCCR1B & B11111000 | B00000010; // for PWM frequency of 3921.16 Hz TCCR1B = TCCR1B & B11111000 | B00000011; // for PWM frequency of 490.20 Hz TCCR1B = TCCR1B & B11111000 | B00000100; // for for PWM frequency of 122.55 Hz TCCR1B = TCCR1B & B11111000 | B00000101; // for PWM frequency of 30.64 Hz
|
Code for Available PWM frequency for D9 & D10:
TCCR2B = TCCR2B & B11111000 | B00000001; // for PWM frequency of 31372.55 Hz TCCR2B = TCCR2B & B11111000 | B00000010; // for PWM frequency of 3921.16 Hz TCCR2B = TCCR2B & B11111000 | B00000011; // for PWM frequency of 980.39 Hz TCCR2B = TCCR2B & B11111000 | B00000100; // for PWM frequency of 490.20 Hz TCCR2B = TCCR2B & B11111000 | B00000101; // for PWM frequency of 245.10 Hz TCCR2B = TCCR2B & B11111000 | B00000110; // for PWM frequency of 122.55 Hz TCCR2B = TCCR2B & B11111000 | B00000111; // for PWM frequency of 30.64 Hz |
Code for Available PWM frequency for D2, D3 & D5:
TCCR3B = TCCR3B & B11111000 | B00000001; // for PWM frequency of 31372.55 Hz TCCR3B = TCCR3B & B11111000 | B00000010; // for PWM frequency of 3921.16 Hz TCCR3B = TCCR3B & B11111000 | B00000011; // for PWM frequency of 490.20 Hz TCCR3B = TCCR3B & B11111000 | B00000100; // for PWM frequency of 122.55 Hz TCCR3B = TCCR3B & B11111000 | B00000101; // for PWM frequency of 30.64 Hz
|
Code for Available PWM frequency for D6, D7 & D8:
TCCR4B = TCCR4B & B11111000 | B00000001; // for PWM frequency of 31372.55 Hz TCCR4B = TCCR4B & B11111000 | B00000010; // for PWM frequency of 3921.16 Hz TCCR4B = TCCR4B & B11111000 | B00000011; // for PWM frequency of 490.20 Hz TCCR4B = TCCR4B & B11111000 | B00000100; // for PWM frequency of 122.55 Hz TCCR4B = TCCR4B & B11111000 | B00000101; // for PWM frequency of 30.64 Hz
|
Code for Available PWM frequency for D44, D45 & D46:
TCCR5B = TCCR5B & B11111000 | B00000001; // for PWM frequency of 31372.55 Hz TCCR5B = TCCR5B & B11111000 | B00000010; // for PWM frequency of 3921.16 Hz TCCR5B = TCCR5B & B11111000 | B00000011; // for PWM frequency of 490.20 Hz TCCR5B = TCCR5B & B11111000 | B00000100; // for PWM frequency of 122.55 Hz
|
Looking for Arduino Nano PWM frequency change? |
PWM frequency example:
To show you how the frequency changes on applying the above code, the Arduino circuit is simulated in Proteus(for Arduino UNO):
Check out: How to add Arduino Library to Proteus and Simulate Arduino Projects | 2018 Edition
1.Two Arduino are selected and placed on Front-Panel
2. Digital Pin 3 ( PWM pin) of each Arduino is connected to an oscilloscope
3. Two separate programs are written for each Arduino:
Program A – Default frequency on Pin 3
void setup() { pinMode(3,OUTPUT); } void loop() { } |
Program B – Changed frequency on Pin 3
void setup() { TCCR2B = TCCR2B & B11111000 | B00000001; // for PWM frequency of 31372.55 Hz } void loop() { }
|
4 .Hex file of above programs are given to Arduino
5. Run Simulation
6. It can be clearly seen in an oscilloscope that frequency is increased to a very high value when this piece of code is used(for Arduino UNO) :
TCCR2B = TCCR2B & B11111000 | B00000001; // for PWM frequency of 31372.55 Hz
Read Similar Articles:
| How to add Arduino Library to Proteus and Simulate Arduino Projects
| How to Add Microphone library to Proteus and generate audio waveforms
| How to Add And Simulate Ultrasonic Sensor Library in Proteus
Thanks for your clear explanation.
Regards
Franz
You have a mistake!
“Code for Available PWM frequency for D2, D3 & D5:
TCCR4B = TCCR4B & B11111000 | B00000001; ”
It needs to be TCCR3B NOT TCCR4B!!!
Hi Peter,
Thankyou for pointing out the mistake. The frequency code for the control pins 5,3 and 2 is now changed from timer 4 to timer 3.
Good Tutorial but the timer codes listed for the pins are incorrect.
The correct ones are:
timer 0 (controls pin 13, 4);
timer 1 (controls pin 12, 11);
timer 2 (controls pin 10, 9);
timer 3 (controls pin 5, 3, 2);
timer 4 (controls pin 8, 7, 6);
Hi Jacob,
Thankyou for pointing out the mistake. The frequency code for the control pins 5,3 and 2 is now changed from timer 4 to timer 3.
Thank you very much for this. I have a very loud motor in my DIY rudder pedals. Are the frequencies you listed here the only ones available? I’m hoping to use a frequency at or near 20khz on a MEGA board.
Thanks.
John