Обновить

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

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

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

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

Единственное в чем наверное разочарую - компилятор скорее всего вырезал ваши трюки с кешированием переменных при расчете. Там конечно надо посмотреть ассемблерный листинг, но в большинстве случаев оно прекрасно видит ситуации когда идет цепочка присваиваний 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 "связанные" велиичины.

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

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

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

Публикации