-Музыка

Родилась мысль найти оправдание

Пятница, 21 Ноября 2014 г. 01:42 + в цитатник

тем sdelat_pizdato (70x379, 32Kb) схемотехническим решениям, про которые принятом говорить в моём контексте «ёбля вприсядку». В современном мире даже DIY, которое в совке было неотъемлемой частью жизни, становится коммерческим, даже в исконно инженерных отраслях появляются упрощалки жизни (а для кого-то выгодное предприятие), да вплоть до визуального программирования. Немудрено что некоторые уёбки дожили (удивительно) почти до 30 и не умеют паять, а электролиты выпаивают открытым огнём турбозажигалки. Ну так вот, сегодняшний разговор относится вовсе не к моей нелюбви к макеткам и иным ардуинам как готовому решению, а скорее к подходу. Экономически целесообразнее в больших партиях стремиться к кнопке «сделать заебись», уменьшить геморрой и затраты, и делать девайсы как можно проще и неремонтопригоднее для ускорения жизненного цикла получения сверхприбылей ради. В DIY на первом месте стоит отсатисфачивание собственного самолюбия, это помимо получения бесценного опыта, а также кайфа от процесса. Ну и конечно, чтобы результат полностью изводил недостатки существующих на рынке дешёвых (по сравнению с DIY) решений, и опять же БОГ В ДЕТАЛЯХ.



Если по делу конкретно в схемотехнике: в конторе естественно пытается господствовать подход экономических оправдашек, посему для реализации какого-либо устройства выбирается наиболее подходящая аппаратная платформа, т.е. помимо части ядра (чаще всего аналоговая обвязка + ПЛИС и что-нибудь специфическое, типа излучателя психотронного оружия или концентратора эктоплазмы для машины времени ). По своей части работки над девайсом мне куда важнее юзабилити и экстерьер, «как лежит в руке» и иные попискивания при нажатиях, а также наличие на цифровой клавиатуре на цифре 5 пипок для почитателей Брайля (зацепки на клавишах F, J и 5). И здесь схемотехнически применяется чаще всего проверенное решение — отдельная цифровая плата с обвязкой (как-то контроллёр/процессор), которая связывается по какому-либо интерфейсу SPI/I2C/UART с ядром. Процессор в свою очередь управляет этими всеми клавиатурами, дисплеями и иными звуковыми пищалками, вибросигналами и USB, зарядками и иными погремушками, которые в последнее время не удостаиваются должного внимания со стороны схемотехников. Но это всё промышленное примененье. В DIY мой синдром ебли вприсядку даже классифицирован и удостоен люркиной цитаты: «И похуй, что изделие габаритное и жрет сотни ампер тока. Зато схема сложная, а следовательно ЧСВ — на высоте». Суть — для всего и вся теперь якобы хватает одного процессора с интегрированной периферией, что расстраивает, ибо в DIY-доступности чаще всего находятся микроконтроллёры без нативных usb, радиомодемов и как правило с малым объёмом флеш-памяти под код, что тратить драгоценные байты и циклы кажется просто немыслимым. Отсюда рождается идея уменьшить влияние софта в тех частях схемы, где можно реально обойтись аппартной реализацией, ведь за полсотни лет с момента изобретения полупроводников была придумана тьма решений.




Самый простой и пожалуй банальный пример №1 — тактовые кнопки и их дребезг. Кто хоть раз сталкивался с этим поймёт, насколь это поганое явление, случись оно в мышке (колёсико) или ином устройстве ввода. Как вообще вводятся данные в МК? Берём кнопку, одним концом к минусу, другим подтягиваем к питанию резистором, и этим же концом приводим в микроконтроллёр. Просто? Проще некуда. Софтом же начинаем отлавливать нажатие, ставим цикл (как я делал в 14 лет на QBASIC отлавливая мышиные нажатия), в котором проверяем появление нуля на ножке.
Драгоценные байты, проверка состояния, выставление задержки — это ли не софтовый путь? Спасает от дребезга проверка кнопки раз в 50мс, скорость реакции человека. Но мы же не любим лёгкий путь, ищем пути подавления дребезга аппаратным путём: здесь на рисунке 258 б) представлен прекрасно работающий (проверенный на 176 серии счётчиков) аппаратный дребезгодав. С его помощью удаётся избавиться от миллисекунд задержки при проверке состояния кнопки, но как уйти от цикла? Просто использовать для кнопки ножку с внешним прерыванием, т.о. мы при нажатии кнопки возбуждаем прерывание в контроллёре и уже в подпрограмме отрабатываем нужную реакцию софтом. Никаких проверок и циклов, вуаля. Нужно подключить много кнопок? Тогда для каждой рисуем дребезгодав, выходные линии раздваиваем так, чтобы они прилетали каждая в свою ножку, а вторые концы заводим в ИЛИ (ИЛИ-НЕ) с множеством входов, например, 74133, или в каскадированную микросхему ИЛИ (7402), они стоят килограмм за пятак, ну а для самых нищебродов существует монтажное ИЛИ на диодах. Логика софта будет такой, что проверка и выяснение звенящей ножки (кнопки) будет инициироваться только по срабатыванию прерывания.
Здесь можно найти первый плюс этого подхода — пара «лишних» элементов повышает ЧСВ автора, усложняет СхЭ, а реально убирает постоянную проверку состояний кнопок, предоставляя кучу свободных циклов для более нужных задач, например, генерация звука нужной частоты идёт без регулярных проглатываний из-за отвлечения процессора.




Вторая находка, которую довольно долго искал — энкодер/валкодер и обработка. Все любят приводить в пример простое подключение к контроллёру энкодера через подтяжку и давлю дребезга конденсаторами на землю.

Не уверен, что работает с низкокачественными энкодерами, но если и работает, к чему нас обязывает подобная схема? К циклу, временным задержкам и т.д., а ещё анализу запаздывания импульсов на второй ножке относительно первой. Хуйня же. И вот для усложнения схемы и упрощения кода была наконец найдено аппаратное решение, которое работало вживую (на дорогущей 564ЛА7 в золотом корпусе):
энкодер2 (647x347, 36Kb)
С помощью магии простой логики на элементах И-НЕ можно эти запоздашки конвертировать в двуногий интерфейс, в котором на одной ноге шаги, на другой направление. Самое то чтобы завести шаги на... прерывание (куда же ещё) и проверять направление по какой-нибудь другой ноге лишь в подпрограмме обработки прерывания. Кстати, этот интерфейс напрямую можно подключить к следующему примеру (интрига).




Третье. Управление униполярным шаговым двигателем. Посколь увлечения должны быть бесплатными, вместо сервоприводов я юзаю униполярные ШД из дисководов, которые зачастую имеют 5 или 6 пинов (на 4 пина - биполярные), два или один из которых общий, остальные 4 — обмотки. Чтобы двигатель двигался, в простом варианте нужно последовательно подавать на каждую из обмоток напругу (12В), в ту или иную сторону будет происходить 4 смены состояния и вращение. Что придумали ардуинщики? Спецдрайвер в кожухе по размеру шильда, с конфигуратором и т.д., использующий всего две ноги — направление и шаг (STEP/DIR). Внимательному читателю должно напомнить предыдущий пример, где использовались выходы с аналогичными функциями, их можно соединять напрямую, и получим на выходе без микроконтроллёра крутилку, которая будет синхронно вращать моторчик, отзываясь на наше вращение ручки. Но это всё покупные варианты, для простоты же зачастую используется схема управления ШД напрямую, через силовые ключи. Здесь параллельный порт смело заменяем на ноги контроллёра (диоды нужны ибо нагрузка индуктивная).
image001 (337x226, 12Kb)
Есть также замечательная микросхема ULN2003, сборка из 7 транзисторов Дарлингтона с защитными диодами как раз под индуктивную нагрузку, выдерживают напругу до 50В, так что питать можно хоть от ноутбучного БП, т.е. сам по себе непосредственно драйвер.
stepmotor2 (422x298, 4Kb)
И если бы я заказал её годом ранее, мне не пришлось бы сочинять драйвер для портального станка с подключением к LPT из трёх (!) плат 5,25" дисководов. Вот этот бессмысленный бутерброд из трёх дисководов ради контроллёра STEP/DIR в каждом. Всё обусловливается количеством выходных пинов на LPT, которых не хватает чтобы обслуживать 12 обмоток на трёх двигателях, поэтому STEP/DIR необходим.
IMG_7121 (640x480, 316Kb)
Так, step/dir функционально конвертирует два входа в четыре выхода, и для ШД вещь просто необходимая, из минусов могу отметить только отсутствие знания со стороны контроллёра о том, какая именно обмотка в данный момент активна, но оно редко нужно, если только у нас нет желания делать что-то, что при сбросе питания будет восстанавливать движените ровно с того же места, без возвата в нуль (~станок, который выключили, восстановит работу с того же места, если предварительно «запомнил» обмотку которая была активна). Ещё управление самими обмотками бывает полезно, если мы хотим хаотично их переключать и не добиваться движения, что бессмысленно =)
Будем значит запиливать «контроллер STEP/DIR» на логике и драйвере.
step-dir (700x373, 80Kb)
Логика работы такова, что сигналы STEP/DIR заводятся на ноги счётчика 561ИЕ11 (РЕВЕРС, СЧЁТ), из него выходит 4-х битный код (0...15), который идёт на дешифратор 74141 (К561ИД1, до 10 выходов для цифр газоразрядных индикаторов), затем с помощью инвертора 7406 сигналы обращаются для подачи на входы драйвера ULN2003. Вся соль в том, что от счётчика ИЕ11 на 74141 приходит всего два проводника (0...3), и дальше не считает, т.е. при импульсах СЧЁТ (STEP) мы последние два бита числа меняем в ту или иную сторону, не глядя на старшие два бита, следовательно, нет разницы, находится в регистрах ИЕ11 число 0 (0000) или 4 (0100) или 8 (1000) или 12 (1100), главное что меж них меняется правая часть бинарника, и следом за ним 74141 переключает 0...1...2...3 и в обратную сторону (РЕВЕРС). Инвертирование 7406 важно чтобы напруга была только на одной из обмоток, а не на других трёх.
Получившаяся платка
Вот тебе очередная экономия кода, использовать аппаратный счётчик вместо переменной и двух ног вместо четырёх. На базе этого счётчика и на волне заделывания периферии я решил заделать мультипрограмматор, удобства ради чтобы не переставлять «4 проводка» в каждый чип, а чтобы они штатно висели на шлейфе и я бы лишь кнопочкой последовательно переключал выходы с подсказкой на индикаторе.
IMG_7426 (640x460, 140Kb)
IMG_7425 (640x431, 241Kb)
multi_prog (700x483, 127Kb)
Да ещё и добавив 74244 или 74245 на вход я получил буфер сигналов, который выравнивает заваленные фронты, упавшие на длине LPT-кабеля к компу. Счётчик ИЕ11 по предыдущей логике переключает выходы 74141, на которые завязаны твердотельные реле, включающие линии MOSI/MISO/SCK/RESET из каждого чипа во входную линию. Пока пяти выходов хватает за глаза, но для расширения я добавил разъём, в который можно запихнуть ещё плату-расширитель с 5 выходами. Также на плате есть триггер, который по кнопке отключает 74245 ввиду мало ли, из некоторых девайсов нужно вынимать программатор чтобы он работал. Кстати, три кнопки, все завязаны по схеме с конденсатором, описанной в первом примере, дребезг довольно редко проскакивает. P.S. Кажется, всё это дело можно было проще запилить на мультиплексорах, а не реле, но исходим из того, что есть в наличии :).



Четвертый пример. Схема ещё не реализована в железе, однако основная мысль уже проглядывается. Цель — считывать 3 байта из аппаратных переключателей. Ну, прикиньте, 24 ноги контроллёра, которые используются 1 раз во всей работе, при инициализации например. Нерационально и глупо, надо выдумывать что-то вроде:
считывалка джамперов через 3 провода (700x406, 117Kb)
Для задания одного из 16,5 млн состояний (можно зашифровать всё, что угодно), удобно использовать DIP-переключатели. Думаю, любую конфигурацию можно уложить в эти 24 бита, хоть ключ шифрования!
dipsw24 (300x300, 11Kb)
Логика схемы следующая: код программы увеличивается, но количество ног контроллёра всего 3, одна на вход, две это DATA/CLOCK задающего сдвигового регистра (4094). Из регистра биты идут в адресную шину мультиплексоров 74153 (3 шт.), на входах которых и установлены DIP-переключатели с кучей подтяжек. Специфика такова, что 8 бит хватает на 3 мультиплексора, и каждые два лишних бита (каскадирование 4094) даст ещё один байт, если не усложнять схему дешифратором. Тут всё по-простому, адресная шина для 74153 это А и Б (2 бита, выборка из четырёх входов) а поскель каждый мультиплексор сдвоенный, есть ещё два пина (1E, 2E) можно выбирать, какой из пары будет включен (поскольку они все выходят в один провод, это важно). Т.е. 4 бита на 8 входов это много, но чтобы не усложнять, пусть пока будет так :). В коде нужно сделать 24 прохода забивки в регистр 8-битного адреса в специфичном формате (А,Б,1Е,2Е,3Е,4Е,5Е,6Е) и на каждом проходе считывать проверять входную ногу.
Такую схемку, если вместо DIPsw поставить бинарные датчики (открытия двери, оптроны, герконы - да что угодно), и подумать над падениями напряжений на расстояниях проводов (5В далеко не ходит), можно использовать как сигналку, каждые 50...500мс сканировать и логгировать события.


Но как-то я полез уже в другую сторону — экономию ног и использование имеющейся элементной базы, снятой со старых девайсов, а тут фантазия безгранична. Посему для первого просветительского поста хватит наглядности. Этот пост лишь демонстрация полезности простой логики и аппаратных решений в угоду чему-либо, я же не подталкиваю использовать Z80 или 8085 с УФ ПЗУ вместо микроконтроллёров, или генерировать VGA-сигнал на простой логике (Видеокарта мазохиста, 32 микросхемы) только из-за роста сложности схемы.

Рубрики:  здесь и сейчас
этот удивительный мир вокруг нас
Метки:  



 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку