Обновить

Драйвер шагового двигателя с векторным управлением

Уровень сложностиСложный
Время на прочтение27 мин
Охват и читатели18K
Всего голосов 57: ↑57 и ↓0+68
Комментарии35

Комментарии 35

Эт - прямо вот хорошо! Отложил в закладки - мало ли когда понадобится!

Единственное в чем наверное разочарую - компилятор скорее всего вырезал ваши трюки с кешированием переменных при расчете. Там конечно надо посмотреть ассемблерный листинг, но в большинстве случаев оно прекрасно видит ситуации когда идет цепочка присваиваний a->b->c и помечает 'b' как no-effect. Ну и дальше вообще убирает его из внутреннего представления программы. Раньше в чистых Сях был допустим трюк со словом 'register' - который рекомендовал компилятору выделить регистр для хранения локальной переменной в блоке. Но работало это не всегда - и в современных процессорах обычно компилятор распределяет регистры лучше человека. Если вы все-таки хотите туда вмешаться - то надо смотреть не-портабельные расширения платформы или компилятора (прагмы, аттрибуты переменных и проч).

Если сейчас набегут варвары, которые будут кричать что ваша поделка не имеет смысла и ее изготовление обошлось дороже покупки готовой в Китае с доставкой - гоните их в сад! Умение повторить - это минимальный уровень владения технологией. Без этого нет и не будет следующих шагов: ни улучшения/адаптации, ни разработки нового.

Удачи!

Спасибо. Оптимизации точно повлияли. Первая версия алгоритма работала примерно в 3-4 раза медленнее. Я мониторил начало и конец прерывания по осциллографу. Не могу утверждать, что ни одна из оптимизаций не была вырезана компилятором, но что-то явно помогло.

А при сборке в параметрах компилятора какая оптимизация задана?

Я скорее всего в дебаге шил с флагом -00.

Ну вот поэтому ручные оптимизации помогают: просто потому что с -o0 компилер собирает "как есть"... А так начиная с -o2 уже руками чаще всего лучше не сделаешь (если это не какие-то специфические случаи)

А в чем вообще смысл шить управление силовой электроникой в дебаге без оптимизаций ? Все равно же не имеете роскоши подключиться отладчиком, остановиться, почитать переменные, и т.д. - система реального времени под отладчиком ведет себя совершенно не так как без него... Я содрал для себя подход у ракетчиков - система пишет в отдельную микросхему (мне нравится FRAM) телеметрию по кругу. После рабочего цикла или аварии - читаем микросхему, анализируем логи... Но сборка кода ведется с O2 или Os - иначе сколько раз было что с O0 - работает, с O2 - падает из-за какой-то невнимательности с указателями или UB. Если не уверены - смотрим ассемблер (к сожалению современный C++ довели до того, что без чтения ассемблера - обойтись сложно).

У меня не C++ , а C, ну не суть. Оптимизации компилятора меня вообще не волнуют, я обычно всё в дебаге шью с -o0 и ни разу не было проблем. Отлаживать можно через Cube Monitor очень удобно(не в этом проекте). Если нужна отладка до микросекунд, то можно выводить цифровые сигналы на логический анализатор или аналоговые на осциллограф. Вроде костыли, а большего и не нужно.

Оптимизации компилятора меня вообще не волнуют [..] шью с -o0 ..

странно это

В системах реального времени надо четко контролировать данные, особенно, если работаешь в прерывании. Компилятор может кэширлвать данные, которые меняются переыерийным устройством в произвольный момент. Компилятор мог это не учитывать и работать с неактуальными копиями в кэше.

Вот это распространенное ошибочное мнение, которое кочует из уст в уста и до сих пор популярно...

  1. Оптимизация - неотъемлемая часть современного компилятора и самая сильная его сторона. Именно она позволяет использовать язык комфортно: ну нужно думать как написать "быстро", как не объявить лишние переменные и т.д. От применения ситнаксического сахара в большинстве случаев не поменяется вообще ничего - компилятор это соптимизирует.

  2. "Компилятор мог это не учитывать и работать с неактуальными копиями в кэше." - давайте не путаться в терминологии. Все с чем работает компилятор заканчивается на этапе компиляции. Дальше с кодом работает процессор. Кэши процессора - удел самого процессора (за редким исключением вроде барьеров памяти, но здесь явно не об этом). Скорее всего имело ввиду работа с переменной в регистре, при этом когда на эту память мапилась периферия? Уже в заголовках библиотек от производителя чипа все что нужно помечено как volatile. Поэтому компилятор знает о таких переменных и будет обращаться к ним правильно. Если нет - это косяк кода, не компилятора, нужно правильно пользоваться инструментом.

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

В общем и целом - современный компилятор очень мощный инструмент. Не боритесь с ним, используйте.

Я рад, если оно действительно так, но я в оптимизациях компилятора не шарю и ассемблерный код не читаю. Мне надо только, чтобы код работал ровно так, как я его написал на C и без сюрпризов.

Воспоминание разблокировано. Серьезность темы электропривода я понял в момент, когда керамический конденсатор размером около 1210 прожег в плате такую дыру, что можно было палец просунуть. После этого я тоже начал считать импульсные токи)

Да, в этом что-то есть... У меня похожее было: неправильно посчитанный дроссель BUCK-конвертера насыщался и у электролитического конденсатора ноги грелись почти до выпаивания... Нагреть конденсатор это видимо какое-то становление начинающего электроника... Нагреть сердечник дросселя при холодной обмотке в принципе тоже :D

У меня так однажды мелкий дисковый конденсатор на 0.1мкф отгорел от драйвера TB6600HG

Компаратор сравнивает падение напряжения на шунте с опорным напряжением и отключает ключи на фиксированный интервал времени.
Мало того, что такое решение просто некрасивое, оно еще и сомнительное с точки зрения электромагнитной совместимости.

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

так называемый Fast Decay и Low Decay режим.

А в вашем проекте это не используется? Ключи в фазе PWM-off просто закрываются, и остаются закрыты до момента PWM-on?

У меня симметричный ШИМ просто переключает диагональные ключи. Получается типа Fast Decay, но с фиксированной частотой ШИМ и аккуратной регулировкой с помощью ПИ регулятора. По обмотке всегда течёт ток либо в одном, либо в другом направлении. Это абсолютно правильно и нормально. Костыль с Low Decay введен в примитивные драйверы из-за отсутствия нормального регулятора

Я так понял, что использование разных режимов decay актуально когда ток регулируется по синусоиде, и для разных фаз (фаза увеличения тока, и фаза уменьшения тока) оптимальным будет разный режим decay. Это не связано только лишь с использованием fixed off-time.

Я знаю, что это для этого сделано, но это не необходимо при наличии нормального ПИ регулятора и ШИМ. ШИМ с регулятором работает на порядок лучше

Отлично сделано!

Но ведь ШИМ остался, и помехи тоже остались. Чтобы от помех избавиться, имеет смысл на выход выводить уже сглаженный сигнал. Или хотя-бы фильтр поставить, чтобы фронты немного сгладить.

Я ещë не очень понял, зачем USB- UART. Выбранный мк и без него может по USB получить прошивку.

И защита лишней не бывает: входы оптронов чувствительны ко всему, особенно при переполюсовке.

Спасибо!

1) Я стремился не избавиться от помех, а нормировать их по частоте, чтобы они нормально фильтровались.

2) Да , я знал про USB DFU, но у меня была библиотека Modbus RTU написанная под USART и я хотел использовать её.

3) Че то я не замечал выгорания оптронов от переполюсовки никогда. Резистор их всегда успешно спасал.

Че то я не замечал выгорания оптронов от переполюсовки никогда. Резистор их всегда успешно спасал.

Вам везёт, наверное. Но обычно светодиоды очень боятся статического разряда. Если бы они где-то в середине платы стояли - не страшно. А прямо на интерфейсе - без защиты от высокого обратного напряжения им уже не очень хорошо будет.

Особенно "спасёт" диод конденсатор, включённый параллельно токоограничивающему резистору :)

Странно. У меня прямо противоположный опыт. В моём понимании светодиод это неубиваемый стабилитрон с побочным эффектом в виде свечения)) Шучу конечно, но у меня светодиод всегда был самой выносливой деталью. Вот лазерный диод неженка, это да)

Совсем недавно STM32 исчезали с российского рынка, потом появились по удесятеренной цене, потом цена снова стала адекватной. Чтобы не зависеть от европриборов, используйте чайнаприборы. Семейство сh32. Раз уж все равно пишете код и тексты с пом. китайских нейросетей (это одобряю).

Мои разработки выпускаются мелкими сериями по 5-50 штук под заказ. На такое и оригинальные stm32 найдутся на скаладах чип и дипа по 300р/шт.

Переход на ту же народную CH32F103 или CH32V307 на RISC-V сейчас и правда выглядит за самый очевидный и бюджетный шаг.

Однако, если мы думаем за долгосрочную стабильность и безопасность (ради чего всё и начиналось), имеет смысл посмотреть также в сторону отечественных микроконтроллеров. И вот почему:

Прямая замена пин-в-пин. Вместо китайских клонов есть смысл глянуть на тот же Миландр. Например, их серия К1986ВЕ91Т (Cortex-M0) или более мощные К1986ВЕ92ФИ (Cortex-M3) — с них выйдет отличная замена старым STM32F103. Под них уже есть горы готового софта, и не надо мучаться с китайскими библиотеками.

Свой RISC-V без сюрпризов. Если вам так сильно приглянулся RISC-V в чипах CH32V, то у нас сейчас активно продвигается проект “Амур” (MIK32) от Микрона. Для простых задач автоматизации и датчиков он подходит идеально, а логистика по нему идет полностью внутри страны, без таможен и банковских блокировок.

Техническая поддержка на родном языке. Архитектура CH32 хорошая, но китайская документация… У отечественных вендоров инженеры ответят сразу на понятном языке, вышлют нормальные схемы и помогут переписать код под проект.

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

Это актуально, когда нужен массовый отечественный продукт. Я ориентируюсь на проверенные временем TI, Infineon, NXP, Renesas, STM, Microchip, Gowin, Xilinx и тп

и током в несколько раз больше максимального тока обмотки. Рассматривается возможность применения транзистора IRF540NPBF.

В несколько - это не по инженерному, это что, запас, что ли?

ирф540 - разработка 70х, сейчас, наверное, в soic-8 есть аналоги, которым и радиаторы не понадобятся.

График зависимости коэффициента увеличения сопротивления перехода сток-исток от температуры

Это не переход, грубая ошибка

Время включения транзистора

Считается не по емкостям, а по Qgtot

Максимальное напряжение Uк, В

100

Для к73-17 и частоты 50кГц - максимальная амплитуда напряжения составляет 2В. то есть вот это

Эквивалентное последовательное сопротивление:

выкиньте

В документации рассеиваемая мощность не указана, но известны габариты 27.5мм*20мм 30мм. Это достаточно крупный корпус, можно грубо оценить рассеиваемую мощность в 1 Вт

Инженеры аплодируют Вам в лицо.

керамических шунтирующих конденсаторов малой ёмкости вплотную к контактам ключей для шунтирования ВЧ помех.

Параметр

Минимальное значение

Ожидаемое значение

Напряжение, В

100

100

Ёмкость, мкФ

11.2

18.8 (20.6)

почитайте про DC bias

надеюсь, в софтовой части всё не столь вопиюще)

1) Что значит не по инженерному? Придирка необоснованная

2) IRF540 старый , но очень хороший транзистор за свою цену 50р/шт. Покупать супер крутые ключи за 500р я не планировал.

3) Что значит не переход? Не вижу ошибку.

4) Как раз по ёмкости и заряду считается.

5) Где написано про 2 вольта? Откуда вы это взяли?

6) Я мог любую цифру ляпнуть, хоть 1, хоть 0.1 , я сам задаюсь рассеиваемой мощностью. Это инженерный рассчет, где слово "инженерный" = "приблизительный". Числа выбираются по совокупности факторов.

7) Я отлично знаю про DC bias, поэтому керамические конденсаторы взяты на номинальное напряжение 250 вольт. 100 вольт я написал для сборки в целом, потому что плёночные на 100, а они не склонны к DC bias.

1) Что значит не по инженерному?

Давай возьмём запас в сколько-то раз, наверное, проканает - вот это оно и есть, слова аксакала, а не инженера

2) IRF540 старый , но очень хороший транзистор за свою цену 50р/шт. Покупать супер крутые ключи за 500р я не планировал.

Нет. Сейчас за меньше доллара можно взять ключи, на порядок лучшие по FOM. Не говоря уже о монтаже теплоотвода. Это всё равно, как если б в качестве процессора использовать С51.

3) Что значит не переход? Не вижу ошибку.

Потому, что не знаете даже, что такое p-n-переход

4) Как раз по ёмкости и заряду считается.

Читайте мануал. Ёмкость - параметр линейного режима, а ключ работает внезапно в ключевом.

5) Где написано про 2 вольта? Откуда вы это взяли?

И опять - даташит

6) Я мог любую цифру ляпнуть, хоть 1, хоть 0.1 , я сам задаюсь рассеиваемой мощностью. Это инженерный рассчет, где слово "инженерный" = "приблизительный". Числа выбираются по совокупности факторов.

Я про "расчёт" допустимой мощности по габаритам.

Инженерный - ни в коем случае не приблизительный - это оптимальный по параметру "необходимая точность*затраты". Вы даже в этом показываете свой уровень(

7) Я отлично знаю про DC bias, поэтому керамические конденсаторы взяты на номинальное напряжение 250 вольт. 100 вольт я написал для сборки в целом, потому что плёночные на 100, а они не склонны к DC bias.

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

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

Даже, если у меня реально есть какие-то ошибки или излишние упрощения это не повод пытаться выставить меня идиотом.

Эта разработка не обязана была быть жемчужиной человеческой мысли, она не пойдёт в серию и не полетит в космос. Я вполне осознанно шёл на компромиссы и упрощал там, где по моему мнению можно упростить. Говорить, что я не знаю что такое p-n переход или DC bias это просто оскорбление.

Я всё обосновал, даже с даташитами, просто у Вас не хватает квалификации, чтоб это понять. Не буду спорить, исход всегда закономерен.

Я не писал идиот, я писал - грубая ошибка. И местами ещё сдерживался.

Я вполне осознанно шёл на компромиссы и упрощал там, где по моему мнению можно упростить. Говорить, что я не знаю что такое p-n переход или DC bias это просто оскорбление.

Тогда какие претензии к работе над Вашими ошибками??

Да, Вы не знаете, что такое p-n-переход, если путаете его с каналом полевика. И да, по Вашим расчётам - Вы не знаете, не учитывете DC-bias, это не оскорбление, много начинающих об этом и не слышали, никто не становится мастером сразу...

"Мужик, будь проще - к тебе тогда люди понятутся..." (C) Анекдот.

А по сути - если у тебя есть время и желание предложить улучшение в проект - то предлагай. Желательно не телеграфным стилем, а так чтобы тебя мог понять человек со средней подготовкой.

При этом объяснять что у полевого транзистора "не переход" - не нужно. Мы это все понимаем, но в разговорной речи (в отличие от экзамена на кафедре) - нам не слишком важно какая именно физика пускает или нет электроны в транзисторе. Поэтому мы говорим "переход", хотя понимаем что в полевом транзисторе это другое...

И какие у тебя проблемы с расчетом включения/выключения полевика по емкости затвора ? Ничего что заряд, емкость и напряжение связаны линейным законом ? Нашел в даташите Qtot - считай по нему. Нашел в даташите графики емкости от напряжения - считай по ним. Все равно получится примерно одно и то же (физику не обманешь методикой расчета).

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

Я вижу, что в 1ю очередь, этого желания нет у Вас, а помогать людям бесплатно или б@же упаси, без просьбы - скверная примета. Тыкать будете равным или подчинённым, с учителями говорить вежливо.

Ничего что заряд, емкость и напряжение связаны линейным законом 

Потом опять напишете - мы все понимаем, что не линейным, но говорим так, нам физика не важна)

  • базовое непонимание того, зачем в ДШ приводят 2 "связанные" велиичины.

 и не провоцировать механизм кармы на затыкание рта в принудительном порядке...

Молчать, чтобы не расстраивать идиотов - мотто современного мира)

Я занялся разработкой микрошагового драйвера ещё летом 2020 и не от хорошей жизни - китайцы попили моей крови на производстве. В процессе разработки было поставлено немало экспериментов, приносил на завод осциллограф, зажимали мощный шаговик в токарном станке и я снимал характеристики ЭДС холостого хода и нагрузки. Две платы управления ушли на свалку истории. Первый вариант с костыльным скалярным режимом заработал летом 2021, окончательно отлажен в октябре 2021, микроконтроллер К1986ВЕ92QI фирмы Миландр. Питание 220В, шаговые двигатели самого крупного 130мм типоразмера. Фрезер на таких шаговиках с моими драйверами проработал до конца 2024, потом был размонтирован по причине покупки заводом пятиосевого обрабатывающего центра.

Первый вариант на К1986ВЕ92QI
Первый вариант на К1986ВЕ92QI

На основе наработанного опыта, в ноябре 2023 был сделан драйвер на STM8S с "векторным" алгоритмом. Шаговики 57 габарита. На данный момент изготовлено пару десятков таких плат, последняя партия из десяти плат была смонтирована вообще без моего участия, но все платы заработали искаропки.

Специализированный драйвер ШД на STM8S
Специализированный драйвер ШД на STM8S

В мае 2024 заработал третий вариант микрошагового драйвера на обновлённом МК К1986ВЕ92FI, также под 57-е шаговики. Изготовлено только несколько опытных экземпляров, частота шагов до 50кГц (максимум 60), на входе быстродействующие оптроны К293ЛП8Р.

Третий вариант микрошагового драйвера на К1986ВЕ92FI
Третий вариант микрошагового драйвера на К1986ВЕ92FI

На всех моих микрошаговых драйверах микрошаг фиксированный 1/16, больше дробить шаг смысла нет из-за неравномерности магнитного поля между зубцами статора и ротора.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации