Почему сигнал ШИМ не генерируется с помощью Таймера 2?

Мне удалось поработать с таймерами 0 и 1, но я не могу сгенерировать ШИМ с таймером 2 в моем atmega328p.

Это код:

#include <avr/io.h>

int main(void)
{
    /* PD6 output */
    DDRD |= (1 << DDD6);

    /* 50% duty cycle */
    OCR2A = 128;

    /* fast PWM  */
    TCCR2A |= (1 << WGM21) | (1 << WGM20);

    /* prescaler = 8 */
    TCCR2B |= (1 << CS21);

    while (1);

}

Может ли кто-нибудь объяснить, в чем проблема и почему я не вижу ШИМ-сигнала на контакте 6 моей платы Arduino Uno?

Спасибо

, 👍3

Обсуждение

Пост определенно в тему. Я не понимаю, почему было проведено голосование за его закрытие., @MichaelT

Я тот, кто проголосовал за вопрос, один из трех, кто проголосовал за ответ, и только что проголосовал за ваш комментарий :), @VE7JRO

Жаль, что множество голосов «оставить открытыми» не отменяют наши ошибочные голоса «не по теме». Понятно, по теме. А таймеры — это всегда так весело! :), @Madivad


1 ответ


Лучший ответ:

5

Блок сравнения выходов таймера 2 подключен к контактам PB3 (OC2A) и PD3 (OC2B). Поэтому вам нужно настроить их как выходы. Имейте в виду, что при использовании аппаратного ШИМ вы не можете выбрать какой-либо вывод, эта аппаратная функция связана с конкретными выводами.

Вам также необходимо установить COM2A1 в TCCR2A. В противном случае OC2A отключается от блока сравнения выходов (см. Таблицу 17-3 в техническое описание). Эффект COM2A0/1 зависит от конфигурации в WGM20-WGM22. То же самое относится и к OC2B соответственно.

,

Я попробовал то, что вы предложили, но, похоже, это не работает: https://paste.ubuntu.com/p/K8KmKnqyvV/ Какие-либо предложения?, @traducerad

Я скомпилировал/прошил ваш код и обнаружил, что в TCCR2A вам нужно установить COM2A1 (см. мои изменения)., @Sim Son

@traducerad: комментарий // включить таймер 2 в вашем коде неверен. Это должно быть // отключение таймера 2, чтобы соответствовать тому, что на самом деле делает следующая строка., @Edgar Bonet