Сложная разработка простых устройств

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



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

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

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

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

    Комментарии 59

      0
      я может туплю но зачем stm питать от кнопок а не от приходящего питания 3,3 вольта
      в чем смысл?
        0
        Так нет там приходящего питания 3,3В. Смотрите схему узла кнопок.
        +3
        А просто три транзистора и немножко RC рассыпухи не прокатят? Ах да, программист без работы останется…

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

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

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

          Так что да, транзисторы и RC рассыпуха не прокатят.
            +3
            Я с удовольствием посмотрю на ваш вариант схемы. А то сложно у меня получилось.
              +1
              Даже если не учитывать сложность отладки, проблемы схемы на рассыпухе в том, что она:

              — Больше по размерам
              — Потребляет больший ток
              — По разному работает при разных температурах
              — Дороже
                0
                про ток далеко не всегда, но один из существенных недостатков в том, как правильно заметил AllexIn схема на рассыпухе не гибкая и смена задержек требует минимум замены компонентов.
              –8
              Что-то я не помню такого мультика про два уяка.
              Не получали сообщение?
              Воздержитесь от нецензурной лексики
              +2
              Подтяжка затворов в 1М не много ли? Боюсь в недружелюбных условиях «окружающей среды» внутри автомобиля MOSFET словит помехи, открывающие его, на раз-два. Мне кажется 1..10К будет самое оно. А как вы считаете?
                0
                Подтяжка здесь в целом не нужна — после старта управляющая нога имеет вполне конкретный уровень, а 1-10кОм это дополнительные 0,35 — 3,5 мА потребления от конденсатора, что увеличит емкость конденсатора до небес.
                +2
                Картинка просто прекрасна! ))) А главное — совершенно верная (лучший пример — недавнее обновление гмыла).
                  0
                  Давно опираюсь на более простую зависимость C*ΔU = I*Δt, ведь интересно именно падение напряжения, а не расход энергии.
                  Для этих вводных (0.5 мА на 0.2 с при падении на 2 вольта) получается 50 мкФ. Хотя, конечно, 0.5 ма — это ни в какие ворота.
                    0
                    Можно поподробнее как вы получили C*ΔU = I*Δt? Согласно вашей формуле получается, что можно на падении 2 В от конденсатора 50 мкФ питать 0,2 с устройства с потреблением 0,5 мА не зависимо от абсолютного напряжения, хотя это не так:
                    image
                      +1
                      А * секунда = Кулон = Вольт * Фарад.
                      Комп с симулятором временно ушёл в кому, так-что скриншотами подтвердить не могу.
                        0
                        Так Вольт * Фарад, а не дельтаВольт * Фарад.
                          +1
                          У него с обеих сторон от равенства дельта, то есть, формула в начале ветки получена дифференцированием. Лень проверять, но в его словах есть смысл. То есть, вы считаете конденсатор так, как будто бы он является источником автономного питания, но на самом деле это не совсем так.
                            +2
                            Закон сохранения заряда. Падение заряда конденсатора (выражающееся в падении напряжения на нём) равно заряду прошедшему в внешнюю цепь (амперы за время разряда).

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


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


                            А 19 мФ при 230 вольтах, очевидно, — ни в какие ворота.
                              0
                              Промоделировал в tina — все как вы говорите, в протеусе — не так, посмотрел осциллографом — не так. Я действительно хочу понять кто прав (почему подход с точки зрения закона сохранения энергии не работает)?
                                +1
                                Возможно — это чем-то близко к парадоксу параллельного соединения конденсаторов.
                                Надо подумать.

                                Из практики — в двухтактных (на TL494 и клонах) ATX БП при мощности порядка 300..500 Вт на выходе сетевого выпрямителя стоят пара конденсаторов примерно на 100..200 мкФ х 400 В.
                                При средневыпрямленном 305 В, для тока потребления 381 Вт / 305 В = 1,25А и времени примерно 8 мс (1/100 сек * угол проводимости диодов или как он там называется, когда выпрямитель работает на ёмкостную нагрузку), — получаются пульсации напряжения около 66 вольт, что можно считать относительно допустимым.
                                А по формуле в статье — около 1250 мкФ для той-же пульсации.

                                P.S. А вот и опечатку нашли.
                                  0
                                  А я еще покрутил софт контроллера — оказалось на устройстве нужна бОльшая емкость чем рассчитанная по вашей формуле из-за того, что после нажатия кнопки (пропадания питания) и переходом в спящий режим проходит некоторое время (с потреблением ~1 мА). Спасибо вам за разъяснение — сейчас исправлю, ошибка действительно глупая.
                                    0
                                    Ну, за торжество истины!

                                    P.S. Скучаю по маскоту… хнык… :-(
                      +1
                      В финальной схеме можно избавиться от транзистора, объединив несколько пинов физически. Тогда ток не будет превышать максимально допустимый для пина.
                        0
                        можно, но 0,6 В придется компенсировать уменьшением резистора R2.
                          0
                          Дык при запараллеленных пинах сопротивление ниже -> падение ниже. А учитывая что на выходе у микроконтроллера не сопротивление, а канал полевого транзистора(неидеальный источник тока) все становится еще интереснее и итоговое падение узнать получится только опытным путем.
                            +2
                            У вас формула для убыли энергии конденсатора неправильная. Начальная и конечные энергии: C*U1^2/2 и С*U2^2/2. Тогда C*(U1^2-U2^2)/2=C*Uср*(U1-U2). И если приравнять к вашей правой части, то Uср сократится и останется C(delta U)=I*(delta t), как указали выше.
                              0
                              Спасибо огромное, признаю ошибку, сейчас исправлю. Глупая ошибка, извиняюсь. Только у вас C*(U1^2-U2^2)/2=C*2*Uср*(U1-U2). Вот куда двойка пропадает
                                0
                                А я не туда комментарий написал, извините.
                                  +1
                                  Ой, а откуда там двойка у вас?
                                  C*(U1^2-U2^2)/2=С*(U1+U2)*(U1-U2)/2, а (U1+U2)/2=Uср, и двойка уходит.
                        +4
                        первая картинка мне понравилась больше :)
                          0
                          Да и телеграм раньше стабильней работал…
                          0
                          Получается, что попытка нажатия кнопки SET+ приводит к падению напряжения ниже минимального и МК сбрасывается.
                          А в первом варианте схемы почему контроллер не сбрасывался?
                            0
                            Потому что выбран мк L-серии. У STM32L031 рабочее напряжение от 1.8 В. На регулятор напряжения с запасом хватает разницы в 0.4 В.
                            +1
                            Извините, что лезу в спор программистов с электронщиками.
                            А использовать физическую кнопку с полу нажатием нельзя было?
                              0
                              Кнопка была уже готовой(штатной) в подрулевом переключателе.
                              +2
                              PIC12F629
                              древний как мамонт.
                              2 вольта
                              25ма на вывод
                              100мка на мегагерц потребление. (это если без фантазий, а так можно и в слип уйти с 1м наноампером — и по кнопке выйти).

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

                                А так идея интересная, я так даже и схему себе представил.
                                  0
                                  Понятно, что все устройства сделаны на том, на чем их умеют делать те, кто их делает, а не на том на чем их можно было сделать наиболее эффективно во всех отношениях. Но зачем транслировать эту позицию в статьях? И как качественно статья смещает навыки тех, кто ее читает в «2-ю область»?
                                    0
                                    Очевидно, статья не для вас.
                                  0
                                  PIC12F629 на столько древний, что просят а него как за антиквариат — $1, ровно как за STM32L010F4P6, а STM8S001 со своими нищадными $0,5 нервно курит в стороне. ATTiny10 выглядит куда более оптимальным по всем приведенным вами критериям.
                                    0
                                    ATTiny10 не доступно ни подобное потребление ни подобный выходной ток на пинах.
                                    Опять придется лепить транзисторы.
                                      0
                                      Потребление PIC 500мкА на 4мгц при внутреннем кварце от 3В, у ATTiny 1,6мА — вы правы, при засыпании они удовлетворяют задаче. А что у них отличается в токе пинов? У PIC V0L=0,6В при 8,5мА, а у ATTiny 0,6В при 10мА.
                                  0
                                  Мне кажется здесь было бы удобнее применить что-то вроде TL431, тогда меняя делитель можно было бы менять напряжение достаточно точно.
                                    0
                                    Не стесняйтесь накидать схемку, чтобы остальные могли посмотреть на сколько ваше решение элегантнее предложенного ими)
                                      +2
                                      Хотел предложить что-то типа такого:

                                      но начал считать делитель и понял, что с каждой цепочкой резисторов напряжение будет расти, а не падать, как необходимо.
                                        0
                                        В этом нет ничего страшного — можно резисторы не подключать для эмуляции нажатия, а наоборот отключать. Тогда для самого сложного нажатия можно будет не переживать о сохранности лог уровня на пинах и тем самым уводить МК в самый глубокий сон. Стоимость правда далеко не гуманная(20р).
                                    +1
                                    1) резистор можно ШИМить, тогда хватит одного для эмуляции несколько виртуальных.
                                    2) питание можно поднять емкостным преобразователем.
                                      0
                                      Интересная идея, но все же в такой схеме питание выйдет за пределы 5,5В
                                        +2
                                        Меняя скважность и период ШИМ, можно независимо (в некоторых пределах) подстраивать напряжение на входе (эмуляция резистора), и на выходе (питание МК).
                                        Пример симуляции в Tina-Ti, потребление МК принято 2мА, 2 варианта ШИМ.
                                    0
                                    Я бы воспользовался микроконтроллером ATtiny13a (1,8-5,5 Вольт). Не люблю МК Atmel, но тут он был бы в тему.
                                    На питание поставил бы диод Шоттки и конденсатор.
                                    Тактование бы сделал от внутреннего источника 128 КГц, поделил бы фьюзом на 8, получил бы 16 КГц.
                                    При «нажатии» на кнопку уводил бы контроллер в сон (~4 мкА), через 0.2 секунды он бы будился Watchdog таймером и «нажимал» бы таким же образом вторую кнопку.

                                    Для меня очень странно, что предложивший не поставил диод на питание — очевидно же, что конденсатор разрядится и напряжение питания просядет.
                                      0
                                      в случае диапазона 1,8-5,5 Вольт диод не нужен — напряжение не падает ниже 2,2В даже при нажатии кнопки, а вот имея низкое потребление МК вам не потребуется пересчитывать резисторы.
                                        0
                                        Кстати есть интересное решение подобной задачи для телефонной гарнитуры именно на attiny13 на радиокоте.

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

                                      Самое читаемое