самая суть
С появлением доступных ARM и MIPS решений, на которые можно установить Linux или WinCE, любительский эмбеддинг вышел на качественно новый уровень(вообще он там давно был, но не в таких широких масштабах как сегодня). Появление таких массовых программных продуктов как Android, очень сильно популяризировало процессоры с не х86 архитектурой, открыло широкой общественности новые возможности в виде снижения цены на быстродействующее железо и обеспечило доступ к той информации, которая раньше распространялась исключительно после подписания NDA.
И всем вроде бы хороши .nix железяки: роутеры, Raspberry Pi и разные девайсы а-ля МК802. У многих они рулят производственными и домашними процессами, роботами и кофеварками. Но, низкая скорость реакции на внешнее воздействие, несколько ограничивает применение таких систем в эмбеддинге. Такими функциями, которые напрочь отсутствуют в подобного рода устройствах(имеется в виду ширпотреб, а не специализированные решения раз, два), могут быть ШИМ с аварийным отключением, скоростной PID регулятор, обработка квадратурного энкодера и многие-многие другие. Все эти вещи требуют известной степени реалтайма.
Краткое описание некоторых способов добавления мускулатуры, немного теории, личных размышлений и конечно, решение от меня под катом.
Часть первая. Теория и размышления
Давайте посмотрим на существующие железные пути решения проблемы «умный, но хилый». Вариантов такого железа несколько:
1. 74хх, 40хх и прочие многоногие
Логика. Просто логика.
Проверенный временем вариант расширения логических функций.
Простая логика позволит собрать несколько сигналов в один, разобрать один на несколько и сформирует удобоваримый сигнал из мусора. И сделает это все очень быстро.
Недостатком этого способа являются большие габариты схемы, которые имеют свойство разрастаться до невероятных размеров при повышении сложности.
Пункт два вытекает из первого, но я его поставил особняком.
Это тоже логика, но логика программируемая.
2. CPLD и FPGA
Недостатков у этого способа железного расширения функций практически нет. Он широко распространен на практике, но довольно высокий порог вхождения, достаточно высокая цена на железки и некоторая(а в случае с FPGA даже вполне конкретная) монструозность, не позволяют использовать этот подход там, где не нужно считать флопы и рулить десятками и сотнями логических уровней.
Учитывая, что наше умное железо, с миром обучено нормально общаться через RS-232 или SPI, и гораздо менее охотно через GPIO, делаем не утешительный вывод: для того, чтобы наша глупая быстрая логика могла общаться с умным медленным хостом, необходимо чудо-устройство.
чудо-устройство в среде обитания
Чудо-устройство должно уметь принять от хоста команду, понятную хосту и выдать ее в понятном для логики виде, а так же принять данные в удобном для логики виде, и переслать их на хост в удобном виде для него.
Технология несколько запутана, но она как нельзя точно описывает процесс общения глупого железа с умным.
В роли чудо-устройства принято использовать микроконтроллер(в случае с ПЛИС, часто можно обойтись и без него).
3. Микроконтроллер
Конечно же микроконтроллер! Данный ресурс уже видел успешные прецеденты скрещивания роутера в качестве «самого умного» и микроконтроллера в качестве экзоскелета. Тренд скрещивания андроида с Arduino или STM32 стал так же очень заметен в последние недели. Собственно этот тренд и побудил на написание статьи.
С приходом в эту схему МК, становится не понятным применение логики в качестве рабочей силы, но пристальное рассмотрение электрических процессов, происходящих в системе с кнопками, реле, силовыми преобразователями и прочими управляющими и исполнительными устройствами, не позволяют полностью отказаться от логики в некоторых случаях.
Одним из таких случаев может быть автомат с некоторым количеством параллельных входов. Предположим, что искомое состояние входов детерминировано и выглядит не просто как «все в ноль», а имеет какой то сложный вид. Микроконтроллеру в данном случае ничего больше не остается, кроме как мониторить это самое некоторое количество входов в рабочем цикле и… больше ничего не делать. И даже в этом конкретном случае микроконтроллер не обеспечивает сравнимого быстродействия, потому что к каждому отдельному изменению состояния порта, мк будет подходить отдельно. Ему нужно будет сначала обработать прерывание, прочитать содержимое порта(или нескольких), сравнить состояние с искомым и сделать свое резюме записью в порт. Даже однотактные устройства потратят на этот процесс уйму времени. Простая схема на логике решит эту проблему в лоб, безо всякого разбора. Она всегда будет работать быстро и четко.
Часть вторая. Или как я дошел до жизни такой
Работая на производстве в должности «решателя производственных косяков», приходилось довольно часто сталкиваться с необходимостью что-то паять, программировать и прошивать. Было ли это управление клапаном набора воды в резервную емкость, или автомат переключения насосов отопления по заданной программе, это были автономные устройства, построенные на МК. Да и почти не было в те доисторические времена(5 — 6 лет назад) доступных возможностей автоматизации кроме промышленного ПЛК и самодельного устройства на МК.
Согласитесь, ведь программа, которая обслуживает насос(качать если уровень воды ниже — не качать если выше) не достойна целого ПЛК за 100+ долларов. Предвидя комментарии ядреных схемотехников спешу заявить, что МК тоже кандидат на эту программу избыточный, но имеет перед аналоговой схемой неоспоримые преимущества — программируемые в человеческих цифрах время и пороги срабатывания(вместо применения магии математики к конденсаторам и резисторам).
И поскольку для решения задачи выбран все-таки голый МК, кроме очевидной экономии, получаю еще и очевидный головняк в виде пайки. Балланс затрат и проблем был решающим в выборе решения. Особо критичные процессы и работа в плохих электромагнитных условиях, как и следовало, доверялись ПЛК без всяких реверансов в сторону самодела.
Появление пресловутых роутеров за 20 долларов, позволило с новой стороны взглянуть на автоматизацию не критических процессов. Опыт получился двоякий. С одной стороны, за копейки, я получал систему, говорящую со мной на почти человеческом языке. С другой, устройство, принципиально не способное работать с дискретными сигналами на приемлемом по скорости уровне. Это налагало свои ограничения в применении новой технологии. Дальнейшая популяризация ардуинообразных и плат на подобие STM32 Discovery, предрешила связку Linux device с низкоуровневым экзоскелетом в виде 8, 16 или 32-битного МК(плюс логика, ОУ и прочее «голое железо»).
Простые же устройства делались по старо-новой схеме:
1) Берем Arduino Nano
2) Обвязываем инфраструктурой
3) ???
4) PROFIT!
Как и прежде, все это годилось лишь для офисного применения и при наличии огромного количества пустого места.Что касается малогабаритных устройств, то тут было все плохо. И если простое устройство, не нуждавшееся в обновлении прошивки могло быть сделано на голом МК, то в устройство, в безглючности прошивки для которого я не особо был уверен(а нужно уже вчера), ставить голый МК было стремно. Во первых, для обновления прошивки нужен программатор. Во вторых… впрочем, и первого пункта для меня было достаточно. Я вообще не люблю программаторы в любом виде. Для меня лучший программатор — USB провод.
Постоянное недовольство этими нюансами, породило жгучее желание унифицировать, унифицировать, унифицировать…
Часть третья. Три недели назад
Три недели назад, я сдал в производство очередной проект(основная моя деятельность — это серийное производство электроники), а следующий замаячил только через примерно две недели. Две недели листания интернета? Хм… заманчиво… но что-то стукнуло в голове, и слово «унификация» всплыло в памяти. А с ним и старая неудовлетворенность жизнью эмбеддерской. На такой депрессивной ноте, я поставил перед собой задачу: создать хоть что нибудь для получения позитива перед новым проектом, удовлетворения ЧСВ и улучшения качества жизни землян за две недели.
Для воплощения столь амбициозных планов, было необходимо не менее амбициозное железо. И оно было найдено среди продукции широко известной в узких кругах фирмы Microchip. Это относительно новый МК PIC16F1509. Здесь, я должен сделать теоретическое отступление и рассказать о природе этой непреодолимой силы, которая заставила современного человека использовать не 32bit МК.
Итак, периферия.
Кроме стандартной периферии(USART|SPI|I2C, 4хPWM,10bit ADC, 5 bit DAC, 3 Timers, датчик температуры кристалла и конечно же GPIO), здесь нашлись любопытные нововведения среди МК начального уровня. Эти нововведения, безаппеляционно, склонили чашу весов от модных 32bit STM к не модным 8bit Microchip.
CLC (Configurable Logic Cell)
Программируемая логика на кристалле МК.
Каждый из четырех модулей имеет вид:
Слева находится четыре входа, к которым можно подключать физические выводы МК, прерывания от таймеров, компараторы, ШИМ, генератор и вообще многое из того, что есть внутри и снаружи МК. Набор источников для одного модуля включает 16 сигналов, но между наборами для каждого из четырех модулей есть различия. В частности, разные физические выводы МК. Далее на схеме находится коммутатор. Сигналы можно подключать как напрямую, так и с инверсией. Выходы идущих после коммутатора элементов ИЛИ тоже управляемые(прямой/инверсный). В самом конце справа, находится выход модуля, который может быть инвертирован, выведен на физический вывод МК или заведен на вход CLC. Выход генерирует прерывание по фронту или по спаду(как настроишь).
Красным прямоугольником обозначена изменяемая логическая функция, которая кроме уже представленного AND-OR, имеет еще 7 вариантов:
К сожалению, целью этой статьи не является ликбез по цифровой схемотехнике, поэтому комментировать тут нечего — иллюстрации говорят за себя. Отмечу только, что конфигурируется все это хозяйство прямо в коде, путем банального присвоения значений регистрам как самая обычная периферия типа таймера или GPIO. Для облегчения настройки этой не самой простой фиговины, существует GUI:
При наличии GUI, все становится предельно просто. В правом верхнем углу виднеются значения регистров, но можно и просто генерировать готовый ассемблерный или С код. К этой любопытной периферии и примерам использования я обещаю вернуться в следующий раз. А для заинтересовавшихся, рекомендую посетить эту страницу.
NCO (Numerically Controlled Oscillator)
По сути, это синтезатор частоты до 500кГц(при тактировании от внутреннего генератора 16МГц) с шагом перестройки от 0.03Гц(при тактировании от внутреннего генератора 31кГц) до 15Гц(тактовая 16МГц)
Умеет генерировать меандр и ШИМ.
Один из вариантов применения NCO и CLC(аппноут) дает 16bit ШИМ в диапазоне коэффициента заполнения от 0% до 100% при частоте ШИМ 500кГц.
CWG (Complementary Waveform Generator)
Программируемый драйвер полумоста.
На выбор несколько источников сигнала(CLC1, NCO, PWM и компараторы).
Это крайне полезная штука, и во многих случаях способна избавить разработчика от огня, дыма и горечи утраты. С предупреждением этих неприятностей, призван бороться аппаратный контроль мертвого времени.
Каждый из транзисторов пары, открывается строго тогда, когда второй уже наверняка закрыт. Это делается для исключения сквозного тока, приводящего к красивым, но порой дорогостоящим спецэффектам. Время, даваемое предыдущему транзистору на закрытие(deadtime), регулируется отдельно для переднего и заднего фронтов. Так же, со спецэффектами призваны бороться сигналы форсированной остановки, которых тут четыре: специальный вывод GPIO, CLC2 и оба компаратора. Учитывая, что на вход CLC2 мы можем подать «еще кой чего», получаем довольно обширный список возможностей по скоростной аварийной остановке драйвера без какого либо участия ядра. От таймаутов, до аналоговых и логических уровней.
На этой ноте, пожалуй, пора завязывать с теорией и переходить непосредственно к практике.
Часть четвертая. Разработка и производство
Определившись с МК, начинаю продумывать остальной конструктив. Хотелось минимально возможной занимаемой площади. Проиграв в голове несколько вариантов, остановился на решении, занимающем площадь микросхемы в корпусе DIP 20(!). Дальше, уже отталкиваясь от габаритных требований, выбрал элементную базу. В качестве USB-TTL конвертера применена известная микросхема CP2102(QFN корпус и кварц не нужен), USB разъем был выбран вертикальный, а микроконтроллер в корпусе QFN. Все это добро было незамедлительно закуплено на маузере.
С платой тоже особо не церемонился. Она, в виду своей крайней простоты, была разведена примерно за час. Выводы питания демонстративно разместил там же, где они находятся у микросхем 74хх логики. Далее я заказал изготовление нескольких штук на заводе и принялся ждать. Во время ожидания, работа над модулем велась исключительно ментальная… мечтательная, я бы сказал.
К тому моменту, когда было получено на руки все железо, исходные две недели почти подошли к концу. Я рисковал завалить собственные сроки, и получить большую порцию депрессии, которая так вредна 30-ти летнему мужскому организму.
В срочном порядке, в качестве бутлоадера, без которого уже не обходится ни одно микроконтроллерное устройство, был выбран отработанный вариант — ds30 Loader. В своей бесплатной версии, он позволяет только загружать в МК скомпилированный hex через UART и имеет при этом удобный GUI(ну и консольная утилита есть, для ценителей).
Результат на фото:
в профиль рядом с DIP20(ATtiny2313)
вид сверху
перспектива...
МК работает от встроенного генератора 16МГц. Кварц, который виден на фото, для программного RTC, который реализован на Timer1. На разъем напрямую выведено 18 из 20 выводов МК(два заняты кварцем), включая RX и TX для непосредственного подключения RS-232 TTL. Если же использовать только этот самый RS-232 TTL, то плата принимает вырожденный вид и теряет половину стоимости:
так выглядит плохо отмытая плата
Вместо заключения
На данный момент, в прошивке реализовано включение и настройка параметров нескольких периферийных модулей командами по RS-232. Это PWM, DAC, GPIO и частично CLC. Так же можно узнать который час и прочитать ADC(как внешние входы, так и датчик температуры кристалла). То есть с некоторыми функциями быстрого экзоскелета для медленной операционки оно уже справляется.
Но даже если абсолютно вся периферия заработает под дудку RS-232(особого ума для чего не надо), это будет не предел. Сейчас уже видно, что этот функционал займет далеко не все место в памяти МК, и самыми подходящими способом утилизации оставшихся нескольких килобайт, я думаю, станет ограниченный интерпретатор графического языка SFC для простейшей автоматизации в пределах 30-50 шагов, а так же софтовые модули, такие как PID, расширение количества вводов/выводов через I2C экспандеры, которые дадут возможность унифицированно подключать дисплеи и клавиатуры.
Получилось несколько сумбурно и рублено, но лучше я потом напишу более подробную статью про тонкости работы с модулями, и приведу примеры применения.
Предвидя вопрос об исходниках:
Планирую опенсорс, но морально не готов выложить сырой продукт прямо сейчас. Нужна поддержка большего количества модулей.
Предвидя вопрос об коммерциализации:
Начал работу над проектом из любви к искусству, но на данном этапе как производственник, не могу не видеть коммерческого потенциала. К тому же модуль уже готов для серийного производства в таком виде как есть, благо обещанный мной опенсорс и свободный ds30, позволяют без особого напряга осуществлять обновление моей прошивки или вообще полной ее замены на пользовательскую и обратно.
Следующим шагом для запуска серийного производства, я вижу создание прессформы для корпуса(чтобы было культурно и больше похоже на микросхему). Она хоть и простая, но на энтузиазме этим заниматься нет ресурсов. Тут все зависит от общественного резонанса, но в любом случае я доволен даже этим промежуточным результатом.
Главными источниками вдохновения были хабрахабр, какой-то китайский сайт с андроидобалалайками по 50 баксов и сайт www.microchip.com
Всем мир.
Автор: Noliki