Продолжаем разработку контроллера сервоприводов MC50, о котором статьи здесь: Схема и плата контроллера Первые шаги по программированию контроллера  Развёртывание промежуточного программного обеспечения  Отладка взаимодействия с интернетом В контроллере применяется чип семейства Renesas Synergy S5D9, в нем есть специальный периферийный блок для 6-шагового управления. Освоим его.  По поводу этого есть много обучающих материалов. Например такой ролик или такой.6-шаговая коммутация на максимальной мощности мотора не требует никакой широтно-импульсной модуляции (ШИМ) и этим отличается от управления синусоидальным напряжением, где ШИМ требуется всегда.  6-шаговая коммутация требует значительно меньше вычислительных ресурсов процессора.  Ещё специальная 6-шаговая коммутация позволяет увеличить до двух раз скорость вращения ротора по сравнению с максимально достижимой при синусоидальном управлении. (9.5.6 Expended Speed Operation, Bimal K.Bose "Modern Power Electronics And AC Drivers", ISBN 0-13-016743-6 ) На заре появления BLDC моторы шли со встроенной схемой коммутации и прямо управлялись простейшей логикой от датчиков положения ротора без всяких микропроцессоров. Скорость вращения регулировалась изменением напряжения подаваемого на драйвер мотора. Это практически совпадало по характеристикам с управлением DC моторами. Отсюда и пошло название  brushless dc motor (BLDC).  На алиэкспрессе можно встретить так называемые BLDC моторы с тремя выводами. Это моторы с уже встроенным драйвером. Два провода питания и один управляющий.   В таких моторах уже применяется микросхема для управления силовыми транзисторами. В случае на фотографии стоит микросхема A4931. Схема мало-функциональна и на ней останавливаться не будем.  Мы выбрали для работы широко распространённый тип мотор-редуктора фигурирующего под названием “Planetary Gearbox Gear BLDC NEMA17 24V 90W Brushless DC Motor” на известных торговых площадках. Спецификация такого мотора  с планетарным редуктором выглядит так: Из спецификации следует, что мотор без нагрузки развивает скорость в 5000 оборотов в минуту. Поскольку у мотора 8 полюсов (т.е. 4 пары), то максимальная частота переменного сигнала на обмотках будет равна 5000*4 = 20000 об/мин или  333 Гц. Такую частоту и чуть больше мы должны обрабатывать с датчиков позиции ротора и с такой частотой обновлять состояние силового драйвера, т.е. каждые 3 мс. Для современных микроконтроллеров это  более чем достаточное время если не придётся выполнять сложную фильтрацию или управление по сложной модели.  Тип мотора проверяют по обратной ЭДС во время ручного прокручивания. У BLDC моторов ЭДС должна быть трапецеидального вида. Как здесь: Тут легко ошибиться пытаясь измерять обратную ЭДС между выводами мотора. Она может показаться синусоидальной. Но синус этот получается сложением двух трапецеидальных сигналов. Однако синус получается и сложением двух синусов. Поэтому измерять надо, как показано на рисунке ниже. Для этого придётся мотор распотрошить, найти в нем место соединения трех обмоток и припаяться к нему измерительным проводником.  После всех этих действий получили вот  такую осциллограмму.  Мотор совсем не демонстрирует характеристику BLDC. Это PMSM с чистой синусоидальной характеристикой. Видимо, сказывается конструктивная особенность ротора, который представляется собой намагниченный цилиндр без визуально выделенных полюсов. Из-за этого мы немного потеряем в эффективности при 6-шаговой коммутации.   Параметр Kv мотора будет равен ((362Hz/4poles paire)*60)/15V= 362 Кстати, сравнение 6-шаговой коммутации и векторного управления в применении к такому BLDC на похожей платформе можно найти  здесь. Преимущества FOC, как следует из документа, довольно призрачны.  Датчики Холла размещаются в промежутках между зубцами ротора. Особой точностью размещение не отличается.   Модель датчика можно прочитать на корпусе чипа.Это аналог хорошо документированной модели SS41F.  Датчики с открытым коллектором, поэтому на плате установлены резисторы подтяжки R60, R61, R62.    Подтяжка к +5 С целью увеличения амплитуды сигнала на фоне помех. Далее идёт делитель с фильтром снижающий размах сигнала до 3.3 В пригодный для подачи на микроконтроллер.  Фильтр создаёт некоторое запаздывание сигнала, но без него могут присутствовать сильные помехи в сигнале. Сами сенсоры имеют некоторый разброс чувствительности и могут быть установлены с некоторым произвольным наклоном. Все это провоцирует возможность запуска вращения мотора с неправильной последовательностью коммутации. При этом момент силы развиваемый мотором может не сильно отличаться от момента развиваемого при правильной коммутации. Единственным признаком ошибочной коммутации может служить повышенный в несколько раз ток потребления. Но поскольку по абсолютной величине ток остаётся приемлемым, в пределах 1-2 А, то не зная истинного нормального тока  может показаться, что все  нормально. Однако попытавшись туже последовательность коммутации подать в реверсном направлении вращение не начинается. А это уже верный признак неверной коммутации.  Полюса находятся на роторе. На статоре находятся зубцы. Не всем это сразу понятно. И автор тоже тут немного лагал в начале. Бывает что ссылаются на количество пар полюсов. Например у 4-полюсного ротора будет две пары полюсов. Ну и естественно у ротора всегда чётное количество полюсов. А вот зубцов может быть нечётное количество. В интернетах трудно встретить описание коммутации, где ротор был бы не 4-полюсный 6-зубцовый (ну всем так проще рисовать). Даже 2-полюсный 3-зубцовый рисуют, хотя промышленно таких моторов не делают. И конечно не сообщают, что для вращения ротора с другим количеством полюсов в том же направлении понадобится другая таблица коммутации.  Существует множество комбинаций полюсов и зубцов. Вот неполная таблица найденная в интернете И беда в том что купленный в следующей партии мотор той же марки может быть с ротором содержащим иное количество полюсов (ведь цельно-литой ротор очень легко перемагнитить). Он будет абсолютно рабочим, но станет крутить не в ту сторону и не с той скоростью.  Надо быть готовым оперативно поменять в программе способ коммутации чтобы адаптироваться к новой конфигурации. Но в целом чем больше полюсов на роторе тем он тише и плавнее вращается.    Хороший источник информации по конфигурации полюсов, зубцов, слотов и обмоток BLDC моторов - книга  Dr. Duane Hanselman "BrushlessPermanent MagnetMotor Design. Second Edition", ISBN 1-881855-15-5 В микроконтроллерах семейства  Renesas Synergy S5D9 есть периферийный блок под названием Output Phase Switching (OPS).  Если в обычных микроконтроллерах для управления 6 сигналами управления драйвером двигателя требуется минимум таймер с 3 компараторными блоками с взаимно инвертированными выходами, то тут нужен всего один компаратор и не используются выходы компараторов. Это экономит ресурсы таймеров для других задач с одой стороны и не приводит к асинхронности перестройки компараторов с другой. Однако таблица коммутации в S5D9 всего одна. Если мотор надо крутить только в одну сторону, то можно полностью отказаться от услуг процессора и заставить крутиться мотор автоматически по сигналам с датчиков положения ротора (датчиков Холла в нашем случае). Но если надо изменять направление вращения ротора, то придётся по прерываниям от датчиков Холла явно выбирать строку с таблице коммутации. И тут поджидает проблема приведения в соответствие позиции строк сигналам от датчиков Холла.      Иногда можно слышать от "специалистов" по асинхронным моторам, что для изменения направления достаточно поменять просто фазы на моторе. С BLDC так не работает. Просто поменять фазы мотора нельзя. Не сработает даже если поменять местами произвольные фазы и на моторе и от датчиков Холла.  Поменять можно только взаимно связанные фазы мотора и датчиков Холла, но это уже не так дёшево схематически.  Ниже дана диаграмма использованная для определения последовательности переключений транзисторов драйвера и отображения битовых масок совокупности сигналов с датчиков Холла на строки встроенной таблицы коммутаций микроконтроллера.   Программирование таймера с компараторами для модуля OPS делается довольно просто если не пользоваться API  с лишними слоями абстракции. В коде ниже инициализируется работа таймера в треугольно-волновом режиме. Т.е. таймер периодически сначала инкрементируется, а потом декрементируется. Тут же настраивается компаратор для сигала триггера АЦП. Сам OPS инициализировать не нужно. У OPS всего один регистр и он записывается нужным значением сразу в прерывании вызываемом по окончании  преобразования АЦП. Прерывания АЦП служат и для смены состояния коммутации силовых транзисторов.  По датчикам Холла прерывания не используются. Поскольку сигналы с датчиков приходят асинхронно с ШИМ, то мгновенная реакция на изменение состояния датчиков Холла приводила бы часто к необходимости укорочения импульсов ШИМ и изменениям в периоде выборки АЦП. А как показано ниже синхронность и предсказуемость работы АЦП очень важны.    Существуют разные способы коммутации силовых транзисторов во время подачи ШИМ. Четыре способа показан на рисунке ниже. Все начинаются с одного и того же состояния в фазе нарастания тока в катушке мотора, но отличаются тем как коммутируется катушка в фазе спада тока.   В режиме  жёсткой коммутации (feedback mode в некоторой литературе)  ШИМ подаётся и на верхние и на нижние плечи. Ток обмоток при низком уровне импульса ШИМ рассасывается в шину питания через диоды верхних и нижних транзисторов либо через замкнутые противоположные транзисторы. Спад тока происходит быстро. Управление током можно обеспечить максимально быстрое.  В режиме мягкой коммутации  (freewheeling mode) ШИМ подаётся только на верхние транзисторы и ток обмоток при низком уровне импульса ШИМ закорачивается через нижний открытый транзистор и диод другого нижнего транзистора либо через оба нижних транзистора. Здесь также можно сделать наоборот и подавать ШИМ на нижние транзисторы и оставлять открытым верхний. Спад тока происходит медленней, но и управление получается с запаздыванием.  Мягкая коммутация основной нагрев переводит на мотор.  Модуль OPS микроконтроллера позволяет выполнять управление в обоих режимах, но не все способы, и необходимо использовать прерывания.  По умолчанию мы применяем жёсткую коммутацию способом 1. В этом случае происходит максимально быстрое рассасывание тока катушки мотора.  Момент силы мотора прямо пропорционален току через обмотки мотора, если управление правильное. Поэтому управляя током мы управляем моментом силы или скоростью если момент постоянный. А током мы управляем изменяя напряжение с помощью ШИМ на обмотках двигателя добиваясь нужного значения тока. Все это происходит динамически и быстро с элементами предсказания, эвристиками, фильтрацией и элементами шаманства. И чем мы точнее и быстрее измеряем ток, тем меньше ухищрений и ресурсов процессора приходится тратить.    Очень точно измеряют сигма-дельта АЦП. И они дешёвые. Но это опасный соблазн. Коммутация силовых транзисторов - это сплошное нагромождение шума, даже когда нет ШИМа. Дешёвые сигма-дельта АЦП сэмплируют по одному биту, но с высокой частотой поэтому они захватывают моменты переходных процессов из-за чего в сигнале получают гораздо больше шума.     Общепринятым способом является синхронизированное с ШИМ измерение. Выборку АЦП выполняют по середине импульсов ШИМ модулятора. В это время не происходит переключение транзисторов и как будто не должно быть никаких помех.  Но помехи все же будут, они возникают при резонансных осцилляциях в тех обмотках в которых происходит прерывание тока. Но семплирование в этих точках с одной стороны можно игнорировать, с другой стороны помехи в эти моменты не так мощны. Другой проблемой является длительность выборки отсчётов АЦП. АЦП микроконтроллера многоканальное. Нам нужно за время покоя оцифровать множество сигналов, это не только токи мотора, но значения с датчиков температуры, с датчиков напряжения, с серво-сенсора и т.д.  Это занимает до десятка микросекунд. Значит минимальная длительность активного импульса не может быть слишком маленькой. Т.е. коэффициент заполнения не должен быть меньше 10% при частоте ШИМ 16 КГц, иначе какие-то отсчёты  попадут на момент коммутации.  Ведь можно просто использовать ШИМ по счётчику с нарастанием и сбросом, т.е. по пилообразному сигналу. Это просто и понятно.  Но проблема возникает тогда с синхронизацией работы АЦП. Triangle-wave PWM - так называется этот режим у Renesas, у других можно встретить определение как симметричный ШИМ. Симметричный ШИМ нужен для того чтобы выборки АЦП можно было привязать ровно к середине импульса и периодичность выборок не колебалась бы при изменении скважности.    Сама процедура обслуживания прерывания АЦП не сложная и выглядит вот так: Связь между АЦП и таймером GPT0, который вырабатывает ШИМ для модуля  OPS, происходит посредством модуля Event Link Controller (ELC). ELC - это отдельный модуль в наборе периферии чипа предназначенный для управления маршрутизацией дискретных сигналов между различной периферией.   Всего модуль на входе может оперировать 511 сигналами и перенаправлять их на 19 определенных получателей. Среди получателей есть оба набортных АЦП по два выделенных сигнала каждому (у каждого возможно организовать две группы с отдельными конфигурациям сканирования)  Старт выборки АЦП инициируется сигналом ELC_EVENT_GPT0_AD_TRIG_A (184) исходящим из таймера GPT0 в момент когда его значение совпадёт со значением регистра компаратора триггера АЦП. В таймерах GPT есть специальные регистры компараторов для генерации вспомогательных сигналов  именно для отправки на АЦП.   Инициализация АЦП выглядит так: Важный момент заключается в том что чип S5D9 способен одновременно сэмплировать до 6 аналоговых сигналов. Это позволяет избавиться от ошибки при последовательном измерении, возникающую у обычных микроконтроллеров с 2-х модульными многоканальными АЦП.  Взятые семплы потом последовательно оцифровываются один за другим.  Остальные каналы сэмплируются и оцифровываются последовательно один за другим без паузы. В сумме весь процесс взятия выборок и оцифровки занимает при текущей настройке около 2 мкс. Уменьшение времени выборки может ухудшить точность измерения.  Порядок семплирования определяется номером канала. Каналы с меньшим номером семплируются первыми. Кроме того сэмплируются ещё внутренние каналы встроенного датчика температуры и референсного напряжения. Они сэмплируются последними.   Продолжение следует...