Для начала позвольте пояснить, зачем козе потребовался баян.
Предположим, вам вдруг загорелось поиграть с программным обеспечением контроллера бесколлекторного мотора популярных нынче электровелосипедов и самокатов и сделать модное
векторное управление (этой новинке, конечно, много десятков лет, но когда она появилась, с ее помощью крутили немного другие моторы).
Поковырявшись в интернете, вы обнаружили, что стая товарищей не так давно разработала для ардуины
библиотеку SimpleFOC (field oriented control — то самое векторное управления), и теперь когда-то нетривиальную задачу кажный решить может, не заморачиваясь преобразованиями Парка и Кларка, и даже не задумываясь, что это такое и зачем это надь.
Но тут возникла засада — библиотеке требуется определенная конфигурация оборудования, с каким попало контроллером она работать не станет. Самым критичным оказывается наличие датчиков фазового тока на честных резисторах. Хотя бы для двух фаз.
У самых простых контроллеров есть только один общий датчик тока на все фазы — отпадают сразу.
Контроллер от гироскутера — неплохая вещь. Сначала делали один контроллер сразу на два двигателя, позднее появились версии с раздельными контроллерами. В интернетах ходят слухи, что на Таобао пару таких контроллеров можно купить за два доллара — хорошая сделка, но у меня с Таобао как-то не сложилось. На Али видел аналогичную
пару контроллеров за 6 с копейками евро плюс 7 евро доставка.
Казалось бы куда уж дешевле и лучше — но контроллеры гироскутера имеют два фазовых канала измерения тока, а в качестве шунта используется сопротивление открытого транзистора. Теоретически этого достаточно для FOC, но SimpleFOC такую конфигурацию (пока?) не поддерживает. И в этой дешевой паре используется контроллер MM32SPIN05, который вроде как совместим по ногам с популярным STM32F103, но у него есть еще встроенные компараторы, если просто перепаять микроконтроллер на другой — каменный цветок не выйдет. А разбираться с программированием еще одного контроллера как-то лениво. Посему — ф топку.
Как-то попался
контроллер для самоката M365, и у него реализовано что надо и что не надо, про него сейчас и расскажу.
При цене около 16 евро с доставкой — вполне терпимо. Самому собирать что-то аналогичное — дороже выйдет. А у этого контроллера есть все с избытком — контроль фазных токов и напряжений, входа для датчиков холла и два последовательных интерфейса, один из них, правда двунаправленный.
Кстати, если лень самому что-то делать — есть готовое
программное обеспечение, то только для мотора M365.
Вот такая коробочка из алюминиевого сплава в роли теплоотвода, транзисторы изолированы от теплоотвода лавсаном — не самый хороший по теплопроводности материал. Прижаты они к теплоотводу крышкой из оргстекла через резиновую прокладку.
Разъем питания по виду похож на популярный XT60, но меньшего размера, видимо XT30.
Мотор подключается обычными плоскими контактами, остальные разъемы — с шагом 2мм. Как все соединяется в самокате — на рисунке ниже:
Назначение контактов разъемов:
Для того, чтобы народ не ставил какие попало батарейки, родная батарея Xiaomi оснащена последовательным интерфейсом, с чужой батареей самокат работать не будет — старый трюк, как заработать деньги на расходниках с задранными ценами.
Общий вид на плату с обеих сторон (кликабельно):
И принципиальная схема (обратите внимание — схема действительно лишь принципиальная, величины резисторов могут быть другими и непринципиальные компоненты я рисовать не стал):
Назначение выводов микропроцессора:
Схема для одной фазы — опять таки несущественные детали опущены:
Усилитель тока — один счетверенный операционник используется один для всех трех фаз, он прячется под большим электролитом.
Транзисторы — RU6888R, Shenzhen ruichips Semicon — 68V 88A 8mΩ@10V,35A. Сопротивление в открытом состоянии не самое маленькое, но вполне сойдет. Полумостовые драйверы затвора — LN4306, спецификация не нашлась, да и не суть важно — их не производит нынче только совсем ленивый. Самый дешевый, который мне удалось найти — это FD2103. У него только максимальное напряжение 180 вольт (у других значительно больше), но для батарейных моторов больше и не надо.
Питание спроектировано вполне аккуратно, благо в Китае сейчас производится множество дешевых понижающих преобразователей с входным напряжением 70...90 Вольт: XL7046, XL7005A и так далее. В данном случае, судя по схеме, использован SY8502 или что-то подобное, хотя надпись BDXCYG ни о чем не говорит.
На выходе преобразователя напряжение 12 Вольт, оно используется для питания драйверов затворов и понижается следующим преобразователем до 5 Вольт. А это напряжение уже разведено по всему самокату для питания прочей электроники и фонарей.
Опять таки то, что написано на микросхеме 5-вольтового преобразователя, ни о чем не говорит, давайте считать что это JW5062T — по параметрам и ножкам вроде как вполне подходящая микросхема.
И последний шаг — обычный LDO, который из 5 Вольт сделает 3.3 Вольта. Их такое превеликое множество, что разбираться какой именно использован просто бессмысленно.
Пишут, что в большинстве аналогичных контроллеров моторов используется STM32F103C8T6, но в моем оказался APM32F103CBT6 от Geehy (128KB FLASH 20KB RAM 2V~3.6V ARM-Cortex-M3 96MHz) — придется или с ним мучиться, или заменить его на STM32F103C8T6.
Без мучений ардуина все равно не получится — кварца, с которым работает ардуино, тут нет. Еще одна заметка — существует 2 различных варианта ардуино для STM32 — старый на базе библиотеки Mapple и на HAL. SimpleFOC на Mapple просто так работать не будет, переделок столько, что проще свою библиотеку написать.
Пробуем подключить ST-LINK через STM32 Cube Programmer. Контроллер читается, хотя защита установлена. Но при попытке считать Flash — облом, читаются одни нули. Значит, по крайней мере, защита не совместима с STM32, там бы просто ничего не читалось. При попытке снять защита память стирается, после этого считываются 0xFF.
Итак, родное программное обеспечения сдохло, можно с чистой совестью доламывать контроллер.
Для начала конфигурируем настройки ардуино — все видно на картинке. Обязательно указать, что у нас нет USB — тогда системный генератор будет генерировать код для работы со встроенным осциллятором.
Как раз к той ножке, куда подключается кварц, в нашей плате подключен светодиод. Но просто так он работать не станет — в реализации ардуино небольшой глюк, инициализируется встроенный генератор, а порт PD остается подключенным к генератору. Не беда — мы его легко переключим куда надо:
AFIO->MAPR |= AFIO_MAPR_PD01_REMAP;
После этого светодиодик начинает моргать.
В программу добавлен код для управления кнопкой включения-выключения. При первом нажатии питание включается, при повторном — выключается. При экспериментах лучше не пытаться использовать питание микроконтроллера от программатора — велика вероятность, что благодаря куче катушек в преобразователях, микроконтроллер умрет. Единственное утешение — вы будете не первый, кто его убил таким образом. Так что используйте внешний источник питания вольт на 30, и установите ограничение тока миллиампер 20 — для экспериментов без подключения двигателя этого хватит. Ну и до кучи протестируем последовательные интерфейсы:
#define LED_BUILTIN PD1
HardwareSerial Serial1(PB7, PB6);
HardwareSerial Serial3(PB11, PB10);
void setup()
{
AFIO->MAPR |= AFIO_MAPR_PD01_REMAP;
RCC->APB2ENR |= RCC_APB2ENR_IOPDEN;
GPIOD->CRL = 0x33;
GPIOD->IDR=0;
Serial3.begin(115200);
Serial1.begin(115200);
pinMode(PC14, INPUT);
pinMode(PC15, OUTPUT);
digitalWrite(PC15, 1);
while (digitalRead(PC14)==1);
}
void loop()
{
GPIOD->BSRR = 2; //digitalWrite(PD1, HIGH);
delay(500);
GPIOD->BRR = 2; //digitalWrite(PD1, LOW);
delay(500);
Serial3.write('*');
Serial1.write('#');
if(digitalRead(PC14)==1)
{
while (digitalRead(PC14)==1);
digitalWrite(PC15, 0);
}
}
Использовать Arduino GUI вовсе не обязательно, в конце концов это программа для мазохистов. Все то же работает и в Platformio, ini файл выглядит так:
[env:genericSTM32F103CB]
platform = ststm32
board = genericSTM32F103CB
framework = arduino
upload_flags = -c set CPUTAPID 0x2ba01477 ; APM32
На сем позвольте откланяться, если ничего не спалю — продолжение будет (если кому-то это интересно).
вопрос теоретический контролерами не занимаюсь
Суть в сдвиге фаз.
А в простейшем случае делают именно так, как вы думаете.
пс автор, я не докапался, просто мысли в слух, а вы красавчик.
Полагаю, аналогично и с общим шунтом. Нагрузка не чисто активная, поэтому рассчитать ток в плечах с необходимой точностью через общий шунт не представляется возможным.
Схема когда-то планировалась другая, где стоял обычный Lm324, у него максимальное выходное не R2R — питание минус 1.5В. Поэтому питание было 5 вольт. А потом этот кусок был просто скопипасчен.
А здесь Lmv324. И четвертый операционник для чего-то используется как буфер.
Но я более чем уверен что в этой плате три оу для усиления сигналов с шунтов а 4ый как буфер для уменьшения выходного сопротивления от цепи измерения напряжения постоянного тока. И скорее всего в этой плате lm324 запитана на 12 вольт. Если будет иначе я буду немного удивлен.
Да удивлен.
Но не китайцам а себе.
Не заметил в вашем сообщении что не просто LM 324 a lmv324. Только на фото смог это рассмотреть. Это все объясняет кроме моей невнимательности.
Если шунт будет только один, вы не сможете понять, как именно измеренный ток распределяется по фазам, то есть, не сможете понять направление того самого вектора тока. Для построения вектора надо минимум два датчика.
Плюс как уже сказал ток через них все равно снюхивается для защиты и эта информация уже есть в контроллере.
Но как уже сказал, я чисто теоретик
Я же пытаюсь вам объяснить — ток идет сразу через три фазы, грубо говоря, в две (которые ШИМятся) заходит и через третью (которая сейчас на земле) выходит. Знание общего тока через двигатель позволяет определить лишь длину вектора тока, но не его направление по фазам. Для этого нужен, как минимум, еще один датчик.
Я это и пытался объяснить. Но вы говорите, что знаете это и знаете очень давно. Взаимоисключающие параграфы, однако.
Я давно занимаюсь электроникой, векторное управление асинхронниками учил в вузе когда часто ники были диковинкой.
Что я имел в виду про один шунт.
Магнитное поле крутится путем шимирования нагрузки и у контроллера есть информация какой идёт общий ток, и о том какие ключи открыты, при шимировании они бывают открыты вместе бывают по очереди бывают закрыты, этой информации уже достаточно для целей смещения магнитного поля,
Если вы в курсе там все равно не прямой расчет должен быть иначе скорости калькулятора не хватит. Так вот, помимо этого у контроллера должна быть косвенная информация в попугаях какой ток течет через какое плечо от снюхивателя перехода транзистора, так как без этого защиты по току не будет, а она есть, и пусть это условные единицы, но сумма условных единиц равна току одного общего шунта.
Потому я как теоретик не вижу необходимости в отдельных грунтах, но я занимаюсь электроникой, а значит чуток критического мышления имеется, потому прямо и говорю, раз люди умнее меня в этом вопросе ставят индивидуальные шунты, значит они там нужны, и это моих познаний не хватает чтоб это понять, возможно просто математика в камешке это не вывозит, возможно идёт каша с переходов мосфетов из-за индуктивности движка, этого я не знаю, но в теории, 1 мосфета достаточно.
Да и как вы себе представляете измерение тока при наличии там сигнала ШИМ? Ведь измерять можно только в то время, пока транзистор открыт (что требует огромного быстродействия), и ток этот будет несколько не тот, что реально течет через обмотку.
Защита по току делается как раз на общем шунте.
Нет, зная лишь одно число даже теоретически невозможно получить из него полноценный двумерный вектор.
На самом деле то какие ключи открыты и в какой момент времени зависит не от принципа управления (скалярный, foc или какой то другой), а от способа модуляции. Это может быть два совершенно разных способа модуляции при одном и том же методе управления. Кстати в библиотеке о которой упоминает топик-стартер simple foc можно выбрать метод модуляции. Естественно некоторые методы управления не поддерживают те или иные типы модуляции. Для более подробного ознакомления можно на Ютубе посмотреть видео от компании НПФ Вектор о которой тоже было сказано в посте. Там много интересного по этой теме. Особенно мне понравилось видео о способах измерения скорости который я у них позаимствовал.
По измерениям токов.
На самом деле есть возможность использовать и один шунт в звене постоянного тока, и три шунта в транзисторных стойках и два шунта непосредственно в фазных проводах и до точно определить результирующий вектор магнитного поля. Но как и везде есть свои но. При использовании одного шунта предъявляются ооооочень высокие требования к операционному усилителю по полосе, скорости установления, скорости нарастания сигнала и дополнительно налаживаются ограничения на минимальный шаг изменения скважности что налагает некоторые ограничения на модуляцию. Так что с экономической точки зрения этот метод не очень привлекателен ибо усилитель с требуемыми характеристиками будет стоить как все изделие и даже при этом общий результат будет хуже чем у схемы с фазным измерением. Три шунта немного упрощают задачу как для аналоговой части так и для цифровой. С тремя шунтами можно до точно знать что напряжение на шунте это ток втекающий или вытекающий из конкретной фазы. Но это решение удел приводов небольшой мощности.
Два датчика тока в фазных проводах(а в серво решения ставят всё-таки три для уменьшения погрешностей, так как при использовании двух третий вычисляют но вычисления то содержат погрешности измерений первых двух) дают данные о том какой ток течет в фазе в любой момент времени не зависимо от этапа коммутации(хотя на практике все стараются делать выборки в моменты статики а не в момент коммутации). Если в первых двух способах реконструкция фазных токов по шунтам требует некоторых вычислений то последний вариант даёт сразу результат. Хотя у меня есть схема которая аппаратно делает восстановление фазных токов по трем шунтам разгружая вычисления но и у нее тоже есть ограничение к примеру ШИМ не более 0.95 ну и самый неприятный момент зависимость данных о токе от скважности хотя и это решается авто корректировкой при старте приложения с помощью линейного интерполятора что увеличивает получение данных о токе на одно умножение. Так что тоже очень спорное решение оказалось.
Удивительно что на таком ресурсе поднимаются столь серьезные темы. Моё почтение собравшимся.
При этом, в первом случае путь тока точно определен и для его измерения вполне достаточно одного общего шунта. Во втором же случае использование общего шунта принципиально не может дать нам двумерный вектор, т.к. значение только одно. Да, можно начать извращаться, сильно увеличить полосу ОУ и АЦП и пытаться проводить несколько измерений за один период ШИМ, чтобы, например, сначала получить ток А-(В + С) (когда обе фазы ВС подключены к питанию), потом А-В или А-С, когда одна из фаз переключится ШИМ-ом на ноль. Но я не уверен, насколько качественный результат это даст, да и какие аппаратные ресурсы это потребует.
Возможно, можно пойти другим путем и проводить измерения токов только один раз для каждой фазы за один электрический оборот в «удобный» момент, а остальные значения получать с помощью интерполяции, и, наверное, это даже будет нормально работать для установившегося режима с постоянной нагрузкой.
Поэтому наиболее точный вариант — это три шунта (чтобы как вы и сказали) не вычислять значение тока третьей фазы по остальным двум :).
Вы близки к пониманию того как происходит определения вектора магнитного потока. Именно за один период ШИМ происходит несколько измерений тока на одном шунте в разные моменты времени когда открыты разные ключи, или если правильно сказать разные сектора активны. Потом это анализируется. И если частота ШИМ хотя бы 16кГц то при 8 измерениях за период сигнал с ОУ должен установиться и быть стабильным быстрее чем 7 микросекунд. Отсюда и требования к ОУ.
Про электрический оборот это вы попытались описать прогнозирование скорости а к измерениям тока это к сожалению невозможно применять. Если оу не вытягивает то он будет не вытягивать в любой момент времени даже самый удобный.
И она конечно же залочена со взрывом дороги (фото гуглить лень, но красивое)
Не проще ли тогда вместо замены батареи заменить банки, а БМС оставить родной? Или оно там в энергонезависимую память пишет состояние банок?
А вот банки менять это и есть пороховая бочка, родные +- притерты по параметрам и новые банки будут ни к селу ни к городу, а балансир у сяоми очень слабенький.
Уж лучше продать такой аккумулятор тому кто готов рисковать жизнью ради трех копеек, а себе взять что то нормальное что квартиру не спалит.
P.S.: Хотя еще и от «приложения» к рукам зависит, а то знаю я деятеля, который устанавливая сидуху типа стульчак на самокат, умудрился саморезами не только верхний лист деки просверлить, но и удачно в батку забуриться, аж часть волшебного дыма вышла. Вот там было хорошо что банки из песка на половину с говном и палками, а то не только бы волшебный дым вышел, но и файер-шоу на халяву бы чел посмотрел.
Причем родная BMS не самая удачная, балансировка через опу…
Батарея имеет на просто «интерфейс», а собственный контроллер, который управляет зарядом/разрядом, измеряет напряжение на ячейках, блокирует батарею при аварийных (нештатных) ситуациях. Т.е. батарея — это часть системы, ничуть не менее важная чем контроллер мотор-колеса. Другое дело, что последний — своеобразный «хаб», соединяющий систему в единое целое. И если при запуске тот же контроллер батареи выдаст в ответе на запрос некую ошибку, для простоты скажем «разряжен выше допустимого», она отобразится на дисплее руля (переданная теперь уже от контроллера мотор-колеса) и… усё, приехали ))
госамокат не завелся с левым аккумулятором.Так что автор описал всё абсолютно правильно.
Похвалить эту отвратную платформио не менее модно.
А можно я сам буду решать, что лучше?