3#include "AudioToolsConfig.h"
4#if defined(USE_PWM) && defined(__AVR__)
5#include "AudioTools/CoreAudio/AudioPWM/PWMAudioBase.h"
6#include "AudioTools/CoreAudio/AudioTimer/AudioTimerAVR.h"
11using PWMDriver = PWMDriverAVR;
12static PWMDriverAVR *accessAudioPWM =
nullptr;
27 accessAudioPWM =
this;
30 virtual int maxChannels() {
return 2; };
42 is_timer_started =
false;
53 LOGE(
"requested sample rate not supported: %d - we use %d",
57 LOGD(
"compare match register set to %d", steps);
65 TCCR1B |= (1 << WGM12);
67 TCCR1B |= (1 << CS11);
68 TIMSK1 |= (1 << OCIE1A);
78 LOGW(
"Max 2 channels supported - you requested %d",
83 for (
int j = 0; j < audio_config.
channels; j++) {
84 LOGD(
"Processing channel %d", j);
94 void setupPin(
int pin) {
99 TCCR2B = TCCR2B & B11111000 | B00000001;
100 LOGI(
"PWM Frequency changed for D3 and D11");
104 LOGE(
"PWM Unsupported pin: %d", pin);
107 pinMode(pin, OUTPUT);
110 virtual void pwmWrite(
int channel,
int value) {
111 analogWrite(pins[channel], value);
115 audio_config.logConfig();
116 LOGI(
"pwm freq: %f khz", 62.5);
118 LOGI(
"output pin: %d", pins[0]);
120 LOGI(
"output pins: %d / %d", pins[0], pins[1]);
125 int pins[2] = {3, 11};
127 virtual int maxOutputValue() {
return 255; }
133 if (accessAudioPWM !=
nullptr && accessAudioPWM->is_timer_started) {
141 TimerAlarmRepeatingDriverAVR::tickerCallback();