Почему сигнал ШИМ не генерируется с помощью Таймера 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?
Спасибо
@traducerad, 👍3
Обсуждение1 ответ
Лучший ответ:
Блок сравнения выходов таймера 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
- Использование millis() и micros() внутри процедуры прерывания
- Как сделать очень долгую функцию delay(), несколько часов
- Разница между «time_t» и «DateTime»
- Получение BPM из данного кода
- Как считать время в секундах?
- Создание таймера с использованием часов реального времени с указанием времени начала и остановки
- Arduino непрерывно считывает значение АЦП с помощью прерывания
- Использование TIMER0_COMPB_vect
Пост определенно в тему. Я не понимаю, почему было проведено голосование за его закрытие., @MichaelT
Я тот, кто проголосовал за вопрос, один из трех, кто проголосовал за ответ, и только что проголосовал за ваш комментарий :), @VE7JRO
Жаль, что множество голосов «оставить открытыми» не отменяют наши ошибочные голоса «не по теме». Понятно, по теме. А таймеры — это всегда так весело! :), @Madivad