Sometimes I like reading datasheets for fun and to see what unexplored features are out there. I've been using Timer Counter A every time I needed PWM, but these new 1-Series chips have multiple timers including one called Timer Counter D which is described as such in the datasheet:
The Timer/Counter type D (TCD) is a high performance waveform controller that consists
of an asynchronous counter, a prescaler, compare logic, capture logic, and control logic.
The purpose of the TCD is to control power applications like LED, motor control,
H-bridge and power converters. The TCD contains a counter that can run on a clock which
is asynchronous from the system clock.
In essence, this allows us to use a different clock for the system than what is being used for PWM. Without the TCD, to get high resolution PWM at a high frequency, you'd need to run the system clock at a high speed (like 20 MHz), but that can consume a non-trivial amount of power (10 mA) especially if you want to drive an LED at low power for a long time. By separating the system clock and the one used by PWM, we can use the Ultra-Low Power (ULP) 32 kHz clock for the system while using the 20 MHz clock for PWM only. This can save a decent amount of power (consumption < 1 mA). To prove this out, I used Atmel's ATtiny817 Xplained Mini dev board and set it up for current measurement (removing a single 0-Ohm resistor and forcing current to pass through my DMM as explained in the Xplained Mini User Guide). The DMM used in this test is my Aneng AN8008.
The code for the PWM current tests can be found here. After conducting the current tests, I tested out the TCD functionality for driving the Xplained's on-board LED. That code can be found here.
Note: default 1-Series main clock is 3.33 MHz (20 MHz oscillator with prescaler divisor of 6)
Clock | Timer | Timer Clock | PWM Freq. | Current | |
---|---|---|---|---|---|
Test 1 | 3.33 MHz | none | -- | -- | 1.9 mA |
Test 2 | 3.33 MHz | TCA, 8 bit | System (3.33 MHz) | 13.02 kHz | 2.0 mA |
Test 3 | 3.33 MHz | TCA, 10 bit | System (3.33 MHz) | 3.25 kHz | 2.0 mA |
Test 4 | 3.33 MHz | TCA, 12 bit | System (3.33 MHz) | 814 Hz | 2.0 mA |
Test 5 | 10 Mhz | none | -- | -- | 5.4 mA |
Test 6 | 10 Mhz | TCA, 8 bit | System (10 Mhz) | 39.06 kHz | 5.5 mA |
Test 7 | 10 Mhz | TCA, 10 bit | System (10 Mhz) | 9.77 kHz | 5.5 mA |
Test 8 | 10 Mhz | TCA, 12 bit | System (10 Mhz) | 2.44 kHz | 5.5 mA |
Test 9 | 20 Mhz | none | -- | -- | 10.1 mA |
Test 10 | 20 Mhz | TCA, 8 bit | System (20 Mhz) | 78.13 kHz | 10.6 mA |
Test 11 | 20 Mhz | TCA, 10 bit | System (20 Mhz) | 19.53 kHz | 10.6 mA |
Test 12 | 20 Mhz | TCA, 12 bit | System (20 Mhz) | 4.88 kHz | 10.6 mA |
Test 13 | 32 kHz | none | -- | -- | 21 uA |
Test 14 | 32 kHz | TCD, 8 bit | 20 MHz | 78.13 kHz | 973 uA |
Test 15 | 32 kHz | TCD, 10 bit | 20 MHz | 19.53 kHz | 970 uA |
Test 16 | 32 kHz | TCD, 12 bit | 20 MHz | 4.88 kHz | 967 uA |
Test 17 | 32 kHz | TCD, 8 bit | 10 Mhz (Prescaler: 2) | 39.06 kHz | 708 uA |
Test 18 | 32 kHz | TCD, 10 bit | 10 Mhz (Prescaler: 2) | 9.77 kHz | 705 uA |
Test 19 | 32 kHz | TCD, 12 bit | 10 Mhz (Prescaler: 2) | 2.44 kHz | 704 uA |
Test 20 | 32 kHz | TCD, 8 bit | 5 Mhz (Prescaler: 4) | 19.53 kHz | 576 uA |
Test 21 | 32 kHz | TCD, 10 bit | 5 Mhz (Prescaler: 4) | 4.88 kHz | 574 uA |
Test 22 | 32 kHz | TCD, 12 bit | 5 Mhz (Prescaler: 4) | 1.22 kHz | 574 uA |
Test 23 | 32 kHz | TCD, 8 bit | 2.5 Mhz (Prescaler: 8) | 9.77 kHz | 508 uA |
Test 24 | 32 kHz | TCD, 10 bit | 2.5 Mhz (Prescaler: 8) | 2.44 kHz | 507 uA |
Test 25 | 32 kHz | TCD, 12 bit | 2.5 Mhz (Prescaler: 8) | 610 Hz | 507 uA |