Почему светодиод на выводе AVR горит тускло?
Обновлено Редакция GAW
У каждого вывода ATmega328P три бита: DDxn задаёт направление, PORTxn — что выдавать, а у входа тот же PORTxn включает подтягивающий резистор. Таблица 14-1 даташита DS40002061B перечисляет все сочетания:
| DDxn | PORTxn | Режим вывода | Что получит светодиод |
|---|---|---|---|
| 0 | 0 | вход без подтяжки | ничего |
| 0 | 1 | вход с подтяжкой | ток через 20–50 кОм |
| 1 | 0 | выход, низкий уровень | ничего (если светодиод на земле) |
| 1 | 1 | выход, высокий уровень | ток через резистор светодиода |
Если забыть DDRB |= _BV(DDB5) или pinMode(13, OUTPUT), запись PORTB |= _BV(PORTB5) или digitalWrite(13, HIGH) переводит вывод во вторую строку таблицы. Arduino описывает ровно этот эффект в справке к digitalWrite().
Сколько тока остаётся
Наш расчёт для питания 5 В и красного светодиода с прямым напряжением около 2 В (Kuphaldt даёт для красных 1,5–2,4 В). Подтяжка RPU по даташиту — от 20 до 50 кОм:
| Цепь | Сопротивление | Ток |
|---|---|---|
| подтяжка, нижняя граница | 20 кОм | 0,15 мА |
| подтяжка, верхняя граница | 50 кОм | 0,06 мА |
| выход и резистор светодиода | 330 Ом | около 9 мА |
Разница — в 60–150 раз, поэтому светодиод еле тлеет. Синий или белый светодиод с прямым напряжением 3–4 В через подтяжку может не засветиться совсем.
Как исправить
- Настройте направление до первой записи в порт:
DDRB |= _BV(DDB5);— подробно в уроке «Порты и регистры». - В Arduino —
pinMode(pin, OUTPUT)вsetup(). - Проверьте резистор: ток выхода считает калькулятор резистора для светодиода.
Если светодиод не горит вовсе, пройдите по списку в ответе «Почему не горит светодиод?». Как работает подтяжка и зачем она нужна входам, рассказано в статье о подтягивающем резисторе.
Похожие вопросы
Может ли светодиод гореть тускло, если вывод настроен правильно?
Да, если резистор слишком большой или светодиод питается от вывода, который одновременно используется периферией, например ШИМ с малым заполнением. Но при правильном выходе ток определяется резистором: с 330 Ом и красным светодиодом это около 9 мА, и свечение заметно яркое.
Почему светодиод светится тускло, когда я вообще не трогаю вывод?
После сброса все выводы — входы без подтяжки, и светодиод светиться не должен. Слабое свечение без программы обычно значит, что ток идёт по другому пути: через соседнюю цепь на плате или через утечку в схеме, — или что вывод настраивает загрузчик или чужой код до вашей программы.
Опасна ли такая ошибка для микроконтроллера?
Нет: ток через подтяжку меньше миллиампера. Опаснее обратная ошибка — светодиод без резистора на выводе-выходе: ток ограничен только выходным сопротивлением вывода и может превысить абсолютный максимум 40 мА.
Источники
- 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 мА
- Arduino. Language Reference: digitalWrite() (репозиторий arduino/reference-en) — если не задать pinMode() как OUTPUT и подключить светодиод, при digitalWrite(HIGH) он может светиться тускло: функция включила внутренний подтягивающий резистор, который работает как большой токоограничивающий резистор
- 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 В
Нашли ошибку?