ATTiny85 ШИМ на PB2 не работает - только вкл/выкл, без затухания

У меня есть самодельная плата ATTiny85 со светодиодами, подключенными к GPIO (PB0-4) через токоограничивающие резисторы. Все порты плавно гаснут, за исключением PB2, который только включается/выключается без промежуточных состояний. Схема идентична для всех светодиодов, что исключает аппаратные проблемы. Подозреваю, это связано со спецификой возможностей PB2.

#define pin PB1

void setup() {
  pinMode(pin, OUTPUT);
}

void loop() {
  for(int i = 0; i < 256; i++) {
    analogWrite(pin, i);
    delay(10);
  }
  for(int i = 255; i >= 0; i--) {
    analogWrite(pin, i);
    delay(10);
  }
}
  • Микроконтроллер: ATTiny85
  • IDE: Arduino
  • Все светодиоды используют одинаковые схемы
  • Другие порты (PB0,1,3,4) затухают нормально

Есть ли что-то особенное в PB2, что требует особой настройки для работы ШИМ? Как включить корректное затухание на этом выводе?

, 👍0


1 ответ


1

Ознакомьтесь с техническим описанием ATtiny85. На рисунке 11-5 показана работа таймеров в режиме сравнения выходов (который используется для ШИМ).

Рисунок 11-5, показывающий, что генератор волн подключается к контактам OCnx

Генератор волн внизу подключается к контактам OCnx. Поэтому для аппаратного ШИМ можно использовать только контакты, обозначенные таким образом. Теперь взгляните на схему расположения выводов в начале (рис. 1-1):

Схема расположения выводов ATtiny85, PB2 без маркировки OCnx

Видите ли, на PB2 нет маркировки OCnx. Все остальные выводы (кроме Vcc, земли и сброса) её имеют. Поэтому этот вывод нельзя использовать с аппаратным ШИМ.

Если вам действительно нужен ШИМ на этом выводе, вам нужно программно настроить его бит-банг, то есть прописать вывод непосредственно в коде. Подходит ли вам этот вариант, зависит от вашего кода и того, что вы хотите с ним делать.


Также обратите внимание, что невозможно генерировать аппаратные ШИМ-сигналы с разной скважностью на PB3 и PB4, поскольку один из них является инвертированным сигналом другого. Это может быть полезно, если вы хотите использовать оба этих вывода для ШИМ.

,

Забавно, что вы упомянули PB3 — я только что заметил, что он тоже ведёт себя как двоичный код. А вот с PB4 всё в порядке. Спасибо за комментарий. Скорее всего, оставлю всё как есть., @Sean

PB3 имеет инвертированный выход (/OC1B) PB4 (OC1B), вы можете получить сигнал там, но не с помощью analogWrite Arduino, и это будет просто инвертированный PB4 (вот почему он пропускается в analogWrite), @KIIV