From 44191d13335f5ed3992e6a706ba541eac3dc5083 Mon Sep 17 00:00:00 2001 From: tomcombriat Date: Tue, 10 Oct 2023 22:17:04 +0200 Subject: [PATCH 1/3] Fix frequency offset for AVR --- MozziGuts_impl_AVR.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MozziGuts_impl_AVR.hpp b/MozziGuts_impl_AVR.hpp index 05067eb1b..90832ce4a 100644 --- a/MozziGuts_impl_AVR.hpp +++ b/MozziGuts_impl_AVR.hpp @@ -168,7 +168,7 @@ static uint8_t mozzi_TCCR4A, mozzi_TCCR4B, mozzi_TCCR4C, mozzi_TCCR4D, static void startAudio() { backupPreMozziTimer1(); Timer1.initializeCPUCycles( - F_CPU / AUDIO_RATE, + F_CPU / AUDIO_RATE-1, PHASE_FREQ_CORRECT); // set period, phase and frequency correct TIMSK1 = _BV(TOIE1); // Overflow Interrupt Enable (when not using // Timer1.attachInterrupt()) @@ -198,10 +198,10 @@ static void startAudio() { // pinMode(AUDIO_CHANNEL_2_PIN, OUTPUT); // set pin to output for audio # if (AUDIO_MODE == STANDARD) Timer1.initializeCPUCycles( - F_CPU / AUDIO_RATE, + F_CPU / AUDIO_RATE-1, PHASE_FREQ_CORRECT); // set period, phase and frequency correct # else // (AUDIO_MODE == STANDARD_PLUS) - Timer1.initializeCPUCycles(F_CPU / PWM_RATE, + Timer1.initializeCPUCycles(F_CPU / PWM_RATE-1, FAST); // fast mode enables higher PWM rate # endif Timer1.pwm(AUDIO_CHANNEL_1_PIN, From cb309efdbda6fdb232de1383e07d20d73930e82d Mon Sep 17 00:00:00 2001 From: tomcombriat Date: Sat, 14 Oct 2023 19:51:14 +0200 Subject: [PATCH 2/3] Improved readability --- MozziGuts_impl_AVR.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/MozziGuts_impl_AVR.hpp b/MozziGuts_impl_AVR.hpp index 90832ce4a..4e2ef5eca 100644 --- a/MozziGuts_impl_AVR.hpp +++ b/MozziGuts_impl_AVR.hpp @@ -168,7 +168,7 @@ static uint8_t mozzi_TCCR4A, mozzi_TCCR4B, mozzi_TCCR4C, mozzi_TCCR4D, static void startAudio() { backupPreMozziTimer1(); Timer1.initializeCPUCycles( - F_CPU / AUDIO_RATE-1, + (F_CPU/AUDIO_RATE)-1, PHASE_FREQ_CORRECT); // set period, phase and frequency correct TIMSK1 = _BV(TOIE1); // Overflow Interrupt Enable (when not using // Timer1.attachInterrupt()) @@ -198,10 +198,10 @@ static void startAudio() { // pinMode(AUDIO_CHANNEL_2_PIN, OUTPUT); // set pin to output for audio # if (AUDIO_MODE == STANDARD) Timer1.initializeCPUCycles( - F_CPU / AUDIO_RATE-1, + (F_CPU/AUDIO_RATE)-1, PHASE_FREQ_CORRECT); // set period, phase and frequency correct # else // (AUDIO_MODE == STANDARD_PLUS) - Timer1.initializeCPUCycles(F_CPU / PWM_RATE-1, + Timer1.initializeCPUCycles((F_CPU/PWM_RATE)-1, FAST); // fast mode enables higher PWM rate # endif Timer1.pwm(AUDIO_CHANNEL_1_PIN, @@ -267,7 +267,7 @@ static void startAudio() { pinMode(AUDIO_CHANNEL_1_lowByte_PIN, OUTPUT); // set pin to output for audio, use 499k resistor Timer1.initializeCPUCycles( - F_CPU / 125000, + F_CPU/125000, FAST); // set period for 125000 Hz fast pwm carrier frequency = 14 bits Timer1.pwm(AUDIO_CHANNEL_1_highByte_PIN, 0); // pwm pin, 0% duty cycle, ie. 0 signal From b05d20e8d2fa981c979de40d8f8bc7f74ba31a0d Mon Sep 17 00:00:00 2001 From: tomcombriat Date: Sat, 14 Oct 2023 19:51:14 +0200 Subject: [PATCH 3/3] Improved readability Added documentation for tweak on AVR timer frequency --- MozziGuts_impl_AVR.hpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/MozziGuts_impl_AVR.hpp b/MozziGuts_impl_AVR.hpp index 90832ce4a..d04e262d4 100644 --- a/MozziGuts_impl_AVR.hpp +++ b/MozziGuts_impl_AVR.hpp @@ -168,7 +168,10 @@ static uint8_t mozzi_TCCR4A, mozzi_TCCR4B, mozzi_TCCR4C, mozzi_TCCR4D, static void startAudio() { backupPreMozziTimer1(); Timer1.initializeCPUCycles( - F_CPU / AUDIO_RATE-1, + (F_CPU/AUDIO_RATE)-1 // the -1 here is a result of empirical tests + // that showed that it brings the resulting frequency + // closer to what is expected. + // see: https://github.com/sensorium/Mozzi/pull/202 PHASE_FREQ_CORRECT); // set period, phase and frequency correct TIMSK1 = _BV(TOIE1); // Overflow Interrupt Enable (when not using // Timer1.attachInterrupt()) @@ -198,10 +201,16 @@ static void startAudio() { // pinMode(AUDIO_CHANNEL_2_PIN, OUTPUT); // set pin to output for audio # if (AUDIO_MODE == STANDARD) Timer1.initializeCPUCycles( - F_CPU / AUDIO_RATE-1, + (F_CPU/AUDIO_RATE)-1,// the -1 here is a result of empirical tests + // that showed that it brings the resulting frequency + // closer to what is expected. + // see: https://github.com/sensorium/Mozzi/pull/202 PHASE_FREQ_CORRECT); // set period, phase and frequency correct # else // (AUDIO_MODE == STANDARD_PLUS) - Timer1.initializeCPUCycles(F_CPU / PWM_RATE-1, + Timer1.initializeCPUCycles((F_CPU/PWM_RATE)-1, // the -1 here is a result of empirical tests + // that showed that it brings the resulting frequency + // closer to what is expected. + // see: https://github.com/sensorium/Mozzi/pull/202 FAST); // fast mode enables higher PWM rate # endif Timer1.pwm(AUDIO_CHANNEL_1_PIN, @@ -267,7 +276,7 @@ static void startAudio() { pinMode(AUDIO_CHANNEL_1_lowByte_PIN, OUTPUT); // set pin to output for audio, use 499k resistor Timer1.initializeCPUCycles( - F_CPU / 125000, + F_CPU/125000, FAST); // set period for 125000 Hz fast pwm carrier frequency = 14 bits Timer1.pwm(AUDIO_CHANNEL_1_highByte_PIN, 0); // pwm pin, 0% duty cycle, ie. 0 signal