|
| 1 | +/**************************************************************************************************************************** |
| 2 | + PWM_Basic.ino |
| 3 | + |
| 4 | + For AVR-based boards (UNO, Nano, Mega, 32U4, 16U4, etc. ) |
| 5 | + Written by Khoi Hoang |
| 6 | +
|
| 7 | + Built by Khoi Hoang https://github.com/khoih-prog/AVR_PWM |
| 8 | + Licensed under MIT license |
| 9 | +
|
| 10 | + This is pure hardware-based PWM |
| 11 | +*****************************************************************************************************************************/ |
| 12 | +/****************************************************************************************************************************** |
| 13 | + // For UNO / Nano |
| 14 | + Timer0 ( 8-bit) used by delay(), millis() and micros(), and PWM generation on pins 5 (6 not usable) |
| 15 | + Timer1 (16-bit) used by the Servo.h library and PWM generation on pins 9 and 10 |
| 16 | + Timer2 ( 8-bit) used by Tone() and PWM generation on pins 3 and 11 |
| 17 | + // For Mega |
| 18 | + Timer0 ( 8-bit) used by delay(), millis() and micros(), and PWM generation on pins 4 (13 not usable) |
| 19 | + Timer1 (16-bit) used by the Servo.h library and PWM generation on pins 11, 12 |
| 20 | + Timer2 ( 8-bit) used by Tone() and PWM generation on pins 9 and 10 |
| 21 | + Timer3 (16-bit) used by PWM generation on pins 2, 3 and 5 |
| 22 | + Timer4 (16-bit) used by PWM generation on pins 6, 7 and 8 |
| 23 | + Timer5 (16-bit) used by PWM generation on pins 44, 45 and 46 |
| 24 | +
|
| 25 | + //////////////////////////////////////////// |
| 26 | + // 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 |
| 41 | + Pin 46 => TIMER5A // PL 3 ** 46 ** D46 |
| 42 | + //////////////////////////////////////////// |
| 43 | + // For 32u4 (3, 5, 6, 9, 10, 11, 13) |
| 44 | + Pin 3 => TIMER0B |
| 45 | + Pin 5 => TIMER3A |
| 46 | + Pin 6 => TIMER4D |
| 47 | + Pin 9 => TIMER1A |
| 48 | + Pin 10 => TIMER1B |
| 49 | + Pin 11 => TIMER0A |
| 50 | + Pin 13 => TIMER4A |
| 51 | + //////////////////////////////////////////// |
| 52 | + // For UNO, Nano (3, 5, 6, 9, 10, 11) |
| 53 | + Pin 3 => TIMER2B, |
| 54 | + Pin 5 => TIMER0B |
| 55 | + Pin 6 => TIMER0A |
| 56 | + Pin 9 => TIMER1A |
| 57 | + Pin 10 => TIMER1B |
| 58 | + Pin 11 => TIMER2(A) |
| 59 | +******************************************************************************************************************************/ |
| 60 | + |
| 61 | +#define _PWM_LOGLEVEL_ 4 |
| 62 | + |
| 63 | +#include "AVR_PWM.h" |
| 64 | + |
| 65 | +#if ( PWM_USING_ATMEGA2560 ) |
| 66 | + // Pins tested OK in Mega |
| 67 | + //#define pinToUse 12 // Timer1B on Mega |
| 68 | + //#define pinToUse 11 // Timer1A on Mega |
| 69 | + //#define pinToUse 9 // Timer2B on Mega |
| 70 | + //#define pinToUse 2 // Timer3B on Mega |
| 71 | + //#define pinToUse 3 // Timer3C on Mega |
| 72 | + //#define pinToUse 5 // Timer3A on Mega |
| 73 | + //#define pinToUse 6 // Timer4A on Mega |
| 74 | + //#define pinToUse 7 // Timer4B on Mega |
| 75 | + #define pinToUse 8 // Timer4C on Mega |
| 76 | + //#define pinToUse 46 // Timer5A on Mega |
| 77 | + //#define pinToUse 45 // Timer5B on Mega |
| 78 | + //#define pinToUse 44 // Timer5C on Mega |
| 79 | + |
| 80 | +#elif ( PWM_USING_ATMEGA_32U4 ) |
| 81 | + // Pins tested OK on 32u4 |
| 82 | + //#define pinToUse 5 // Timer3A on 32u4 |
| 83 | + #define pinToUse 9 // Timer1A on 32u4 |
| 84 | + //#define pinToUse 10 // Timer1B on 32u4 |
| 85 | + |
| 86 | +#else |
| 87 | + |
| 88 | + // Pins tested OK on Nano / UNO |
| 89 | + //#define pinToUse 9 // Timer1A on UNO, Nano, etc |
| 90 | + #define pinToUse 10 // Timer1B on UNO, Nano, etc |
| 91 | + //#define pinToUse 5 // Timer0B on UNO, Nano, e |
| 92 | + //#define pinToUse 3 // Timer2B on UNO, Nano, etc |
| 93 | +#endif |
| 94 | + |
| 95 | +//creates pwm instance |
| 96 | +AVR_PWM* PWM_Instance; |
| 97 | + |
| 98 | +float frequency; |
| 99 | +float dutyCycle; |
| 100 | + |
| 101 | +void setup() |
| 102 | +{ |
| 103 | + Serial.print(F("\nStarting PWM_Basic on ")); |
| 104 | + Serial.println(BOARD_NAME); |
| 105 | + 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); |
| 109 | +} |
| 110 | + |
| 111 | +void loop() |
| 112 | +{ |
| 113 | + delay(10000); |
| 114 | + frequency = 20000; |
| 115 | + dutyCycle = 90; |
| 116 | + |
| 117 | + PWM_Instance->setPWM(pinToUse, frequency, dutyCycle); |
| 118 | + |
| 119 | + delay(10000); |
| 120 | + dutyCycle = 10; |
| 121 | + |
| 122 | + PWM_Instance->setPWM(pinToUse, frequency, dutyCycle); |
| 123 | +} |
0 commit comments