У меня уже есть то, что мне нужно, используя 8-битный таймер2. Я просто обеспокоен использованием другого таймера вместо Timer2, потому что Timer2 используется в различных библиотеках, и я хотел бы иметь большую гранулярность. Таким образом, я хотел бы использовать 16-битный таймер1. < /P>
Вот то, что я использую для генерации 25 кГц, переменного рабочего цикла с использованием Timer2. На этом примере давайте рассмотрим 35% -ного рабочего цикла: < /p>
Код: Выделить всё
void setup()
{
/*
16*10^6/ [prescaler] / ([OCR2A]) / 2 = [desired frequency]
16*10^6/ 8 / [OCR2A] / 2 = 25*10^3
Prescaler table for Timer2 (from datasheet section 17-9):
CS22 CS21 CS20
0 0 0 = No clock source (Timer/counter stopped)
0 0 1 = clkT2S/(No prescaling)
0 1 0 = clkT2S/8 (From prescaler)
0 1 1 = clkT2S/32 (From prescaler)
1 0 0 = clkT2S/64 (From prescaler)
1 0 1 = clkT2S/128 (From prescaler)
1 1 0 = clkT2S/256 (From prescaler)
1 1 1 = clkT2S/1024 (From prescaler)
*/
pinMode(3, OUTPUT);
TCCR2B = _BV(WGM22) | _BV(CS21);
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(COM2B0) | _BV(WGM20);
OCR2A = 40;
OCR2B = 16; //40*0.35=16
}
void loop()
{
}
< /code>
Чтобы получить тот же результат, используя Timer1, должен быть невероятно простым, однако я не знаком с этими регистрами.
Я искал объяснения за пределами таблицы данных. Я нашел этот пост: секреты Arduino Pwm. Тем не менее, он охватывает только использование таймера2. < /P>
Я попробовал следующее в соответствии с предложением Стефана. Тем не менее, это просто приводит к тому, что оба выхода (D9 и D10) удерживаются высоко: < /p>
void setup()
{
pinMode(9, OUTPUT); // D9
pinMode(10, OUTPUT); // D10
// Set GPIO for timer1 output for OC1A and OC1B
//DDRB |= (1
Подробнее здесь: [url]https://stackoverflow.com/questions/52083686/proper-implementation-of-timer1-for-pwm-generation[/url]
Мобильная версия