Контроллер sensorless BLDC мотора с контролем тока через обмотки
Из вчерашнего “сетевого штурма”, что стало понятней:
- Бездатчиковыми моторами можно управлять не только по поиску средней точки принимая сигналы с делителей на АЦП контроллера, но и по сигналам с датчиков тока “точно также” можно определять положение ротора. То есть достаточно 3 входа АЦП, а не 6шт (а то уже расстроился, их всего 8);
1а. Главная проблема тут - слабый отклик противоЭДС при малых скоростях вращения. Но, можно решать подачей ВЧ наводок на фазы, как в сельсинах. В моем случае видимо не должно сказаться как-то значительно, ибо моторы будут с повышенной индуктивностью, среднее kV в диапазоне 30-100.
1б. Собственно этот же способ подачи ВЧ примеси можно использовать для начального определения положения ротора при запуске стоящего мотора и его управления в режиме “малой скорости”.
- Примитивное 6-и шаговое управление, для датчиковых моторов это и есть самый простой случай векторного управления. А если ещё оно делается “по синусу”, так и вообще класс. А если оно ещё и смещает среднюю точку, то может подавать даже большую напругу на обмотки в каждый момент управления (плавающая средняя точка);
2а. управление по синусу устраняет залипания на магнитах при малых оборотах и как раз и создает вращающийся вектор м.поля. В таблице управления достаточно иметь только 1/4 часть синуса, остальное получается вычислением стартовой точки.
2б. моё желание фиксить мотор в заданном положении решается примитивно выставлением “по синусу” фазных токов на это самое положение. Тут важен ШИМ, дабы не пожечь мотор.
-
Все решает ШИМ. Управление просто модифицирует его “как того требует ситуация”, но в конечном итоге ток в обмотках формируется им.
-
Управление моментом можно решать 2-я путями:
а) подавая “размагничивающий” ток в продольную фазу;
б) формируя “урезанный/уширенный шим” в нужное время. -
Преобразование координат при переходах “туда и обратно” вполне можно запихать в таблицы преобразований и сложность вычислений приближается к нулю. К тому что 32-я мега в общем-то должна справиться с возникающими задачами.
Продолжу.
Итого, в качестве испытательного стенда, выбрал имеющуюся у меня самопальную плату на базе ATmega128a (“МУРК-128”) с блоком расширения ОЗУ до 512кбайт и экранчиком TFT в 2". Оба устройства сидят на шине расширения RAM-bus и имеют прямое управление. МК имеет на борту 6 16-и битных ШИМ каналов (2 таймера) + 8 каналов АЦП, которые легко запинываются в режим 79 ksps/10бит или в режим до 400ksps/7бит. и можно сразу выводить на дисплейчик формы с АЦП по типу осцилоскопа… параллельного ОЗУ на 512кб должно хватить для накопления нужных семплов и просмотра результатов на экранчике.
Программа экспериментов:
- Собрать типовое 6-и шаговое управление мотором с входного резистора “скорость вращения” + собрать управление скважностью ШИМ каналов также с входного резистора “мошность мотора” и посмотреть на формы токов в обмотках. Звезда и треугольник.
- Переработать схему на режим “управление по синусу”, запихав в прогмем таблицу из 240 точек на 1/4 периода. Посмотреть снова формы токов в обмотках на звезде и треугольнике и управляемость на ХХ.
- Загнать тот же ШИМ в качестве частоты измерения индуктивности и посмотреть варианты сельсинного определения положения ротора.
- Нормирование снимаемых токов и построение таблицы преобразования координат во вращающуюся систему “ротора”.
- Построение режимов работы “управление по скорости” и “управление по моменту” … отладка “итого” что получится.
… в целом если не напутал с пониманием “векторного управления”, на ближайшие пару месяцев интересными увлечениями вроде как обеспечен…
Поправьте плиз, если где не так понял чего-нибудь …
возьмите лучше моторы с датчиками холла. они устойчиво работают на малых оборотах именно благодаря обратной связи.
Какие моторы посоветуете на низкие обороты 30-100 kV с наружным диаметром не более 28мм и весом до 50гр с тягой в районе 1.5кг*см и токами в пределах пары ампер?
вот тут х.з. надо у автомобильщиков спрашивать.
Не нашел у них моторов легче 75-140гр. в свое время … может плохо искал. Все что меньше, они катают на коллекторниках, а там не будет возможности (или это проблематично) выковыривать мотор из колеса в случае выгорния щеток (типовая проблема на соревнованиях по робототехнике). Поэтому и остановился на бесколлекторниках, но их в нужном диапазоне тоже нет.
Отсюда и вся тема.
В целом, уже “загорелся”: “на ближайшие пару месяцев развлечение себе найдено” … может даже и на подольше. 😃
Так что, моторы приехали, находятся в перемотке (это не быстро как оказалось), камни и прочие деталюшки, чего не хватает - уже заказаны, едут, силовую часть драйвера уже развел … можно собирать макетку и тестировать “что там получается на самом деле”…
P.S. Жаль что так и не нашел “образцов для подражания” … за основу взял цикл статей с avislab как наиболее универсальное решение.
Собрал силовую часть драйвера, осталось запаять Нанно (лежит новая нераспаянная)…
Итого, в драйвере: силовые мосты АО4606 + их раскачка от двух пинов контроллера: верхнее и нижнее плечо по отдельности. Есть встроенная блокировка одновременного включения обоих плеч для устранения сквозных токов.
С каждой фазы сделан делитель с ФНЧ: 33кОм / (2.4кОм + 560нф), чтобы снимаемый сигнал не превышал порога АЦП в 1.1в.
Поставлено 1 сопротивление для измерения общего тока 3-х фаз номиналом в 0.2 ома. Его сигнал также в пределах 1.1в для токов до 5А.
Собственно и вся силовая часть. Итого имеем 6 ног управления + 3 фазных напряжения + 1 токовое = 4 АЦП входа.
Попробовал, ничего не понял … замер АЦП проходит за 21.7 микросекунды, на период ШИМ в 500мксек получается 23 замера. Только вот на втором замере уже срабатывает ограничитель тока в 1.7 ампера. Первый замер после включения напруги дает 0.7А, второй 1.8А … и как им управлять, если ток в стоящем моторе нарастает до предельного уже на 43мксек?
и как им управлять, если ток в стоящем моторе нарастает до предельного уже на 43мксек?
Увеличить частоту ШИМ? Если ток в обмотках будет успевать падать до нуля, то будет ещё и звук с частотой 2000 Гц. И пульсация момента, т.е. фактически вибрация. Либо я всё не так понял…
Верно, звук есть. Пищит громко и противно. 😃
В общем, пока сделал так:
- Поднял частоту АЦП НАНО до 2Мгц (0.5мксек, делитель 1:4), что дало для 16Мгц тактовой 0.5*(13.5+1) = 7.25мксек на замер или 138ksps. Этот подход хорошо себя зарекомендовал ещё на проекте “Осцилограф из Ардуино”. Практически АЦП всех мег одинаков и способен пахать на частотах вплоть до 8Мгц, но там уже сильно падает точность оцифровки (до 6бит) и возрастают требования к выходному сопротивлению источника. Такое нестандартное поднятие частоты ожидалось, поэтому все делители делал из небольших сопротивлений до 10-20кОм.
- Сделал пока 3 фукнции:
а) замерТокаФазы (включитьТак) – включает заданным способом, делаем 4 замера подряд на нарастании тока, выключаем и возвращаем среднее.
б) замерТокаМотора() – запускает пред. функцию 6 раз для всех комбинаций токов, получает массив токов. Время выполнения - 300мксек.
в) включитьФазу(фаза, время, шим) – включает заданную комбинацию (AH+BL,…) на указанное время с контролем тока через мотор. Если ток достигает предела (константа пока), то выключает мотор с получением времени нарастания тока до предела, пересчитывает полученное время согласно заданному ШИМ и держит указанную паузу, после чего снова включает фазу. И так пока не кончится заданное время.
г) тестМотора(время, шим) – замеряет токи “б”, и по циклу принудительно включает фазы “в”, начиная с результата “б”. Стартовое время для “в” - 4мсек, далее уменьшает его по -200мксек до 0.8мсек, затем уменьшает по -10 до 0.6мсек и по -1 …
Вчера смотрел на какой частоте переключения мотор сорвется с синхронизации. Независимо от указанного ШИМ (почти), срыв синхронизации наступает при времени переключения в 559мксек, что для 9N12P (6 полюсов) дает kV= 60*1000/0,559/6/6/7,38 = 404 при напряжении аккума 7.38в (рабочее). Расчетное kV ожидалось 423. Думаю неплохое попадание.
Измерил полный ток ХХ “мотор+контроллер” = 160мА. Расчетный ток контроллера на работающем моторе оказался 24мА, итого при таком “в лоб” управлении получаем токХХ около 136мА. Пересчет тока ХХ от DYS BX1306 3100 дает 0.13А … это конечно не DYS, а "noname … но все равно приятно. eCalc для подобных параметров предлагает КПД = 72%.
“не DYS” - обидно то, что при шаговом вращении мотора функцией “в” оказалось что мотор имеет 2 неустойчивых положения среди тех 6-и, которые “должны быть” всяко. Похоже магниты ротора имеют сильную неоднородность … *опа. 😦
В общем, то что намерял в п.“г” предыдущего поста - не соответствует тому, что получается на тестовом стенде и типовом контролле от Blhelli.
Тестовый стенд: мотор через контроллер BlHelli подключен к Ардуино, которая снимает управляющий сигнал с переменного резистора и подает его как скорость в контроллер. Далее на мотор нанесена белая метка (сам мотор - черный), и ИК датчиком снимается количество оборотов.
Результат для оригинального мотора 1306 оказался kV = 3000, для этого перемотанного мотора около 940. Почему в п.“г” он крутит больше чем в 2 раза медленнее - так и не понял, но раскрутить шустрее принудительной синхронизацией не удается. И токи мотора в принудительном варианте получаются значительно выше.
Взял паузу на раздумья. Пока ничего не понимаю в этих печеньках…