Речь о том, как управлять включением и скоростью двигателя постоянного тока на примере сервопривода MC50 так, чтобы сервопривод не сгорел. Несмотря на то, что MC50 был разработан для управления BLDC моторами, он также хорошо подходит и для управления коллекторными двигателями постоянного тока мощностью до 600 Вт. Правда для этого пришлось сделать некоторые незначительные модификации.

Все статьи по открытому проекту MC50 здесь:

Во-первых, сопротивление шунтов в измерителях тока фаз было уменьшено до 1 мОм.
Во-вторых, MOSFET транзисторы CSD18540Q5BT в 3-фазном мосте были заменены на более продвинутые и недавно выпущенные STL320N4LF8. Эти транзисторы отличает уникально низкое сопротивление открытого канала - всего 0.8 мОм, при таком же быстродействии и даже выше чем у CSD18540Q5BT. Благодаря этому на мощностях до 400 Вт и чуть выше сервоприводу не нужен вентилятор. А когда мощность требует вентилятора, то его можно подключить между оставшейся свободной фазой W и клеммой GND.

В текущей версии программы мотор можно включать и выключать в ручном режиме с платы используя ручной энкодер, из управляющей программы Freemaster и по интерфейсу CAN. Для управления скоростью вращения коллекторные двигатели вместо 3-фазных датчиков холла оборудуются 2-фазными датчиками с квадратурным сигналом.

В программе при выборе типа приложения DC traction motor будет проводится измерение скорости с квадратурного энкодера подключённого к линиям W и V. Сам мотор подключается к клеммам U и V. В данном случае получается полный мост и мотор можно вращать в обоих направлениях.

Осторожно с модуляцией!

Скоростью мотора управляем изменяя коэффициент заполнения ШИМ. Когда хотим получить полную мощность ШИМ отключаем и оставляем статические включённые транзисторы. В традиционных драйверах такое могло привести к падению напряжения в бустерах верхних ключей и их закрытию, поскольку они подзаряжаются только при наличии ШИМ. Но в нашей схеме применена микросхема драйвера 3-фазного моста TMC6200, которая сама создаёт нужное напряжение для верхних ключей без необходимости ШИМ. Это плюс.

Но есть другая проблема - мёртвое время. Мёртвое время обеспечиваемое микросхемой TMC6200 слишком мало для мощных MOSFET применяемых на плате. Дополнительное мёртвое время создаётся в ШИМ генераторах микроконтроллера. Это стандартная фича. Нестандартно здесь будет обеспечить переход из ШИМ в статические сигналы и обратно.
Когда плавно повышаем ШИМ до 100%, то в конце процесса нужно выставить статический сигнал, чтобы в одном плече все время был открыт верхний транзистор, а в другом плече нижний.

Тут может оказаться, что микроконтроллер не справляется с такой задачей без установления на доли микросекунды одновременного высокого уровня на верхнем и нижнем транзисторах использую штатные возможности таймеров. Также следует рассмотреть выход из статических сигналов на формирование ШИМ и ситуации переключения из одной статической конфигурации сигналов к противоположной. Есть опасность коротких (наносекундных), но очень мощных сквозных токов.

Диаграмма описывающая корректную вставку мёртвого времени при обычной ШИМ модуляции. Но на ней не видно что будет если модуляцию отключить.
Диаграмма описывающая корректную вставку мёртвого времени при обычной ШИМ модуляции. Но на ней не видно что будет если модуляцию отключить.

В случае нашего микроконтроллера Renesas Synergy выход был найден в быстром переключении функции портов с периферийной функции на функцию общего ввода вывода с явной очерёдностью установки уровней сигналов.

Выглядит это так, на примере одной фазы:

/*-----------------------------------------------------------------------------------------------------
  Установка состояния на выходе фазы U 3-фазного инвертера

  val =   0     - нижний ключ постоянно открыт, верхний постоянно закрыт
  val = 100     - нижний ключ постоянно закрыт, верхний постоянно открыт
  val =  -1     - нижний ключ постоянно закрыт, верхний постоянно закрыт
  0 < val < 100 - На выходе сигнал ШИМ с коэфициентом заполнения равным val в процентах
                  Установка ШИМ буфферизирована, и вступит в действие после окончания текущего цикла ШИМ

-----------------------------------------------------------------------------------------------------*/
void Phase_U_mode(int32_t val)
{
  if (val >= 100)    gpt0_out_mode = FL_PHASE_PULL_UP;
  else if (val == 0) gpt0_out_mode = FL_PHASE_PULL_DOWN;
  else if (val < 0)  gpt0_out_mode = FL_PHASE_Z_STATE;
  else
  {
    val =(gpt_pwm_cycle_set * (100 - val)) / 100;

    // Не даем прекратиться PWM и не даем импульсу стать слишком коротким
    if (val < MIN_PWM_COMPARE_VAL)
    {
      val = MIN_PWM_COMPARE_VAL;
    }
    else if ((gpt_pwm_cycle_set - val) < MIN_PWM_COMPARE_VAL)
    {
      val = gpt_pwm_cycle_set - MIN_PWM_COMPARE_VAL;
    }
    R_GPTA0->GTCCRC = val;
    gpt0_out_mode = FL_PHASE_PWM_ON;
  }
}


/*-----------------------------------------------------------------------------------------------------
  Функция вызываемая из обработчика прерывания для приведения выходов к заданному задачей управления состоянию

  \param mode
-----------------------------------------------------------------------------------------------------*/
void Set_output_U(uint8_t mode)
{
  uint32_t  tmp_H = R_PFS->P415PFS;
  uint32_t  tmp_L = R_PFS->P414PFS;
  switch (mode)
  {
  case FL_PHASE_PULL_UP   :
    // Для фазы U устанавливаем P415 (UH) в 1, P414 (UL) в 0
    tmp_H = tmp_H & ~(LSHIFT(0x1F,24) | BIT(16));
    tmp_H = tmp_H | BIT(2) | BIT(0);

    tmp_L = tmp_L & ~(LSHIFT(0x1F,24) | BIT(16) | BIT(0));
    tmp_L = tmp_L | BIT(2);

    R_PFS->P414PFS = tmp_L;  // Записываем состояние выхода в порт данного выхода
    __DSB();                 // Оператор Data Synchronization Barrier (DSB) необходим для гарантии установления состояния выхода
                             // до того как начнет выполняться следующая инструкция
    R_PFS->P415PFS = tmp_H;
    __DSB();
    break;
  case FL_PHASE_PULL_DOWN :
    // Для фазы U устанавливаем P415 (UH) в 0, P414 (UL) в 1
    tmp_H = tmp_H & ~(LSHIFT(0x1F,24) | BIT(16) | BIT(0));
    tmp_H = tmp_H | BIT(2);

    tmp_L = tmp_L & ~(LSHIFT(0x1F,24) | BIT(16));
    tmp_L = tmp_L | BIT(2) | BIT(0);

    R_PFS->P415PFS = tmp_H;
    __DSB();
    R_PFS->P414PFS = tmp_L;
    __DSB();
    break;
  case FL_PHASE_Z_STATE       :
    // Для фазы U устанавливаем P415 (UH) в 0, P414 (UL) в 0
    tmp_H = tmp_H & ~(LSHIFT(0x1F,24) | BIT(16) | BIT(0));
    tmp_H = tmp_H | BIT(2);

    tmp_L = tmp_L & ~(LSHIFT(0x1F,24) | BIT(16) | BIT(0));
    tmp_L = tmp_L | BIT(2);

    R_PFS->P414PFS = tmp_L;
    __DSB();
    R_PFS->P415PFS = tmp_H;
    __DSB();
    break;
  case FL_PHASE_PWM_ON       :
    // Для фазы U переключаем P415 (UH) и P414 (UL) в режим управления периферией

    // Перепрограммирвать режим портов только если он не был уже в заданном состоянии
    if (((tmp_H >> 24) & 0x1F) != PSEL_03)
    {
      // Если выход H был установлен в 1, то предварительно установить его в 0
      if (tmp_H & BIT(0))
      {
        tmp_H = tmp_H & ~(LSHIFT(0x1F,24) | BIT(16) | BIT(0));
        tmp_H = tmp_H | BIT(2);
        R_PFS->P415PFS = tmp_H;
        __DSB();
      }

      // Если выход L был установлен в 1, то предварительно установить его в 0
      if (tmp_L & BIT(0))
      {
        tmp_L = tmp_L & ~(LSHIFT(0x1F,24) | BIT(16) | BIT(0));
        tmp_L = tmp_L | BIT(2);
        R_PFS->P414PFS = tmp_L;
        __DSB();
      }

      tmp_H = tmp_H & ~(LSHIFT(0x1F,24) | BIT(0));
      tmp_H = tmp_H | BIT(16) | BIT(2) | LSHIFT(PSEL_03,24);

      tmp_L = tmp_L & ~(LSHIFT(0x1F,24) | BIT(0));
      tmp_L = tmp_L | BIT(16) | BIT(2) | LSHIFT(PSEL_03,24);

      R_PFS->P414PFS = tmp_L;
      __DSB();
      R_PFS->P415PFS = tmp_H;
      __DSB();
    }
    break;
  }
}

Осторожно с разгоном!

Подавать напряжение на двигатель постоянного тока надо с осторожностью. При резкой подаче даже половинного от номинального напряжения возникает импульс тока через мотор почти в два раза превышающий его максимальный рабочий ток.

Старт вращения ротора без стадии разгона. Заполнение ШИМ = 50%
Старт вращения ротора без стадии разгона. Заполнение ШИМ = 50%

Если увеличить напряжение ещё на 10%, то ток уже достигает величины на пределе безопасной работы силовых элементов драйвера.

Старт вращения ротора без стадии разгона. Заполнение ШИМ = 60%
Старт вращения ротора без стадии разгона. Заполнение ШИМ = 60%

Отсюда следует, что запускать мотор постоянного тока следует плавно. Причём даже увеличивая по шагам заполнение ШИМ всего на 1%, можно наблюдать импульсы тока на моторе величиной около 1 А. Поэтому график мощности потребления и тока, показанный ниже, имеет странную пилообразную структуру.

Старт вращения ротора со стадией разгона. Заполнение ШИМ в конце  = 100%
Старт вращения ротора со стадией разгона. Заполнение ШИМ в конце = 100%

Осторожно с торможением!

Если мотор удалось без происшествий разогнать, то теперь задача его остановить. Резкая остановка закорачиванием обмоток работает неплохо, но вызывает сильный удар способствующий ускоренному разрушению ведущего вала при наличии инерционной нагрузки. Поэтому применяют контролируемое замедление снижением напряжения (уменьшая коэффициент заполнение ШИМ). И здесь поджидает обратная ЭДС.

Если мы попытаемся останавливать быстрее чем останавливается мотор при свободном выбеге (когда все транзисторы в драйвере отключаются), то можем получить обратную ЭДС амплитудой превышающей выносливость питающего источника или пробить силовые транзисторы.

График торможения с уровня ШИМ 40% до 0 за 0.7 сек
График торможения с уровня ШИМ 40% до 0 за 0.7 сек

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

Никогда не забываем о температуре.

На итальянском моторе может быть такая надпись: SERVIZIO S3 25%. На других моторах символы S3 могут встретиться также. Это говорит о том, что мотор не предназначен для постоянной работы. Если его держать с номинальной скоростью в течении, скажем, часа, то он просто сгорит. Поэтому на мотор тоже надо ставить термосенсор. Можно, конечно, следить в программе сколько там процентов времени проработал мотор, но это скорее всего приведёт к недобору ресурса по температуре и более частым отказам в исполнении команд. В нашем сервоконтроллере есть специальный вход для подключения NTC резистора 10 КОм.

Далее можно столкнуться с перегревом самого сервоконтроллера. На плате установлен измерительный термистор рядом с силовыми транзисторами. Кроме этого термосенсор интегрирован в самом микроконтроллере и присутствует защита от перегрева в микросхеме драйвера TMC6200. Следует помнить, что длительный перегрев хуже всего влияет на электролитические конденсаторы, которые быстро теряют свой ресурс при 100 и более град.
Установленные конденсаторы типа EEE-FT1H331AP имеют ресурс 2000 часов при 105 град. С. Несмотря на то, что наш двигатель называется двигателем постоянного тока, его ток потребления при постоянном напряжении все равно импульсный. И амплитуда импульсов достигает десятка ампер. Поэтому импульсная нагрузка на конденсаторы не намного меньше чем в 6-шаговом управлении BLDC моторами. Т.е. конденсаторы греются не только через плату от транзисторов и шунтов, но и сами по себе. В программе реализовано управление вентилятором с клеммы W и задаётся таймаут отключения вентилятора после остановки мотора.

Положение термистора на плате
Положение термистора на плате

Все исходные тексты проекта находятся здесь. В проекте сохранена также функциональность всех предыдущих демонстраций серво управления BLDC и все промежуточное программное обеспечение включая RTOS и сетевые стеки. Переключение между управлением BLDC и DC моторами производится в энергонезависимых настройках. Кроме того добавлено дистанционное управление по CAN с одного сервоконтроллера другим сервоконтроллером.

Комментарии (23)


  1. BelerafonL
    18.10.2023 07:35
    +5

    Почитал рассуждения про мёртвое время, что есть опасность, что оно может в каких-то случаях не выдерживаться, и поэтому автор перешел на прямое управление портами ввода-вывода (костыль крайней меры). Как электроприводчик, который каждый день это программирует, могу сказать что такое поведение микроконтроллера - нонсенс. В микроконтроллерах модуль мёртвого времени как раз и делают для того, чтобы оно выдерживалось вообще всегда, при любых, каких угодно изменениях уставок сравнения таймеров ШИМ. И пользователь навсегда забывал об опасности сквозных токов. С Renesas Synergy не работал, но во всех других микроконтроллерах, что мне доводилось использовать, мёртвое время было гарантировано и работало вообще всегда. Иначе такой микроконтроллер на выброс. Для включения наглухо нижнего или верхнего ключа достаточно задать уставку сравнения равной нулю или периоду таймера. Всё.

    Думается, автору нужно лучше перечитать даташит на модуль ШИМ и обойтись штатными средствами выдерживания мёртвого времени. Нужно обратить внимание на использование теневых (буферных) регистров сравнения - чтобы новая уставка сравнения начинала отрабатываться не в момент записи в регистр программой, а на следующем периоде ШИМ при переходе таймера через ноль.

    Если же действительно мёртвое время не выдерживается, то надо локализовать место и сделать минималистический демо-пример ошибки, снять осциллограммы с выхода микроконтроллера для управления верхним и нижним ключом и писать производителю микроконтроллера. Это слишком серьезная "бага".


    1. Indemsys Автор
      18.10.2023 07:35

      Понимаю вашу озабоченность. Я сам был шокирован. Ведь в мануале на Renesas Synergy очень чётко прописаны алгоритмы действий PWM генератора при загрузке нуля или загрузке максимального значения. Там все правильно. Устанавливается либо 0 либо 1 на выходе. Но вот учитывается ли при этом мёртвое время ничего не сказано.

      В Renesas Synergy есть и буферизация записи в регистры сравнения, и даже двойная буферизация. Я в в статье специально отметил в комментарии это в строке с записью в регистр сравнения (по видимому даже профессионалы не смотрят код в статьях).
      И конечно я осциллографом тщательно тестировал эти моменты.

      Более того в Renesas есть регистры где можно задать заранее на следующем такте сравнения как должны сработать выходы: переключиться, упасть в 0, установиться в единицу. И это тоже не сработало. Все равно есть моменты когда единица и на верхнем и на нижнем сигналах управления при определенный сценариях. (хитрость в подборе сценариев)

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

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

      Кстати, в Synergy есть отдельный модуль формирования мёртвого времени (дополнительно к штатному в таймерах). Он работает железно. Но его максимальное мёртвое время слишком короткое для применения с транзисторами драйвера мотора.


      1. BelerafonL
        18.10.2023 07:35
        +1

        Как говорится, понятно, вычёркиваем. (из планов смотреть на эти контроллеры).

        Но производителю я бы написал - на форуме или где там принято, зарегаться с гугловской почты и подробно расписать проблему. С примером кода, осциллограммами и вариантами что пробовали. Всё равно я уверен на 95%, даже после вашего ответа, что решение есть и штатный модуль мёртвого времени должен работать.


        1. Indemsys Автор
          18.10.2023 07:35

          С другой стороны а почему должен? Ведь это уже не ШИМ. А мёртвое время обещают только для ШИМ.

          Да и вообще в микроконтроллерах в периферию защиту от дураков вставлять не принято. В любой периферии можно что-то сломать неправильно установив штатные регистры. Писать каждый раз производителю?

          Я работал и с STM32 и с Kinetis и с LPC и с i.MX. Везде с таймерами есть нюансы требующие исследований. В Renesas, кстати, удобней чем c STM32. В Renesas в ШИМ-ах стоят везде 32-битные таймера вместо 16-битных.

          Думаю проблему сбоев мёртвого времени плохо замечают потому что её маскируют микросхемы драйверов, которые всегда есть между микроконтроллером и транзисторами. Я бы сам не обратил внимания если бы не сильный перекос во времени отрывания и закрывания у мощных транзисторов.


          1. BelerafonL
            18.10.2023 07:35
            +1

            В мощных преобразователях частоты (сотни вольт и ампер) драйвера сами мёртвое время не вставляют - видел такое, но очень редко. Более того, есть драйверы независимые на один ключ, которые про ключ соседний и его сигналы управления ничего не знают. Если бы такая серьезная бага была в микроконтроллере, который претендует на управление электродвигателями, то её заметили бы если не первые, то вторые пользователи. А если микроконтроллер с его устоявшейся периферией ШИМ существует уже много лет, то это намекает, что там должно быть с этим всё ок. Касаться уставкой сравнения нуля или периода таймера - не какая-то экзотическая ситуация, а прямо скажем каждодневная.


            1. Indemsys Автор
              18.10.2023 07:35

              Где сотни вольт и ампер в принципе другая схемотехника. Там и мультифазные и многоступенчатые преобразователи и FPGA с собственными реализациями ШИМ и внешний interlock protection. А в киловатных трехфазниках драйвер со своим мёртвым временем это прямо стандарт- https://habr.com/ru/articles/597757/


              1. BelerafonL
                18.10.2023 07:35
                +1

                Да нет, где сотни вольт и ампер ставят обычный микроконтроллер и прямо его ШИМ выходы A, B ведут на управление драйверов ключей. Вот где больше тысячи вольт и ампер - там приходится делать многоуровневый инвертор и некоторые разработчики применяют ПЛИС. Но мы делаем и то и другое напрямую на микроконтроллерах (обычно Texas, но и на других делали) без дополнительных аппаратных блокировок мёртвого времени. И ни разу проблемы со сквозняками не было. Как в периферийном модуле мёртвого времени МК задали, так оно и получается.

                Советую всё же сделать пример, воспроизводящий проблему и опубликовать на форумах ренесанса, а сюда кинуть линк - мы с коллегами тоже глянем на воспроизводящий баг код и осцы. Желательно, чтобы кода было не больше страницы - инит и запуск ШИМ на 50% скважности, и после программной задержки в несколько периодов ШИМ воспроизведение баги за счёт изменения уставки сравнения. Такой код был бы легко читаем и воспроизводим.


                1. Indemsys Автор
                  18.10.2023 07:35

                  Я посмотрел чип TMS320F28335 на котором вы делаете свой контроллер.
                  В их ePWM есть всего один модуль обеспечивающий мёртвое время Dead-band (DB). Очень похожий есть и в Renesas Synergy - PWM Delay Generation Circuit. Но у него слишком маленький максимальный интервал 8 ns на штатной частоте. Я с ним не работал, но по описанию там все будет в порядке. Я просто не склонен снижать штатную частоту.

                  Если же в TMS320 не использовать DB, то они тоже костыль предлагают типа загрузки в верхний и нижний компараторы разных значений чтобы сдвинуть фронты. Это по времени займёт даже больше чем моё перепрограммирование портов поскольку требует вычислений.

                  Так что в Renesas Synergy есть два аппаратных механизма обеспечения мёртвого времени против одного в TMS320. Просто один из них работает не так как я ожидал.

                  И есть ещё нюанс небольшой. Нюанс для случая когда применяется симметричный ШИМ и выборки АЦП прецизионно посередине импульса. В этом случае задержки вызванные модулем типа Dead-band (DB) в TMS320 смещают момент выборки от центра импульса. Получаются измерения тока искажённые.
                  А вот генератор мёртвого времени в Synergy делает не задержку, а упреждающую генерацию фронта. Т.е. выборка АЦП всегда строго по центру при любой длине импульса и с любым мёртвым временем.

                  Получается в TMS320 чтобы удержать выборку по центру придётся делать перерасчёты для регистра компаратора генератора событий выборки АЦП. А это гораздо дороже по времени чем перепрограммировать порты.

                  Но спасибо за дискуссию.


                  1. BelerafonL
                    18.10.2023 07:35
                    +2

                    В тексасах типа TMS320F28335 мы вполне комфортно задаём мёртвые времена (МВ) порядка единиц микросекунд. Типичное мёртвое время для мощных ключей на киловольт и килоампер 4мкс. Ни о каких ограничениях типа наносекунды речи не идёт. Частоту тактирования таймеров ШИМ мы иногда понижаем раза в 2-4 относительно частота ядра. Но не чтобы обеспечить большое мёртвое время, там регистра и так хватает, а чтобы сделать очень низкие частоты ШИМ порядка 1кГц.

                    Я не очень понял, к чему относилось "Но у него слишком маленький максимальный интервал 8 ns на штатной частоте" - у него это у тексаса или ренессанса? Очень странное короткое мёртвое время. Неюзабельное я бы сказал. 8наносекунд это что, несколько десятков тактов ядра? Там регистр мёртвого времени 8 бит что ли, притом что таймеры 32 бита? Какая частота ядра? У тексаса 100-200Мгц.

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

                    По поводу центрирования момента измерения тока в середине периода таймера (или нуля, смотря как полярность настроена). Да, это стандартный способ измерения токов в шунтовых датчиках тока в нижних ключах инвертора. И да, мёртвое время без магии упреждения сдвигает центр импульса немного относительно периода таймера. Но целиться ровно-ровно в середину импульса по нашему опыту неверно - есть задержка в переходном процессе на операционниках, т.е. после того, как нижние ключи включились, и типа можно измерять, надо выждать паузу на устаканивание сигнала на входе АЦП микроконтроллера - дождаться, пока включится ключ, потекут токи по резистору шунтовому, операционник отработает и зарядит выходной кондер на входе АЦП. Поэтому в общем случае мы всегда в таких задачах запускаем АЦП от отдельного таймера, который сдвинут относительно таймеров ШИМ на заданную пользователем задержку. И подбираем этот сдвиг опытным путём в зависимости от настроек МВ, задержки операционников, времени коммутации ключей и т.п.

                    А порты перепрограммировать просто опасно - нет гарантии, что вы сделали это правильно для всех-всех случаев, и что кто-то помимо вас, кто полезет в проект, эту тонкую настройку не сломает приоритетом прерываний, сменой частоты ШИМ или чем-то таким. Аппаратное МВ в периферийном модуле микроконтроллера имеет сильно большую защиту от дурака и надёжность. Очень странно, что там 8нс. Что-то не так... Этого никому не хватит. Притом, что в микроконтроллере продуманы аж такие вещи как упреждение генерации фронта МВ, странно что длительность МВ такая маленькая.


                    1. Indemsys Автор
                      18.10.2023 07:35

                      Микроконтроллеры TMS320F28335 как и Renesas Synergy разрабатывались не только для моторов, это подчеркивается прям в начале их описаний.

                      И есть такие технологии, как преобразователи энергии типа ZVSFB конвертеров. Так вот в них частота ШИМ более 100 Кгц. И там очень важно иметь хорошее разрешение. Вот тогда и нужны прецизионные регулируемые формирователи задержек в единицы наносекунд.

                      С другой стороны если думать о сертификации для домашней автоматизации, то для уменьшения электромагнитного шума очень полезна техника дитеринга или хотя бы фазового смещения фронтов в 3-фазных мостах. И вот +-8 нсек очень могут помочь реализовать смещение, при этом оно не сильно скажется на точности измерений.

                      Очень странно что вы подбираете сдвиг момента выборки АЦП опытным путем да еще при таких низких частотах модуляции. Там все четко планируется и рассчитывается. Время установления ОУ на датчиках тока и его CMRR - одни из самых кричных параметров. В моем случае это 2-4 мкс. Поэтому импульсы короче 8 мкс у меня запрещены. Длительность выборки тоже точно специфицируется. В даташитах для расчёта этого времени всегда дают точные формулы. Я конечно не прям по центру запускаю АЦП а с упреждением на длительность выборки. И у меня синхронный 3-х фазный вход на АЦП. Никаких неточностей быть не может. Это особенно важно для векторного безсенсорного управления с очень плавными разгонами и прецизионным позиционированием. В самосвалах может быть это не так актуально, тут спорить не буду.

                      Если посмотрите те же апноты от TI для микроконтроллеров TMS320F28335, то увидите что они используют прерывания с частотой 200 Кгц в тех же конвертерах ZVSFB. И в этих прерываниях производят перерасчет для регистров ШИМ. Но это же так опасно трогать регистры исходя из вашей точки зрения, а если ошибутся? . Или вы думаете что есть менее опасные регистры и более опасные регистры в микроконтроллерах?


                      1. BelerafonL
                        18.10.2023 07:35

                        Никто не запрещает делать задержки по 8 нсек, имея просто достаточные опции по делителям таймеров и достаточные регистры мёртвого времени. В тексасе нету проблемы сделать МВ как 8нс, так и 8мкс. Кроме того, в новых микроконтроллерах тексаса появился ШИМ высокого разрешения HRPWM, где можно отмерять ширину импульса с разрешением внутри одного такта процессора. Мой посыл в том, что странно что в микроконтроллерах ренесанс из-за ограничения МВ на максимальную шину 8нс приходится изобретать программные костыли. Мы делали проекты с частотами ШИМ от 1 до 500кГц на тексасах и ни в какие такие ограничения не попадали, чтобы нам МВ или разрешения таймера ШИМ не хватало, и от этого прям портилась точность задания напряжения ощутимо для задачи. Где частота ШИМ низкая, ключи медленные, там ставим делители на таймеры ШИМ, и тогда и регистр МВ начинает работать для более широких значений. Для высоких частот ШИМ работаем без делителей. Разве в ренесансе не так? Можно конкретики - какая у вас частота ШИМ, какое мёртвое время на ключах, какой период таймера ШИМ в Uint32 и какое максимальное МВ получается отсчитать?

                        По поводу сдвига момента запуска АЦП - опыт подтверждает теорию (расчёт). А иногда не подтверждает и надо разбираться. Просто всегда удобно подвигать момент запуска и проверить, что он настроен правильно. Поэтому используется для запуска АЦП отдельный таймер, и никогда не используется просто запуск по нулю(периоду) основного таймера ШИМ. Ну просто чтобы была степень свободы.


                      1. Indemsys Автор
                        18.10.2023 07:35

                        Насчёт конкретики, то мой проект полностью открыт. Там все сорсы открыты и прокомментированы, целый ряд статей с объяснениями. Можете их исследовать сколько угодно.
                        Но вот ваши сорсы я проверить не могу, а значит и ваши слова.

                        Ещё раз напомню вопрос: считаете ли вы работу с одними регистрами опасной, а с другими безопасной и почему. Похоже считаете. И на основе этого применяете термин "костыли". Но в обоснование приводите особенности собственно вашей организации работы или некие умозрительные сценарии.
                        Я думаю что наиболее вероятный сбой - это сбой PLL и внутренних генераторов чипа от ЕМИ. В обоих случаях ШИМ будет сорван и порты могут оказаться в любом состоянии. (любимый приём хакеров, кстати) в независимости как и какие регистры записываете в прерываниях.

                        Я вот отдельный таймер на АЦП назвал бы костылями. Поскольку в Renesas компаратор (а вернее несколько на случай асимметричного ШИМ) для формирования сигнала выборки АЦП встроен в сам формирователь ШИМ. И это понадёжнее чем отдельный таймер.

                        Тут ведь особое значение имеет скорость доступа ко всем регулируемым в реальном времени функциям. Если мой доступ к портам работает быстрее чем ваш доступ к отдельному таймеру, то это не у меня костыли, а у вас. Потому что чем больше ресурсов останется на вычисления тем более эффективные алгоритмы управления можно применить.


                      1. BelerafonL
                        18.10.2023 07:35

                        У нас есть опенсорсный проект - https://bitbucket.org/niietcm4/motorcontroldemo/src

                        Это среднестатистический сферический в вакууме проект для векторного и скалярного управления для трёхфазного шестиключевого инвертора. Для микроконтроллера НИИЭТ К1921ВК01Т, который сделан по мотивам даташитов тексаса. Периферия ШИМ - там почти полная копия тексаса. Но шариться по чужим исходникам, чтобы что-то найти и доказать, трудное дело - например, в этом проекте motorcontroldemo частота ШИМ и мёртвое время и минимальная скважность настраиваются пользователем через CAN, и что там стоит по дефолтам из исходников выяснить почти невозможно. Поэтому я и спросил у вас, какие частоты, времена и периоды, чтобы не тратить кучу времени на вычитку вашего проекта.

                        Насчёт вопроса про регистры - какие опасные, какие безопасные. Я так вопрос бы не ставил именно про регистры, лучше сформулировать так: подход реализации программного мёртвого времени через смену периферийной функции портов на GPIO и возвращение её назад сильно более опасный, чем реализация МВ периферийным модулем ШИМ, который отлажен годами производителем микроконтроллеров. Если искать аналогии, то для меня это как ехать на одноколесном велосипеде жонглируя шариками, или на автомобиле с пристёгнутыми ремнями безопасности.

                        Если же вы серьезно рассматриваете гипотезу о том, что у вас от помех PLL проца глюканул, и поэтому ШИМ сбился, и так повезло что только ШИМ, а всё остальное работает... То я бы при наличии такой гипотезы остановил бы все опыты дальнейшие, воспроизводил бы только эту проблему, усугубил её и менял схемотехнику до полного её устранения и даже потенциальной возможности повторения. Чип не должен таким образом сбоить от слова совсем в реальной задаче. Обходить проблему программно, меняя вид помехи воздействуя на GPIO, имея в голове что первопричина это сбой тактирования, это категорически неправильный подход. Это маскирование симптомов, а не болезни.

                        По поводу запуска АЦП - в тексасе тоже можно запускать АЦП по условиям компараторов таймера ШИМ. Но чисто из удобства захотелось запускать от отдельного таймера, который можно подвигать. Иногда оба (а их у тексаса два) компаратора таймера заняты под ШИМ, и тогда запускать АЦП нечем (кроме нуля и периода таймера). Чуть гибче выходит отдельным таймером. И этот другой таймер аппаратно синхронизируется с таймером ШИМ с заданной пользователем фазой - тут костыля не вижу, я не обхожу какую-то багу проца, где шаг влево или вправо это сквозной ток и бабах. Это один из штатных вариантов использования периферии.


                      1. Indemsys Автор
                        18.10.2023 07:35
                        -1

                        Иногда оба (а их у тексаса два) компаратора таймера заняты под ШИМ, и тогда запускать АЦП нечем (кроме нуля и периода таймера). 

                        Ну вот видите как всё плохо у TI.
                        А у Renesas есть целых два выделенных специальных компаратора для АЦП в каждом ШИМ формирователе. Причём с буферизацией и даже с двойной! буферизацией.
                        Ну и у кого костыли?
                        Здесь TMS320F28335 представляется уже старой архаикой.

                        Мёртвое время с предустановкой фронтов, а не с задержкой - это инновация позволяющая сохранять точность измерений при минимуме издержек на вычисления корректировок. И это главное.
                        Ваш проект я посмотрел. Уровень проработки векторного управления и эстиматоров показался слабым. Особенно покоробил стиль обращения с типом float. Кажется с оптимизацией работали слабо и не проверяли на переносимость. Поскольку многие константы там будут трактоваться как double. Очень опасный код в плане таймингов.
                        Позиционировать такой код и спорить о граблях ну сами понимаете...

                        Тут надо помнить что Renesas эт не новичок на рынке, это наследник знаменитой Mitsubishi которые делали микроконтроллеры для двигателей раньше чем TI взялся за это дело. На Mitsubishi уже были RTOS, когда TI еще на ассемблере программировался.


  1. Karlson_rwa
    18.10.2023 07:35
    +5

    Подавать напряжение на двигатель постоянного тока надо с осторожностью. При резкой подаче даже половинного от номинального напряжения возникает импульс тока через мотор почти в два раза превышающий его максимальный рабочий ток.

    Вы бы поосторожнее с терминологией обращались. Люди без профильного образования могут неправильно понять и напугаться. Не максимальный рабочий ток, а номинальный продолжительный рабочий ток (nominal current, max. continuous current). А то, о чем вы пишете, всего лишь stall current или стартовый ток или ток останова\страгивания, который для любого брендового мотора прописан производителем и банально равен номинальному напряжению питания деленному на сопротивление обмоток. И любой разработчик СУ для DC двигателей должен быть в курсе этих параметров и контролировать их в своей разработке. Каковы эти параметры для вашего 540 ваттного двигателя, кстати? Итальянцы даташитами не разбрасываются, к сожалению.


  1. semennikov
    18.10.2023 07:35
    -1

    А я бы еще попробовал поставить маленький дроссель чтобы он блокировал броски тока таких маленьких времен


    1. sim2q
      18.10.2023 07:35
      +3

      маленький дроссель

      судя по графику (не смотря на JPEG) там порядка 20мс и ток больше 50-70А...
      на сколько маленький дроссель нужен?:)


      1. semennikov
        18.10.2023 07:35

        В зависимости от конкретных условий. Индуктивность не любит изменение тока ни в верх ни вниз. Поэтому дроссель нужно снабдить еще и диодом, чтобы дроссель не препятствовал уменьшению тока через двигатель Напряжение на дросселе U=L*dI/dt, поэтому при расчете вставляем допустимый ток и время считая U равным питанию и заменяя дифференциал на отношение допустимого возрастания тока к времени действия. Расчет конечно приблизительный, если нужно точнее то надо решать дифференциальное уравнение. Но особого смысла точно считать нет, достаточно прикинуть. В качестве сердечника годятся только ферриты пригодные для СВЧ ну и сопротивление должно быть много меньше сопротивления обмоток двигателя


        1. Indemsys Автор
          18.10.2023 07:35

          Лучше покажите куда этот дроссель поставить. Будет любопытно.


          1. semennikov
            18.10.2023 07:35
            -1

            В цепь силового питания после конденсаторов


            1. Indemsys Автор
              18.10.2023 07:35

              Драйвер откажется работать с такой схемой ибо его цепи защиты зафиксирует некорректные напряжения на стоках.


        1. sim2q
          18.10.2023 07:35

          Но особого смысла точно считать нет, достаточно прикинуть

          я прикинул, но забыл "/s" после маленький

          на сколько маленький дроссель нужен?:)


      1. BelerafonL
        18.10.2023 07:35

        Проблема бросков тока в данной задаче при резком изменении задания напряжения решается либо введением задатчика интенсивности на изменение напряжения, либо введением контура тока (токоограничения) в системе управления.