Приветствую читатель! Сегодня я расскажу вам курьезную историю, которая заставила меня задуматься о проблемах, возникающих при неправильном (неоптимальном) выборе комплектующих для реализации какого-либо электронного изделия. А также о кажущейся простоте на примере устройства «одного дня».
Условимся, что история вымышлена, любые совпадения случайны… или не случайны.
Однажды обратился ко мне Сережа-программист с просьбой сделать ему в машину устройство, которое эмулирует последовательное нажатие 2х виртуальных кнопок при нажатии одной физической в цепи управления круиз-контролем авто (Ford Focus 2). Схема стандартного блока управления выглядит следующим образом:
Со стороны блока управления это классический кнопочный ввод с помощью АЦП. так вот задача устройства при нажатии аппаратной кнопки последовательно нажать кнопку ON и SET+ на время ~0,2с. Для простоты интеграции устройства было решено питать его от верхнего резистора делителя. Напряжение на выводах подключения 4,6 В без подключенной схемы кнопок. Поскольку устройство планировалось сделать за вечер, мною была сделана схема без предварительных расчетов из того, что было на монтажном столе. Решение «в лоб»:
Сережа написал прошивку, и устройство прекрасно заработало на авто. В момент, когда плату уже хотели паковать в корпус подрулевого переключателя кто-то из глубины офиса крикнул: «А че так сложно? Половину деталей можно выкинуть, да и вообще STM8 для такой задачи самое то». И началось… Автор идеи вызвался сам спаять макет «из 3х деталей» (видимо предвкушая легкую победу). Я же (руководствуясь своей же статьей о профессиональной ревности) решил не мешать полету молодого специалиста, а подключился лишь на этапе, когда все поняли, что чуда не произошло.
Схема, предложенная моим коллегой, была действительно проще, но работала только на столе:
Ошибки были видны даже на первый взгляд, тем не менее я решил заставить работать схему именно на МК STM8S001J3.
Для того чтобы понять как нужно переделать схему проведем несколько измерений. Сопротивление верхнего резистора в делителе АЦП ~130 Ом, а напряжение без нагрузки 4,6 В.
Тогда схема узла кнопок имеет вид:
При этом диапазон рабочих напряжений МК STM8S001J3 составляет 2,95-5,5 В. Получается, что попытка нажатия кнопки SET+ приводит к падению напряжения ниже минимального и МК сбрасывается.
На этом моменте предлагаю отвлечься и обсудить каков идеальный МК для этой задачи и почему не выбрали его. Обычно для таких поделок используют то, с чем разработчик умеет работать и то, что есть под рукой. Например, у microchip есть контроллеры PIC10F200 или ATtiny10 в корпусе SOT23-6 с диапазоном напряжений питания 2(1,8) — 5,5 В. Эти микросхемы не требуют стабилизатора напряжения (как STM32L031), но и не будут перезагружаться при нажатии кнопки SET+ (как STM8S001J3). В обвязке будет всего лишь 2 резистора и конденсатор. Красота, но в номенклатуре STMicro контроллеров с таким диапазоном питания нет. Внимательный читатель справедливо заметит, что в рамках такой задачи можно освоить практически любой контроллер, но отсутствие привычной среды программирования и отладочных средств определяют выбор.
Вернемся к схеме. Чтобы решить проблему со сбросом контроллера нам нужна энергия для питания контроллера во время нажатой кнопки SET+. Для оценки количества этой энергии необходимо измерить ток потребления (или посмотреть в документации):
Почти 500 мкА в самом лучшем случае. Это много, но чтобы было понятно я приведу расчет. Для накопления энергии нам нужен диод (VD1) и конденсатор (C1):
Падение на VD1 0,2 В, соответственно при отпущенных кнопках С1 будет заряжен до 4,33 — 0,2 = 4,13 В. При «нажатии» кнопки SET+ напряжение в точке Vin падает до 2,2 В, VD1 закрывается и МК питается от разряжающегося С1.
(За правку ошибки спасибо VT100 и DenisHW)
В этом выражении слева энергия запасенная в конденсаторе (при его разряде с 4,13 до 3,1 В), справа энергия затраченная контроллером за время t = 0,2 с. Тогда емкость конденсатора:
100 мкФ для этой задачи терпимо, но попробуем усыплять контроллер во время нажатой кнопки.
Для этого у STM8 есть режим Active Halt Mode:
Отключив MVR и Flash, удалось получить ток потребления ~40 мкА (это существенно выше заявленного тока, но для данной задачи такой ток подходит), а благодаря AWU (auto wake up unit) можно легко выставить пробуждение через 256 мс после перехода в сон. В таком случае для обеспечения работы контроллера нужен конденсатор емкостью всего 10 мкФ, но поскольку после зажатия ноги проходит некоторое время до засыпания МК необходимой и достаточной оказалась емкость 47 мкФ.
Вроде бы все проблемы решены, но есть еще одно НО. Ток при нажатой кнопке SET+ 18,4 мА — это меньше предельного тока для вывода, но напряжение логического нуля при этом будет в районе 0,7 В. Это приведет к падению тока через резистор и потребует либо пересчета сопротивления, либо использования внешнего транзистора по схеме с открытым стоком. Я выбрал второй вариант как более прогнозируемый в поведении. Итоговая схема приняла вид:
В таком виде она успешно заработала и эксплуатируется по сей день.
Вместо заключения
В этом материале я хочу обратить внимание на проблему того, как разработчик наказывается за излишне поверхностный или легкомысленный подход к разработке простого (на первый взгляд) устройства. С другой стороны, хотелось показать, как неоптимальный выбор основной элементной базы (в данном случае МК) усложняет процесс разработки и само изделие в виду двух основных причин:
Условимся, что история вымышлена, любые совпадения случайны… или не случайны.
Однажды обратился ко мне Сережа-программист с просьбой сделать ему в машину устройство, которое эмулирует последовательное нажатие 2х виртуальных кнопок при нажатии одной физической в цепи управления круиз-контролем авто (Ford Focus 2). Схема стандартного блока управления выглядит следующим образом:
Со стороны блока управления это классический кнопочный ввод с помощью АЦП. так вот задача устройства при нажатии аппаратной кнопки последовательно нажать кнопку ON и SET+ на время ~0,2с. Для простоты интеграции устройства было решено питать его от верхнего резистора делителя. Напряжение на выводах подключения 4,6 В без подключенной схемы кнопок. Поскольку устройство планировалось сделать за вечер, мною была сделана схема без предварительных расчетов из того, что было на монтажном столе. Решение «в лоб»:
Сережа написал прошивку, и устройство прекрасно заработало на авто. В момент, когда плату уже хотели паковать в корпус подрулевого переключателя кто-то из глубины офиса крикнул: «А че так сложно? Половину деталей можно выкинуть, да и вообще STM8 для такой задачи самое то». И началось… Автор идеи вызвался сам спаять макет «из 3х деталей» (видимо предвкушая легкую победу). Я же (руководствуясь своей же статьей о профессиональной ревности) решил не мешать полету молодого специалиста, а подключился лишь на этапе, когда все поняли, что чуда не произошло.
Схема, предложенная моим коллегой, была действительно проще, но работала только на столе:
Ошибки были видны даже на первый взгляд, тем не менее я решил заставить работать схему именно на МК STM8S001J3.
Для того чтобы понять как нужно переделать схему проведем несколько измерений. Сопротивление верхнего резистора в делителе АЦП ~130 Ом, а напряжение без нагрузки 4,6 В.
Тогда схема узла кнопок имеет вид:
- при отпущенных кнопках ток в цепи составляет 2 мА, напряжение на входе АЦП 4,33 В;
- при нажатой кнопке ON 3,7 мА, напряжение на входе АЦП 4,11 В;
- при нажатой кнопке SET+ 18,4 мА, напряжение на входе АЦП 2,2 В.
При этом диапазон рабочих напряжений МК STM8S001J3 составляет 2,95-5,5 В. Получается, что попытка нажатия кнопки SET+ приводит к падению напряжения ниже минимального и МК сбрасывается.
На этом моменте предлагаю отвлечься и обсудить каков идеальный МК для этой задачи и почему не выбрали его. Обычно для таких поделок используют то, с чем разработчик умеет работать и то, что есть под рукой. Например, у microchip есть контроллеры PIC10F200 или ATtiny10 в корпусе SOT23-6 с диапазоном напряжений питания 2(1,8) — 5,5 В. Эти микросхемы не требуют стабилизатора напряжения (как STM32L031), но и не будут перезагружаться при нажатии кнопки SET+ (как STM8S001J3). В обвязке будет всего лишь 2 резистора и конденсатор. Красота, но в номенклатуре STMicro контроллеров с таким диапазоном питания нет. Внимательный читатель справедливо заметит, что в рамках такой задачи можно освоить практически любой контроллер, но отсутствие привычной среды программирования и отладочных средств определяют выбор.
Вернемся к схеме. Чтобы решить проблему со сбросом контроллера нам нужна энергия для питания контроллера во время нажатой кнопки SET+. Для оценки количества этой энергии необходимо измерить ток потребления (или посмотреть в документации):
Почти 500 мкА в самом лучшем случае. Это много, но чтобы было понятно я приведу расчет. Для накопления энергии нам нужен диод (VD1) и конденсатор (C1):
Падение на VD1 0,2 В, соответственно при отпущенных кнопках С1 будет заряжен до 4,33 — 0,2 = 4,13 В. При «нажатии» кнопки SET+ напряжение в точке Vin падает до 2,2 В, VD1 закрывается и МК питается от разряжающегося С1.
(За правку ошибки спасибо VT100 и DenisHW)
В этом выражении слева энергия запасенная в конденсаторе (при его разряде с 4,13 до 3,1 В), справа энергия затраченная контроллером за время t = 0,2 с. Тогда емкость конденсатора:
100 мкФ для этой задачи терпимо, но попробуем усыплять контроллер во время нажатой кнопки.
Для этого у STM8 есть режим Active Halt Mode:
Отключив MVR и Flash, удалось получить ток потребления ~40 мкА (это существенно выше заявленного тока, но для данной задачи такой ток подходит), а благодаря AWU (auto wake up unit) можно легко выставить пробуждение через 256 мс после перехода в сон. В таком случае для обеспечения работы контроллера нужен конденсатор емкостью всего 10 мкФ, но поскольку после зажатия ноги проходит некоторое время до засыпания МК необходимой и достаточной оказалась емкость 47 мкФ.
Вроде бы все проблемы решены, но есть еще одно НО. Ток при нажатой кнопке SET+ 18,4 мА — это меньше предельного тока для вывода, но напряжение логического нуля при этом будет в районе 0,7 В. Это приведет к падению тока через резистор и потребует либо пересчета сопротивления, либо использования внешнего транзистора по схеме с открытым стоком. Я выбрал второй вариант как более прогнозируемый в поведении. Итоговая схема приняла вид:
В таком виде она успешно заработала и эксплуатируется по сей день.
Вместо заключения
В этом материале я хочу обратить внимание на проблему того, как разработчик наказывается за излишне поверхностный или легкомысленный подход к разработке простого (на первый взгляд) устройства. С другой стороны, хотелось показать, как неоптимальный выбор основной элементной базы (в данном случае МК) усложняет процесс разработки и само изделие в виду двух основных причин:
- Необходимости подстраивать выбор технических решений под умения программиста.
- Невозможности объять весь спектр возможных комплектующих, подходящих для выполнения задачи, чтобы выбрать из них «самое самое». Эти факторы, чаще всего, объясняют то, что многие устройства (бытовые, коммерческие, специальные) работают нормально, но сделаны не так, как сделали бы его вы.