Arduino и транзиторы (15.12.2021). Печать
2021 - Декабрь
15.12.2021 18:16
Save & Share
Внезапно, процессор Arduino начал нагреваться до условно-обжигающего состояния. Оказалось, дело в биполярных транзисторах - при этом баг неочевидный. Вывод: использовать для коммутации с каналами Arduino только полевые транзисторы, во избежание подобных внезапных проблем.

Процессор грелся, когда канал D2 замыкал биполярный транзистор BDX33C, а транзистор замыкал реле. Чтобы это выяснить, пришлось загибать контакты Arduino по одному, исключая их последовательно из DIP-панельки печатной платы - и, конечно же, по закону подлости, в итоге отогнуты были почти все. Загибать ножки обратно и выравнивать их - то еще удовольствие.

Ток удержания реле, выведенный эмпирически ранее и сейчас наблюдаемый в реальности, - 25мА. Значит, транзистор BDX33C, имеющий коэффициент усиления минимум 750 (а по факту - больше 1000), должен потреблять управляющим контактом всего 0.033мА. Но, каким-то волшебным образом, по управляющему контакту тек ток 100мА.

Таких транзистора было 3, и ток по всем трем был около 100мА, независимо от коммутируемого объекта (реле, светодиодище 63мА, модуль отправки SMS). Последствием такого тока, почему-то, стал нагрев именно процессора Arduino Nano v.3.0. Для уменьшения итогового номинала тока источника питания, данные транзисторы ранее были разнесены во времени. Не исключено, что если бы сработало хотя бы 2 одновременно, Arduino бы настал конец (неизвестно, имеет ли контроллер систему защиты от перегрева).

Решений оказалось 3:
- поставить на процессор радиатор. Но найти радиатор со стороной 10-15мм - лень, а ножовкой работать с 40мм - лень;
- заменить биполярные транзисторы на полевые. Но открывать кассетницу - лень;
- запускать каналы Arduino через подтягивающий резистор, заменив вхождения "digitalWrite(1, 255)" на "pinMode(1, INPUT_PULLUP)". Ток на канале снизился (номинал забыл - доли миллиампера) - при этом ни транзистор, ни приборы не потеряли своей работоспособности. Процессор при этом был просто теплым, если трогать его губами.

Также стоит строго избегать использования контактов D0 (Rx) и D1 (Tx) для каких-либо устройств, обменивающихся данными. Единственное, что к ним корректно подключалось на практике, - светодиоды да резисторы. При этом внешние светодиоды при заливке скетча моргают в такт внутренним, а также их требуется принудительно гасить сразу после старта скетча.

(добавлено 16.12.2021) На форумах темы по поводу нагревания процессора попадаются - но никто истинных причин так и не нашел. Пусть причина найдена в этом материале. Но остается другой вопрос: как биполярный транзистор мог иметь hFE <1. Ведь формула транзистора как усилителя тока работает в обе стороны (на то она и формула): если ток коллектор-эмиттер мал - то и ток база-эмиттер будет мизерным. Возможно, дело во входном сигнале - но сигнал с цифровых выходов Arduino не превышает 16МГц - а транзистор рассчитан на 20МГц.

(добавлено 18.02.2022) Неожиданный отрицательный результат. При входном напряжении на Arduino 5.5В и плате Arduino одного производителя - подключение к базе транзистора подтягивающего резистора проблем не создавало. Но при входном четко 5В и Arduino другого производителя (даже тип корпуса процессора другой) - подстроечный резистор оказался номиналом больше необходимого. В итоге, транзистор не открывался до конца. Из этого выводы:
- возможно, на разных печатных платах Arduino номиналы подтягивающих резисторов разные;
- возможно, напряжения 5В недостаточно для работы биполярных транзисторов в связке с подтягивающими резисторами.
Обновлено ( 29.01.2024 17:48 )