Практика помехоустойчивости: INPUT с внешней стяжкой или INPUT_PULLUP (возможно, с доп подтяжкой)
- Войдите на сайт для отправки комментариев
Ср, 05/09/2018 - 21:52
Сабж. В первую очередь интересует именно практический опыт.
С точки зрения кода - имхо удобней стяжка (наличие событий на всём порту достаточно сравнить с 0. Да, можно и с 255, но 0 нам всем нагляднее).
Аппаратная часть не изменится - т.к. около кнопок есть и +12, и Gnd.
Длина кабеля планируется в пределах 15 метров, UTP или - возможно - другая качественная медяшка. Лично у меня на подобной длине особых проблем ранее не замечалось в обоих случаях (HIGH-LOW - Холла, герконы, кнопки), но хочется больше статистики (и рекомендаций от практиков) до того, как будут приняты решения по железу.
+ за внешнюю подтяжку к питанию и работу по низкому уровню.
Кстати, подтяну свой уровень вопросом: есть ли какая-либо потенциальная опасность в том, чтобы продублировать внутренний pull-up резистор внешним?
Кстати, подтяну свой уровень вопросом: есть ли какая-либо потенциальная опасность в том, чтобы продублировать внутренний pull-up резистор внешним?
Внутренняя подтяжка слабэнька обычно, предпочитаю внешнюю. При этом при необходимости юзаю и внутреннюю (забыл внешнюю развести на плате, например). Ума не приложу, откуда бы там взяться опасности - подтяжка и подтяжка, внешнюю обычно посильнее внутренней ставят, да и удобней так, пмсм.
Кстати, подтяну свой уровень вопросом: есть ли какая-либо потенциальная опасность в том, чтобы продублировать внутренний pull-up резистор внешним?
Никакой, если при подключении внешней держать в голове, что одна подтяжка уже есть, и не ставить параллельно слишком мелких сопротивлений. Зато нередко это бывает полезно.
Я про случай когда на макетке отгонял с внутренней, а потом то же самое, не меняя INPUT_PULLUP на INPUT воткнул на плату со внешней. Так-то я тоже опасности не вижу (если не сильно занижать сопротивление внешнего), но на всякий пожарный решил спросить, раз возможность подвернулась.
По моей практике (именно на кабеле) было несколько случаев, когда устойчивость просто пришлось дотягивать внешней подтяжкой, без вариантов. Что висело в качестве датчиков - не вспомню уже. Но было такое дело.
Вообще, в теории, недостаточная подтяжка чувствительна в первую очередь к просадкам напряжения (запуск мотора, включение реле, падение в первичной сети), недостаточная стяжка - к импульсным помехам. Это тоже можно рассматривать как фактор выбора (ну нет вдруг возможности повысить питание или разделить цепи, или хотя бы привесить хороший электролит, например). Или наоборот - не удаётся вычислить или экранировать\исключить источник помех.
Невитой кабель - имхо в обоих случаях подвержен примерно равно. Зато подтяжку можно эффективно сдублировать на дальней стороне (если есть питание), а со стяжкой (опять же имхо) ситуация на кабеле чуть хуже. Но статистика - она пообъективнее, чем имхо), потому создал ветку.
Я про случай когда на макетке отгонял с внутренней, а потом то же самое, не меняя INPUT_PULLUP на INPUT воткнул на плату со внешней. Так-то я тоже опасности не вижу (если не сильно занижать сопротивление внешнего), но на всякий пожарный решил спросить, раз возможность подвернулась.
"если не сильно занижать сопротивление внешнего" - вот и вся тонкость, собсно. Ну а так, конечно - лучче что-то одно - делитель он и в африке делитель.
Где-то в интернете читал что внутренняя подтяжка может банально и достаточно часто сдохнуть и вроде нормальный чип перестаёт работать, потому просто на всякий случай всегда 10 КОм резистором дублирую внутреннюю. Занимает не много места, а на душе спокойнее.
Кстати, вот почему ещё "0" лучше. Если в ходе работы часть входов необходимо исключить из запроса, это корректируется простым маскированием до сравнения, и никаких других изменений нигде в коде не требуется. "0" всегда остаётся "0", и в этом безупречен и безопасен.
А вот при подтяжке - необходимо сравнение каждый раз с разным числом (при этом самое безобидное - во все такие места передавать новую маску), по понятным причинам более опасное. Как человеческий фактор при написании кода, так и нечаянно не случившаяся вовремя синхронизация (обновлённая маска - или маскированный результат - уверена, что она актуальна, но по факту уже не соответствует ни состояниям входов, ни настройкам опроса).
А вот при подтяжке - необходимо сравнение каждый раз с разным числом
А сколько Вы знаете разных логических единиц?
Единиц - одну. А их комбинаций с нулями - при штатном оперировании переменными - примерно 2^31 в обе стороны от оного. Применительно к собранному из 3х-4х физических одному виртуальному порту в 8 (при желании больше) разрядов - существенно меньше (от 255 и выше). Но это в 255 раз больше, чем один ноль (да простят математики). Плюс сама необходимость внедрения лишней динамически изменяемой сущности... Описанный ранее сбой вполне реален, если проект развит чуть более, чем ногодрыг. Хотя и в нём... тему можно развивать долго, но не в этой ветке. На вопрос я ответил.
А Вам есть что рассказать непосредственно о практике помехоустойчивости в работе по верхнему и нижнему уровням?
Единиц - одну. А их комбинаций с нулями - при штатном оперировании переменными - примерно 2^31 в обе стороны от оного. Применительно к собранному из 3х-4х физических одному виртуальному порту в 8 (при желании больше) разрядов - существенно меньше (от 255 и выше). Но это в 255 раз больше, чем один ноль (да простят математики). Плюс сама необходимость внедрения лишней динамически изменяемой сущности... Описанный ранее сбой вполне реален, если проект развит чуть более, чем ногодрыг. Хотя и в нём... тему можно развивать долго, но не в этой ветке. На вопрос я ответил.
А Вам есть что рассказать непосредственно о практике помехоустойчивости в работе по верхнему и нижнему уровням?
Т.е. одна кнопка у Вас передает "примерно 2^31 в обе стороны"? Я тоже хочу такую кнопку!
Помехоустойчивость как таковая напоминает коня. Сферического. Теоретически никакой разницы, куда притягивать, - нет. Существенное - в деталях. В частности, как выполнены входные и выходные каскады. Кстати, по условию около кнопки присутствует как земля, так и питание. Ничто в этом случае не мешает использовать двухтактный активный выход.
Уважаемый, давайте оптимизировать самый ценный невозобновляемый ресурс. Он называется "время жизни".
Для понимания "многоразрядной кнопки" написано достаточно в предыдущем сообщении. Sapienti Sat.
За очередную - на этот раз hardware - лишнюю сущность отдельное спасибо) - дополнительных задержек и непредсказуемостей мне не надо, иначе не собирал бы порты. Как и усложнения целого пула периферии активными каскадами. Конечно, применений им, безусловно, существует немало, но не для текущей задачи. Как и других прекрасных веток для сферических разработчиков на этом и других форумах.
Что интересует меня, как ТС, в этой ветке - это практические обобщения и мнения по сабжу от тех, кто имеет реальный опыт (а не сферический). Теоретическая разница как раз есть, и описана в т.ч и мной выше (повторюсь, стяжка независима от просадок напряжения, в отличие от подтяжки - как очевидный пример). Спасибо за понимание)
По описанным здесь и ряду иных причин решил совместить достоинства обоих вариантов (и убить пару попутных зайцев). Порты будут на входах с внешней подтяжкой и NC-контактами на массу на концах шлейфов.
Это буде кто тем же вопросом задастся. Всем участникам продуктивной части обсуждения спасибо :)
По описанным здесь и ряду иных причин решил совместить достоинства обоих вариантов (и убить пару попутных зайцев). Порты будут на входах с внешней подтяжкой и NC-контактами на массу на концах шлейфов.
Т.е. универсальность подхода, я правильно понял? А не проще тогда сразу на плате предусмотреть площадки: запаял так - подтяжка, запаял эдак - стяжка? Или я чего-то не уловил?
По описанным здесь и ряду иных причин решил совместить достоинства обоих вариантов (и убить пару попутных зайцев). Порты будут на входах с внешней подтяжкой и NC-контактами на массу на концах шлейфов.
Т.е. универсальность подхода, я правильно понял? А не проще тогда сразу на плате предусмотреть площадки: запаял так - подтяжка, запаял эдак - стяжка? Или я чего-то не уловил?
Имеется в виду, что со стороны процессора всегда на всех входах подтяжка, а со стороны всех шлейфов нормальный "коротыш". То есть, нажатие кнопки не замыкает, а размыкает линию, "освобождая" подтяжку. Странно, что такого очевидно удобного решения на просторах планетного разума нет. Или просто не встретилось.
Имеется в виду, что со стороны процессора всегда на всех входах подтяжка, а со стороны всех шлейфов нормальный "коротыш". То есть, нажатие кнопки не замыкает, а размыкает линию, "освобождая" подтяжку. Странно, что такого очевидно удобного решения на просторах планетного разума нет. Или просто не встретилось.
Спасибо, это надо обмозговать.
Имеется в виду, что со стороны процессора всегда на всех входах подтяжка, а со стороны всех шлейфов нормальный "коротыш". То есть, нажатие кнопки не замыкает, а размыкает линию, "освобождая" подтяжку. Странно, что такого очевидно удобного решения на просторах планетного разума нет. Или просто не встретилось.
Спасибо, это надо обмозговать.
А главное, вдогонку к такому решению вагон и маленькая тележка вполне себе весомых бесплатных ништяков. К примеру, непрерывный контроль целостности линии ;) и далее по списку.
А как Вы нарушение целостности отличаете от нажатия на кнопку?
При адаптации транзистор-тестера к Ардуине (http://arduino.ru/forum/proekty/transistor-tester-arduino) прочитал, что в коде может применяться команда, отключающая внутреннюю подтяжку к питанию всех пинов, поэтому при подключении кнопки использовал внешнюю подтяжку. Так как кнопка была поключена к аналоговому порту, то при подтяжке в 10 кОм при нажатии на кнопку слегка проседало напряжение, что влияло на измерения на соседних аналоговых портах. Поэтому подтягивающий резистор поставил 100 кОм, а в скетче добавил небольшую задержку перед началом измерений.
то при подтяжке в 10 кОм при нажатии на кнопку слегка проседало напряжение
Штооо? Мошт ты на 10 Ом влепил по ошибке?
то при подтяжке в 10 кОм при нажатии на кнопку слегка проседало напряжение
Штооо? Мошт ты на 10 Ом влепил по ошибке?
Напряжение проседает на несколько милливольт, но на измерения транзистор-тестера это уже влияет.
Когда я собирал проект на макетке, то провода и контакты тоже помехи давали.
Ну, тогда - да. Согласен.
При адаптации транзистор-тестера к Ардуине (http://arduino.ru/forum/proekty/transistor-tester-arduino) прочитал, что в коде может применяться команда, отключающая внутреннюю подтяжку к питанию всех пинов, поэтому при подключении кнопки использовал внешнюю подтяжку. Так как кнопка была поключена к аналоговому порту, то при подтяжке в 10 кОм при нажатии на кнопку слегка проседало напряжение, что влияло на измерения на соседних аналоговых портах. Поэтому подтягивающий резистор поставил 100 кОм, а в скетче добавил небольшую задержку перед началом измерений.
Теперь я знаю, что буду собирать следующим в ближайшее свободное время ;)
P.S. Разделение реального нажатия кнопки и обрыва/плохого контакта (а это две разных неисправности) до банальности тривиально. Не упомянул я ещё один бесплатный приз от такого подключения - проводок от COM-вывода кнопки (он же "подтянутый вход", а NC на "массе") на мосфет для местной индикации без инвертирования и прочих заморочек, и без подвешивания гейта в воздухе на момент переключения или ожидания.
на мосфет для местной индикации без инвертирования и прочих заморочек...
Это смотря каким уровнем козёл управляется)) а то ведь ни ноты без б.. электрона)
Даже на ресете часто обходился внутренней подтяжкой... Но после пары случаев стараюсь ставить внешнюю - внутренняя вылетала по непонятным причинам. Именно на ресете, на других пинах подобного не наблюдал.