Открыть список
Как стать автором
Обновить

Генерация многофазного ШИМ сигнала на TMS320F28027

Программирование микроконтроллеровСхемотехникаПроизводство и разработка электроникиDIY или Сделай самЭлектроника для начинающих
Tutorial
Всего голосов 43: ↑41 и ↓2 +39
Просмотры18.8K
Комментарии 59

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

На картинке Шаг 3: T = 400+400+400=1200
Так-с… что-то я туплю, ошибка? На картинке 400 + 400 + 400 = 1200. Полные период 1200 (или 600 если считаем в обе стороны).
в драйвер встроен dc/dc, который принимает на вход 15...50В

в даташите DRV8353 однозначно написано «Low-Side Linear Regulator», поэтому и светился при понижении 50->3.3
А DC/DC там «High-Side Doubler Charge Pump» — это удвоитель на конденсаторах, только для питания high-side.
Сначала «400+400+400=1600», а теперь потерян dc/dc… Линейник там для питания драйвера транзисторов и он потребляет средний ток всего 4 мА, а речь идет о встроенном dc/dc, который специально для запитывания низковольтной части схемы:

Оставлю в покое жуткие флоаты с синусами там, где можно было сделать целочисленную табличку.
Задам вопрос вот о чём: зачем вы пишете о (и делаете) сдвиге фаз между PWM-сигналами, работающими на частоте 50 кГц? Сдвиг фаз должен быть между медленными синусоидами 50 Гц, но зачем он нужен между несущими частотами PWM? Какие проблемы решает этот сдвиг между PWM, работающими на частоте 50 кГц?

Сдвиг между несущими PWM нужен:


  1. Для того, чтобы уменшить амплитуду "пилы" выходного ШИМ-сигнала и тока потребления
  2. Чтобы увеличить частоту реальной модуляции в N раз
  3. На бОльшую частоту проще сделать выходной фильтр

Таким образом достигается


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

Ах да… Через таблицу не всегда прокатит, например, если нужно синхронизироваться по напряжению внешнему в том же PFC или инверторе.

зачем вы пишете о (и делаете) сдвиге фаз между PWM-сигналами, работающими на частоте 50 кГц?
Теперь все понял… не читали. Тогда повторюсь — например, для interleaved dc/dc, там между фазами тоже нужен сдвиг.

Какие проблемы решает этот сдвиг между PWM, работающими на частоте 50 кГц?
Ваши проблем 100% тут ничего не решает.
Просто в тексте очень часто упоминаются именно двигатели BLDC и трёхфазные обычные двигатели (асинхронники), потому складывается впечатление, что описывается именно схема управления двигателем. Да, в конце раздела есть абзац, что это всё же алгоритм многофазного dc-dc конвертера.

У меня вопрос про вторую часть, где синусоиды и 50Гц. Там нужно смещение фаз и deadtime?
Вариант через таблицу прокатит даже если нужно синхронизироваться по внешнему напряжению. Просто в этом случае к таблице нужно добавить коррекцию табличных значений с помощью ряда Тейлора функции синус. Либо кусочно-линейную или квадратичную аппроксимацию табличных значений в промежуточных точках. Т.к. фаза табличной синусоиды — это, по сути, индекс массива. И это будет быстрее, нежели считать синус. Но, опять же, если захотелось — охота пуще неволи, можно и синус считать. Просто нужно учесть, сколько тактов МК из 400 имеющихся в наличии уйдёт на вычисление синусов и сопутствующие вопросы (если ШИМ 50 кГц при частоте ядра 60 МГц, то у Вас остается 400 тактов на выбор скважности ШИМ).
И это будет быстрее, нежели считать синус

А вы давно заглядывали в библиотечный код вычисления синуса? Из избыточного там только приведение радиан к [0;1]

Из избыточного там, как минимум, использование типа float. И точность вычисления синуса там избыточная. Т.к. если у Вас период ШИМ равен 1200 тактов ядра, а максимальная скважность ШИМ и того меньше, Вам общепрограммная точность синуса не нужна, достаточно считать с точностью до 0.0005. Все это можно сделать из глины и палок в операциях целочисленной арифметики, и это будет очень быстро. Кроме того, если аргумент у Вас не в радианах, а в целочисленных попугаях, то дело пойдёт еще быстрее. Труднее поддерживать такой код будет, это да. Но скорость работы будет отменная.
Более того, т.к. у Вас период ШИМ равен 1200 тактов ядра, и точность синуса выше 0.0005 не нужна, то… Вы можете четверть периода синуса, умноженного на Вашу максимальную скважность, запихнуть в таблицу на 2000 ячеек (т.к. синусоида растет медленнее, чем y=x) типа int16_t (т.к. Ваши значения не превосходят 1200), и вычислять скважность ШИМ с необходимой для вашей задачи точностью за несколько тактов, просто вычисляя нужный индекс массива.
общий КПД преобразователя получался около 65-70% при токе 300 мА

В даташите указан кпд более 80% для 95Vin и почти 90% при 48В. Но даже для 0.5Вт Rth case-ambient = 25 градусов на ватт. То есть перегрев порядка 13 градусов. Возможно, индуктивность была мала и пиковые токи были большие. Там Ton фиксировано для LM5008.
Спасибо за статью.
По идее корпус должен выдерживать где-то 3Вт, но суммарно там и 1Вт не было и уже грелось. Я думаю на внутренний полигон, была плохая идея в него рассеивать.

индуктивность была мала и пиковые токи были большие
Надо попробовать, брал расчетную + 25%, не думал в ту сторону.

В даташите указан кпд более 80% для 95Vin и почти 90% при 48В
При выходном 10...12В так и есть, а вот при 3.3В все очень плохо становится. dc/dc косит под линейник :))
А на какой частоте вы включали LM5008a?

А точно не помню, вроде сотни кГц, то ли 300, то ли 500.

А точно не помню, вроде сотни кГц, то ли 300, то ли 500.
Ага, я так и подумал. Собственно, выше вам уже указали на проблему:
Возможно, индуктивность была мала и пиковые токи были большие. Там Ton фиксировано для LM5008.


Если бы вы, вместо того, чтобы ставить «то ли 300, то ли 500 кГц», почитали даташит на LM5008a, то смогли бы обнаружить в нем на седьмой странице рисунок 5, показывающий предельную частоту для разных сочетаний входного и выходного напряжения. У LM5008a minimum on-time 400 нс (третья страница, описание шестого пина RT/SD), и для входа 95В и выхода 3.3В частота должна быть не больше 50 кГц. Удивительно, как он вообще в таких условиях какое-то разумное напряжение на выход выдавал.
Но, конечно, проще поставить еще один преобразователь, чем прочитать даташит на тот, который уже есть)
Там еще эта микросхема требует минимального риппла на выходе для стабильной работы, ESR выходного конденсатора должен быть конечным (добавлен Rout на схеме выше).
However, the regulator requires a minimum amount of ripple voltage at the feedback input for proper loop operation. For the LM5008A the minimum ripple required at pin 5 is 25 mVp-p, requiring a minimum ripple at VOUT of 100 mV.

У техаса целая серия подобных преобразователей. Toff там определяется рипплом на выходе.
Конкретно для LM5008A явно подробно не написано, но для LM5160 целый раздел как быть с этим рипплом.

Вы странный человек… Стою я в пробке, у меня спрашивают про частоту микросхемы в одном из проектов и вы думаете я это помню?)) Мне не хочется такое запоминать.


У меня есть сниппет схемы, который я один раз посчитал для выхода 3.3В и входа 12...50 под микросхему lm5008. Схема никогда не вызывала проблем. В это драйвере стоит такая же микра по сути, я просто перенес обвязку с теми же номиналами и при выходе 3.3В она греется, на другой плате нет. Подозреваю, что дело не в недостаточной индуктивности или ёмкости.

один раз посчитал для выхода 3.3В и входа 12...50 под микросхему lm5008. Схема никогда не вызывала проблем.
Не вызывала проблем, потому что вы никогда не запускали ее от входа 95 В. Предельно допустимая частота LM5008A пропорциональна отношению выхода к входу, а вы это, вероятно, не учли, просто переиспользовав готовое решение из другого проекта и не перепроверив его пригодность к новым исходным данным. Не стоит так делать никогда, это называется «халтура», а не «качественная работа».
Дык, что вы хотите? Про автора ходят всякие интересные слухи насчет кидалова. И здесь проскакивало и на электрониксе.

У меня она в обоих случаях не работает при 95В. Откуда вообще информация что я на пределе ее запускаю? Вроде вполне понятно писал, что вход 15...50В в одном случае и 12...50В во втором. И почему бы в таком случае не переиспользовать?


Вся ваша критика сводится к "вы это ВЕРОЯТНО не учли", прекрасно… Вы угадываете что я сделал и потом свои же догадки критикует, не странно ли это?

Откуда вообще информация что я на пределе ее запускаю?
Видимо, не совсем верно понял ваш комментарий выше.

В даташите указан кпд более 80% для 95Vin и почти 90% при 48В
При выходном 10...12В так и есть, а вот при 3.3В все очень плохо становится. dc/dc косит под линейник :))


Энивэй, если вы запускаете микросхему внутри ее рабочего диапазона, заданного в даташите, то она должна работать нормально. Причина имеющихся проблем может быть разной, но «встроенным dc/dc опускаем вход 15...50В до 12В, а дальше из 12В снижать в 3.3В уже внешним дешевым dc/dc» — это не решение проблемы, а костыль, прямо из парижской палаты мер и весов, из секции «как не надо делать ни при каких обстоятельствах».
Да, правильно разобраться до конца, если не видно соответствия даташиту. Но автор все-таки чесно описал, уже хорошо, урок. Вот можно было бы автора попросить схему, было бы интересно посмотреть.
чесно описал
Так задача рассказать чего было, а не просто — «смотри как я поездат», да и ваши дельные подсказки куда посмотреть и что проверить тоже часто помогают.
это не решение проблемы, а костыль, прямо из парижской палаты мер и весов
Это было быстрое решение, которое потребовало 10 минут на переработку платы, о «костыле» в принципе даже не спорю, но когда заказчик подгоняет каждый день на исследования места не остается :))

Вообще с данным драйвером еще буду ковыряться, попытки «с наскока» поиграться с индуктивностью +-50% от расчетной к решению проблемы не привели. Если получится в итоге получить >80% при 50В входе и 3.3В выходе, то сам буду рад, но пока проблему «отложил на полку» до следующей ревизии.
Если хотите, есть спец документ у TI формата excel в котором можно всё посчитать. Эдакий калькулятор для данной микросхемы dc-dc. У меня даже вроде сохранен где-то был.
Но, конечно, проще поставить еще один преобразователь, чем прочитать даташит на тот
Хм, а не вы ли пару дней назад объясняли, что лучше поставить побольше конденсаторов, чем считать какой-то там ESR?
сtrl+F на мой никнейм в обсуждении по вашему линку не дает никаких результатов. Видимо, это был не я. И, если что, фраза «проще поставить еще один преобразователь, чем прочитать даташит» — это не мое предложение, а критика того, что сделано в этой статье:
Решение проблемы — встроенным dc/dc опускаем вход 15...50В до 12В, а дальше из 12В снижать в 3.3В уже внешним дешевым dc/dc
Упс, извиняюсь, перепутал вас с asmolenskiy.

Спасибо, отличная статья.
Вы не пробовали заменить float'овскую математику на библиотеку IQMath? Код получится чуток эффективнее за счет аппаратной поддержки C2000-ым ядром. У TMS320F28027 FPU-то нет.


P.S. теперь жду статьи advanced-уровня "как поддерживать сдвиг фазы в ШИМ переменной частоты" (:

IQmath это правильный путь, я же показал "велосипед" чтобы было понятен сам принцип и откуда ноги растут. А так на либы ti хорошие доки + примеры, пересказывать их особо нет смысла.


Сейчас в черновиках лежит заготовка Парк/Кларк, так что про синхронизацию когда нибудь тоже выдам. Можно даже скоро :))

Ачипятка:
«Что вообще такое этот сдвига фазы на 120o?»
Еще опечатка:
«Для меня же это очевидный плюс, когда мы говорим об управление электроприводом или инверторах напряжения с трехфазным выходом.»

Благодарю, исправлю в ближайшее время.

Ураа!) Статейка про tms вышла, думал не дождусь! Спасибо за отличную статью!)

Присоединяюсь, интересная штука!
А чем плоха 1-sin(х)? Деление же не самая быстрая операция.
Синус на STM32H7 легко генерится софтом. Рабочий пример из программы генерации 2 фаз со сдвигом 180 градусов, т.е. в противофазе. Используются функции из DSP LIB.

Две переменные объявлены в main:
float angle_pointer_step = 3.6; //шаг разворачивания синуса
float angle_degree_offset_float = 180; //смещение второго канала

Остальное в прерывании:

//1 фаза угол
angle_degree_float = angle_degree_float + angle_pointer_step;

if (angle_degree_float >= 360 ) angle_degree_float = 0;

angle_rad_A = (angle_degree_float * _Pi) / 180.0;

PWM_A_float = arm_sin_f32(angle_rad_A) * amplitude;

PWM_A = (signed long) PWM_A_float;

//2 фаза со смещение

angle_degree2_float = angle_degree_float + angle_degree_offset_float;

if (angle_degree2_float > 360)
{
angle_degree2_float = angle_degree2_float — 360;
}

angle_rad_B = (angle_degree2_float * _Pi) / 180.0;

PWM_B_float = arm_sin_f32(angle_rad_B) * amplitude;

PWM_B = (signed long) PWM_B_float;

Вывод в ЦАП для отладки
DAC1->DHR12R1 = 2048 + PWM_A;
DAC1->DHR12R2 = 2048 + PWM_B;

TIM4->SR &= ~TIM_SR_UIF; //сброс флага UIE: Update interrupt enable

Сравнили новомодный Cortex M7 и древний C2000, кхе-кхе.
Между прочим "быстрое" вычисление синуса в ARM — это табличный метод + интерполяция. Собственно так делают все библиотеки DSP, если у процессора нет аппаратного ускорителя тригонометрии


И кстати, ради разворота синуса на 180 градусов не нужно ничего делать, просто инвертируйте результат.

Согласен. :)

По инверсии — не везде нужен сигнал в противофазе. :)
Ну С2000 не совсем древний, конечно ti клепает камни не как в st, все таки это железо для разных применений. Например, не так давно сделали среднебюджетный tms320f280049c с fpu, tmu и прочими cla. Он дешевле H7 и шустрее в задачах управления приводом или преобразователями

Ну, 280049 у меня достаточно валяется в тумбочке. Но он не то же самое, что F28027. FPU+TMU сильно увеличили производительность на такт, да и периферия серьезно продвинулась вперед.


А в дельфинах уже завезли 5-ядерного (2 C2000+CLA, Cortex M4) зверя с EtherCAT Slave и плавучкой двойной сложности. Теперь железные алгоритмы можно мониторить в реальном времени на ПК, если найти способ это дело использовать.

Но сравнивать F28027 с упомянутым H7 не совсем корректно. 28027 не далеко ушел от самого обычного МК за пару баксов, из плюшек отличительных HRPWM да поддержка тексасовских либ. TMU ему по сути не нужен, а вот FPU бы конечно хотелось.
Никак не могу разрешить один вопрос… Если я правильно понял, то Вы неудачно смешали в этом предложении
Особенностью трехфазной сети является то, что ток в фазах не синхронный, а сдвинут на 120o относительно соседней. Что вообще такое этот сдвига фазы на 120o? Если говорить по простому, то это смещение точки старта генерации на 1/3 периода. Период сигнала с математической точки зрения равен 2π, а значит двигать второй сигнал надо на 2π/3, а третий на 4π/3. С точки зрения электроники период задается периодом отсчета нашего таймера. Например, при тактирование 60 МГц мы хотим получить ШИМ с частотой 50 кГц, значит период отсчета таймера будет от 0 до 1200 (60 000 000 Гц / 50 000 Гц = 1200). Теперь чтобы получить 3 фазы со сдвигом 120o нам надо 1-ю фазу не трогать, для 2-й фазы к текущему значению добавлять +400, для 3-й фазы к текущему значению добавлять +800.

сдвиг фазы напряжения в трехфазной сети и сдвиг сигналов ШИМ для ключей в этой сети. Это не связанные между собой вещи. Они обе нужные, но решают совершенно разные задачи и происходит это совершенно по-разному.
Сдвиг переменных напряжений в фазах происходит за счет того, что при вычислении скважности ШИМ для разных фаз Вы к аргументу прибавляете 1/3 и 2/3 периода синусоиды соответственно для фаз B и C. Это абсолютно необходимо, т.к. иначе Ваш преобразователь не будет трехфазным.
Сдвиг сигналов ШИМ происходит за счет смещения значений таймеров на 1/3 и 2/3 периода ШИМ, благодаря этому все ключи не открываются одновременно, потребление тока получается более равномерным. Без этого Ваш преобразователь все равно останется трехфазным, но качество входного тока и выходного напряжения будет ниже, а также выше будет уровень помех.

Или я чего не понял?
Сдвиг таймеров ШИМ для питания трехфазных электродвигателей вреден. Нельзя строить аналогию с DCDC-преобразователями.
Ниже картинка с некоторым маленьким вектором напряжения в секторе между векторами 0, 1 и 3. Первая без сдвига, где вектор реализуется векторами треугольника в последовательности: включены все нижние ключи, включается верхний ключ фазы А, включается верхний ключ фазы В, включены все верхние ключи, и в обратном порядке.
А вот если таймеры сместить на 120 градусов, то этот же вектор напряжения делается обеганием всех вершин окружности. Угадайте, в каком случае пульсация тока будет меньше?
photo-2019-06-26-17-43-02
Между тем, иногда режим сдвига таймеров делают специально в ущерб КПД, чтобы ввести в напряжение вот такую вращающуюся составляющую, как на рисунке справа. Тогда по отклику в токе на такую инжекцию можно определить положение ротора электродвигателя, но это не наш случай.

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

Это не мой пример, а из статьи. Вот на осциллограме сдвинутый ШИМ, как у меня справа на рисунке, и я объяснил, чем это плохо.
image
А да это просто пример реализации сдвига, эта осциллограмма более интересная для интерливед конвертеров о чем написал в статье. Про синусоиду там отдельная глава и она в принципе не привязана к управлению электропривода, скорее хотел показать как ее изобразить и сдвинуть.

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

P.S. за объяснение отдельное спасибо
Вопрос может очевидный, но как лучше задизайнить пады под винт (аналогично первой фотографии), чтобы пад не оторвало при затягивании/подключении? Достаточно просто побольше диаметр или всё же надо усиливать переходными?
Для механического крепления я сейчас не использую металлизированные пады, а наоборот убираю и металл и паяльную маску. Это позволяет не наносить видимых повреждений плате, в моем случае это актуально, т.к. платы часто едут к заказчику и нужен «товарный вид».

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

Еще бывают специальные припаиваемые и запрессовываемые клипсы, они монтируются на плату, а потом в них уже винт загоняется. Но имхо такое крепление с помощью «большого ума» тоже можно свернуть, а лишняя позиция в ВОМе это всегда прибавка к себестоимости устройства.
Понял, благодарю за разъяснения.
иногда крепежное отверстіе c пятаком по диаметру шайбы помогает адекватно сохранять зазоры к компонентам и метализации.
NordicEnergy, там у этого вашего камня TMS320F28027F есть весьма интересная технология InstaSPIN-FOC. Использовали её? Как впечатления? Ну и главный вопрос: можно ли при помощи одного камня рулить несколькими моторами сразу? Несколько инстансов InstaSPIN можно инициализировать?
Я использую для разработки движка отладку DRV8353-EVM и как раз InstaSPIN, вполне удобная штука, если нужно работать с неизвестным двигателем. Сама отладка неплохо считает Rs, Ls, Kv мотора, для первичной оценки хватает. Вообще у ti очень хороший наблюдатель fast, но он пропреитарный увы. Из интересного — он может достаточно точно работать на низкий оборотах, например, 0.1 или 1 Гц и выдерживать частоту более менее.
пропреитарный — почему бы не использовать росийское слово — платный?
Потому что «проприетарный» и «платный» — это не одно и то же?
Проприетарная технология может быть бесплатной, но запрещенной к копированию или использованию без разрешения. Нестрогий синоним слова «проприетарный» — это «запатентнованный», но это ненамного лучше)
Дело в том, что fast не платный, он просто закрытый. То есть пользуйтесь на здоровье с нашими утилитами, но исходники мы вам не покажем даже за деньги.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.