Tag: бормашинка
Подогнали клёвый видос нашей поделки:
github.com/speedcontrols/ac_sc_grinder
Если собирать больше 1 штуки (например, себе и друганам), получается совсем бюджетно. Детальки и платы заказываются в полтора клика. Чтобы собрать, великим электронщиком быть не обязательно.
Оказывается есть довольно современные разработки: (AN863) Improved sensorless control with the ST62 MCU for universal motor. Кому интересно - почитайте, там довольно красивые картинки и понятные пояснения.
Если кратко - девайс меряет ток во время zero-cross и пытается его стабилизировать. А конские формулы заменяются табличками компенсаций. Только диапазон скоростей приходится бить на полосы, и строить свою табличку для каждой полосы. Если речь о серийном производстве - вполне годное решение. Но в нашем случае это плохо, потому что:
- Нужен стенд, чтобы снимать показания мотора, причем потребуется давать нагрузку на вал.
- Выше требования к входным фильтрам, давящим шумы.
- Одна табличка параметров будет работать только для узкого диапазона скоростей.
Отсюда кстати понятно, почему регулятор на U2010B хорошо работать не сможет - там просто таблички компенсаций отсутствуют. Точнее, он будет работать относительно хорошо только на средних и высоких оборотах. И под конкретный движок понадобится настраивать вручную.
Если проводить параллели с регулятором, который мы сейчас сочиняем, то у нас измерения идут не на zero-cross, а непрерывно, и считается свертка. В итоге намного меньше проблем с шумами.
github.com/speedcontrols/ac_sc_grinder
Там еще овердохрена приключений с теорией, но видимо остановимся на том что есть. Ибо уже подзадолбало ковыряться, да и работает приемлемо. Опишу в общих чертах что вышло. Решили подбирать методом половинного деления, по отсутствию автоколебаний и перерегулирования. Каждый шаг занимает пару секунд, всего около 6 шагов - довольно быстро, и нет смысла мудрить с продвинутыми техниками. Получилось примерно так:
- P - сначала отпускаем коэффициенты и меряем дисперсию шума. Автоколебанием считаем если дисперсия больше шума на 10%. Потом двигаемся между минимумом и максимумом, уменьшая шаг, пока не найдем точку где автоколебаний все еще нет.
- I - тут немного хитрее. Поскольку автоколебаний им не запустить, то дергаем скорость с 0.3 до 0.4 и смотрим чтобы выход не “заносило”. Тоже половинным делением подбираем нужное значение.
- Уменьшаем оба коэффициента на 0.8, для запаса стабильности.
Крайние значения интервала P взяты [1…5] - типовые номиналы. Крайнее значение I сейчас забито константой (4 сек), но потом подправим, чтобы мерилось время разгона-останова (больше быть точно не может).
Сегодня без графиков, залью по окончании, когда полностью закончим. А пока новые леденящие душу подробности 😃.
Как известно, для вычисления коэффициентов ПИ-регулятора, надо подать на девайс “импульс” и померить время разгона и торможения. Удивительно, но время торможения оказалось меньше времени разгона. Если б не видел графики лично - не поверил бы. Но нам это только на пользу - торможение не будет мешать поджимать коэффициенты регулятора посильнее. А вот с самими измерениями есть нюансы.
Сигнал ОЧЕНЬ шумный. Если посмотреть спектр, то будет до фига гармоник, в том числе на частоте 1 герц (фик знает почему но факт). То есть, чтобы реально все задавить, нужно у фильтра ставить частоту среза 0.5 герц. А это вызывает сильное запаздывание, которое в данном случае может мешать. Мы пока занимались тем, что перебирали в scilab варианты фильтров, частоты срезов и смотрели что будет.
Лучше всего работают low-pass фильтры, которые не искажают АЧХ. То есть, Баттерворта и Чебешева 2 вида. Честно говоря, по картинкам огромной разницы не заметил. График разгона похож на логарифм. После фильтра получается небольшая задержка в начале (которая нас мало волнует), и не особо заметная в конце (если не повышать порядок фильтров).
Залил обновленные графики, поправил инструкции, то-сё. Все-таки график измерения скорости пришлось исправлять более серьезно.
Как уже писал, в середине графика скорости есть аномальный провал. Из-за него пришлось сильно разжимать коэффициенты PI-регулятора, что не приемлемо. Поэтому стали думать, как быть. Интерполяция полиномом тут не прокатывает, так как она борется с шумами, а не с откровенно кривыми исходными данными.
Т.к. с нормальными идеями туго, решили временно обойтись “магическими константами” - на глаз разметили диапазоны, где измерения заслуживают доверия, а остальное “достроили”. Улучшать надо, но времени нет. Как-нибудь потом. Получилось так:
- На низких оборотах выбрали интервал ~ 0.2-0.4 от максимума, и провели прямую, достроив ноль (стандартной полиномиальной регрессией).
- На высоких оборотах (фаза 0.6-1.0) просто взяли 3 точки, там шаманить особо нечего.
- Дырку достроили сплайном
github.com/speedcontrols/ac_sc_grinder/…/data - посмотрите графики в файлах “rpms_*”, станет понятно как выбирали магические константы.
Завтра убьем нафик старую историю коммитов и будем считать что есть “рабочая бета”. Ну и займемся ПИД-ом наконец-то.
github.com/speedcontrols/ac_sc_grinder
Напоминаю предысторию - перед тем как химичить с калибровкой ПИ-регулятора, понадобилось компенсировать нелинейность мотора (rpms/volts). Над этим и бились. Вроде победили, не считая пары нюансов, которые закроем в понедельник.
Картинки можно посмотреть в файле github.com/speedcontrols/…/rpms_interpolated.ods. Там 3 графика:
- Красный - что померили тахометром.
- Синий - что показывает измерялка Back EMF.
- Желтый - после отбрасывания шумов и вычисления полинома пятой степени.
Шаг измерений нелинейный, чтобы сократить время калибровки - в начале почаще, в конце пореже.
На синем графике в середине возникает загадочный провал, объяснения которому нет. Но поскольку он не очень сильный и мешать не должен, в итоге плюнули.
Как оказалось, корректно снять характеристику мотора (зависимость оборотов от напряжения) не так просто.
- Те шумы скорости, которые пофик при реальной работе, в калибраторе довольно сильно мешают.
- Определить что скорость стабилизировалась (перед началом измерений), тоже тот еще квест.
В общем, вместо того чтобы семимильными шагами писать калибровку ПИД-а, буксуем на предыдущем этапе.
- Пока на тестовых данных сделали апроксимацию графика полиномом. С виду симпатично.
- Думаем, как детектить что скорость выросла и перестала меняться.
В общем, текущая неделя уйдет на суровую математику и эксперименты. Одно радует - вся эта хренотень потом перенесется на следующие типы регуляторов. Текущая железка - это ведь полигон, для того чтобы разобраться в технологиях разработки. Так что время тратится с большой пользой.
Как обычно, повылазили новые нюансы 😃. Рассказываю.
Во-первых, вычисление скорости переписали через свертку за период. Старый способ оказался шумноват для тонких вещей. Во-вторых, мы забыли компенсировать нелинейную характеристику мотора (это добавило проблем ПИД-у). Я залил на гитхаб новые файлы с реальными данными и графиками.
К счастью, снять характеристику мотора не сложно - просто плавнo наращиваем фазу триака и меряем скорость в 20 точках. Ну а потом интерполятором накладываем коррекцию.
Теперь по ПИД-у. Стандартные методы (через отклик на прямоугольный импульс) выдавали фигню, видимо из-за отсутствия коррекции. Надо будет проверить после доработки калибратора. Но есть план Б - имитировать ручную настройку, когда коэффициенты ПИД-а крутятся до возникновения автоколебаний.
Правда, есть вопрос, как обнаруживать автоколебания без сложной математики. Пока в голову пришел такой способ. Подаем на мотор напряжение без ПИД-а и вычисляем дисперсию скорости (стандартная сигма), чтобы определить порог шума. Потом включаем ПИД, и если дисперсия больше - значит начались автоколебания.
github.com/speedcontrols/ac_sc_grinder/…/doc
Обновил подробности про калибровке параметров моторов. Сейчас калибруется все, кроме ПИД-а. С ним надеюсь что на неделе тоже закончим. А пока резюме по той практике, которая фигово вписывается в теорию.
Сопротивление и индуктивность мотора
Во-первых, когда мотор остановлен, можно легко насытить железки тестовым импульсом. В итоге мы подаем только 10% от полупериода синусоиды.
Во-вторых, вычисляемые R и L зависят от длины поданного импульса (смотрите по выложенным файлам с выборками). Сопротивление на минимальном импульсе в полтора раза больше чем на максимальном. Придумать правдоподобную модель сходу не получилось (одному аллаху известно, что там со щетками). В итоге просто используем результаты с 10% импульса.
Нормализация скорости
Значение скорости ОЧЕНЬ шумное.
- Есть шумы в пределах одного периода. Давятся медианным фильтром длины 32. Увеличение до 64 картину особо не меняет.
- Результат между разными периодами синусоиды тоже сильно скачет. Обычно это давит медленный ПИД и инерция мотора. Но при калибровке надо об этом позаботиться отдельно - собрать данные с разных периодов сети, и тоже взять медиану.
Как обычно, новые кровавые подробности 😃 . Сегодня отладили новый медианный фильтр, эмулятор EEPROM и стали ковырять калибраторы.
Выплыл досадный косяк в управлялке триаком. Изначально симистором рулили короткими импульсами (через оптрон), откладывая нужный кусок синусоиды. И все было бы хорошо, если бы нагрузкой была простая лампочка. Но там же ж блин моторчик, у которого смещен ток.
В итоге триак закрывается не когда напряжение падает до нуля, а позже. Поэтому на макимуме следующий импульс идет когда триак все еще не до конца закрылся, и на следующем полупериоде он тупо не открывается. Короче, внешне фигня выглядит так: на максимуме начинается фигня, и на минимуме мотор тоже не полностью стоит. Жопа.
Видимо надо убрать химию с испульсами на оптроне, и держать его открытым полностью до конца периода. В надежде что триак сам откоммутируется как ему потребно. Из потенциальных косяков - в диапазоне 95%-100% ручка будет выдавать максимум. Ну и минимум тоже сместится с 10% на 20%. Считать реальное отставание тока можно (чтобы убрать смещение), но IMHO ненужный гимор. Будем чинить по-быстрому. Уж очень хочется поскорее зарелизиться.
Вот наконец-то регулятор достиг той точки, когда можно взять прошивку и попробовать ей воспользоваться. Правда автокалибровки там еще нет, поэтому с текущим конфигом будет работать только на одном типе моторов. Поэтому лучше подождать недельку-другую полноценного релиза.
Жду когда доедут новые платы и понемногу готовлюсь к тому, чтобы прибить историю коммитов в репе (в отладочной ветке многовато мусора от творческих метаний).
На завтрашнюю отладку уже заготовлены новые куски кода:
- Скользящий медианный фильтр (для считалки скорости). Помимо того что “это красиво”, позволит гарантировать отсутствие переполнений на не калиброванном девайсе.
- Считалка сопротивления и индуктивности двигателя.
Вроде сюрпризов не ожидается, и останется только добить калибровку коэффициента масштабирования скорости и настройки ПИД-a.
github.com/speedcontrols/ac_sc_grinder
В папку с документацией добавились аналитические формулы и модели для scilab. К понедельнику дочистим код и можно будет переходить к автокалибровке. Обратите внимание, подобной инфы в понятном виде в интернетах нет. Люди лепят алгоритмы “по наитию” и с “магическими коэффициентами”, а такое прокатывает только до первой производной. Хотелось бы внести окончательную ясность по данному вопросу. И для себя лично, и чтобы следующие падаваны не собирали слухи из мутных источников, а юзали готовую и годную математику. С гарантированным результатом. В серьезном подходе ведь главное - не просто код слепить, а гарантии, что он будет работать должным образом.
Надо отметить, что сложности в основном характерны для моторов с подмагничиванием, где обмотки соединены последовательно. Если брать моторы постоянного тока и бесколлекторники, то там все намного проще.
Второй важный момент - мы предполагаем, что на подобных “мелких” моторах статор не входит в насыщение (для мощных коллекторников переменного тока все ровно наоборот, но там уже есть датчики оборотов и подобные регуляторы и не актуальны).
Прогресс пока в основном на макетке, но хорош. Комрад переписал формулу вычисления скорости, заменив стрёмную свертку на более полноценное выражение с производной. Сообщил, что теперь обороты держатся намного стабильнее во всем диапазоне (для одних и тех же коэффициентов ПИД-а). Был скользкий момент с насыщением магнитного потока (если поток не линейный, то формулы просто так не сократить), но, хвала всем богам, его либо нет, либо им можно пренебречь без последствий.
То есть теперь, чтобы определить скорость, достаточно двух соседних отсчетов (два - чтобы производную тока определить). Единственный нюанс - во время включения симистора производная слишком большая, и стоит игнорировать данные. Теперь осталось внимательно перепроверить на реальном моторе, вписываемся ли в нужную точность, и будем “отливать в граните”. Проверять надо на минимальной скорости, 3000rpm (~10% от макимума):
- Сколько нужно выпилить отсчетов в начале (примерный критерий - пока производная тока не станет <= 0).
- Сколько нужно выпилить отсчетов в конце (чтобы не делить на слишком маленький ток, который может вызвать погрешность).
Если после выпиливания головы и хвоста останется хотя бы пара рабочих отсчетов - значит все зашибись. Думаю, все будет пучком, т.к. макетка пашет.
Ну что ж, регулятор с новой платой и прошивкой ожил, но надо уточнять математику. Если выставить ПИД на большой скорости, то там стоит как влитой, но на малых не хватает (просадка, потом восстановление за 2 сек). Если выставлять ПИД на малой скорости - то на малой держит железно, а на большой уже начинает дергаться.
Я не хочу пока фантазировать о причинах такого поведения, т.к. придерживаюсь простого принципа - если есть явно кривой код, то надо его сначала выпрямить, а потом разбираться с остальным. Потому что когда кривых мест несколько, то они накладываются, и разбираться в причинах - не рациональная трата времени. А исправлять еще есть что:
- Грубовато сократили формулу вычисления скорости.
- Есть накладки с точностью на математике с фиксированной точкой, и погрешность не поддается нормальной оценке.
- Остались “магические константы” (зависят от параметров двигателя).
easyeda.com/speed/AC-speed-control-for-grinder
В прошлый раз писал, что в регуляторе концы с концами слегка не сошлись. Бывает. Для тех кто не занимается профессиональным проектированием приводов, ниже подробности. Возможно кому-то они будут полезны.
АЦП
Не учел импеданс цепочки, через которую меряется входная синусоида. В итоге измерялку слегка перекосило. Выпилил резистор между делителем и входом АЦП, не нужен он. Заодно, на всякий случай, поставил защитную сборку из диодов шодки. В основном от отрицательного напряжения, чтобы не юзать внутренние защитные диоды микросхемы (меньше шансов, что отрицательной напругой перекосит мультиплексор АЦП). Не уверен, что в такой защите есть смысл, но сборка копеечная, места почти не занимает.
Если делаете высокоомные делители и АЦП работает на максимальной частоте - загляните в datasheet, чтобы избежать сюрпризов. АЦП в микроконтроллерах очень хорошие, но все-таки не “идеальные шарообразные” с бесконечным импедансом.
Triac