Перейти к содержанию

Почему светодиод на выводе AVR горит тускло?

Обновлено Редакция GAW

У каждого вывода ATmega328P три бита: DDxn задаёт направление, PORTxn — что выдавать, а у входа тот же PORTxn включает подтягивающий резистор. Таблица 14-1 даташита DS40002061B перечисляет все сочетания:

DDxnPORTxnРежим выводаЧто получит светодиод
00вход без подтяжкиничего
01вход с подтяжкойток через 20–50 кОм
10выход, низкий уровеньничего (если светодиод на земле)
11выход, высокий уровеньток через резистор светодиода

Если забыть DDRB |= _BV(DDB5) или pinMode(13, OUTPUT), запись PORTB |= _BV(PORTB5) или digitalWrite(13, HIGH) переводит вывод во вторую строку таблицы. Arduino описывает ровно этот эффект в справке к digitalWrite().

Сколько тока остаётся

Наш расчёт для питания 5 В и красного светодиода с прямым напряжением около 2 В (Kuphaldt даёт для красных 1,5–2,4 В). Подтяжка RPU по даташиту — от 20 до 50 кОм:

I=5 В−2 ВRI = \frac{5\ \text{В} - 2\ \text{В}}{R}
ЦепьСопротивлениеТок
подтяжка, нижняя граница20 кОм0,15 мА
подтяжка, верхняя граница50 кОм0,06 мА
выход и резистор светодиода330 Омоколо 9 мА

Разница — в 60–150 раз, поэтому светодиод еле тлеет. Синий или белый светодиод с прямым напряжением 3–4 В через подтяжку может не засветиться совсем.

Как исправить

  1. Настройте направление до первой записи в порт: DDRB |= _BV(DDB5); — подробно в уроке «Порты и регистры».
  2. В Arduino — pinMode(pin, OUTPUT) в setup().
  3. Проверьте резистор: ток выхода считает калькулятор резистора для светодиода.

Если светодиод не горит вовсе, пройдите по списку в ответе «Почему не горит светодиод?». Как работает подтяжка и зачем она нужна входам, рассказано в статье о подтягивающем резисторе.

Похожие вопросы

Может ли светодиод гореть тускло, если вывод настроен правильно?

Да, если резистор слишком большой или светодиод питается от вывода, который одновременно используется периферией, например ШИМ с малым заполнением. Но при правильном выходе ток определяется резистором: с 330 Ом и красным светодиодом это около 9 мА, и свечение заметно яркое.

Почему светодиод светится тускло, когда я вообще не трогаю вывод?

После сброса все выводы — входы без подтяжки, и светодиод светиться не должен. Слабое свечение без программы обычно значит, что ток идёт по другому пути: через соседнюю цепь на плате или через утечку в схеме, — или что вывод настраивает загрузчик или чужой код до вашей программы.

Опасна ли такая ошибка для микроконтроллера?

Нет: ток через подтяжку меньше миллиампера. Опаснее обратная ошибка — светодиод без резистора на выводе-выходе: ток ограничен только выходным сопротивлением вывода и может превысить абсолютный максимум 40 мА.

Источники

  1. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet, DS40002061B, 2020 — 14.2.1 — единица в PORTxn у вывода-входа включает подтягивающий резистор; табл. 14-1 «Port Pin Configurations» (с. 87): DDxn = 0, PORTxn = 1, PUD = 0 — вход с подтяжкой, DDxn = 1, PORTxn = 1 — выход высокого уровня; 30.2 — сопротивление подтяжки вывода RPU 20–50 кОм; 29.1 — абсолютный максимум постоянного тока вывода 40 мА
  2. Arduino. Language Reference: digitalWrite() (репозиторий arduino/reference-en) — если не задать pinMode() как OUTPUT и подключить светодиод, при digitalWrite(HIGH) он может светиться тускло: функция включила внутренний подтягивающий резистор, который работает как большой токоограничивающий резистор
  3. Kuphaldt T. R. Lessons In Electric Circuits, Vol. III — Semiconductors, ch. 3 «Diodes and Rectifiers», разд. «Light-emitting diodes» (CC BY) — таблица прямых напряжений: красные светодиоды 1,5–2,4 В, белые и синие 3–4 В

Нашли ошибку?