Skip to content
This repository was archived by the owner on Feb 4, 2023. It is now read-only.

Commit 22230c2

Browse files
authored
v1.0.0 for hardware-PWM on AVR boards
### Initial Releases v1.0.0 1. Initial coding to support **AVR boards, such as Mega-2560, UNO, Nano, Leonardo, etc.**, etc. using AVR core 2. The hardware-based PWM channels can generate very high frequencies.
1 parent ff713bf commit 22230c2

File tree

6 files changed

+252
-252
lines changed

6 files changed

+252
-252
lines changed

examples/PWM_Basic/PWM_Basic.ino

+28-28
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/****************************************************************************************************************************
22
PWM_Basic.ino
3-
3+
44
For AVR-based boards (UNO, Nano, Mega, 32U4, 16U4, etc. )
55
Written by Khoi Hoang
66
@@ -24,20 +24,20 @@
2424
2525
////////////////////////////////////////////
2626
// For Mega (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 44, 45, 46)
27-
Pin 2 => TIMER3B // PE 4 ** 2 ** PWM2
28-
Pin 3 => TIMER3C // PE 5 ** 3 ** PWM3
29-
Pin 4 => TIMER0B // PG 5 ** 4 ** PWM4
30-
Pin 5 => TIMER3A // PE 3 ** 5 ** PWM5
31-
Pin 6 => TIMER4A // PH 3 ** 6 ** PWM6
32-
Pin 7 => TIMER4B // PH 4 ** 7 ** PWM7
33-
Pin 8 => TIMER4C // PH 5 ** 8 ** PWM8
34-
Pin 9 => TIMER2B // PH 6 ** 9 ** PWM9
35-
Pin 10 => TIMER2A // PB 4 ** 10 ** PWM10
36-
Pin 11 => TIMER1A // PB 5 ** 11 ** PWM11
37-
Pin 12 => TIMER1B // PB 6 ** 12 ** PWM12
38-
Pin 13 => TIMER0A // PB 7 ** 13 ** PWM13
39-
Pin 44 => TIMER5C // PL 5 ** 44 ** D44
40-
Pin 45 => TIMER5B // PL 4 ** 45 ** D45
27+
Pin 2 => TIMER3B // PE 4 ** 2 ** PWM2
28+
Pin 3 => TIMER3C // PE 5 ** 3 ** PWM3
29+
Pin 4 => TIMER0B // PG 5 ** 4 ** PWM4
30+
Pin 5 => TIMER3A // PE 3 ** 5 ** PWM5
31+
Pin 6 => TIMER4A // PH 3 ** 6 ** PWM6
32+
Pin 7 => TIMER4B // PH 4 ** 7 ** PWM7
33+
Pin 8 => TIMER4C // PH 5 ** 8 ** PWM8
34+
Pin 9 => TIMER2B // PH 6 ** 9 ** PWM9
35+
Pin 10 => TIMER2A // PB 4 ** 10 ** PWM10
36+
Pin 11 => TIMER1A // PB 5 ** 11 ** PWM11
37+
Pin 12 => TIMER1B // PB 6 ** 12 ** PWM12
38+
Pin 13 => TIMER0A // PB 7 ** 13 ** PWM13
39+
Pin 44 => TIMER5C // PL 5 ** 44 ** D44
40+
Pin 45 => TIMER5B // PL 4 ** 45 ** D45
4141
Pin 46 => TIMER5A // PL 3 ** 46 ** D46
4242
////////////////////////////////////////////
4343
// For 32u4 (3, 5, 6, 9, 10, 11, 13)
@@ -76,13 +76,13 @@
7676
//#define pinToUse 46 // Timer5A on Mega
7777
//#define pinToUse 45 // Timer5B on Mega
7878
//#define pinToUse 44 // Timer5C on Mega
79-
80-
#elif ( PWM_USING_ATMEGA_32U4 )
79+
80+
#elif ( PWM_USING_ATMEGA_32U4 )
8181
// Pins tested OK on 32u4
8282
//#define pinToUse 5 // Timer3A on 32u4
8383
#define pinToUse 9 // Timer1A on 32u4
8484
//#define pinToUse 10 // Timer1B on 32u4
85-
85+
8686
#else
8787

8888
// Pins tested OK on Nano / UNO
@@ -103,21 +103,21 @@ void setup()
103103
Serial.print(F("\nStarting PWM_Basic on "));
104104
Serial.println(BOARD_NAME);
105105
Serial.println(AVR_PWM_VERSION);
106-
107-
//assigns PWM frequency of 20 KHz and a duty cycle of 0%
108-
PWM_Instance = new AVR_PWM(pinToUse, 20000, 0);
106+
107+
//assigns PWM frequency of 20 KHz and a duty cycle of 0%
108+
PWM_Instance = new AVR_PWM(pinToUse, 20000, 0);
109109
}
110110

111111
void loop()
112112
{
113-
delay(10000);
114-
frequency = 20000;
115-
dutyCycle = 90;
113+
delay(10000);
114+
frequency = 20000;
115+
dutyCycle = 90;
116116

117-
PWM_Instance->setPWM(pinToUse, frequency, dutyCycle);
117+
PWM_Instance->setPWM(pinToUse, frequency, dutyCycle);
118118

119-
delay(10000);
120-
dutyCycle = 10;
119+
delay(10000);
120+
dutyCycle = 10;
121121

122-
PWM_Instance->setPWM(pinToUse, frequency, dutyCycle);
122+
PWM_Instance->setPWM(pinToUse, frequency, dutyCycle);
123123
}

examples/PWM_DynamicDutyCycle/PWM_DynamicDutyCycle.ino

+46-46
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,20 @@
2323
2424
////////////////////////////////////////////
2525
// For Mega (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 44, 45, 46)
26-
Pin 2 => TIMER3B // PE 4 ** 2 ** PWM2
27-
Pin 3 => TIMER3C // PE 5 ** 3 ** PWM3
28-
Pin 4 => TIMER0B // PG 5 ** 4 ** PWM4
29-
Pin 5 => TIMER3A // PE 3 ** 5 ** PWM5
30-
Pin 6 => TIMER4A // PH 3 ** 6 ** PWM6
31-
Pin 7 => TIMER4B // PH 4 ** 7 ** PWM7
32-
Pin 8 => TIMER4C // PH 5 ** 8 ** PWM8
33-
Pin 9 => TIMER2B // PH 6 ** 9 ** PWM9
34-
Pin 10 => TIMER2A // PB 4 ** 10 ** PWM10
35-
Pin 11 => TIMER1A // PB 5 ** 11 ** PWM11
36-
Pin 12 => TIMER1B // PB 6 ** 12 ** PWM12
37-
Pin 13 => TIMER0A // PB 7 ** 13 ** PWM13
38-
Pin 44 => TIMER5C // PL 5 ** 44 ** D44
39-
Pin 45 => TIMER5B // PL 4 ** 45 ** D45
26+
Pin 2 => TIMER3B // PE 4 ** 2 ** PWM2
27+
Pin 3 => TIMER3C // PE 5 ** 3 ** PWM3
28+
Pin 4 => TIMER0B // PG 5 ** 4 ** PWM4
29+
Pin 5 => TIMER3A // PE 3 ** 5 ** PWM5
30+
Pin 6 => TIMER4A // PH 3 ** 6 ** PWM6
31+
Pin 7 => TIMER4B // PH 4 ** 7 ** PWM7
32+
Pin 8 => TIMER4C // PH 5 ** 8 ** PWM8
33+
Pin 9 => TIMER2B // PH 6 ** 9 ** PWM9
34+
Pin 10 => TIMER2A // PB 4 ** 10 ** PWM10
35+
Pin 11 => TIMER1A // PB 5 ** 11 ** PWM11
36+
Pin 12 => TIMER1B // PB 6 ** 12 ** PWM12
37+
Pin 13 => TIMER0A // PB 7 ** 13 ** PWM13
38+
Pin 44 => TIMER5C // PL 5 ** 44 ** D44
39+
Pin 45 => TIMER5B // PL 4 ** 45 ** D45
4040
Pin 46 => TIMER5A // PL 3 ** 46 ** D46
4141
////////////////////////////////////////////
4242
// For 32u4 (3, 5, 6, 9, 10, 11, 13)
@@ -78,14 +78,14 @@
7878
//#define pinToUse 46 // Timer5A on Mega
7979
//#define pinToUse 45 // Timer5B on Mega
8080
//#define pinToUse 44 // Timer5C on Mega
81-
82-
#elif ( PWM_USING_ATMEGA_32U4 )
81+
82+
#elif ( PWM_USING_ATMEGA_32U4 )
8383
// Pins tested OK on 32u4
8484
////#define pinToUse 3 // Timer0B on 32u4
8585
//#define pinToUse 5 // Timer3A on 32u4
8686
#define pinToUse 9 // Timer1A on 32u4
8787
//#define pinToUse 10 // Timer1B on 32u4
88-
88+
8989
#else
9090

9191
// Pins tested OK on Nano / UNO
@@ -118,56 +118,56 @@ void printPWMInfo(AVR_PWM* PWM_Instance)
118118

119119
void setup()
120120
{
121-
Serial.begin(115200);
121+
Serial.begin(115200);
122122

123-
while (!Serial);
123+
while (!Serial);
124124

125-
delay(100);
125+
delay(100);
126126

127-
Serial.print(F("\nStarting PWM_DynamicDutyCycle on "));
128-
Serial.println(BOARD_NAME);
129-
Serial.println(AVR_PWM_VERSION);
127+
Serial.print(F("\nStarting PWM_DynamicDutyCycle on "));
128+
Serial.println(BOARD_NAME);
129+
Serial.println(AVR_PWM_VERSION);
130130

131-
frequency = 5000;
131+
frequency = 5000;
132132
//frequency = 70.0f;
133-
134-
PWM_Instance = new AVR_PWM(pinToUse, frequency, 50);
135133

136-
if (PWM_Instance)
137-
{
138-
if (!PWM_Instance->setPWM())
134+
PWM_Instance = new AVR_PWM(pinToUse, frequency, 50);
135+
136+
if (PWM_Instance)
137+
{
138+
if (!PWM_Instance->setPWM())
139139
{
140140
Serial.println(F("Stop here"));
141-
141+
142142
// stop here
143143
while (true)
144144
delay(1000);
145145
}
146-
}
146+
}
147147

148-
Serial.println(dashLine);
148+
Serial.println(dashLine);
149149
}
150150

151151
void loop()
152-
{
153-
//frequency = 10000.0f;
152+
{
153+
//frequency = 10000.0f;
154154
frequency = 1000.0f;
155-
156-
dutyCycle = 90.0f;
157155

158-
Serial.print(F("Change PWM DutyCycle to "));
159-
Serial.println(dutyCycle);
160-
PWM_Instance->setPWM(pinToUse, frequency, dutyCycle);
156+
dutyCycle = 90.0f;
161157

162-
printPWMInfo(PWM_Instance);
158+
Serial.print(F("Change PWM DutyCycle to "));
159+
Serial.println(dutyCycle);
160+
PWM_Instance->setPWM(pinToUse, frequency, dutyCycle);
163161

164-
delay(5000);
165-
dutyCycle = 10.0f;
162+
printPWMInfo(PWM_Instance);
163+
164+
delay(5000);
165+
dutyCycle = 10.0f;
166166

167-
Serial.print(F("Change PWM DutyCycle to "));
168-
Serial.println(dutyCycle);
169-
PWM_Instance->setPWM(pinToUse, frequency, dutyCycle);
170-
printPWMInfo(PWM_Instance);
167+
Serial.print(F("Change PWM DutyCycle to "));
168+
Serial.println(dutyCycle);
169+
PWM_Instance->setPWM(pinToUse, frequency, dutyCycle);
170+
printPWMInfo(PWM_Instance);
171171

172172
delay(5000);
173173
}

examples/PWM_DynamicDutyCycle_Int/PWM_DynamicDutyCycle_Int.ino

+44-44
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,20 @@
2323
2424
////////////////////////////////////////////
2525
// For Mega (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 44, 45, 46)
26-
Pin 2 => TIMER3B // PE 4 ** 2 ** PWM2
27-
Pin 3 => TIMER3C // PE 5 ** 3 ** PWM3
28-
Pin 4 => TIMER0B // PG 5 ** 4 ** PWM4
29-
Pin 5 => TIMER3A // PE 3 ** 5 ** PWM5
30-
Pin 6 => TIMER4A // PH 3 ** 6 ** PWM6
31-
Pin 7 => TIMER4B // PH 4 ** 7 ** PWM7
32-
Pin 8 => TIMER4C // PH 5 ** 8 ** PWM8
33-
Pin 9 => TIMER2B // PH 6 ** 9 ** PWM9
34-
Pin 10 => TIMER2A // PB 4 ** 10 ** PWM10
35-
Pin 11 => TIMER1A // PB 5 ** 11 ** PWM11
36-
Pin 12 => TIMER1B // PB 6 ** 12 ** PWM12
37-
Pin 13 => TIMER0A // PB 7 ** 13 ** PWM13
38-
Pin 44 => TIMER5C // PL 5 ** 44 ** D44
39-
Pin 45 => TIMER5B // PL 4 ** 45 ** D45
26+
Pin 2 => TIMER3B // PE 4 ** 2 ** PWM2
27+
Pin 3 => TIMER3C // PE 5 ** 3 ** PWM3
28+
Pin 4 => TIMER0B // PG 5 ** 4 ** PWM4
29+
Pin 5 => TIMER3A // PE 3 ** 5 ** PWM5
30+
Pin 6 => TIMER4A // PH 3 ** 6 ** PWM6
31+
Pin 7 => TIMER4B // PH 4 ** 7 ** PWM7
32+
Pin 8 => TIMER4C // PH 5 ** 8 ** PWM8
33+
Pin 9 => TIMER2B // PH 6 ** 9 ** PWM9
34+
Pin 10 => TIMER2A // PB 4 ** 10 ** PWM10
35+
Pin 11 => TIMER1A // PB 5 ** 11 ** PWM11
36+
Pin 12 => TIMER1B // PB 6 ** 12 ** PWM12
37+
Pin 13 => TIMER0A // PB 7 ** 13 ** PWM13
38+
Pin 44 => TIMER5C // PL 5 ** 44 ** D44
39+
Pin 45 => TIMER5B // PL 4 ** 45 ** D45
4040
Pin 46 => TIMER5A // PL 3 ** 46 ** D46
4141
////////////////////////////////////////////
4242
// For 32u4 (3, 5, 6, 9, 10, 11, 13)
@@ -75,13 +75,13 @@
7575
//#define pinToUse 46 // Timer5A on Mega
7676
//#define pinToUse 45 // Timer5B on Mega
7777
//#define pinToUse 44 // Timer5C on Mega
78-
79-
#elif ( PWM_USING_ATMEGA_32U4 )
78+
79+
#elif ( PWM_USING_ATMEGA_32U4 )
8080
// Pins tested OK on 32u4
8181
//#define pinToUse 5 // Timer3A on 32u4
8282
#define pinToUse 9 // Timer1A on 32u4
8383
//#define pinToUse 10 // Timer1B on 32u4
84-
84+
8585
#else
8686

8787
// Pins tested OK on Nano / UNO
@@ -114,50 +114,50 @@ void printPWMInfo(AVR_PWM* PWM_Instance)
114114

115115
void setup()
116116
{
117-
Serial.begin(115200);
117+
Serial.begin(115200);
118118

119-
while (!Serial);
119+
while (!Serial);
120120

121-
delay(100);
121+
delay(100);
122122

123-
Serial.print(F("\nStarting PWM_DynamicDutyCycle_Int on "));
124-
Serial.println(BOARD_NAME);
125-
Serial.println(AVR_PWM_VERSION);
123+
Serial.print(F("\nStarting PWM_DynamicDutyCycle_Int on "));
124+
Serial.println(BOARD_NAME);
125+
Serial.println(AVR_PWM_VERSION);
126126

127-
frequency = 1000;
127+
frequency = 1000;
128128

129-
PWM_Instance = new AVR_PWM(pinToUse, frequency, 50);
129+
PWM_Instance = new AVR_PWM(pinToUse, frequency, 50);
130130

131-
if (PWM_Instance)
132-
{
133-
PWM_Instance->setPWM();
134-
}
131+
if (PWM_Instance)
132+
{
133+
PWM_Instance->setPWM();
134+
}
135135

136-
Serial.println(dashLine);
136+
Serial.println(dashLine);
137137
}
138138

139139
void loop()
140140
{
141-
delay(5000);
141+
delay(5000);
142142

143-
frequency = 5000;
143+
frequency = 5000;
144144

145-
// 50% dutyCycle = (real_dutyCycle * 65536) / 100
146-
dutyCycle = 32768;
145+
// 50% dutyCycle = (real_dutyCycle * 65536) / 100
146+
dutyCycle = 32768;
147147

148-
Serial.print(F("Change PWM DutyCycle to (%) "));
148+
Serial.print(F("Change PWM DutyCycle to (%) "));
149149
Serial.println((float) dutyCycle * 100 / 65536);
150-
PWM_Instance->setPWM_Int(pinToUse, frequency, dutyCycle);
150+
PWM_Instance->setPWM_Int(pinToUse, frequency, dutyCycle);
151151

152-
printPWMInfo(PWM_Instance);
152+
printPWMInfo(PWM_Instance);
153153

154-
delay(5000);
154+
delay(5000);
155155

156-
// 20% dutyCycle = (real_dutyCycle * 65536) / 100
157-
dutyCycle = 13107;
156+
// 20% dutyCycle = (real_dutyCycle * 65536) / 100
157+
dutyCycle = 13107;
158158

159-
Serial.print(F("Change PWM DutyCycle to (%) "));
160-
Serial.println((float) dutyCycle * 100 / 65536);
161-
PWM_Instance->setPWM_Int(pinToUse, frequency, dutyCycle);
162-
printPWMInfo(PWM_Instance);
159+
Serial.print(F("Change PWM DutyCycle to (%) "));
160+
Serial.println((float) dutyCycle * 100 / 65536);
161+
PWM_Instance->setPWM_Int(pinToUse, frequency, dutyCycle);
162+
printPWMInfo(PWM_Instance);
163163
}

0 commit comments

Comments
 (0)