Авторизация
Зарегистрироваться

Контроллер мотор-колеса на MM32SPIN05. Нет повести печальнее на свете…

Нет, к Ромео и Джульетте претензий нет, они кросавчеги, конечно. Но вот события вокруг них развиваются очень грустно.

В этом рассказике тоже будут убийства, вскрытие и много соплей слез.

Началось все очень красиво — я приобрел на Али контроллеры для гироскутера. Не те, традиционно-посконные и известные всем, где один контроллер управляет двумя двигателями, а более поздние версии, где каждому колесу полагается собственный контроллер. Радиодетальки нынче дешевы, а чего их жалеть, супостатов — можно и два контроллера сгородить, зато толстых проводов и, соответственно, потерь меньше.

Ну да ладно, ближе к телу.

Сейчас все это мы разберем, восстановим схему и попробуем немного поардуинить.

 

Вот они, контроллеры. Закатанные в пластик. Коробочки склеены, поэтому надо просто ломать — парой отверток это делается враз. Обнаруживаем платки — слегка разные, на одной есть преобразователи напряжение от батареи 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 тоже недорогая, я про нее писал тут и тут.

 

 

 

 

 

 

Добавить в избранное +73 +95
свернуть развернуть
Комментарии (35)
RSS
+
avatar
+58
+
avatar
+5
Только читал занятную статью про импортозамещение simulink — habr.com/ru/articles/846918/

Чтобы не палить usb и комп, может стоит купить usb isolator на ADUM3106?
+
avatar
  • donBaton
  • 01 октября 2024, 16:23
+22
Зачем его покупать? Он же уже давным-давно в столе лежит. Может, вы еще его и подключить посоветуете? :)
+
avatar
+1
А почему не пользуетесь?
+
avatar
  • donBaton
  • 01 октября 2024, 16:38
+11
Хороший вопрос :)
+
avatar
  • nikkky
  • 03 октября 2024, 04:27
+7
ощущения не те
+
avatar
  • VladM
  • 01 октября 2024, 16:36
+10
… Предыдущие сочинения автора, мне как-то казались и понятнее и логичнее. Здесь же что- то без начала и с задушенным концом… Кстати, это только у меня загадочные окошечки в тексте, не реагирующие на попытки активировать, или все тоже самое видят?
+
avatar
+1
Как раз такие все понятно (если читать автора с самого начала). Не понятно зачем дону-батону управлять по моменту, логичнее же по скорости.
+
avatar
  • donBaton
  • 01 октября 2024, 16:57
+7
Нет, не логично. Если одновременно работают 2 мотора — они пойдут в разнос, а момент — это что-то типа электронного дифференциала. Ну и привычнее — поведение, как у обычного автомобиля. Едем в горку при том же положении газа — теряем скорость.
+
avatar
+1
Да, про повороты и колесную базу я забыл. Теперь понятно. Спасибо.
+
avatar
+2
Повесть хороша, как всегда. А печальная или весёлая, не важно…
П.С. Тоже пожёг немало чего из-за подобной криворукости.
+
avatar
  • Lenny
  • 01 октября 2024, 18:58
+9
Интересно как много народу поняло о чем вообще эта повесть? ))))))
+
avatar
0
Нужна внимательность при прочтении.
+
avatar
  • INN36
  • 01 октября 2024, 22:14
+1
Интересно как много народу поняло о чем вообще эта повесть?
Так ведь некий Татарин пОнял и некий enjoyneering пОнял. Остальные — изрядно тупые, ибо не понимают потоков сознания ТС. Но леммиг голосует, куда же без него.)
И в этом вся фишка.)
+
avatar
  • ABATAPA
  • 01 октября 2024, 19:11
+4
Ловите самокатчика!
+
avatar
+1
Он вооружён…
+
avatar
  • DIMAace
  • 01 октября 2024, 19:21
+8
Мне всё ясно. Нет смысла мучать колесо и ардуину, лучше пойду налью себе коньячку.
+
avatar
0
Поддерживаю…
+
avatar
  • INN36
  • 01 октября 2024, 20:05
0
Симулинковыми картинками можно полюбоваться здесь, правда, что-либо изменить и перегенерировать код не получится.
Почему не получится? Это же симулинк из матлаба, если я правильно понял?
+
avatar
  • donBaton
  • 01 октября 2024, 20:10
-1
это web-версия, смотрелка.
+
avatar
  • INN36
  • 01 октября 2024, 20:38
0
это web-версия, смотрелка.
Скажите, а в пакете симулинк от матлаба (?) Вы реально пытались смоделировать свою наисложнейшую нелинейную динамическую систему или привели эту смотрелку, что бы нагнать волны?)
+
avatar
  • donBaton
  • 01 октября 2024, 20:50
+1
я этого вообще не делал — я же писал, это программное EFeru, я его только перенес на другой процессор, даже не вникая в его алгоритмы. А я вообще не знаю ни математики, ни симулинка и матлаб бесплатно под линукс не дают.
+
avatar
  • INN36
  • 01 октября 2024, 21:40
0
я вообще не знаю ни математики, ни симулинка и матлаб бесплатно под линукс не дают.
Жесть какая…
+
avatar
+2
А вот понижающий преобразователь интересен. Обратите внимания — у схемы не предусмотрено подключение к земле.
Кто бы объяснил, как эта дичь работает. Ладно с питанием, но как осуществляется обратная связь? Понятно, что на ногу FB приходит какое-то напряжение, но напряжение нам надо стабилизировать относительно земли. Той самой, с которой у нас нет связи.
+
avatar
  • donBaton
  • 01 октября 2024, 20:46
-1
земля она как бы есть — в определенный период времени. Заряжается конденсатор примерно выходным напряжением, от него и питаемся, от него и обратная связь. Естественно, не особо точно, но для каких-то задач этого достаточно. Попробуйте перевернуть схему, может понятней станет
+
avatar
+1
Вот вы пишете:
А вот понижающий преобразователь интересен. Обратите внимания — у схемы не предусмотрено подключение к земле. Данный преобразователь способен выдать 15 Вольт из 100 с приличной эффективностью.
Ну потратьте еще 10 минут и опишите, как именно работает микросхема и в чем её особенность относительно обычного DC-DC — людям же без глубокого знания электроники совершенно непонятно, как это всё работает. А если непонятно это, то непонятно и в чем «интересность» преобразователя. А тогда зачем вообще об этом упоминать?

Тут, как бы, сказали «А», говорите и «Б».
+
avatar
  • donBaton
  • 02 октября 2024, 07:21
+1
Ну потратьте еще 10 минут и опишите, как именно работает микросхема
то, что я написал, каждый пункт можно расписывать и расписывать. Народу, как видите, и то краткое изложение не особо интересно. Но спасибо, что Вы сделали это. Я даже не думал, что эта мелочь кого-то заинтересует.
И в статье есть картинка очень простого преобразователя с блок-схемой внутренностей. Я полагал, это все объясняет.
+
avatar
0
то, что я написал, каждый пункт можно расписывать и расписывать.
Можно. И было бы здорово, если бы вы так сделали хотя бы по части из них.
Народу, как видите, и то краткое изложение не особо интересно.
Почему? В первом же комментарии жалуются на то, что непонятно. Если бы вы объяснили, было бы интересней.
+
avatar
+8

После включения питания микросхема начинает заряжать С15 (Vcc) через внутренний малоточный стабилизатор от входа DRAIN. Как только Vcc относительно SW достигнет рабочего значения, микросхема запускается. Открывается ключ, DRAIN замыкается с SW (на Vcc при этом получается напряжение выше входного, т.к. за счет D3 С15 не разряжается). Через какое-то время ключ закрывается. Это приводит к генерации ЭДС индуктивностью в обратной полярности. Эта ЭДС открывает D10 и, таким образом, на выходе SW становится напряжение чуть меньше нуля. В этот момент от выходного конденсатора (левый С?) через диод D? заряжается правый С? по схеме, напряжение на котором становится примерно равно выходному (но относительно SW). Далее оно через стабилитрон ZD? подается на вход обратной связи. Также через диод D3 в этот момент подзаряжается конденсатор питания C15.

То есть, все напряжения на микросхеме «измеряются» относительно выхода SW. А преимущество у такой схемы только одно — обычный DC-DC должен откуда-то питаться, обычно это некий внутренний линейный стабилизатор от входного напряжения. Чем выше входное — тем больше мощности рассеивается на стабилизаторе, что нагревает микросхему и снижает КПД. В данном решении такой стабилизатор тоже есть, но он отключается после начального запуска генерации — дальше микросхема питает сама себя уже от выходного напряжения, которое значительно ниже входного. Поэтому такие микросхемы допускают весьма высокое входное напряжение.
+
avatar
+1
Тут пазл и сложился — все эти выводы как раз для усилителя. Либо плата разрабатывалась для другого микропроцессора, у которого есть эти операционники, либо они есть и у этого — но в документации о них нет ни слова.
Мне кажется, ситуация проще — стандартная прошивка контроллера просто управляет двигателем по 6-ступенчатому алгоритму, ей фазовые токи не нужны от слова совсем. Положение ротора определяется датчиками Холла или, на крайний случай, можно по переходу через «ноль» фазового, которое подключено к РА0/РА4, а напряжение с шунтов используется исключительно для ограничения максимального тока — тут уже разрешения АЦП и без усилителя хватает.

И это косвенно подтверждается в hoverboard-firmware-hack-FOC:
Compared to the commutation method,
То есть, подразумевается, что опубликованный способ лучше стандартного. Кстати, написано, что используется ослабление поля для повышения скорости вращения — вот тут интересно, дает ли это хоть какой-то прирост скорости при реальной эксплуатации? Ведь при ослаблении поля (при сохранении лимита на ток потребления) уменьшается момент, а для движения на высокой скорости он тоже нужен.
+
avatar
  • donBaton
  • 02 октября 2024, 07:14
+1
стандартная прошивка контроллера просто управляет двигателем по 6-ступенчатому алгоритму, ей фазовые токи не нужны от слова совсем.
Скорее всего так, но зачем они вообще сделали такую схему? Наверно, первоначальная мысль была глубже и, возможно, это причина, почему эти платы продают так дешево. Наверно, нормально они все-таки не работают.
+
avatar
+1
Вариантов много может быть, начиная от слепого копирования чужого решения и заканчивая первоначальным желанием реализовать векторное управление (возможно, на МК).

Не знаю как сейчас (не слежу), но 3-5 лет назад в области недорогого электротранспорта вообще не было и речи про векторное управление.
+
avatar
0
И еще вопрос — правильно ли я понимаю, что от SimpleFOC вы, в итоге, отказались, т.к. нормально она не заработала?

P.S. На днях тоже спалил МК во время экспериментов. Правда это была atmega328, но я даже до конца не понял, как именно это произошло — предположительно через соскользнувший щуп мультиметра 24 вольта пошло куда-то, куда идти ему было не надо. Но точного подтверждения нет, потому что после этого МК еще некоторое время делал вид, что работает (был ШИМ на выходе), а вот после выключения и последующего включения перешел в режим кипятильника.
+
avatar
  • donBaton
  • 02 октября 2024, 07:10
+2
правильно ли я понимаю, что от SimpleFOC вы, в итоге, отказались
да, поиграться можно, а вот реально использовать — EFeru постарался гораздо лучше. Правда, вся его математика только для одного типа двигателя, и как это поменять — одному EFeru известно. А он проект уже давно забросил.
+
avatar
  • Imyarek
  • 03 октября 2024, 03:56
+1
диоды со щетками ))
Такое ощущение что тут две статьи по половине и со слов теперь давайте ардуинить заканчивается половина первой статьи )

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.