Правильная реализация таймера1 для генерации ШИМC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Правильная реализация таймера1 для генерации ШИМ

Сообщение Anonymous »

На Atmel Atmega328p (DataSheet) есть три таймера для генерации PWM (Timer0, Timer1 и Timer2). < /p>
У меня уже есть то, что мне нужно, используя 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»