Нет, к Ромео и Джульетте претензий нет, они кросавчеги, конечно. Но вот события вокруг них развиваются очень грустно.
В этом рассказике тоже будут убийства, вскрытие и много соплей слез.
Началось все очень красиво — я приобрел на Али контроллеры для гироскутера. Не те, традиционно-посконные и известные всем, где один контроллер управляет двумя двигателями, а более поздние версии, где каждому колесу полагается собственный контроллер. Радиодетальки нынче дешевы, а чего их жалеть, супостатов — можно и два контроллера сгородить, зато толстых проводов и, соответственно, потерь меньше.
Ну да ладно, ближе к телу.
Сейчас все это мы разберем, восстановим схему и попробуем немного поардуинить.
Вот они, контроллеры. Закатанные в пластик. Коробочки склеены, поэтому надо просто ломать — парой отверток это делается враз. Обнаруживаем платки — слегка разные, на одной есть преобразователи напряжение от батареи 10s во что-то более-менее разумное, на второй — место для bluetooth модуля. Это нас сейчас интересует меньше всего, поэтому вторую платку откладываем в сторону и плотно займемся первой.
Для начала — что там с мозгами? Обнаруживаем микроконтроллер MM32SPIN05PF. Казалось бы, очень похож на STM32 — но все-таки не очень. Это Cortex-M0, какая-то часть периферийных устройств похожа на STM32, какая-то не очень, вернее даже совсем не похожа. И диапазон питания у него другой — и это для контроллера мотора неплохо подходит — ведь тем же датчикам Холла надо минимум 4 лишним вольта. Мы к нему потом вернемся и разберемся, как его программировать, хорошо?
Рядом с микроконтроллером стоит IMU — 6D гироскоп/акселерометр, по виду и разводке ног очень похож на MPU-6900 из iPhone, но не он. Ну и ладно, все равно и на MPU-6900 спецификации у меня нет, да и вообще на этой плате он мне не интересен.
Перейдем к системе питания, тут найдется кое-что интересное.
Кнопка включения-выключения ничего особенного не представляет, во всех аналогичных изделиях сделано более-менее похоже. А вот понижающий преобразователь интересен. Обратите внимания — у схемы не предусмотрено подключение к земле. Данный преобразователь способен выдать 15 Вольт из 100 с приличной эффективностью.
Прецезионностью преобразователи такого типа не страдают, но зато среди них есть экземпляры, которые могут работать с очень высоким входным напряжением, до 800 Вольт. Естественно, их применяют во всяких устройствах для хитроумных домов. Они стоят очень дешево, 20-30 центов в розницу и их много разных: MP173, PN8015, PN8016, MP9488, PN6055 — короче, nomen illis legio — легион им имя. И даже диоды со щетками им не нужны — в схеме можно самые дешевые использовать. Правда, индуктивность у катушки должна быть приличной, в моих закромах такие не валяются.
На моей плате этот преобразователь выдает около 13.6 вольт, это питание используется для драйверов затвора транзисторов и внешних светодиодов. С него же через обычный линейный стабилизатор берется 5 Вольт для микропроцессора. И еще один линейный стабилизатор на 3.3 Вольта исключительно для питания IMU. Импульсный преобразователь на 5 Вольт предназначен для питания чего-то внешнего, похоже там предусмотрена целая гирлянда WS2812.
Транзисторный полумост и драйверы затвора — абсолютно ничего особенного, как и должно быть. А вот с измерением токов — чуть интереснее. В обычном контроллере гироскутера на измерении тока стоят усилители — для фазных токов измерение происходит на открытом переходе транзистора, и у усилителя коэффициент усиления в районе 3. Общий ток измеряется на шунте, там у усилителя усиление порядка 10. Здесь никаких усилителей нет вообще. Где собака порылась, спрашивается?
Я писал, что периферия у этого мелкоконтроллера немного другая, и ADC отличается очень сильно. В том числе и использованием внутреннего опорного напряжения. В ADC MM32SPIN05 используется напряжение 1.2 Вольта (в STM32 — это напряжение питания) — стало быть усиление в районе трех уже лишнее. Точность измерения общего тока становится уже не очень, до какой-то степени это компенсируется увеличением сопротивления шунта.
Но все это были предположения до того, как я стал писать для этого контроллера свое программное обеспечение.
И опять таки мучило сомнения — ну на кой нужно к одному каналу аж три вывода подключать? Один товарищ таки надоумил — он работал с микропроцессорами, где внутрях есть операционники. Тут пазл и сложился — все эти выводы как раз для усилителя. Либо плата разрабатывалась для другого микропроцессора, у которого есть эти операционники, либо они есть и у этого — но в документации о них нет ни слова.
Кстати, если кто сам разрабатывает контроллеры и хочет обойтись минимумом деталей, могу порекомендовать STSPIN32F0 — там есть все, и высоковольтные драйверы затвора, и преобразователь высокого входного напряжения и даже несколько операционников.
Ну, думаю, поверхностно я все рассказал, но полная схема все равно расскажет больше — можете кликнуть для увеличения.
И чисто для удобства — куда щупальца у микроконтроллера тянутся:
Теперь начнем ардуинить.
Первый вопрос — чем этот микроконтроллер шить? Есть такая штука — называется pyOCD. В паре со свистком st-link она этот вопрос решает.
Ставим ее:
python3 -m pip install -U pyocd
и добавляем возможность программировать наш MM32SPIN05, по умолчанию его там нет:
pyocd pack install mm32spin05pf
Все, прошивальщик у нас есть. Стереть микросхему и снять защиту:
pyocd erase -t mm32spin05pf —chip
Прошить ваш файл:
pyocd flash -t mm32spin05pf your_file_name.ext
Программу для этого контроллера тоже надо как-то разрабатывать. На сайте разработчика лежат и приличная документация на контроллер, и пакеты для Keil uVision, IAR workbench, свой HAL, примеры — короче всего много. Не обольщайтесь только сильно — ошибок там хватает.
Гнутый Си, конечно, забыт. Ну да не боги горшки обжигают, пишем свой ассемблерный стартап, скрипт для линкера, берем готовые заголовочные файлы — и с make уже вполне можно работать, Cortex-M0 — он и в Африке Cortex.
Затем берем широко известный в узких кругах хак гироскутерных плат и выдираем из него все упоминания о втором моторе и кубическом HAL.
Чем это программное обеспечение отличается от других? Двигатель смоделирован в Simulink, и этот Simulink генерирует код для векторного управления в C файл. При этом он все оптимизирует и по получившемуся коду абсолютно непонятно, чем он занимается.
Симулинковыми картинками можно полюбоваться здесь, правда, что-либо изменить и перегенерировать код не получится. Уточняю на всякий случай — я к этим картинкам и симулинку никакого отношение не имею, это все EFeru — с него и спрос. А я лично и калькулятором с трудом пользуюсь — если там только не слишком много кнопок.
Переписываем все на чистых регистрах и убеждаемся, что программа еще работоспособна. Потом внимательно читаем руководство по программированию MM32SPIN05 и переписываем все для него — многие блоки, например аналоговый преобразователь или UART, не имеют вообще ничего общего с STM32, некоторые имеют мелкие отличия.
Пытаемся отлаживать, подключаю контрольные точки. Не разрядив конденсатор, лезу в схему. Нечаянно замыкаю два вывода на драйвере затвора. Процессор не выдерживает 12 вольт и в муках умирает. Мир его кремниевому праху.
Купить такой же — на Али они стоят раза в два дороже STM32 и его еще ждать надо. Погоревав, берем вторую плату. Резво начинаем отладку. Но опять засада — проводок от логического анализатора касается чего-то высоковольтного. В итоге — он (логический анализатор) жертвою пал в борьбе роковой. Да ладно бы один — он был подключен к очень неплохому USB хабу с переключаемым выходами. Один вход и один выход накрылись медным тазом.
Отпеваем невинных жертв, доделываем программу. Запускаем — работает, но не во всех режимах. Точности измерения АЦП — максимум менее 5% от полной шкалы не хватает для режимов, где измерение тока критично. Управление моментом не работает — а мне именно оно было нужно. Печаль. Плата годна только на раздергивания на запчасти. Или найти правильный процессор со встроенным операционным усилителем.
Ну и быстродействия Cortex-M0 немного не хватает для оригинальных 16 кГц PWM, пришлось снизить до 12.
Тем не менее — все исходники я выложил на гитхаб, можете посмотреть и поиграть при желании.
Но мне же нужно управление моментом, и что, мне пустым возвращаться назад? Но тут я набрел на товары вспомнил про плату от самоката M365, про которую уже писал. Клонируем (исходники положил на Гитхаб) хак Eferu еще на один процессор — и чудо случилось, все заработало так, как надо.
Так что не гонялся бы ты, поп, за дешевизной. Тем более, что плата M365 тоже недорогая, я про нее писал тут и тут.
+75 |
4023
106
|
+39 |
2538
46
|
+27 |
688
12
|
Чтобы не палить usb и комп, может стоит купить usb isolator на ADUM3106?
П.С. Тоже пожёг немало чего из-за подобной криворукости.
И в этом вся фишка.)
Ну потратьте еще 10 минут и опишите, как именно работает микросхема и в чем её особенность относительно обычного DC-DC — людям же без глубокого знания электроники совершенно непонятно, как это всё работает. А если непонятно это, то непонятно и в чем «интересность» преобразователя. А тогда зачем вообще об этом упоминать?
Тут, как бы, сказали «А», говорите и «Б».
И в статье есть картинка очень простого преобразователя с блок-схемой внутренностей. Я полагал, это все объясняет.
Почему? В первом же комментарии жалуются на то, что непонятно. Если бы вы объяснили, было бы интересней.
После включения питания микросхема начинает заряжать С15 (Vcc) через внутренний малоточный стабилизатор от входа DRAIN. Как только Vcc относительно SW достигнет рабочего значения, микросхема запускается. Открывается ключ, DRAIN замыкается с SW (на Vcc при этом получается напряжение выше входного, т.к. за счет D3 С15 не разряжается). Через какое-то время ключ закрывается. Это приводит к генерации ЭДС индуктивностью в обратной полярности. Эта ЭДС открывает D10 и, таким образом, на выходе SW становится напряжение чуть меньше нуля. В этот момент от выходного конденсатора (левый С?) через диод D? заряжается правый С? по схеме, напряжение на котором становится примерно равно выходному (но относительно SW). Далее оно через стабилитрон ZD? подается на вход обратной связи. Также через диод D3 в этот момент подзаряжается конденсатор питания C15.
То есть, все напряжения на микросхеме «измеряются» относительно выхода SW. А преимущество у такой схемы только одно — обычный DC-DC должен откуда-то питаться, обычно это некий внутренний линейный стабилизатор от входного напряжения. Чем выше входное — тем больше мощности рассеивается на стабилизаторе, что нагревает микросхему и снижает КПД. В данном решении такой стабилизатор тоже есть, но он отключается после начального запуска генерации — дальше микросхема питает сама себя уже от выходного напряжения, которое значительно ниже входного. Поэтому такие микросхемы допускают весьма высокое входное напряжение.
И это косвенно подтверждается в hoverboard-firmware-hack-FOC:
То есть, подразумевается, что опубликованный способ лучше стандартного. Кстати, написано, что используется ослабление поля для повышения скорости вращения — вот тут интересно, дает ли это хоть какой-то прирост скорости при реальной эксплуатации? Ведь при ослаблении поля (при сохранении лимита на ток потребления) уменьшается момент, а для движения на высокой скорости он тоже нужен.
Не знаю как сейчас (не слежу), но 3-5 лет назад в области недорогого электротранспорта вообще не было и речи про векторное управление.
P.S. На днях тоже спалил МК во время экспериментов. Правда это была atmega328, но я даже до конца не понял, как именно это произошло — предположительно через соскользнувший щуп мультиметра 24 вольта пошло куда-то, куда идти ему было не надо. Но точного подтверждения нет, потому что после этого МК еще некоторое время делал вид, что работает (был ШИМ на выходе), а вот после выключения и последующего включения перешел в режим кипятильника.
Такое ощущение что тут две статьи по половине и со слов теперь давайте ардуинить заканчивается половина первой статьи )
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.