Приветствую читатель! Сегодня я расскажу вам курьезную историю, которая заставила меня задуматься о проблемах, возникающих при неправильном (неоптимальном) выборе комплектующих для реализации какого-либо электронного изделия. А также о кажущейся простоте на примере устройства «одного дня».
Условимся, что история вымышлена, любые совпадения случайны… или не случайны.
Однажды обратился ко мне Сережа-программист с просьбой сделать ему в машину устройство, которое эмулирует последовательное нажатие 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.



В этом выражении слева энергия запасенная в конденсаторе (при его разряде с 4,13 до 3,1 В), справа энергия затраченная контроллером за время t = 0,2 с. Тогда емкость конденсатора:



660 мкФ для этой задачи очень много. Попробуем усыплять контроллер во время нажатой кнопки.

Для этого у STM8 есть режим Active Halt Mode:



Отключив MVR и Flash, удалось получить ток потребления ~40 мкА (это существенно выше заявленного тока, но для данной задачи такой ток подходит), а благодаря AWU (auto wake up unit) можно легко выставить пробуждение через 256 мс после перехода в сон. В таком случае для обеспечения работы контроллера нужен конденсатор емкостью всего 47 мкФ.

Вроде бы все проблемы решены, но есть еще одно НО. Ток при нажатой кнопке SET+ 18,4 мА — это меньше предельного тока для вывода, но напряжение логического нуля при этом будет в районе 0,7 В. Это приведет к падению тока через резистор и потребует либо пересчета сопротивления, либо использования внешнего транзистора по схеме с открытым стоком. Я выбрал второй вариант как более прогнозируемый в поведении. Итоговая схема приняла вид:



В таком виде она успешно заработала и эксплуатируется по сей день.

Вместо заключения

В этом материале я хочу обратить внимание на проблему того, как разработчик наказывается за излишне поверхностный или легкомысленный подход к разработке простого (на первый взгляд) устройства. С другой стороны, хотелось показать, как неоптимальный выбор основной элементной базы (в данном случае МК) усложняет процесс разработки и само изделие в виду двух основных причин:

  1. Необходимости подстраивать выбор технических решений под умения программиста.
  2. Невозможности объять весь спектр возможных комплектующих, подходящих для выполнения задачи, чтобы выбрать из них «самое самое». Эти факторы, чаще всего, объясняют то, что многие устройства (бытовые, коммерческие, специальные) работают нормально, но сделаны не так, как сделали бы его вы.

Комментарии (37)


  1. blwl
    15.12.2018 01:41

    я может туплю но зачем stm питать от кнопок а не от приходящего питания 3,3 вольта
    в чем смысл?


    1. vladimir_open-dev Автор
      15.12.2018 01:42

      Так нет там приходящего питания 3,3В. Смотрите схему узла кнопок.


  1. DGN
    15.12.2018 04:31

    А просто три транзистора и немножко RC рассыпухи не прокатят? Ах да, программист без работы останется…

    p.s. Как то раз, в далекие доинтернетные времена, я помогал одному товарищу сделать систему скрытной видеозаписи на даче. Система состояла из видеоплеера и лаптопа 286, который через LPT порт управлял этим видеоплеером. Он был программист, и жутко навороченный искуственный интеллект на турбопаскале там всем этим рулил, но недостаточно хорошо. И собственно я был призван подсобить сделать все чуть более надежно, чтобы система пережила зиму и сняла кино про воров. В общем провозившись с системой, я взял макетку, горку радиодеталей и чисто на конденсаторах, транзисторах и реле, реализовал всю логику этого хитрого контроллера.
    p.p.s. stm32 это ведь будет помощнее i286?


    1. AllexIn
      15.12.2018 10:46
      +3

      А просто три транзистора и немножко RC рассыпухи не прокатят?

      Ошибки в коде правятся на ПК за секунды и требуют только перепрошивки.
      Ошибки в схеме тяжело искать(особенно если осцилогрофа нет, а его нет у большинства любителей) и также тяжело править.
      При прочих равных, херовый программист и херовый электронщик потратит очень разное время на решение и исправление.
      Не говоря уж о том, что херовый программист хоть что-то сделает, а херовый электронщик не сделает вообще ничего.

      Я сам любитель — начинал с ЛУТ, сложных плат, вплоть до пайки контроллеров в QFP.
      Сейчас я всегда беру Bluepill и всё. Платы стали проще, правки вносить проще. Что уж говорить, даже если мне нужн транзистор — я предпочитаю не делать развязку из резисторов, а сразу брать логический транзистор с встроенными резисторами. Да, не феншуй. Да, дороже. Но время и нервы экономит.
      Да, и сейчас приходится переделывать. Но гораздо реже. Сейчас я могу взять одно устройство, и полностью переделать его функциональность просто переписав прошивку.
      Старые устройства на рассыпухе идут в мусор, потому что переделке не подлежат от слова вообще.

      Так что да, транзисторы и RC рассыпуха не прокатят.


    1. vladimir_open-dev Автор
      15.12.2018 11:00
      +1

      Я с удовольствием посмотрю на ваш вариант схемы. А то сложно у меня получилось.


  1. MaxVetrov
    15.12.2018 05:29

    Что-то я не помню такого мультика про два уяка.
    Не получали сообщение?

    Воздержитесь от нецензурной лексики


    1. MaxVetrov
      15.12.2018 20:09

      О, исправили на фигак! Спасибо!


      1. vladimir_open-dev Автор
        15.12.2018 20:10

        Зачастую фигаком не обойтись)


        1. MaxVetrov
          15.12.2018 21:10
          -1

          Действительно .) О чем это я? :)
          www.youtube.com/watch?v=SN1ZbiksnM8


  1. malishich
    15.12.2018 10:11
    +1

    Подтяжка затворов в 1М не много ли? Боюсь в недружелюбных условиях «окружающей среды» внутри автомобиля MOSFET словит помехи, открывающие его, на раз-два. Мне кажется 1..10К будет самое оно. А как вы считаете?


    1. vladimir_open-dev Автор
      15.12.2018 11:03

      Подтяжка здесь в целом не нужна — после старта управляющая нога имеет вполне конкретный уровень, а 1-10кОм это дополнительные 0,35 — 3,5 мА потребления от конденсатора, что увеличит емкость конденсатора до небес.


  1. Barma2012
    15.12.2018 11:55
    +2

    Картинка просто прекрасна! ))) А главное — совершенно верная (лучший пример — недавнее обновление гмыла).


  1. VT100
    15.12.2018 17:28

    Давно опираюсь на более простую зависимость C*?U = I*?t, ведь интересно именно падение напряжения, а не расход энергии.
    Для этих вводных (0.5 мА на 0.2 с при падении на 2 вольта) получается 50 мкФ. Хотя, конечно, 0.5 ма — это ни в какие ворота.


    1. vladimir_open-dev Автор
      15.12.2018 18:44

      Можно поподробнее как вы получили C*?U = I*?t? Согласно вашей формуле получается, что можно на падении 2 В от конденсатора 50 мкФ питать 0,2 с устройства с потреблением 0,5 мА не зависимо от абсолютного напряжения, хотя это не так:
      image


      1. VT100
        15.12.2018 19:39

        А * секунда = Кулон = Вольт * Фарад.
        Комп с симулятором временно ушёл в кому, так-что скриншотами подтвердить не могу.


        1. vladimir_open-dev Автор
          15.12.2018 20:04

          Так Вольт * Фарад, а не дельтаВольт * Фарад.


          1. BigBeaver
            16.12.2018 11:52

            У него с обеих сторон от равенства дельта, то есть, формула в начале ветки получена дифференцированием. Лень проверять, но в его словах есть смысл. То есть, вы считаете конденсатор так, как будто бы он является источником автономного питания, но на самом деле это не совсем так.


          1. VT100
            16.12.2018 14:15

            Закон сохранения заряда. Падение заряда конденсатора (выражающееся в падении напряжения на нём) равно заряду прошедшему в внешнюю цепь (амперы за время разряда).

            Симуляция в Tina-TI (заряд конденсатора 1 мс, разряд 10 мс), разряд на приёмник тока:


            И на резистор (ввиду малого времени — падение напряжения кажется ещё линейным):


            А 19 мФ при 230 вольтах, очевидно, — ни в какие ворота.


            1. vladimir_open-dev Автор
              17.12.2018 13:10

              Промоделировал в tina — все как вы говорите, в протеусе — не так, посмотрел осциллографом — не так. Я действительно хочу понять кто прав (почему подход с точки зрения закона сохранения энергии не работает)?


  1. ittakir
    15.12.2018 20:36
    +1

    В финальной схеме можно избавиться от транзистора, объединив несколько пинов физически. Тогда ток не будет превышать максимально допустимый для пина.


    1. vladimir_open-dev Автор
      15.12.2018 20:49

      можно, но 0,6 В придется компенсировать уменьшением резистора R2.


      1. timdorohin
        15.12.2018 21:49

        Дык при запараллеленных пинах сопротивление ниже -> падение ниже. А учитывая что на выходе у микроконтроллера не сопротивление, а канал полевого транзистора(неидеальный источник тока) все становится еще интереснее и итоговое падение узнать получится только опытным путем.


  1. demonit
    15.12.2018 20:55
    +2

    первая картинка мне понравилась больше :)


    1. DGN
      15.12.2018 21:13

      Да и телеграм раньше стабильней работал…


  1. SergeyMax
    15.12.2018 21:49

    Получается, что попытка нажатия кнопки SET+ приводит к падению напряжения ниже минимального и МК сбрасывается.
    А в первом варианте схемы почему контроллер не сбрасывался?


    1. ovegio
      17.12.2018 12:03

      Потому что выбран мк L-серии. У STM32L031 рабочее напряжение от 1.8 В. На регулятор напряжения с запасом хватает разницы в 0.4 В.


  1. rub_ak
    15.12.2018 23:32
    +1

    Извините, что лезу в спор программистов с электронщиками.
    А использовать физическую кнопку с полу нажатием нельзя было?


  1. emmibox
    16.12.2018 14:06

    PIC12F629
    древний как мамонт.
    2 вольта
    25ма на вывод
    100мка на мегагерц потребление. (это если без фантазий, а так можно и в слип уйти с 1м наноампером — и по кнопке выйти).

    Диод и конденсатор — нафиг. Достаточно тех диодов, которые внутри ноги на питание распирают. Итого остается единственный конденсатор между выводами питания и резисторы.


    1. Nikopol_86
      16.12.2018 20:37

      Ваши слова лишь подтверждают выводы автора стать

      Невозможности объять весь спектр возможных комплектующих, подходящих для выполнения задачи, чтобы выбрать из них «самое самое». Эти факторы, чаще всего, объясняют то, что многие устройства (бытовые, коммерческие, специальные) работают нормально, но сделаны не так, как сделали бы его вы.

      А так идея интересная, я так даже и схему себе представил.


      1. emmibox
        17.12.2018 08:23

        Понятно, что все устройства сделаны на том, на чем их умеют делать те, кто их делает, а не на том на чем их можно было сделать наиболее эффективно во всех отношениях. Но зачем транслировать эту позицию в статьях? И как качественно статья смещает навыки тех, кто ее читает в «2-ю область»?


  1. Exeland
    17.12.2018 12:02

    Мне кажется здесь было бы удобнее применить что-то вроде TL431, тогда меняя делитель можно было бы менять напряжение достаточно точно.


    1. vladimir_open-dev Автор
      17.12.2018 12:43

      Не стесняйтесь накидать схемку, чтобы остальные могли посмотреть на сколько ваше решение элегантнее предложенного ими)


  1. HDL
    17.12.2018 12:03
    +1

    1) резистор можно ШИМить, тогда хватит одного для эмуляции несколько виртуальных.
    2) питание можно поднять емкостным преобразователем.


    1. vladimir_open-dev Автор
      17.12.2018 14:57

      Интересная идея, но все же в такой схеме питание выйдет за пределы 5,5В