static uint32_t reqfreq = 350; // Частота 350 Гц
Static - это ключевое слово в C++, используемое для придания элементу особых характеристик. Для статических элементов выделение памяти происходит только один раз и существуют эти элементы до завершения программы.
void setup() {
pinMode(9, OUTPUT); // выход генератора
TCCR1A = 0;
TCCR1B = 0;
static uint32_t reqfreq = 350; // Частота 350 Гц
uint32_t ocr = OCR1A;
uint16_t divider = 1;
if (reqfreq == 0 || reqfreq > F_CPU/2) return;
ocr = (F_CPU/reqfreq/2/divider);
byte shifts[] = {3, 3, 2, 2};
for(byte i = 0; i < 4; i++) {
if (ocr > 65536) {
divider <<= shifts[i];
ocr = F_CPU/reqfreq/2/divider;
}
else {
TCCR1B = (i + 1)|(1<<WGM12);
break;
}
} //Mode4 (CTC)
OCR1A = ocr - 1;
TCCR1A = 1<<COM1A0;
}
void loop() {
}
существует проект того же автора на основе СТМ32 с куда большими возможностями по частотам и удобным интерфейсом на основе ТФТ экраная немного "прокачал" этого малыша
На порту С нет выходов таймеров, так что не выйдет.В общем-то можно чтоб генерил на любом пине PORTC (А0-А5), да хоть на всех сразу.
//Пример генерации меандра на таймере 2 , канале B (D3 на Arduino UNO)
#include <GyverTimers.h>
void setup() {
Serial.begin(115200);
Serial.println("==START==");
pinMode(3, OUTPUT); // настроить пин как выход
}
void loop() {
uint32_t reqfreq = 0; //переменная запроса частоты
if (Serial.available() > 0)
reqfreq = Serial.parseInt();
if (reqfreq == 0 || reqfreq > F_CPU / 2)
return;
// из-за особенности генерации меандра таймером
// частоту нужно указывать в два раза больше нужной!
reqfreq = Timer2.setFrequency(reqfreq * 2); // настроить частоту таймера в Гц
Serial.println(reqfreq/2); // Реальная частота
Timer2.outputEnable(CHANNEL_B, TOGGLE_PIN); // в момент срабатывания таймера пин будет переключаться
}