Делаем Arduino Mega из того, что под рукой

Не, ну а почему бы и нет?! Возьмём АРМ, да не простой, а золотой, добавим отладчик и оформим всё в формате Arduino Mega. :) Импортозамещение!

B77-00

В статье опишу схемотехнику, разводку (хотя тут нечего толком и расписывать), покажу собранный вариант и пример прошивки на получившейся плате, и всё это — Open Source. Да, это те самые платы от SeeedStudio, что были замазаны в прошлом обзоре. Надеюсь, интрига стоила того, чтобы не выкладывать все карты сразу. :) 

Сердце платы

Итак, что бы взять такого необычного (ведь на банальщине типа STM32F103 не интересно будет, такого добра и у китайцев хватает) и то, что есть «под рукой». А есть семплы К1986ВЕ4У1! Вполне пригодно. :)

Краткие характеристики:

  • ARM Cortex-M0, 36 МГц;
  • 128 Кбайт Flash-памяти;
  • 16 Кбайт ОЗУ;
  • 36 пользовательских линий ввода-вывода;
  • 2 блока 16-ти разрядных таймеров с 4 каналами захвата событий и ШИМ;
  • 2 * UART;
  • 1 * SPI;
  • 4 источника тактирования (HSE, HSI, LSE, LSI) + PLL;
  • Блок подсчета CRC с изменяемым полиномом;
  • 2 сторожевых таймера;
  • 8 каналов 12-битных АЦП;
  • 8 каналов 24-битных независимых ∑∆ АЦП;
  • корпус 5153.64-1.

Более подробно можно прочесть всё в спецификации.

Схемотехника

В целом, схемотехника довольно проста и ничего специфичного здесь не требуется. Я же подбирал комплектующие (особенно в части питания) те, что, как уже написал выше, были «под рукой» и никакой завязки на них нет. Итак, пройдёмся по схеме. В статье будет рассмотрена ревизия 0 с описанием её недочётов, на гитхабе же лежат обе ревизии (исходная 0 и с исправлениями 1, все замечания также отмечены в TXT файле рядом с проектом).

Начнём с сердца платы. Тут совсем всё просто:

B77-02

Из обвязки — кварцы (и то часовой я не ставил, т. к. держатель для батареи на плате не предусмотрен, задач с RTC нет) да конденсаторы по питанию, ну разве что ещё кое-что… догадались, что здесь я забыл поставить (если нет, ответ будет в конце раздела) ?

Аналоговое питание — тоже ничего примечательного, ставим бусину и разные по ёмкости конденсаторы, чтобы подавить большой спектр шумов по питанию:

B77-03

Да, не забываем также развязать аналоговую и цифровую землю бусиной:

B77-04

Для экспериментов предусмотрено место для установки внешнего прецизионного опорного напряжения ADR3412ARJZ-R7 от Analog Devices:

B77-05

Если DA1 не установлена, то опорное напряжение можно брать от внутреннего источника МК.

Ну и разъёмы, гора разъёмов:

B77-06

Из примечательного здесь — дифференциальные ФНЧ на входах сигма-дельта АЦП, номиналы RC необходимо корректировать (на плате установлены условные 100 Ом + 100 пФ) в зависимости от буфферного ОУ до них и требуемой полосы пропускания.

Далее простой селектор питания, который переключается на внешнее питание (если оно появилось) или питается от USB. Для внешнего питания на основе IRLML9301TRPBF собрана простейшая схема идеального защитного диода от переплюсовки, а отключение VBUS шины (питание от USB) собрано на дешевой сборке PMC85XP (MOSFET-P + BJT-NPN). Выглядит на схеме это так (от VCCIN потом формируется VCC5P0 посредством DC-DC):

B77-07

Хм, заметили косяк ? :) Если да — у вас зоркий глаз и острый ум! (ответ, что не так, в конце раздела)

DC-DC для формирования +5 В собран на MP2315GJ-Z, схема практически из даташита и ничего интересного из себя не представляет:

B77-08

LDO для получения +3.3 В на основе LM1117MPX-3.3 или LM1117MPX-ADJ (у меня их просто завались, поэтому ставлю везде, где есть место и не жалко):

B77-09

Ну и напоследок, схема X-Link в немного изменённом виде на основе STM32F103C8T6, добавлена защита USB Data линий — USBLC6-2SC6:

B77-10

При большом желании можно, конечно, поставить К1986ВЕ92QI вместо STM32F103C8T6, в качестве прошивки портировать CMSIS-DAP и будет тотальное импортозамещение, но это уже для ярых фанатов. ;)

Да, самое важное чуть не забыли! Поставить зацеп для осциллографа или мультиметра, соединённый с общим:

B77-11

А теперь список замечаний и выявленных косяков по ревизии 0:

  • Нет резисторов на MODE пинах (PB0, PC0) — будут проблемы с выбранным режимом при не подключенных \ не подтянутых никуда пинах.
  • VRef для ADCIU лучше вывести на боковой разъём — уменьшается петля проводника\кабеля для аналоговой платы, подключаемой к разъёму XS1.
  • На USB экран подключить через RC к общему — уменьшение помех в общем проводе от USB кабеля.
  • Кварцевый резонатор ZQ1 лучше заменить на 8 МГц — проще установить необходимую частоту на выходе PLL.
  • Селектор питания, VT1 и обвязку заменить на диод Шотки — питание от USB в отсутствие дополнительного питания приходит в норму (без этой корректировки через обратный диод MOSFET VT1 на вход внешнего питания просачивается небольшое напряжение, которое открывает VT3, который, в свою очередь, призакрывает VT4 и вместо 5 В после него ~3,4 В только).

Упрощённое решение с селектором питания в ревизии 1 построено на диоде Шотки MBR0540T1G (он же впаян на место VT1 на фотографиях далее):

B77-12

На этом всё.

Разводка

Вот так выглядит разводка печатной платы (кликабельно):

Это слайд-шоу требует JavaScript.

Из особенностей это платы стоит отметить разводку цифрового и аналогового общих. Рассмотрим вначале аналоговый общий, который располагается исключительно на стороне сигма-дельта АЦП и под его входами:

B77-17

Если включить отображение верхнего слоя, то становится видно, что заливка в нижнем слое касается только аналоговых цепей и не пересекается с цифровыми линиями:

B77-18

А если же рассмотреть заливку цифрового общего, то здесь стоит отметить важный момент — от разъёмов питания и DC-DC до бусины и, собственно, самого МК необходимо обеспечить по возможности кратчайший путь максимально широкой заливкой (при возможности с наименьшим числом разрывов), этот путь в данной плате обеспечивается в нижней стороне, от разъёма питания до разграничивающей цифровую и аналоговую земли бусины, а также к МК:

B77-19

Примечание: да, только сейчас заметил, что линию Reset можно было не тянуть по нижнему слою, а протянуть чуть дальше по верхнему слою и в итоге заливка на нижнем слое была бы ещё шире, что теоретически снизило бы (хоть и незначительно) величину шумов по общему проводу.

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

B77-20

Примечание: если интересно — попробуйте найти проводник, о котором я писал выше, и решение изложенной проблемы.

3D рендеры печатной платы, верх платы (разъёмы убраны для большей наглядности):

B77-21

И низ платы (тут совершенно нет компонентов для упрощения пайки, стоит это учитывать в своих изделиях — если есть возможность, то всегда лучше ограничивайтесь в наличии компонентов на одной стороне печатной платы):

B77-22

Не забываем в Draftsman сделать простой сборочный чертёж:

B77-23

Это может сильно помочь вам как при пайке платы, так и в отладке платы (если вдруг она не заработает или даже испустит волшебный дым при первом включении).

Собранная плата

Рендеры это, конечно, хорошо, но кайфовее смотреть уже на собранную плату! :) Вот несколько фотографий (кликабельно):

Это слайд-шоу требует JavaScript.

Да, кстати! А вы заметили тут резисторы на PB0 и PC0 ? :) Маленькие такие… 0402.

На плате даже синий светодиодик есть на PB6 пине, можно помигать…но это как-то неинтересно будет. Надо спаять чего-нибудь ещё.

Дополнительные платы

Итак, чтобы работать с дифференциальным входом сигма-дельта АЦП, нужен исключительно дифференциальный источник сигнала, это может быть как специальный генератор сигналов, так и буферный дифференциальный ОУ, который может преобразовывать однополярный или двухполярный сигнал в дифференциальный.

Простейшую схему можно увидеть в даташите на LT1994 или любом аналогичном дифференциальном ОУ:

B77-29

Здесь отображен открытый вход (т. е. без развязки по постоянному напряжению) и согласовано сопротивление обоих входов ОУ (на положительном входе ОУ 402 Ом на общий и на отрицательном входе 374 Ом + (50 * 54,9/(50 + 54,9)) ~ 400,17 Ом), что очень важно для минимизации искажений и сдвига Vocm.

Я собрал аналогичную схему (с этим ОУ), только с другими номиналами, в отсутствие сигнала на входе и выходах, а также Vocm вход подключён к выходу Vref 1986ВЕ4 для согласования уровней смещения, можно видеть следующее:

B77-35

  • CH1 (жёлтый) — это вход, как видно, есть небольшое смещение относительно нуля.
  • CH2 (голубой) — это положительный выход ОУ.
  • CH3 (фиолетовый) — это отрицательный выход ОУ.

Как можно видеть, выходы ОУ равны по постоянному напряжению и также равны напряжению смещения, подаваемому на вход Vocm (+1,2 В).

При подаче синусоиды 200 Гц на вход выходы работают в противофазе:

B77-36

Выглядит плата для проверки так:

Это слайд-шоу требует JavaScript.

Также есть дисплей с IPS матрицей 240*240 на контроллере ST7789, у меня версия, что управляется только по SPI, — этого вполне хватит для теста. Подключение у него крайне простое (часть схемы с отладочной платы от Waveshare):

B77-32

Подсветку я подключил просто напрямую к питанию — всегда включена, что самое приятное — здесь не требуется никаких повышающих DC-DC для подсветки и всё можно питать от +3.3 В. Выглядит это так:

B77-33

Ну что же, двух дополнительных плат вполне хватит для теста (подключение USB-UART переходника не считается):

B77-34

Переходим к написанию прошивки!

Прошивка

Для простой проверки и легкого старта на гитхабе также выложены исходники проекта с использованием SPI (для дисплея) и сигма-дельта АЦП. Пример-проект для Visual Studio 2017, но, впрочем, никакой привязки этой IDE нет и его можно скомпилировать как обычный Makefile проект.

За основу взят пак для Keil uVision 5 версии 1.5 от 29.05.2018 с официального сайта и чуть подшаманен для компиляции с gcc-arm-none-eabi.

Что в ней реализовано для быстрого старта:

Пример инициализации периферии, настройки тактирования с комментариями.

Самое простое, но зачастую вызывающее вопросы у новичков, осваивающих АРМ от Миландра. В проекте дан пример инициализации с краткими комментариями, зачем и почему. Также проверен разгон этого МК и тест будет проводиться на тактовой частоте 80 МГц (по спецификации максимум 36 МГц, проводим такие тесты на свой страх и риск)!

Пример реализации задержки на основе SysTick.

Дан пример использования системного таймера SysTick в файлах delay.* для реализации типичной задержки мс (типа HAL_Delay, кто с STM32 знаком :D ).

Вывод отладочной информации через printf на UART.

Дан пример реализации вывода отладочной информации с printf на UART (пины PB0, PB1), в main файле объявлен вывод символов __io_putchar и оставшиеся системные функции в файле syscalls.c.

Пример сбор отсчетов сигма-дельта АЦП и пересчет в вольты при необходимости.

По большей части это переработанный пример из папки Firmware\Examples\ADCIU, да, примеры из официального пака скопированы в Firmware\Examples. Также в main.h приведён пример объявлений для быстрой конвертации полученных RAW значений в вольты.

Пример драйвера для дисплея с контроллером ST7789 (а также портированный драйвер для SSD1306).

Файлы lcd_st7789.* — простой драйвер дисплея, обьявления пинов в main.h, также рядом драйвер lcd_ssd1306.*, который был взят тут afiskon/stm32-ssd1306 и немного подшаманен (проверен, работает на 1986ВЕ4).

Пример подготовки и вывода изображения на дисплей.

Для теста было создано изображение по размеру дисплея:

B77-37

Конвертация изображения в 16-битовый массив, который уже легко встраивается в прошивку и будет храниться во flash-памяти (жутко её отбирая, отдавать ли память на это — стоит трижды подумать, нужны ли эти красивости), произведена утилитой LCD Image Converter.

Краткое пользование утилитой — открываем изображение, переходим в Options->Conversation…, далее в открывшемся окне выбираем пресет Color R5G6B5, выставляем величину данных 16-бит и открываем превью:

B77-38

Открывается превью конвертации изображения, здесь можно скопировать 16-битовый массив этого изображения:

B77-39

Пример вывода в прошивке прост насколько, насколько это возможно — полученный массив хранится в image.h, а его вывод на дисплей — это вызов одной функции ST7789_DrawImage.

Пример вывода собранного буфера отсчетов сигма-дельта АЦП на дисплей.

И напоследок простейший пример вывода накопленного буфера на экран с масштабированием, логика примера крайне проста:

  1. С прерыванием по окончании преобразования наполняются отсчёты в буфере, если заполнили весь буфер — выставляем флаг готовности.
  2. В основном цикле проверяется флаг готовности, и если он установлен, то производится масштабирование и вывод на дисплей, флаг готовности сбрасывается в конце.
  3. Цикл повторяется.

Как можно заметить на время вывода на дисплей, отсчеты АЦП никак не буферизируются и теряются — поэтому это не RealTime, более того, с такой реализацией непериодические сигналы нельзя корректно рассмотреть. В качестве же простого плохого примера — вполне сносно. :)

Скомпилировали, теперь бы прошить полученный файл прошивки в МК…

Прошиваем с J-Link

Всё бы хорошо, но если использовать версию J-Link, которая заточена для STM, то есть 2 пути, прошивать и отлаживать МК других производителей с его помощью:

  1. Самый простой — просто указываем в качестве target — тип Cortex-M* и всё. Никакой привязки к производителю, J-Link в этом случае может работать с МК любых производителей.
  2. Более сложный — идём в папку с установленным J-Link и находим там файл JLinkDevices.xml, открываем и дописываем в любом месте по аналогии с другими записями (пример можно посмотреть вот тут).

Заметили, в чём подвох-то? vendor = ‘ST‘ :) Вот и всё, да, немного грязно, но работает. Опробовано на версии JLink V6.40. Файл JLinkDevices.xml, как и дополнительные файлы Devices\Milandr\*.FLM с алгоритмами прошивки (их тоже необходимо скопировать в папку с установленным J-Link) также выложены на гитхабе Firmware\JLink_Patch.

Немного печального о 1986ВЕ4 , вот скриншот со временем, затрачиваемым на полное стирание и запись прошивки практически равной величине flash-памяти и её верификацией:

B77-40

Большие проекты часто заливать быстро надоест…

Итог

Ну и, конечно же, гифки, как оно работает…

Вывод тестового изображения и 50 Гц синусоиды после сброса:

B77-41

Здесь кстати виден нюанс, что после сброса МК и дисплея соответственно, после его повторной инициализации выводится последнее, что сохранено в RAM памяти дисплея — картинка с синусом.

Еще гифка с сигналом 200 Гц:

B77-42

Да, и цвета вживую нормальные, соответствуют тестовому изображению, это так на видео получилось, что оттенки расходятся на отдельные цвета и видны полосы обновления матрицы. Вот фото:

B77-43

По гифкам видно, что скорость обновления невысока, и это ещё на 80 МГц тактовой частоты МК! Также видно, что вывод картинки значительно быстрее, чем отображение буфера АЦП — это вследствие неоптимального алгоритма (масштабирование отнимает немало времени + рисование областями), эта часть требует переработки, а также перевода SPI на DMA, но это уже будет не «плохой пример». :)

Ссылки

Реклама

2 Comments »

    • Спасибо) Этим примером хотелось как раз показать, как можно делать отладки в популярном формате с нашими АРМи-ми для большей популярности Миландра (да и не только).
      Но, стоит отметить, что есть хорошие отладочные платы от LDM-SYSTEMS — https://ldm-systems.ru/catalog/milandr .
      И хоть это скорее проект по приколу, но надеюсь выложенными материалами, он поможет начинающим.

      Нравится

Добавить комментарий

Please log in using one of these methods to post your comment:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s