Думаю многие из вас наверняка видели рекламу, либо читали статьи, где была фраза «чистый синус». Вот именно о нем и пойдет речь, но не о маркетинговой составляющей, а о исключительно технической реализации. Я постараюсь максимально понятно рассказать о самих принципах работы, о стандартных (и не очень) схемотехнических решениях и самое главное — напишем и разберем ПО для микроконтроллера STM32, которое и сформирует нам необходимые сигналы.
Почему STM32? Да потому, что сейчас это самый популярный МК в СНГ: по ним много обучающей русскоязычной информации, есть куча примеров, а главное эти МК и средства отладки для них — очень дешевые. Скажу прямо — в коммерческом проекте я бы поставил только TMS320F28035 или подобный DSP из серии Piccolo от TI, но это уже совсем другая история.
Важно одно — STM32 позволяет стабильно управлять простыми «бытовыми» силовыми преобразователями от которых не зависит
![](https://habrastorage.org/webt/lv/df/cu/lvdfcunjwdp6xfp7zp1t_gbpuw8.png)
Вот такую картину управляющих сигналов необходимо получить, чтобы превратить ток постоянный в переменный. И да — тут именно синус! Как в том фильме: «Видишь суслика? — Нет. — А он есть...»
Интересно узнать каким образом формируется синус? Хочется узнать как все-таки качают
1. Топологии для формирования синусоидального сигнала
Если спросить у толпы электронщиков: «Как можно сформировать синусоидальный сигнал?», то посыпятся предложения с десятком различных методов, но какой нужен нам? Давайте оттолкнемся от изначальной задачи — нам нужно превратить, например, 380В 10А в переменное напряжение 230В. В общем это «классический» случай, его мы можете увидеть в любом хорошем on-line UPS или инверторе. Получается нам надо преобразовать мощность около 4 кВт да еще и с хорошим КПД, не слабо, да? Я думаю подобное условие поубавит количество вариантов «рисования» синуса. Так что же нам остается?
В силовых преобразователях до 6-10 кВт применяется две основные топологии: полный мост и «полумост» со сквозной нейтралью. Выглядят они следующим образом:
1) Топология со сквозной нейтралью
![](https://habrastorage.org/webt/tn/ly/ju/tnlyjuejfaeh5fbk8anz8eio4m8.png)
Данная топология очень чаще всего встречается в бюджетных ИБП с синусом на выходе, хотя и такие авторитеты как APC и GE не брезгуют применять ее даже на достаточно больших мощностях. Что же их побуждает к этому? Давайте рассмотрим достоинства и недостатки данной топологии.
Плюсы:
- Минимально возможное количество силовых транзисторов, а значит потери в 2 раза меньши и стоимость устройства тоже ниже
- Сквозной ноль. Это упрощает процесс сертификации, особенно CE и ATEX. Связано это с тем, что сквозной ноль позволяет системам защиты по входу (например, УЗО) срабатывать так же при возникновение аварии в выходных цепях после преобразователя
- Простая топология, что позволяем максимально уменьшить стоимость изделия при мелко-
и средне серийном производстве
Минусы:
- Необходимость двухполярного источника питания. Как видите на схему инвертора надо подавать ±380В и еще ноль
- Удвоенное количество высоковольтных конденсаторов. Высоковольтные конденсаторы большой емкости и с малым ESR на мощностях от 3-4 кВт начинают составлять от 20 до 40%
стоимости компонентов - Применение электролитических конденсаторов в «делителе». Они сохнут, подобрать конденсаторы с одинаковыми параметрами практически нереально, а если учесть, что параметры электролитов меняются в процессе эксплуатации, то и бессмысленно. Заменить на пленку можно, но дорого
Основные плюсы и минусы определены, так когда необходима это топология? Мое субъективное мнение: на мощностях до 500-1000 Вт, когда основополагающим требованием является стоимость, а не надежность. Явный представитель такого ширпотреба — это стабилизаторы от «А-электроника»: дешево, кое-как работает да и ладно. Для 60% потребителей в нашей стране этого достаточно и доступно по цене. Делаем выводы.
2) Мостовая топология
![](https://habrastorage.org/webt/0f/yd/vl/0fydvlcitxtdtm7jsrsv1ugpq6i.png)
Мостовая топология… наверное самая понятная и самая распространенная топология в силовых преобразователях, а главное доступная разработчикам даже с небольшим опытом. После 10 кВт вы не встретите ничего другого кроме моста одно- или трехфазного. За что же его так любят?
Плюсы:
- Очень высокая надежность. Она в основном обусловлена качеством системы управления силовыми транзисторами и не зависит от деградации компонентов
- Входная емкость требуется в разы, а то и на порядок меньше. Необходимо лишь обеспечить расчетное значение ESR. Это позволяет использовать пленочные конденсаторы при сохранение себестоимости. Пленочные конденсаторы — не сохнут, лучше ведут в суровых температурах, рабочий ресурс на порядок выше, чем у электролитов
- Минимальные пульсации напряжения на транзисторах, а значит можно применить транзисторы на меньшее напряжение
- Простота и понятность алгоритмов работы. Это приводит к значительному уменьшению времени на разработку изделия, а также на его пуско-наладочные работы
Минусы:
- Увеличенное количество силовых транзисторов, а значит необходимо более серьезное охлаждение. Увеличение цены на транзисторах, но за счет меньшего количества конденсаторов это скорее даже плюс
- Повышенная сложность драйвера, особенно при требованиях к наличию гальванической развязки
Как видите из реальных минусов мостовой топологии лишь повышенное требование к охлаждению транзисторов. Многие подумают: «Тепла выделяетсябольше — значит КПД ниже!». Не совсем так… За счет уменьшенных выбросов ЭДС и более «жесткой» системы управления КПД у двух приведенных топологий примерно равный.
В 70% случаев мне приходится применять мостовую схему не только в DC/AC инверторах, но и в других преобразователях. Это связано с тем, что проектирую в основном промышленные решения и все чаще для европейских заказчиков, а там принято на дорогие промышленные устройства давать гарантию 5-15 лет. Классическое требование: «Хотим железку, чтобы можно было давать гарантию 10 лет», тут уже выбирать не приходится. Конечно, когда люди хотят устройство с минимальной ценой, то тут необходимо уже отталкиваться от конкретной задачи при выборе топологии.
Небольшой итог: в данной статье будет приведено ПО для работы мостового преобразователя (Н-мост или Full Bridge), но сам принцип формирования синуса одинаковый для всех топологий. Код можно будет также адаптировать и под 1-ю топологию, но это вы уже сами.
2. Формирование переменного тока с помощью мостового преобразователя
Для начала давайте разберем как вообще работает мостовой преобразователь. Смотрим на схемку и видим транзисторы VT1-VT4. Они позволяют нам подавать на нашу абстрактную нагрузку (резистор, например) тот или иной потенциал. Если мы откроем транзисторы VT1 и VT4, то получится следующее: VT4 один конец нагрузки подключит к минусу (GND), а транзистор VT1 подключит к +380В, на нагрузке появится разность потенциалов «380В — 0В», которая не равна нулю, а значит через нагрузку начнет протекать ток. Я думаю все помнят, что ученые договорились — ток протекает «от плюса к минусу». Получаем такую картину:
![](https://habrastorage.org/webt/rr/05/oz/rr05oztig6gvhehgpu87sj3dj6c.png)
Что мы получили открыв VT1 и VT4? Мы подключили нашу нагрузку к сети! Если резистор заменить на лампочку, то он она бы просто загорелась. И еще мы не просто включили нагрузку, а определили направление тока, протекающего через нее. Это очень важно! А что было в это время с VT2 и VT3? Они были закрыты… совсем… намертво… Что будет если все таки VT2 или VT3 были так же открыты? Смотрим:
![](https://habrastorage.org/webt/8y/kx/ch/8ykxch3vlq0z7qrucs4jt4fo8eq.png)
Предположим, что открылись транзисторы VT1, VT4 и VT2. Вспоминаем закон Ома, смотрим сопротивление канала у высоковольтных транзисторов, например, IPP60R099P7XKSA1 и видим 0.1 Ом, у нас их 2 последовательно — значит сопротивление цепи VT1 и VT2 у нас около 0.2 Ом. Теперь посчитаем ток, которые пойдет через эту цепь: 380В / 0.2 Ом = 1900А. Думаю всем понятно, что это КЗ? Так же думаю всем понятно почему VT2 и VT3 должны быть закрыты?
Данный «феномен» называется — сквозной ток. И именно с ним идет большая война в силовой электронике. Как его избежать? Создать систему управления, алгоритм которой будет жестко запрещать одновременной открытие лишнего транзистора.
Зачем же нужны тогда транзисторы VT2 и VT3? Помните я писал, что очень важно направление тока? Давайте вспомнит что такое переменные ток. Собственно это ток, который имеет что-то переменное, в данном случае направление тока. У нас в розетке протекает ток, который меняет свое направление 50 раз в секунду. Давайте теперь закроем VT1 и VT4, а затем откроем транзисторы VT2 и VT3 и получим такую картину:
![](https://habrastorage.org/webt/14/hp/wq/14hpwqm6ivawim-mxlqwudro014.png)
Как видите направление тока (обозначено стрелками) изменилось на противоположное. Использование моста позволило нам менять направление тока, о чем это говорит? Да, мы получили переменный ток!
Прошу обратить внимание, что у моста есть как бы 2 диагонали: первая диагональ образована VT1+VT4, а вторая диагональ образована с помощью VT2+VT3. Данные диагонали работают по очереди, коммутирую ток сначала в одну сторону, а потом в другую.
Вот мы получили переменный ток, скажите вы, но не все так просто… У нас есть стандарт — сетевое напряжение. Оно нормируется двумя основными параметрами: напряжение и частота. Давайте пока разберемся с частотой, ибо вопрос напряжения простой и чисто схемотехнический.
И так частота… что о ней известно — она 50 Гц (бывает 60Гц в Штатах). Период сигнала равен 20 мс. Синусоида штука симметричная в данном случае, а значит наши 2 полуволны (положительная и отрицательная) имеют одинаковую длительность, то есть 10 мс + 10 мс. Надеюсь тут все понятно.
Что это значит в физическом смысле? Да то, что нам нужно менять направление тока в нагрузке каждые 10 мс. Получаем, что сначала у нас открыта 10 мс диагональ VT1+VT4, а затем она закрывается и на следующие 10 мс открывается диагональ VT2+VT3.
«Открытый транзистор» — это транзистор, на затвор (G) которого подали положительный потенциал (+10..18В) относительно истока (S) и транзистор изменил сопротивление канала (S-D) с бесконечно большого (2-100 МОм) на малое (обычно 0.1 — 1 Ом). То есть транзистор начал проводить ток.
«Закрытый транзистор» — это транзистор, затвор (G) которого подтянули к истоку (S) и его сопротивление изменилось с маленького до бесконечно большого. То есть транзистор перестал проводить ток.
Для лучше ознакомления с принципом работы полевого транзистора или IGBT — советую вам прочитать пару глав в книге Семенова «Основы силовой электроники» или другой источник, можно и википедию для начала.
Для управления мы подаем сигнал с Широтно-Импульсной Модуляцией или более привычная аббревиатура — ШИМ. Особенность данного сигнала в том, что у него есть 2 состояния: нижнее напряжение (GND) и верхнее напряжение (VCC), то есть подавая его на затвор транзистора мы или открываем его или закрываем — иного не дано. Про ШИМ тоже советую почитать дополнительно, ибо я вам описал
И так, для того, чтобы у нас мост менял направление тока каждые 10 мс нам нужно подать на него ШИМ сигнал, период которого равен 20 мс, а скважность 50%. Это значит, что у нас из 20 мс плечо половину времени (10 мс) открыто и проводит ток, а другую половину закрыто. Подавать такой ШИМ нам надо на все ключи, но с одним условием — на диагональ VT1+VT4 мы подаем прямой ШИМ, а на диагональ VT2+VT3 уже инверсный. Если говорить более по-умному, то сигнал, подаваемый на диагонали должен иметь сдвиг 1800. Я думаю в этот момент у вас голова закипела в попытках понять текст, поэтому смотрим на его визуальное представление:
![](https://habrastorage.org/webt/cn/0w/n9/cn0wn9iwb4nsfiec0tfmcpfc02c.png)
Теперь все понятно? Нет? Тогда подробнее… Как видите я отметил специально моменты открытия и закрытия транзисторов: открываются на «плюсе» и закрываются на «минусе». Также сигналы противоположны, то есть инверсные: когда синий сигнал «плюс», то зеленый сигнал «минус». Синий сигнал мы подаем на один на одну диагональ, а зеленый сигнал на другую — как видно на осциллограмме, наши диагонали никогда не открываются одновременно. Переменный ток готов!
Смотри на период. Специально показал осциллограмму с выходов контроллера, чтобы мои слова не были абстракцией. Период сигнала составляет 20 мс, одна диагональ открыта 10 мс и создает положительную полуволну, другая диагональ так же открывается на 10 мс и создает уже отрицательную полуволну. Теперь надеюсь всем понятно, а кто и сейчас не понял — пишите в ЛС, проведу для вас индивидуальное занятие на пальцах. В подтверждение моих слов осциллограмма показывает наши заветные 50 Гц! Только расслабляться рано…
Мы получили переменный ток с частотой 50 Гц, но в розетке у нас синусода, а тут меандр — не дело. Формально можно подавать меандр на выход и питать им большинство нагрузок, например, импульсному блоку питанию все равно: синус или меандр. То есть для включения ноутбуков, телефонов, телевизоров, телефонов и прочего вам уже хватит, но если вы подключите двигатель переменного тока, то все будет очень плохо — он начнет греться и КПД его ощутимо меньше, а в итоге скорее всего сгорит. Вы думаете у вас нет двигателей дома? А компрессор холодильника? А циркулярный насос отопления? Последние вообще горят как будто из дерева сделаны. Такая же ситуация с глубинными насосами для скважин, да и вообще много с чем. Получается, что синусоидальный сигнал на выходе инвертора, стабилизатора или ИБП все таки бывает важен. Что же — надо его создать! Сейчас начнется совсем взрыв мозга…
3. Формирование синусоидальной формы сигнала с помощью ШИМ
Если говорить откровенно, то я не знаю как данный раздел преподнести на доступном языке. Вдруг кто не поймет, то прошу вас или погуглить дополнительно, или написать в комментарии или ЛС — попытаюсь персонально вам объяснить. Глаза боятся, а руки делают…
Давайте посмотрим как выглядит обычный график синуса:
![](https://habrastorage.org/webt/x5/jl/h-/x5jlh-mkmnealtyciflxm5wpegu.jpeg)
Видим 2 оси: одна ось с периодом пи, пи/2 и далее, вторая с амплитудой от -1 до +1. В нашей задаче период измеряется в секундах и составляет 20 мс или 10 мс на каждую полуволну. Тут все просто и понятно, а вот с амплитудой веселее — просто примите как аксиому, что амплитуда у нас от 0 до 1000. Это значение скважности, которую устанавливает микроконтроллер, то есть 100 — это 10%, 500 — 50%, 900 — 90%. Логика думаю понятна. В следующей главе вы поймете почему от 0 до 1000, а пока перестроим наш график под наши значения:
![](https://habrastorage.org/webt/cj/m4/cd/cjm4cdxgxb1gresudvtgdjjqn5o.jpeg)
Вот так выглядит график синуса
По оси Х у нас время, а по оси Y скважность нашего ШИМ-сигнала. Нам нужно нарисовать синус с помощью ШИМа. Вспоминаем геометрию в школе, как мы строили графики? Правильно, по точкам! А сколько точек? Давайте построим синус по нескольким точкам О1(0,0) + О2(5,1000) + О3(10,0) + О4(15, -1000) + О5(20, 0) и получаем такой синус:
![](https://habrastorage.org/webt/5d/wo/gn/5dwogn7oehjljaau4uh2qjtlv0w.png)
Построили и видим, что в принципе данный сигнал больше похож на синус чем обычный меандр, но это все равно не синус пока что. Давайте увеличим количество точек. Это кстати называется «дискретность сигнала» или в данном случае «дискретность ШИМа». А как узнать координаты этих точек? С крайними то просто было…
Расчет значений для формирования синуса
Как выше я говорил — синус у нас вполне себе симметричный. Если мы построим 1/4 периода, то есть от 0 до 5 мс, то дублируя этот кусок дальше — мы можем строить синус бесконечно долго. И так формула:
![](https://habrastorage.org/webt/er/jm/n3/erjmn3wv1qkivp5kxg1w0twaixo.png)
И так по порядку:
- n — значение скважности в данной дискретной точке
- A — амплитуда сигнала, то есть максимальное значение скважности. У нас это 1000
- pi/2 — 1/4 периода синуса попадает в pi/2, если считаем 1/2 периода, то pi
- x — номер шага
- N — количество точек
Давайте для примера сделаем удобно условие, что у нас 5 точек. Получается у нас 1 шаг = 1 мс, это позволит легко график построить. Шаг дискретизации считается просто: период в котором строим график (5 мс) делим на количество точек. Давайте приведем формулу к человеческому виду:
![](https://habrastorage.org/webt/tk/4g/cs/tk4gcse-rse5-tyaae6a0bewypw.png)
Получаем шаг дискретизации 1 мс. Формулу для вычисления скважности оформим, например, в excel и получим следующую таблицу:
![](https://habrastorage.org/webt/dt/zy/tz/dtzytzlg1dd9e9kzwuelxbjhnuw.png)
Теперь вернется к нашему графику синуса и построим его снова, но уже для большего количества точек и посмотрим как он изменится:
![](https://habrastorage.org/webt/vo/um/l3/vouml3yuxohvo9tpblm9ig4_sgk.png)
Как видим сигнал куда больше похож на синус, даже с учетом моего мастерства в рисовании, а точнее в уровне лени)) Я думаю результат не требует объяснений? По результатам построения выведем аксиому:
Чем больше точек, чем выше дискретизация сигнала, тем идеальнее форма синусоидального сигнала
И так, сколько же точек будем использовать… Понятно, что чем больше, тем лучше. Как посчитать:
- Использую для статьи старенький микроконтроллер STM32F100RBT6 (отладка STM32VL-Discovery), его частота 24 МГц.
- Считаем сколько тактов будет длиться период 20 мс: 24 000 000 Гц / 50 Гц = 480 000 тиков
- Значит половина периода длится 240 000 тиков, что соответствует частоте 24 кГц. Хотите повысить несущую частоту — берите камень шустрее. 24 кГц наши уши все таки услышат, но для тестов или железки, стоящей в подвале пойдет. Чуть позже я планирую перенести на F103C8T6, а там уже 72 МГц.
- 240 000 тиков… Тут логично напрашивается 240 точек на половину периода. Таймер будет обновлять значение скважности каждые 1000 тиков или каждые 41,6 мкс
С дискретностью ШИМа определились, 240 точек на пол периода с запасом хватит, чтобы получить форму сигнала как минимум не хуже, чем в сети. Теперь считаем таблицу, так же в excel как самый простой вариант. Получаем такой график:
![](https://habrastorage.org/webt/vz/u0/qz/vzu0qzvv_s5nnk9rpk19bfpqelu.png)
Исходник таблицы и значений можно взять по ссылке — тут.
4. Управление мостовым преобразователем для формирования синуса
Мы получили таблицу синуса и что с ней делать? Нужно передавать эти значения с определенным шагом дискретизации, который у нас известен. Все начинается с того, что таймер инициализировался — время 0, скважность ноль. Далее мы отсчитываем шаг дискретизации 41,66 мкс и записываем в таймер значение ШИМа из таблицы 13 (0,13%), отсчитываем еще 41,66 мкс и записываем 26 (0,26%) и так далее все 240 значений. Почему 240? У нас 120 шагов на 1/4 периода, а нам надо нарисовать 1/2 периода. Значения скважности те же, только после того как они достигли 1000 мы записываем ее в обратной последовательность и получаем спад синуса. На выходе мы будем иметь вот такую осциллограмму:
![](https://habrastorage.org/webt/ev/ls/3n/evls3nttkufuiz55hxpo4nb7v7w.png)
Как видите мы получили кучу значений ШИМа в четко заданном периоде и его длительность составляет: 240 шагов х 41,66(!) мкс = 9998,4 мкс = 9,9984 мс ~ 10 мс. Мы получили половину периода для частоты сети 50 Гц. Сигнала как видите опять два и они в противофазе, как раз то, что нужно для управления диагоналями моста. Но позвольте, где же синус спросите вы? Настал момент истины! Давайте теперь сигнал с выхода микроконтроллера подадим на ФНЧ, я сделал простой ФНЧ на RC-цепочки с номиналами 1,5 кОм и 0,33 мкФ (под рукой просто были) и получил такой результат:
![](https://habrastorage.org/webt/s7/h9/ps/s7h9psfeeu2glggk0wy2j_nvxyy.png)
Вуаля! Вот он наш долгожданный синус! Красный луч осциллографа — это сигнал до ФНЧ, а желтый луч — сигнал уже после фильтрации. ФНЧ обрезал все частоты выше 321 Гц. У нас остался основной сигнал 50 Гц, ну и конечно его гармоники с небольшой амплитудой. Если хотите идеально очистить сигнал, то сделайте ФНЧ с частотой среза около 55-60 Гц, но пока это не важно, нам надо было лишь проверить получился ли у нас синус или нет. Кстати… у меня синхронизация осциллографа включена по желтому лучу (стрелка справа экрана) и мы видим внизу экрана его частоту — идеальные 50 Гц. Что еще можно пожелать? Пожалуй все, осталось определиться какой сигнал и куда подавать. Давайте рассмотрим такую картинку:
![](https://habrastorage.org/webt/d-/u9/af/d-u9afnw820ogdix_v8fpuefstw.png)
Если вы обратите на саааамую первую осциллограмму в статье, то увидите, что сигнал в желтом и синем лучше имеют одинаковую фазу, то есть они в одно время становятся положительными и открывают транзисторы. Эти 2 сигнала открывают диагональ VT1+VT4. Соответственно 2 других сигнала так же имеют одинаковую фазу и открывают другую диагональ. Теперь мы не просто меняем направление тока, но и задаем амплитуду с помощью ШИМ таким образом, чтобы она изменялась по синусоидальному закону. Теперь рассмотрим эту же схемку, но уже с токами:
![](https://habrastorage.org/webt/di/sp/pw/disppwegsawq_jkn4nghglzk-e4.png)
Как видим ток через нагрузку протекает в противоположную сторону, меняя направление с частотой 50 Гц, а модулированный ШИМ, подаваемый на транзисторы VT1 и VT2 позволяет нарисовать синусоидальную форму сигнала на полуволнах.
ФНЧ (фильтр низкой частоты) выполнен на индуктивности L1 и конденсаторе C2. Частоту среза для данного фильтра советую считать менее 100 Гц, это позволит минимизировать пульсации напряжения по выходу.
На десерт покажу часть схемы реального устройства с подобной топологией и фильтром, она большая, поэтому скачиваем PDF-ку тут.
5. Борьба со сквозными токами
Я думаю не для кого не секрет, что нет ничего идеального? Тоже самое и с Mosfet-ами, у них есть ряд недостатков и мы рассмотрим один из них — большая емкость затвора. То есть, чтобы нам открыть транзистор надо не просто подать напряжение, но и этим самым напряжением зарядить конденсатор, поэтому фронт и спад сигнала затягивается. Это приводит к тому, что на границе сигналов может возникать момент времени, когда один транзистор еще полностью не закрылся, а другой уже начал открываться.
Подробнее о данном явление советую почитать, например, в этой статье. Я лишь расскажу как с ним бороться. Чтобы транзисторы успели нормально закрыться до открытия следующего плеча между управляющими сигналами вводят deat-time или проще говоря — временную задержку. У нас такая задержка будет введена между управляющими сигналами на транзисторах VT3 и VT4, т.к. именно они обеспечивают коммутацию полуволн. На транзисторах с модулируемым ШИМом (VT1 и VT2) такие задержки уже есть — синус начинается со скважности 0% и заканчивается тоже 0%. Эта задержка длиной в 1 шаг дискретизации, то есть 41.6 мкс.
И так — надо реализовать мертвое время между синим и зеленым лучом/сигналом. На любом контроллере такую задержку можно сделать программным способом, но это не есть хорошо — программа подвиснет или задержится и пыщ-пыщ ваше устройство
Нам понадобится таймер TIM1, только он умеет вставлять аппаратную задержку между сигналами, в разделе про написание ПО я расскажу как это сделать, а сейчас смотрим на результат и на то, что вообще должно быть:
![](https://habrastorage.org/webt/2q/s1/o7/2qs1o7yvllytmxvus3x3zrezoxq.png)
Чтобы увидеть задержку «растягиваем» сигнал на осциллографе, т.к. он имеет небольшую длительность около 300 нс. Необходимое время длительности deadtime необходимо рассчитывать для каждой конкретной задачи, чтобы защитить транзисторы от сквозных токов. Длительность задержки настраивается при иннициализации (настройке) таймера TIM1. Данная задержка присутствует и на фронте и на спаде сигнала.
6. Написание встроенного ПО для микроконтроллера STM32
Вот мы и подошли наверное к самой важной и интересной части. Физику процесса мы разобрали, принцип работы вроде понятен, необходимый минимум защит тоже определен — осталось только все это реализовать в реальном железе. Для этого я использую платку STM32VL-Discovery, получил ее кстати еще в 2011 году во времена, когда ST раздавали отладки бесплатно на своих конференциях и с тех пор она лежала запакованная — открыл упаковку всего пару месяцев назад, вроде срок годности не прошел))) Выглядит мой «стенд» для написание кода вот так:
![](https://habrastorage.org/webt/yb/es/fr/ybesfrpaq3dhfrliz6z517bwy-8.jpeg)
Теперь пройдемся по подключению. Так как мне необходимо формировать два сигнала с разной частотой, то пришлось задействовать выходы ШИМ на разных таймерах. TIM1 формирует сигнал, который задает основную частоту 50 Гц и подает их на транзисторы VT3 и VT4. Используется канал ШИМа №3 + его комплементарный выход. Да да, в STM32 аппаратный deadtime можно настроить только между обычным и комплементарным выходом одного канала, что мне сильно не понравилось. Сам процесс формированию синуса передан таймеру TIM2, тут уже не нужна задержка (ранее писал почему) и он вполне сгодится для формирование модулированного сигнала на VT1 и VT2.
Используемые выходы:
- PA10 — обычный выход ШИМ, канал №3 таймера TIM1, который генерирует 50 Гц на транзистор VT3
- PB15 — комплементарный выход канала №3 таймера TIM1, который подается на транзистор VT4
- PA0 — выход ШИМ канала №1 таймера TIM2. Подает модулированный сигнал на VT1
- PA1 — выход ШИМ канала №2 таймера TIM2. Подает модулированный сигнал на VT2
Проект реализован в среде Keil 5, он будет в конце статьи прикреплен к архивом. Рассказывать как создавать проект и подобные очевидные вещи надеюсь не стоит, если такие вопросы возникают, то советую посмотреть как это делать в гугле или на youtube. Весь код написан на CMSIS (регистры), т.к. использовать в системе управления преобразователем какие-либо дополнительные уровни абстракции просто грех! У ST это библиотеки SPL и более актуальные HAL. Для интереса поработал и с теми и с теми, вывод — хлам полный. HAL так вообще безумно тормознутый и для приложений с жестким реал-таймом просто не подходит от слова совсем. В некоторых критичных моментах регистры были в разы быстрее, об этом кстати нашел не одну статью на просторах интернета.
Некоторые наверняка спросят: «А почему не задействовать DMA?» Сделать это можно и нужно, но данная статья носит скорее ознакомительный характер, да и сам МК не делает ничего сложного в плане вычислений, поэтому в производительность ядра тут точно не упереться. DMA — это хорошо, но без DMA можно обойтись без каких-либо потенциальных проблем. Давайте уточним, что нам нужно сделать в программе:
- Создать массив с нашими 240 точками синуса
- Настроить цепи тактирования на частоту 24 МГц, выбрав источник внешний кварцевый резонатор
- Настроить таймер TIM1 на генерацию ШИМ 50 Гц с включенным deadtime
- Настроить TIM2 на генерацию ШИМ с несущей частотой 24 кГц
- Настроить таймер TIM6, который генерирует прерывания с частотой 24 кГц. В нем мы будем отправлять следующее значение скважности из таблицы в таймер TIM2, а также чередовать генерацию полуволн
Ничего сложного, правда? Тогда поехали…
6.1. Создание таблицы синуса
Тут все просто, обычный массив. Единственное, что стоит помнить — у нас 120 точек от 0 до 1000. Нам нужно добавить в таблицу еще 120 точек, но в обратной последовательности:
uint16_t sin_data[240] =
{0,13,26,39,52,65,78,91,104,117,130,143,156,196,182,195,207,220,233,246,
258,271,284,296,309,321,333,346,358,370,382,394,406,418,430,442,453,465,477,488,
500,511,522,533,544,555,566,577,587,598,608,619,629,639,649,659,669,678,688,697,
707,716,725,734,743,751,760,768,777,785,793,801,809,816,824,831,838,845,852,859,
866,872,878,884,891,896,902,908,913,918,923,928,933,938,942,946,951,955,958,962,
965,969,972,975,978,980,983,985,987,989,991,993,994,995,996,997,998,999,999,999,
999,999,999,998,997,996,995,994,993,991,989,987,985,983,980,978,975,972,969,965,
962,958,955,951,946,942,938,933,928,923,918,913,908,902,896,891,884,878,872,866,
859,852,845,838,831,824,816,809,801,793,785,777,768,760,751,743,734,725,716,707,
697,688,678,669,659,649,639,629,619,608,598,587,577,566,555,544,533,522,511,500,
488,477,465,453,442,430,418,406,394,382,370,358,346,333,321,309,296,284,271,258,
246,233,220,207,195,182,196,156,143,130,117,104,91,78,65,52,39,26,13,0};
6.2. Настройка системы тактирования
Настройка тактирования в STM32 весьма гибкая и удобная, но есть несколько нюансов. Сама последовательность выглядит следующим образом:
1) Переключаемся на тактирование от встроенной RC-цепочки (HSI) на внешний кварц (HSE), дальше ждем флага о готовности
RCC->CR |= ((uint32_t)RCC_CR_HSEON); // Enable HSE
while (!(RCC->CR & RCC_CR_HSERDY)); // Ready start HSE
2) Flash память контроллера работает несколько медленнее, чем ядро для этого настраиваем тактирование флеши. Если этого не сделать, то программа запустится, но будет периодически падать: пара кВт и нестабильное ПО — вещи несовместимые.
FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY; // Cloclk Flash memory
3) Выставляем делители для системной шины тактирования (AHB) и для шин периферии, коих аж две штуки: APB1 и APB2. Нам нужна максимальная частота, поэтому ничего не делим и коэффициенты деления делаем равными 1.
RCC->CFGR |= RCC_CFGR_HPRE_DIV1; // AHB = SYSCLK/1
RCC->CFGR |= RCC_CFGR_PPRE1_DIV1; // APB1 = HCLK/1
RCC->CFGR |= RCC_CFGR_PPRE2_DIV1; // APB2 = HCLK/1
4) Настраиваем множитель частоты (PLL) предделитель, который стоит перед ним и делит частоту кварца на 2. Получаем, что 8 МГц поделили на 2 и получили 4 МГц. Теперь надо их умножить на 6, чтобы на выходе были 24 МГц. Перед записью регистров предварительно сотрем их содержимое на всякий случай.
RCC->CFGR &= ~RCC_CFGR_PLLMULL; // clear PLLMULL bits
RCC->CFGR &= ~RCC_CFGR_PLLSRC; // clearn PLLSRC bits
RCC->CFGR &= ~RCC_CFGR_PLLXTPRE; // clearn PLLXTPRE bits
RCC->CFGR |= RCC_CFGR_PLLSRC_PREDIV1; // source HSE
RCC->CFGR |= RCC_CFGR_PLLXTPRE_PREDIV1_Div2; // source HSE/2 = 4 MHz
RCC->CFGR |= RCC_CFGR_PLLMULL6; // PLL x6: clock = 4 MHz * 6 = 24 MHz
5) Теперь надо включить множитель частоты (PLL) и дождаться флага о готовности:
RCC->CR |= RCC_CR_PLLON; // enable PLL
while((RCC->CR & RCC_CR_PLLRDY) == 0) {} // wait till PLL is ready
6) И наконец-то настраиваем источник тактирования для системной шины (AHB) выход нашего множителя частоты, на котором заветные 24 МГц. Предварительно содержимое регистра чистим, устанавливаем нужный бит и ждем флага готовности:
RCC->CFGR &= ~RCC_CFGR_SW; // clear SW bits
RCC->CFGR |= RCC_CFGR_SW_PLL; // select source SYSCLK = PLL
while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1) {} // wait till PLL is used
В итоге у нас получается вот такая функция настройки тактирования:
void RCC_Init (void){
RCC->CR |= ((uint32_t)RCC_CR_HSEON); // Enable HSE
while (!(RCC->CR & RCC_CR_HSERDY)); // Ready start HSE
FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY; // Cloclk Flash memory
RCC->CFGR |= RCC_CFGR_HPRE_DIV1; // AHB = SYSCLK/1
RCC->CFGR |= RCC_CFGR_PPRE1_DIV1; // APB1 = HCLK/1
RCC->CFGR |= RCC_CFGR_PPRE2_DIV1; // APB2 = HCLK/1
RCC->CFGR &= ~RCC_CFGR_PLLMULL; // clear PLLMULL bits
RCC->CFGR &= ~RCC_CFGR_PLLSRC; // clearn PLLSRC bits
RCC->CFGR &= ~RCC_CFGR_PLLXTPRE; // clearn PLLXTPRE bits
RCC->CFGR |= RCC_CFGR_PLLSRC_PREDIV1; // source HSE
RCC->CFGR |= RCC_CFGR_PLLXTPRE_PREDIV1_Div2; // source HSE/2 = 4 MHz
RCC->CFGR |= RCC_CFGR_PLLMULL6; // PLL x6: clock = 4 MHz * 6 = 24 MHz
RCC->CR |= RCC_CR_PLLON; // enable PLL
while((RCC->CR & RCC_CR_PLLRDY) == 0) {} // wait till PLL is ready
RCC->CFGR &= ~RCC_CFGR_SW; // clear SW bits
RCC->CFGR |= RCC_CFGR_SW_PLL; // select source SYSCLK = PLL
while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1) {} // wait till PLL is used
}
6.3. Настройка таймера TIM1 и «мертвого времени»
Я приведу общую настройку таймера, она подробно описана в reference manual — назначение каждого регистра советую почитать. Да и базовые статьи по работе с ШИМ в интернете есть. Сам код у меня весьма неплохо прокомментирован, поэтому привожу сразу код функции инициализации таймера TIM1, а самые интересные моменты разберем:
void PWM_50Hz_Init (void){
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // enable clock for TIM1
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // enable clock for port A
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // enable clock for port B
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // enable clock for alternative gpio
/****************************** Setting PA10 **************************************/
GPIOA->CRH &= ~GPIO_CRH_CNF10; // setting out alternative push-pull for PWM
GPIOA->CRH |= GPIO_CRH_CNF10_1;
GPIOA->CRH &= ~GPIO_CRH_MODE10;
GPIOA->CRH |= GPIO_CRH_MODE10; // gpio speed 50 MHz
/***************************** Setting PB15 ***************************************/
GPIOB->CRH &= ~GPIO_CRH_CNF15; // setting complementary for CH3N
GPIOB->CRH |= GPIO_CRH_CNF15_1;
GPIOB->CRH &= ~GPIO_CRH_MODE15;
GPIOB->CRH |= GPIO_CRH_MODE15; // gpio speed 50 MHz
/************************** Config PWM channel ************************************/
TIM1->PSC = 480-1; // div for clock: F = SYSCLK / [PSC + 1]
TIM1->ARR = 1000; // count to 1000
TIM1->CR1 &= ~TIM_CR1_CKD; // div for dead-time: Tdts = 1/Fosc = 41.6 ns
TIM1->CCR3 = 500; // duty cycle 50%
TIM1->CCER |= TIM_CCER_CC3E | TIM_CCER_CC3NE; // enable PWM complementary out
TIM1->CCER &= ~TIM_CCER_CC3NP; // active high level: 0 - high, 1 - low
TIM1->CCMR2 &= ~TIM_CCMR2_OC3M;
TIM1->CCMR2 |= TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1; // positiv PWM
TIM1->BDTR &= ~TIM_BDTR_DTG; // clear register
TIM1->BDTR |= TIM_BDTR_DTG_2 | TIM_BDTR_DTG_1 | TIM_BDTR_DTG_0; // value dead-time
TIM1->BDTR |= TIM_BDTR_MOE | TIM_BDTR_AOE; // enable generation output
/*******************************************************************************/
TIM1->CR1 &= ~TIM_CR1_DIR; // count up: 0 - up, 1 - down
TIM1->CR1 &= ~TIM_CR1_CMS; // aligned on the front signal
TIM1->CR1 |= TIM_CR1_CEN; // start count
}
Скважность у нас фиксированная и никогда не изменяется, как и частота. Именно этот таймер задает время и последовательность работы диагоналей:
TIM1->CCR3 = 500; // duty cycle 50%
Длительность паузы «мертвого времени» зависит сильно от временной параметра TDTS, которое настраивается тут:
TIM1->CR1 &= ~TIM_CR1_CKD; // div for dead-time: Tdts = 1/Fosc = 41.6 ns
Его длительность составляет 1 тик тактовой частоты. Если посмотреть в reference manual, то можно увидеть, что биты CKD могут, например, сделать Tdts равным 2, 8 тикам и прочее.
Самое же время паузы устанавливается тут:
TIM1->BDTR |= TIM_BDTR_DTG_2 | TIM_BDTR_DTG_1 | TIM_BDTR_DTG_0;
Если отроете reference manual RM0041, то увидите вот такие формулы для расчета DT. Как видите параметр Tdts там основнополагающий:
![](https://habrastorage.org/webt/ht/7-/dy/ht7-dyrbbx2vtyjawhmdirpjpxi.png)
6.4. Настройка таймера TIM2, формирующий синус
Тут все еще проще, объяснять что-то в настройке наверно нет смысла, ибо комментарии и так избыточны. Если будут вопросы — жду их в комментариях.
void PWM_Sinus_Init (void){
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // enable clock for TIM2
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // enable clock for port A
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // enable clock for alternative gpio
/****************************** Setting PA0 ***************************************/
GPIOA->CRL &= ~GPIO_CRL_CNF0; // setting out alternative push-pull for PWM1_CH1
GPIOA->CRL |= GPIO_CRL_CNF0_1;
GPIOA->CRL &= ~GPIO_CRL_MODE0;
GPIOA->CRL |= GPIO_CRL_MODE0; // gpio speed 50 MHz
/****************************** Setting PA1 ***************************************/
GPIOA->CRL &= ~GPIO_CRL_CNF1; // setting out alternative push-pull for PWM1_CH1
GPIOA->CRL |= GPIO_CRL_CNF1_1;
GPIOA->CRL &= ~GPIO_CRL_MODE1;
GPIOA->CRL |= GPIO_CRL_MODE1; // gpio speed 50 MHz
/*************************** Config PWM channel ***********************************/
TIM2->PSC = 0; // div for clock: F = SYSCLK / [PSC + 1]
TIM2->ARR = 1000; // count to 1000
TIM2->CCR1 = 0; // duty cycle 0%
TIM1->CCR2 = 0; // duty cycle 0%
TIM2->CCER |= TIM_CCER_CC1E; // enable PWM out to PA8
TIM2->CCER &= ~TIM_CCER_CC1P; // active high level: 0 - high, 1 - low
TIM2->CCER |= TIM_CCER_CC2E; // enable PWM complementary out to PA9
TIM2->CCER &= ~TIM_CCER_CC1P; // active high level: 0 - high, 1 - low
TIM2->CCMR1 &= ~(TIM_CCMR1_OC1M | TIM_CCMR1_OC2M);
TIM2->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 |
TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1; // positiv PWM1_CH1 and PWM1_CH2
/*******************************************************************************/
TIM2->CR1 &= ~TIM_CR1_DIR; // count up: 0 - up, 1 - down
TIM2->CR1 &= ~TIM_CR1_CMS; // aligned on the front signal: 00 - front; 01, 10, 11 - center
TIM2->CR1 |= TIM_CR1_CEN; // start count
}
6.5. Настройка прерываний от таймера TIM6
Настраиваем сам таймер на частоту 24 кГц:
void TIM6_step_init (void){
RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; // enable clock for basic TIM6
TIM6->PSC = 1-1; // div, frequency 24 kHz
TIM6->ARR = 1000; // count to 1000
TIM6->DIER |= TIM_DIER_UIE; // enable interrupt for timer
TIM6->CR1 |= TIM_CR1_CEN; // start count
NVIC_EnableIRQ(TIM6_DAC_IRQn); // enable interrupt TIM6_DAC_IRQn
}
6.6. Реализация основного алгоритма управления
Основные события происходят в генерируемом таймером TIM6 прерывании. Прерывание генерируется каждые 41,66 мкс, если помните это наш шаг дискретизации. Соответственно в прерывании записывается значение скважности из таблицы в регистр CCRx. Также в данном прерывании определяется какая диагональ в данный момент времени отрисовывается, путем инверсии флага sin_status после каждого полупериода. Мы выводим 240 точек, инвертируем флаг, что вызывает переход управления к другому каналу, когда уже и он отрисовал, то флаг опять инвертируется и все повторяется. Код основного алгоритма:
void TIM6_DAC_IRQHandler(void){
TIM6->SR &= ~TIM_SR_UIF;
if(sin_status == 0){TIM2->CCR1 = sin_data[sin_step];}
if(sin_status == 1){TIM2->CCR2 = sin_data[sin_step];}
sin_step++;
if(sin_step >= 240){
sin_step=0;
sin_status = sin_status ? 0 : 1;
}
}
Итоги
Скачиваем проект, компилируем и заливаем в ваш микроконтроллер и получаем рабочий инвертор. Вам остается только сделать мост и подавать на него сигналы:
![](https://habrastorage.org/webt/xb/eu/oe/xbeuoedsmgdvntnsequnhzr2kau.png)
Одну из своих схем моста я чуть ранее выложил в PDF-ке можете пользоваться сколько угодно, надеюсь она вам поможет в освоение силовой электроники.
Также в проект я натянул FreeRTOS. Конечно средствами RTOS нельзя реализовывать подобные задачи по управлению, т.к. простое переключение между задачами длится от 4 до 18 мкс и это если код хорошо написан и работе планировщика ничто не помешает. Это не позволяет получить систему управления, работающую в жестком реал-тайме. FreeRTOS я поставил для другого: интерфейсы связи (RS-485 Modbus RTU), регулировка выходной амплитуды напряжения, пересчет таблицы, синхронизация с сетью 230В и прочее. Все эти плюшки я тоже попробую реализовать на STM32, а возможно и напишу продолжение тематики статьи, если получатся интересные результаты и будет чем поделиться.
Надеюсь статья вам понравилась. Если у вас возникли вопросы по применению данного кода в реальном железе, то буду рад ответить на них. Также прошу не воспринимать данный код как что-то готовое, это ядро преобразователя, которое реализует основную функцию. Все «плюшки» и прочую избыточность вы можете добавить сами. Голое ядро проекта позволит вам понять как оно работает и не тратить кучу времени на разборку кода.
Структура такая:
а) start_init — настройка частоты, выхода MCO для тестов, GPIO общего назначения (светодиоды/кнопки)
б) PWM — настройка ШИМа, таймеров и всего, что было задействовано при работе по управлению мостом
в) main.c — основной код
2) Reference manual для STM32F10x — тут
Комментарии (151)
Ppord
15.11.2017 16:49Таблицу синусов можно сократить вдвое, она симметричная. Хотя в нынешних МК памяти уже не жалко.
NordicEnergy Автор
15.11.2017 17:03Конечно можно и нужно. В статье об этом несколько раз упоминалось, что таблицы для 1/4 периода достаточно, т.к. синус сигнал симметричный. Таблицу на половину периода я сделал лишь с целью сделать код понятным. Если сделать таблицу на 120 значений, то несколько усложнится алгоритм записи данных в прерывании, а так таблица просто пишется линейно. И есть несколько моментов, во-первых, усложнение алгоритма вывода значений увеличит время нахождения в прерывании, что не есть хорошо и во-вторых, может запутать совсем начинающего электронщика.
Goron_Dekar
15.11.2017 17:13Отдельно спасибо за работу на регистрах.
atd
15.11.2017 22:20Да, это прямо в душу запало. Я-то думал что один такой и что-то со мной не так, когда плевался на стандартные либы от ST…
Там внутри реальный трэш и угар творится.NordicEnergy Автор
16.11.2017 08:38Вы не один такой)) SPL ещё более менее, а вот HAL это просто ад. Ощущение, что его 3 пьяных индуса за вечер написали. Да и скорость разработки он не увеличивает, если что-то ломается, то можно пару дней искать косяк в библиотеках. У меня много знакомых, кто с регистров ушли на HAL, а через пол года вернулись
LampTester
16.11.2017 12:33+1Аналогично, залогинился специально, чтобы поставить плюс за работу на регистрах. :)
Если говорить откровенно, то я не знаю как данный раздел преподнести на доступном языке.
Я бы просто сказал, что, чтобы получить синус, ШИМ надо проинтегрировать. Что такое интегрирование здешняя аудитория точно знает. :)
Или можно сказать, что мы выделяем нижнюю гармонику, которая будет соответствовать модулирующему сигналу.NordicEnergy Автор
16.11.2017 14:11Кстати да, интегрирование — отличная интерпретация. В следующий раз в таком виде и буду описывать. Спасибо за хорошую мысль!)
syrompe
15.11.2017 17:27Плюсы/минусы сквозной нейтрали/моста местами сильно надуманы, местами противоречат сами себе.
Сквозная нейтраль почти всегда будет дороже моста в основном из-за необходимости двуполярного питания.
Про надежность опять же ИМХО опять же сильно надумано.
Ну и все эти заморочки с УЗО, заземлением и прочая не на пустом месте появились, а для больших мощностей намного актуальнее.NordicEnergy Автор
15.11.2017 17:38Все, что написано в статья является исключительно моим субъективным мнением и я надеюсь это все понимают. Четкого разделения на «плюс» и «минус» не возможно в принципе, это тоже думаю понятно. Именно поэтому плюс и минусы пересекаются и противоречат частично)) Данные выводы по «плюсам/минусам» сделаны из моего опыта разработки силовых преобразователей + информация из достаточно компетентных статей и прочих источников. У кого-то этот опыт может быть иным как и мнение, это нормальное явление.
Про основную сложность с двухполярным питанием вы абсолютно правы. Если речь идет, например, о ИБП, то у нас и выход инвертора должен быть двухполярным, и выход PFC тоже двухполярным, а это сложнее и дороже.
Заморочки со сквозной нейтралью в ряде стран описаны на уровне стандартов, например, в Норвегии без сквозной нейтрали нельзя установить ИБП от слова совсем. В России таких требований пока нет. На больших мощностях обычно (из того, что сам видел) и ДО и ПОСЛЕ преобразователя ставят защиту, т.к. если пыхнет, то ущерб будет сильно дороже, чем стоимость даже хорошего автомата от того же ABB.
Dmitry_7
15.11.2017 19:40Очень странное предположение, что гладкий интерпретированный график в экселе означает такой же сигнал… ВЧ-гармоник в нем будет очень много
NordicEnergy Автор
15.11.2017 19:51А где вы это увидели? И зачем смотреть на график, когда есть осциллограмма сигнала, которая по той же таблице генерируется? В месте про ФНЧ так же указано, что гармоники уменьшаются по амплитуде, но не исчезают полностью. Прошу не читать между строк.
googlodrocher
15.11.2017 20:31А вправду говорят, что нонешние частотные преобразователи обходятся без DC-преобразования? Вроде как заправские джедай-самураи- рубят входную синусоиду на куски, и тут же её склеивают в выходную?
NordicEnergy Автор
15.11.2017 21:08Не совсем так. Есть решения, когда сеть все таки выпрямляют, но не сглаживают. Получается однополярная синусоида с удвоенной частотой, как в выпрямителе без конденсатора и уже ее нарезают. На мощностях больше 2.2 кВт такое на практике не встречал, но сказать, что сильно много с промышленными частотниками сталкиваюсь, тоже не могу.
Izy125
15.11.2017 20:48несколько лет назад стояла задачка получить синус на 400 Гц и 36 В и три фазы для включения авиационного прибора. Так как мощность была не очень большая( 2А по ТЗ по постоянному питанию, по факту разумеется меньше), то решил немного упростить себе жизнь и отказаться от LC фильтра на выходе. В итоге получилась связка ШИМ от МК подается на фильтр Баттерворта 2 порядка на ОУ, а полученная синусоида раскачивается на TDA7294
NordicEnergy Автор
15.11.2017 21:10Хитрое решение)) Пульсации были так понимаю меньше чем с LC-фильтром? И КПД не измеряли случаем? Мне кажется, что на паре сотен ватт это уже наверное печка будет.
Izy125
16.11.2017 09:13печка неплохая, все же синусоида не самый лучший сигнал для усиления))
в цифрах уже не скажу, давно дело было и в серию в итоге плата не пошла. Прибор заработал и на меандре)
sanchosd
16.11.2017 16:16Круто!!! еще-бы на лампах, каких-нить 6С19… непомню… короче мощняцкие триоды, 1.5Ампера анодного току… запаралелить их 100500, и был-бы реально теплый-ламповый инвертор!!! Вы-бы стали звездой Ютюба!)
без сарказма есличе)Izy125
16.11.2017 16:46составить конкуренцию для Kreosan?:)
На светлане генераторные лампы до сих пор клепают на пару кВт штука)sanchosd
16.11.2017 17:14Ухты. Откуда такая инфа? У них репортажи были, про обычные лампочки. А про генераторные? есть где поглядеть?
Izy125
17.11.2017 11:52лет 5 назад ездили на производство от универа. У нас со светланы пару преподов было. С репортажами без понятия, где могли засветиться.
Хотя производство мелких ламп там тоже интересое
alexhott
15.11.2017 21:21А разве если писать на ходу в CCRx не возникает глюков у ШИМа?
или этот вопрос в контроллерах больше не актуален?
на атмеловском контроллере простеньком чего-то делал, дак там рекомендовали перед сменой скважности деинициализировать ШИМ.
И мне кажется что дискретность ШИМа 0-1000 избыточна, и 250 достаточно, и частоту можно будет поднять.
Можно также порекомендовать для преобразователей покупать контроллеры у которых эта функция аппаратно заложена, обычно три фазы для питания двигателей.
Ну и не забываем про микросхемы — драйверы ключей, в них сейчас и защита и мертвое время аппаратно заложены.
ЗЫ: статью в закладки, плюс в карму
NordicEnergy Автор
15.11.2017 21:36C AVR и PIC16 не работал никогда, что там не скажу, но вот в STM32, TMS320, LPC, MSP432 такой проблемы точно нет. Собственно периферийный блок ШИМ и создан для этого. Нужно только помнить, что не у всех МК значение загружается в ШИМ за 1 такт системный, но у меня ни разу не возникало необходимости делать несущую частоту сигнала сопоставимую частоте работы ядра и периферии.
0-1000 это лишь значение скважности, чем больше эта цифра, тем точнее считается значение. Если сделать, например, 0-250, то точность упадет в 4 раза. Это не очень сильно помешает конечно, но если есть возможность сделать лучше — надо делать лучше.
Про использование motor control нормальных я написал во втором абзаце, просто они не сильно популярны, ибо специфичны. Хотелось показать именно на чем-то доступном любому человеку. В планах написать аналогичную статью, но для трехфазного ШИМа и на TMS320F28027, тоже дешевый камень, но уже специализированный как раз под силовуху.
Про драйвера верно подмечено, но иногда ее не хватает. Например, у меня есть железка, где сигнальные линии около 320 мм и сделать короче нельзя — одно из решений было как раз увеличить задержку с помощью DSP, чтобы компенсировать затяжные фронты.atd
15.11.2017 22:22Но от затяжного фронта же сам мосфет будет греться сильнее? Не было возможности драйвер перенести к самому ключу?
NordicEnergy Автор
15.11.2017 22:25Конечно будет, но +3 Вт динамических потерь на каждом транзисторе (их 12 штук) были не существенны при мощности 8000 Вт. Возможности не было, т.к. надо было обязательно в 2 слоя и токи большие, поэтому все сожрали полигоны медные. Таким образом нашли просто «золотое сечение» между стоимость/КПД
BigBeaver
16.11.2017 10:35Влезу сюда, раз про скважность речь идет.
Это значение скважности, которую устанавливает микроконтроллер, то есть 100 — это 10%, 500 — 50%, 900 — 90%.
Простите за занудство, но скважность и коэффициент заполнения у вас сопоставлены неправильно.
Таким образом, 50% это скважность 2, а 500 — это 0.2%.NordicEnergy Автор
16.11.2017 11:07Скважность это отношение времени открытого состояния к периоду. Период счета 1000, время открытого состояния 500. Скважность 500/1000 = 0.5. Значение скважности всегда от 0 до 1. Получаем, что 0.5 — это 50%
BigBeaver
16.11.2017 11:14Скважность (S) это отношение периода импульса (T) к его длительности (т). А от 0 до 1 это коэфициент заполнения (D — duty cycle), который есть отношение единицы к скважности. Но их постоянно путают.
NordicEnergy Автор
16.11.2017 11:47Ох… какая разница? Зависимость то линейная, просто в -1 степени. На физический смысл в контексте статьи это никак не влияет, а слово «скважность» привычнее для большинства ушей.
BigBeaver
16.11.2017 11:55В том-то и дело, что не линейная, да еще и в обратную сторону (чем больше скважность, тем короче импульс) — разница принципиальная.
Я вот не могу понять, вы, вроде, нормальный специалист, написали орошую статью, но вместо просвещения занимаетесь оправданием ошибок в терминологии под предлогом «многим так привычно». Не надо так.NordicEnergy Автор
16.11.2017 12:07Принципиальная для вас — да. Для меня нет, т.к. для понимания происходящего — это не критично, тем более цифру «50%» интерпретировать как-то иначе надо постараться. Хотите академичности — добро пожаловать в учебники, тут же даже отметки «туториал» нет, поэтому написано так, как мне показалось более доступным.
BigBeaver
16.11.2017 12:12Для любого человека с профильным образованием или хотя бы читавшего википедию.
Leerooooy, я тебе не чувак, парень. Есть некоторая разница между ошибкой в орфографии и осознанной подменой терминологии.NordicEnergy Автор
16.11.2017 12:18Для людей с профильным образованием — эта статья не принесет ничего нового. Это или 1й семестр спец глав электротехники или 2й семестр схемотехники же. Статья больше для людей «самоучек» у которых огромная пропасть между их знаниями и учебником. Я открою секрет наверное, но 95% студентов не способны осилить учебник в чистом виде, т.к. нужна прослойка и даже не одна. Собственно поэтому учебники все забывают через неделю, а статьи расписанные «на пальцах» уходят в закладки на долгое время.
sanchosd
16.11.2017 16:24Вы все правильно написали. Я когда-то делал подобную штуку… на****ся с алогритмом управления ключами. Поначалу синус все время кривым получался, хотя на РЦ-цепочке все идеально было. Подсказали на одном очень умном форуме(форум Валентина Володина), очень умные люди, что в диагонали, оба конца фильтра всегда должны быть «пришпилены» к питалову и земле. Т.е. например левая половина Н-моста работает комплементарно, а в правой, конец даагонали или к земле, или к питанию. Потом поменялись. Я честно говоря не вдался в подробности, у вас так-же, или нет, но у меня без этой хитрости все кривое выходило. Как только доработал- сразу все пошло как в книжке на картинке.
Хорошо, что вы все разжевали. Тому, кому понятно, нет нужды читать, пролистать мышкой вниз не составит труда.
Отдельный + за код работы с регистрами и разжевывание. Присоединяюсь к заянию библиотек типа HAL. Можно привыкнуть ими пользоваться, но это все равно, что зазубрить, сдать, забыть. Нужно каждый раз лезть в библиотеку и смотреть, а как-жее собственно использовать, как там индусы придумали…
Короче ставлю вам жирный + в карму)))NordicEnergy Автор
16.11.2017 16:29Ага, Володина знаю)) Не знаю как сейчас, но обитал там в году 2008-2011-м, публика там очень адекватная была, особенно по сварочникам.
Я про такое явления кратко упомянул, что ключами надо управлять так, чтобы модулированный ШИМ сигнал всегда перед нагрузкой прошел через индуктивность. Бывает, что не парятся и ставят дроссель и на фазу и на ноль, но лишний дроссель — это закопанные деньги. И если его не поставить, то действительно форма будет сильно искажаться. Тоже с таким сталкивался еще в универе, когда диплом делал.
Leerooooy
16.11.2017 12:01Автор, не парься, чувак просто дунул. Когда начинают докапываться до терминологии так глубоко, либо до орфографии — значит по делу человеку сказать нечего. Не обращай на них внимание.
Nikita_64
17.11.2017 16:20Спасибо за статью, (почти) все понятно. К сожалению, не владею темой, но неужели нет готовых аппаратных решений (имею ввиду переменный ШИМ для будущего синусоидального сигнала)? Одно дело проекты более 10 кВт, где могут быть специальные требования, другое — запитать насос на 300 Вт? Заранее благодарен.
NordicEnergy Автор
17.11.2017 17:22«МК + программа» как раз и есть это аппаратное решение. Конечно можно сделать тоже самое, на дискретной цифровой логике, но это громоздко и без каких любо плюсов. Есть готовые решения, например, EG8010, но у них лишь базовый функционал. Если захотите синхронизировать вход и выход, либо выход и городскую сеть, то не обнаружите такой возможности, поэтому сделать свое решение — самый простой путь.
BigBeaver
16.11.2017 10:30У Атмела есть буферизация (Double Buffered Output Compare Registers даже у Тини13).
The OCR0x Registers are double buffered when using any of the Pulse Width Modulation (PWM) modes. For the normal and Clear Timer on Compare (CTC) modes of operation, the double buffering is disabled. The double buffering synchronizes the update of the OCR0x Compare Registers to either top or bottom of the counting sequence. The synchronization prevents the occurrence of odd-length, non-symmetrical PWM pulses, thereby making the output glitch-free.
actodc
15.11.2017 22:29Не понял, а в мостовой топологии можно сделать сквозную нейтраль? Например, для питания фазозависимых газовых котлов?
NordicEnergy Автор
15.11.2017 22:32В мостовой нейтраль не сквозная. А что значит фазозависимый? Тут не совсем понял. Делал знакомым для котла на 300 Вт ИБП мелкий и там было требование лишь к форме сигнала и частоте.
actodc
15.11.2017 22:47Во время установки газовой горелки, монтажники зафиксировали ее подключение к сети дома, так что определенный провод подключен к нейтрали, а другой к фазе. Объяснили, что если подключить наоборот, то не будет работать датчик пламени (ионизационный).
NordicEnergy Автор
15.11.2017 22:52Аааа, понял о чем вы. Да, соблюдать «фазировку» нужно. Мост тоже создает полноценный ноль. Если обратите внимание на схему, то получается, что один полумост (VT3-VT4) не имеет дросселя, а только коммутирует нейтраль. Второй полумост уже относительно этой нейтрали и рисует синус.
Если преобразователь мостовой, то у него на выходе так же четко фаза и ноль обозначены, просто ноль выходной напрямую не связан с нулем на входе. В хорошем ИБП вход и выход должны быть синхронизированы по фазе, для нагрузке (котла) это создает условия как будто он просто в сеть включен и позволяет объединить ноль на входе и на выходе. Соединяют иногда прям внутри, а иногда снаружи.syrompe
16.11.2017 14:23У газовых котлов все несколько сложнее.
Они пропускают небольшой ток (микроамперы, чтоб УЗО не сработало) между фазой и заземлением для контроля пламени. Соответственно если нет честной фазы (относительно заземления), то котел уходит в ошибку.NordicEnergy Автор
16.11.2017 14:51Тогда для 100% надежности фазу входную и выходную проводом соединяем и готово. Я собственно так и делал, в самом щитке где стоял ИБП все имело общий ноль на колодке. Проблем не наблюдалось. К сожалению про котлы знаю достаточно мало, сказать как и что внутри будет не могу уже.
syrompe
16.11.2017 15:05А КЗ не получим в итоге? Или я что-то не понял…
Собственно на многих импульниках с трансформатором на выходе один из выводов транса соединен с заземлением через резистор. Но тут трансформатор развязывает…NordicEnergy Автор
16.11.2017 15:08В ИБП между входом и выходом развязки нет. PFC обычно однотактный step-up преобразователь с дросселем и потом сразу мост. Да и не нужна развязка эта. А вот трансформатором развязывают DC/DC, например, 12->380В который, чтобы в случае чего АКБ не погибли.
КЗ не будет, если вход и выход синхронизированы. Этот момент надо уточнять, но в последние годы даже китайцы делают синхронизацию.
lingvo
15.11.2017 23:38Интересно, а вы знаете, что можно в вашем мосте вместо мосфетов поставить IGBT на 3300В/1200А а сами мосты соединить последовательно (N предыдущего моста с L следующего и т.д.), чтобы повысить напряжение и взять таких мостов штук 3000 и получится HVDC VSC — DC/AC конвертор, качающий гигаватты?
Принцип тот же, только контроллер немного сложнее :-)NordicEnergy Автор
15.11.2017 23:44IGBT медленные, я стараюсь от них уходить по возможности и ставить SiC. Есть кстати IGBT сборки на 10 кВ для частотников и если раскурочить модуль, то видно, что внутри как рас последовательное включение транзисторов. Мне кажется в предложенном варианте 3300В/1200А тоже ключики соединены последовательно, например, 3 по 1200В
imwode
15.11.2017 23:47Я три раза перечитал и все равно не понял вот этого:
Давайте оттолкнемся от изначальной задачи — нам нужно превратить, например, 380В 10А в переменное напряжение 230В. В общем это «классический» случай, его мы можете увидеть в любом хорошем on-line UPS или инверторе.
С чего это вдруг эта задача изначальная? Инверторы обычно питаются от 12В батареи, при чем тут 380В 10А? Откуда вообще берется DC 380В? Ну и далее по тексту — куча вопросов. Разжевывать что такое полный мост людям, имеющим ответы на эти вопросы — странно.NordicEnergy Автор
16.11.2017 08:42От 12В работает китайчина, хороший инвертор хотя бы от 24/48В работает. Статья вот только не про dc/dc, это аж в названии указано. 380В — это пример, там может быть любое постоянное напряжение. 380В — это стандартное напряжение в dc шину у инверторов и online UPS
BigBeaver
16.11.2017 10:38Было бы здорово об этом (устройстве таких систем) тоже статью аналогичного уровня.
imwode
16.11.2017 17:04+1Видимо речь о каких-то всем известных принципах построения датацентров. Я ни разу про такое не слышал. Т.е. с батарей снимается 380В?
Я к тому что в статье сильный перекос. В части микроконтроллеров и синуса разжевывается все до мелочей, а в части упса — «изначальная задача».NordicEnergy Автор
16.11.2017 17:40+1UPS целиком не был изначальной задачей, читаем названием) UPS — это всем известная железка, где такая топология применяется. Кому совсем интересно пойдет читать дальше. Что касается напряжений… Что есть «стандарт» не могу сказать на 100%, но в большинстве случаев в совсем мощных ИБП (10 и более кВт) DC-шина образуется последовательным включением 10, 20 или 30 АКБ. Получаем 120, 240 или 360В напряжение шины. До 10 кВт бывает 24, 48, 96, 120, 240, 360В — это и лично встреченного мною. В решениях для ЦОД в основном шина все таки 360В, это позволяет минимизировать ток в проводниках и транзисторах, что повышает КПД.
Будет статья по инвертору 24->380В, там постараюсь осветить вопрос с АКБ более подробно.
lingvo
16.11.2017 11:48DC 380В — это изначально просто выпрямленное напряжение из сети. DC/AC инвертор в этом случае — это базовый силовой блок, позволяющий из этого напряжения получить синусоидальное напряжение или ток любой частоты и амплитуды, например для плавного регулирования частоты вращения асинхронного электродвигателя, или питания устройств, которые чувствительны к частоте или гармоникам в питающем напряжении.
При этом, если генерировать не простую синусоиду, а подмешивать 3-ю гармонику, то на выходе можно получать напряжения выше действующего входного.
YUVladimir
16.11.2017 00:16Если хотите идеально очистить сигнал, то сделайте ФНЧ с частотой среза около 55-60 Гц
С таким фильтром и чистый меандр в синусоиду превратится.
Vanellope
16.11.2017 04:57Посоветуйте занимательного чтива по силовой электронике, а?
NordicEnergy Автор
16.11.2017 08:54Семенов «Основы силовой электроники», там 2 тома, это для старта и Reference Design на сайте Texas Instruments и у Infineon. Или хотите на русском?
Vanellope
16.11.2017 12:01Семёнова читала, спасибо. С английским проблем нет. Референсы все подряд смотреть, или посоветуете что-нибудь конкретное, как специалист?
NordicEnergy Автор
16.11.2017 12:13Референсы там идут по конкретным топологиям, например, для пуш-пула есть вот такая статейка с описанием работы + методы расчетов: скачать
Для пополнения знаний как-то масштабно могу еще посоветовать журнал: «Практическая силовая электроника». Это научное издание, выходит 4 раза в год. Оооочень хороший журнал, но стоит понимать — источник академический, а значит базовые знания математики и физики просто обязательны.
Jumper_In
16.11.2017 09:54Зиновьев "Основы силовой электроники". Есть несколько редакций, профессор активно борется с интернетом за удаление учебника со всяких там ресурсов, но найти и скачать можно. Ну или купить в НГТУ :)
В книге из приятного есть блок-схема для выбора силовой схемы под разные задачи (мощность, фазы, выходные токи-напряжения). Ну и хорошая теория по расчёту цепей (интегралы есть, но их можно не пугаться).Vanellope
16.11.2017 12:09Ок, до НГТУ только далеко. А как материал, современный?
Jumper_In
16.11.2017 13:52Если учесть, что в силовой электронике за последние лет 10 появились только новомодные импульсные схемы (типа резонансных схем с переключениями при нулевых токах и напряжениях, типа матричных преобразователей) + способы управления различные, то весьма актуальный.
Всё, что есть в промышленности сейчас — найдётся там, материал на момент 2005-2010 года современный.
Потому что почти всё новые схемы даже до этапа опытного образца не доходят, добрая половина только для статей и моделей доживает, не более того.
Вот если хочется что-то более современное, то тут только статьи IEEE искать или иностранные учебники. У китайцев/индийцев неплохая школа силовой электроники, если судить по статьям.
syrompe
16.11.2017 14:26На coursera есть курс «Power Electornics». По этому же курсу книжка «Fundamentals of Power Electronics» by Robert W. Erickson.
sanchosd
16.11.2017 16:28Я пробовал пройти этот курс. Не прошел. На третьем экзамене не смог «собрать» какую-то из формул.
При этом всем я ИИП занимаюсь по работе последние 4.5 года, именно разработкой.
Курс очень серьезный, очень серьезный, с разбегу не запрыгнуть.
AEP
16.11.2017 07:56Не понял, как LC-фильтр на выходе совместим с dead-time. Ведь если через индуктивность в данный момент протекает ненулевой ток, то одновременно закрыть VT1 и VT2 просто не получится — один из них будет вынужден пропустить ток (и нагреться) из-за ЭДС самоиндукции.
NordicEnergy Автор
16.11.2017 08:55VT1 и VT2 работают поочередно, то есть один из них всегда проводит ток.
lingvo
16.11.2017 11:54Вы заметили, что параллельно каждому транзистору стоит такой маленький и незаметный обратный flywheel диод? Так вот автор не показал путь протекания тока индуктивности, когда оба транзистора закрыты, а на самом деле ток никуда не девается, а начинает течь через эти диоды на соответственно плюс и минус DC шины.
NordicEnergy Автор
16.11.2017 14:22Совершенно верно, я несколько абстрагировался от различных паразитных явлений: ёмкостей, технологического диода. Сейчас жду железо и тогда как соберу плату уже подробнее напишу чисто по схемотехнике и транзисторы уже будут рассматривать не как идеальный, а с учётом всех явлений.
dimaviolinist
16.11.2017 08:55<музыкант-зануда>
«24 кГц наши уши всё-таки услышат»
Нет, не услышат.
</музыкант-зануда>
За статью большое спасибо, весьма познавательно.NordicEnergy Автор
16.11.2017 08:57Я часто в импульсниках на низкую частоту слышу писк, связываю это с частотой низкой. В данном преобразователе тоже еле еле, но слышно. Есть догадки с чем это связано?
Alexeyslav
16.11.2017 12:19Это скорей из-за процессов происходящих в схеме в целом, импульсник работая на 100кГц может затыкаться с частотой 10кГц и вы будете слышать писк.
Но вообще, услышать 24кГц можно. Слышим же эхолокатор летучих мышей(недавно убедился от залетевшей на балкон мышки), там частоты повыше. Весь вопрос в мощности излучения, которую мы сможем услышать из-за сильного завала АЧХ ушей. А у всех этот завал индивидуальный…NordicEnergy Автор
16.11.2017 12:21С большой частотой понятнее, затык например при КЗ или при насыщение, когда ОС отрабатывает слышно часто. Но вот когда частота меньше 30 кГц всегда казалось, что слышу именно свист транса или дросселя, т.к. он не пропадает даже в номинальном режиме работы. Наверное дело в ушах, либо глюки))
LampTester
16.11.2017 12:42Есть догадки с чем это связано?
Дроссель гудит на субгармониках?NordicEnergy Автор
16.11.2017 12:53Гармоники имеют частоту больше чем коммутация. Мне аж захотелось уже озадачить считать этим вопросом и в железке отловить его))
Geban
16.11.2017 08:57Шикарно! Спасибо! Ждем статью про DC-DC (48-380(400))
NordicEnergy Автор
16.11.2017 08:58Если интересует инвертор, то можете у меня на канале глянуть видео по инвертору www.youtube.com/NordicEnergy
У меня там небольшой open source, сейчас подъезжают оставшиеся комплектующие и видео по данной тематике продолжатся + по итогам работы будет статья на GT.
ZavDimka
16.11.2017 09:16Долго разбирался чем Ti МК лучше то же stm32f334, вроде только у stm есть таймер с псевдо 4.6ггц таймером. Для силовухи выбрали 334ый, отлично работает и разрядность шима радует.
NordicEnergy Автор
16.11.2017 10:06334-й дороже, чем TMS320F28027, хотя у последнего уже есть скоростные каналы ШИМа и пара других прелестей. 4.6 ГГц то откуда? Предел 32 бита и то при объединение таймеров. У toshiba еще шикарнее мотор контролы, но всем проще ковырять STM-ы, ибо они проще и инфы больше))
ZavDimka
16.11.2017 10:44Я имел ввиду временное разрешение.
High-resolution timer: 217ps, self-compensated versus power supply and temperature drift.
Максимальная частота таймера 144Мгц. При этом 10 выходов. Сигнал формируется не сравнением с числом, а событиями. Очень интересная периферия.
Реальная задача, где без этого таймера не обошлось — ФАПЧ на 100-200кгц. На стандартных таймерах был слишком грубый шаг скважности.BigBeaver
16.11.2017 10:48В силовых преобразователях слишком сильно частоту не выгодно задирать из-за роста динамических потерь — нескольких десятков мегагерц (опорная частота ШИМ) обычно заглаза.
NordicEnergy Автор
16.11.2017 11:01Частоту выгодно задирать, но дорого. Нужен более сложный драйвер, нужны ключи с мелкой ёмкостью затвора, а SiC и GaN пока достаточно дорогие.
Хотя серия P7 у infineon стоит дёшево и 200 кГц для них не проблемаBigBeaver
16.11.2017 11:05В принципе, я к тому и клоню. То есть понятно, что иметь более высокую частоту круто, но требования к компонентам и дизайну растут довольно резко начиная с какого-то уровня.
NordicEnergy Автор
16.11.2017 10:59150пс у самого дешманского f28027. За стоимость F334 можно взять камень ещё серьезнее. И в чем смысл делать дороже и хуже? Для меня это загадка.
32 бита я упомянул именно в плане точности хода.
Все современные железки даже совсем большой мощности уже уходят за 100 кГц и выше. До 1000Вт стараюсь меньше 200 кГц не опускать частоту коммутации.
Разумеется для каких-то задач хватит и stm, но в сложных задачах уже не прокатит. Есть математика, которая просто непосильна stm, например, управление сервоприводами высокого разрешения для ЧПУ. Делал и на F722 и на tms320f335 — последнего впритык хватило, а stm явно не хватает второго ядра или сопроцессора.
В каких-то простых задачах меня подкупает цена f1 и f0 серии))
Gordon01
16.11.2017 09:19Неужели в 2017 осталась еще нагрузка, которой нужен реальный переменный ток? Компрессор холодильника? Окей, очень старые и дешевые — да, но сейчас все инверторное.
NordicEnergy Автор
16.11.2017 09:50+1У меня дома — это скважина, циркулярные насосы системы отопления, то есть вся основная инфраструктура. Спалить грюнфус за 300-400$ мне кажется никто не захочет. Те, кто отапливаются газом еще и имеют котел, который так же хочет синус.
Поэтому переменный ток нужен, просто не всем. Особенно если вы живете в квартире.
JohnViper
16.11.2017 16:24Вы будете удивлены, но стремительно набирающие популярность во всем мире гибридные и электромобили требуют мощных преобразователей высокого DC напряжения от Li-Ion батареи в 3-х фазную переменку для работы мотор-генераторов. вот, например инвертор TOYOTA PRIUS Источник: priuschat.ru/topic/17-ustroistvo-invertora-avtomobilia-toyota-prius
Так что эта тема весьма актуальна, спасибо большое автору за статью!
EvgeniyNuAfanasievich
16.11.2017 16:33а инвенрторные какой то инопланетный двигатель используют, которому не нужен синус?
Andy_Big
19.11.2017 03:54Они входную переменку сразу выпрямляют и из полученной постоянки уже формируют синусы с нужными параметрами для двигателя (как описано в этой статье :)), так что их можно хоть постоянкой питать :)
lingvo
16.11.2017 16:41Ну еще всем асинхронникам с регулируемой частотой вращения тоже синусоидальная переменка нужна....
Skyroger2
16.11.2017 09:27Я правильно понял, что выход STM подключен непосредственно к MOSFETам без драйвера (возможно с какой-то схемой согласования напряжений)?
На мой взгляд, было бы правильно здесь использовать полумостовой драйвер (2 шт), что-то типа IR2104PBF, который стоит три копейки. Заодно это решает проблему с потенциальным КЗ при одновременном открытии плечей и с ёмкостью затворов MOSFETов.
За теорию и описание схем большое спасибо.NordicEnergy Автор
16.11.2017 09:53+2Надо быть укуренным извращенцом, чтобы подключать МК на затворы. Схема в pdf-ке приведена в статье. И да, она куда умнее и стабильнее, чем предлагаемый вами вариант.
Дублируют — ссылка.
golf2109
16.11.2017 09:40-2по поводу SPL HAL & CMSIS…
попробуйте без применения CubeMX создать проект например для STM32F746ZG
(FREERTOS,FATFS,FMC-16bit,LTDC-565,SDIO) а затем перенести его на STM32F476IG(заменив LTDC-565 на 888), а затем все это на STM32F769BI…
после решения подобных задач вы несколько разочаруетесь в «регистрах» и «полюбите»
HAL & CubeMXNordicEnergy Автор
16.11.2017 09:47+1Не поверите, но портировал недавно код с LTDC и Ethernet с F469 на F745 и заняло у меня это пол дня на регистрах. Когда была подобная задача с F4 на L4 и все на HAL, то несколько библиотек просто переписать пришлось. Да и так рекламируемая «полна совместимость кода» — полная фикция, особенно когда часть функций на разных сериях по разному работает.
Ну и самое главное, попробуйте написать что-то важнее, чем дисплей)) Код на регистрах работает шустрее и стабильнее. Если на дисплее тупняк на десяток мкс никто даже и не заметит, то в силовой электронике это приведет к выгоранию на пару тысяч $.golf2109
16.11.2017 11:23<blockquoteно портировал недавно код с LTDC и Ethernet с F469 на F745>
трудно оценить, что вы портировали, но на сайте st.com написано «STM32F745 doesn’t embed the LCD-TFT controller interface»…
по поводу «написания на регистрах», то задачу которую вы прекрасно описали в данной стотье, я решал года 3 назад — arm-stm.blogspot.com/2015/05/2-x-pwm-stm32f030f4.html
а насчет «тупняков» на дисплее — попробуйте например побороться с tearing-эффектом при пиксельных частотах 20-30 МГц при DMA 90-100 MГц и потом говорить, что в графике не важен «десяток мкс»NordicEnergy Автор
16.11.2017 11:54Действительно, в дискавери 746й стоит. Очепятка.
«Не важно» — это в смысле если ваш дисплей хоть молотком разбить, то это не приведет к остановке чего-то важного, как минимум потому, что HMI не наделяется каким-то критичным функционалом.
«решал года 3 назад» — у вас я, например, не вижу решения самой важной проблемы — проблемы сквозняка, задействование TIM3 путь простой, но не дает возможности получить аппаратную задержку, которую еще можно и пересчитывать на ходу. Вы вроде управляете двигателем, но не задействовали TIM1, который для этого и предназначен.
Да и назвать статьей 2 картинки и листинг у меня язык не поворачивается, материал все таки должен быть качественным.golf2109
16.11.2017 12:35Не заметил где я заметки из дневника «статьями» называю…
А по поводу dead time или как у вас «сквозняка», так он там и не учитывается, ибо решать такую проблему без применения аппаратных драйверов управления полумостами (IR2xxx, IRS2xxx), устраняющих возможность не только эффекта dead time но и межфазных замыканий для 3-х фазных мостов бессмысленноNordicEnergy Автор
16.11.2017 12:57Я уже писал выше: у драйверов dt фиксированный. На адекватной частоте (100+кГц) его просто не хватит. Для этого и регулиют DT в системе управления. DT считается для определенной частоты, для определенных условий и часто в ходе работы контроллера его приходится менять.
Я так понимаю вы очередной теоретик, который на практике даже 1-2 кВт не перешагнули? Иначе бы не писали про драйвера… В них защита чисто от дураков. Или по вашему DT регулируемый в том же TL598 зря сделали?golf2109
16.11.2017 13:04теоретик по моему вы, меняя dead time «в ходе работы контроллера» и собравшись применять «адекватные частоты 100 кГц» в киловаттной технике
NordicEnergy Автор
16.11.2017 13:12Ясно. Думаю дискуссия вошла в тупик, поэтому вынужден оставить вас наедине с вашими фантазиями.
PavN
16.11.2017 10:34Очень подробно и наглядно, интересно было освежить всё это в памяти, даже захотелось собрать… Хотя я больше стороник готовых решений, но на пару идей статья натолкнула, спасибо автору!
lingvo
16.11.2017 12:04Кстати, судя по последней диаграмме, у Вас довольно таки разная частота переключения левых и правых транзисторов — первые переключаются с ШИМом, а вторые только 50Гц. Это приведет к довольно-таки неравномерным потерям и перегреву. Вы можете легко добавить блок, который бы перекодировал состояния транзисторов, чередуя их между собой. Тогда частота ШИМ транзисторов уменьшилась бы в 2 раза и вы получили бы равномерный нагрев всех 4-х транзисторов.
NordicEnergy Автор
16.11.2017 13:14Так в этом и прелесть. Правая сторона VT3+VT4 она "медленная", значит динамические потери там стремятся к нулю и можно смело поставить более медленные и дешёвые ключи или даже igbt. В неравномерном нагреве плохого ничего нет.
lingvo
16.11.2017 14:23… но при этом вам будут нужны более быстрые и дорогие ключи в ШИМ-части и в итоге выигрыша в КПД и стоимости может не получиться. Я просто не видел, чтобы использовались разные типы ключей в мосте. Может это какое-то новое веяние?
NordicEnergy Автор
16.11.2017 14:55Зачем более быстрые? VT1 и VT2 будут в любом случае транзисторами с малой емкостью затворов. Mosfet-ы современные сейчас почти все могут до 200 кГц стабильно работать с адекватными потерями на коммутации, а главное стоят дешевле предыдущих поколений. Экономия существенная, просто не нужно в устройство ставить динозавров с алишки как это принято в СНГ.
EvgeniyNuAfanasievich
16.11.2017 16:25для эмоциональной разрядки: почему нельзя подключать выход ибп к его входу? (без задействования сети 220В)?
NordicEnergy Автор
16.11.2017 16:31Я вроде не заряжался, мы же культурные люди)) Если синхронизирован вход и выход, то думаю можно, но синхронизировать все и вся слишком проблематично и дорого, а главное бессмысленно. Обычно ставят байпас чтобы вход и выход соединять.
P.S. надеюсь правильно понял вопрос)EvgeniyNuAfanasievich
16.11.2017 16:36неет. я имел ввиду бытовые ИБП, которые дохнут если сделать вот так (только вилку воткнуть в него же самого) и включить кнопкой.
NordicEnergy Автор
16.11.2017 17:43Да, то, что на фото подходит только для всяких лампочек, да импульсных БП типа ноута или телевизора. Там внутри вроде линейно-интерактивная топология, то есть коммутируется или инвертор или входная сеть. От такого котел думаю загнуться может с большой вероятностью.
Мне попадался в руки VES-300, просто и достаточно качественный ИБП именно для котла.
andersong
16.11.2017 12:45Когда по работе начал осваивать промышленные ПЧ, задавался вопросом свиста асинхронных трехфазных двигателей при работе. По умолчанию частота дискретизации на ПЧ была установлена 10 кГц. В мануале для устранения шума было рекомендовано поднимать частоту дискретизации кГц до 15-20, но при этом падал КПД привода. Так что либо свист, либо низкий КПД. А у Вас в статье посыл, что чем выше частота, тем лучше. Противоречие?
NordicEnergy Автор
16.11.2017 13:23КПД падает, потому что частотник ваш и вообще многие, сделаны на igbt модулях, а они медленные. Частота растет — растут динамические потери. Я использую быстрые полевики, а они до 150 кГц работают без проблем. Так что никаких противоречий, только наука))
Alexeyslav
16.11.2017 15:58Где-то с пол года назад здесь уже был цикл статей по мощным ИБП/инверторам с генерацией синуса на ПЛИСе используя алгоритм DDS.
NordicEnergy Автор
16.11.2017 16:15Круто! А ссылочки не будет? Я все смотрю в сторону попробовать на fpga сделать преобразователь полноценный, но пока в порядке экспериментов дальше написания IP ядра для ШИМа не ушел.
Alexeyslav
16.11.2017 17:29geektimes.ru/post/267682
Как время летит, уже даже больше чем пол года прошло. Пожалуй даже сильнее чем пол года.NordicEnergy Автор
16.11.2017 17:45Эти статьи видел, задумка мне понравилась и корпус серверный тоже приятный. Жалко, что статьи не завершились. Реализацию на FPGA там вроде автор не показал, хотя упоминал.
Alexeyslav
16.11.2017 21:32Странно, я вроде думал что закончилось все. Как-то на полуслове заканчивается. Кажется я начал вспоминать… автора закритиковали он и бросил постить. Печаль. Да там вроде ничего сложного не должно быть, гланое на ПЛИС ШИМ высокоскоростной многоразрядный реализовать и четверть-синусовую таблицу занести. Сам DDS до безобразия прост — 32-битный накапливающий сумматор с выводом старших 16 бит на таблицу синуса и потом на ШИМ. А может и больше бит, где-то видел чип DDS с выходом синуса так там заведена таблица на 1Мx16 бит, чисто в ПЛИСе такая наверно не поместится.
NordicEnergy Автор
17.11.2017 10:45Можно внешнюю SDRAM прицепить и перед стартом таблицу в нее из флешки переносить. Это должно решить проблему реализации большой разрядности.
Alexeyslav
17.11.2017 12:17Костыли, однако. Причем дикие костыли. Лучше уж сразу параллельную флеш. К тому же, наверняка есть ПЛИС со встроенной табличной(ПЗУ) памятью, ведь функция не так чтобы очень редкая.
NordicEnergy Автор
17.11.2017 12:37Параллельная флешка медленнее SRAM. Да и такой «костыль» везде и применяют, никто не использует флеш как «расширение» ОЗУ. Обычно SRAM, в крайнем случаем SDRAM/DDR.
У альтеры есть MAX10, у других не знаю. Можно конечно взять CPLD жирную от Lattice и не париться.Alexeyslav
17.11.2017 17:45Это когда вопрос о десятках мегагерц и выше. Тут же вроде речи о таких скоростях не идёт.
Andy_Big
19.11.2017 04:06Можно просто SRAM, без заморочек с регенерацией, быстродействия хватит за глаза для любого ШИМ :)
Ну и кроме того, очень многие ПЛИС уже имеют SRAM на борту с достаточным объемом. Те же Cyclone III/IV. Можно просто при инициализации заливать в них таблицу синуса. Я так делал цифровые фильтры с изменяемыми параметрами — просто заливал в ПЛИС нужную таблицу коэффициентов.
На ПЛИС такого уровня вообще очень много критических по времени функций можно возложить, ту же синхронизацию, например, а контроллеру оставить только высокоуровневые вещи :)
lingvo
17.11.2017 00:38Я несколько лет назад сделал активный фильтр на Спартане-3. Основной задачей было управление 3-х фазным 3-х уровневым NPC инвертором на IGBT. Генерация синуса была на основе CORDICов и векторного управления.
В данном случае, как и у вас, рекомендую пользоваться Симулинком для моделирования и отладки контроллера. Там есть тулбокс для моделирования силовой электроники, которым как раз инверторы моделировать можно.
vbif
16.11.2017 17:47Полагаю, первый минус мостовой схемы аннулируется для трёхфазных схем?
NordicEnergy Автор
17.11.2017 10:48Правильно полагаете. Когда у нас появляется трехфазная сеть, то все становится еще лучше. Только система управления несколько усложняется.
Dmitri-D
17.11.2017 02:51вполне можно использовать как преобразователь постоянного напряжения с солнечных панелей в 220в 50Гц для подпитки домашеней сети, чтобы снизить расходы на электричество в жаркий период. Нужно лишь обеспечить синхронизацию с внешней сетью по частоте (grid tie inverter).
NordicEnergy Автор
17.11.2017 10:52Не люблю рекламу, но если вам интерес инвертор приглашаю: www.youtube.com/NordicEnergy
Сейчас компоненты подтягиваются и видео продолжатся. Проект полностью открытый, на github исходники первой ревизии лежат. Платы вчера получил: картинка.
Там как раз и синхронизация с сетью будет реализована и прочие прелести))Dmitri-D
18.11.2017 06:36По схеме — вызывает некое удивление отсутствие демпфирующих цепей, фильтров по входу и довольно упрощенный фильтр на выходе. Неужели прототипирование не выявило никаких проблем?
Помотрите вот например тут — сколько резисторов пришлось задействовать и вообще сама система RLC довольно сложная geektimes.ru/post/272274 и фильтрует не только выход, но и вход. Ведь вход может быть довольно «длинным» — до панелей десятки метров кабеля. И всё это будет «фонить»?
Второй момент — что, если скажем пара транзисторов в мосте (по диагонали) пробьется на короткое замыкание? Разве не пойдет на выход постоянка? Какая защита от такой ситуации?
С остальным — хочется только похвалить — хорошая и современная компонентная база. Идеи и принципы, изложенные в статье, мне нравятся. Всё правильно.NordicEnergy Автор
18.11.2017 11:01Я извиняюсь, а что Вы собрались по входу фильтровать? АКБ что-то излучают или может быть они не любят ВЧ шум в несколько десятков милливольт от самого преобразователя?
Если длина от АКБ до инвертора десятки метров, то надо плюнуть в того, кто так сделал. Шина 24В 100А и на 10 метров? Для этого от панелей кидают DC шину 120-240В, а затем контроллером понижаю ее в 24/48В или любое другое необходимое. Падение на проводах минимальное и не надо сечение провода 16-25 мм2.
RCD снабберы — это для китайцев и ребят с уровнем развития из 90-х. Элементарный TVS-диод сделает тоже самое, только дешевле, лучше и будет меньше греться. К тому же ключи взяты с запасом по напряжению, что позволяет обеспечить более мягкий режим коммутации ключиков.
Если что-то пробьется, то для этого есть защита от КЗ + обратная связь по напряжению. В любом преобразователе может что-то пробиться, но пока от этого никто не умирал.
Статью, что вы скинули после фразы «главное инновацией стали GaN ключи» — просто не стал дальше читать. Это было инновацией лет так 15 назад, сейчас актуальны сборки, например, LMG3410. Такие модули позволяют уже 1 кВт впихнуть в пачку сигарет))Dmitri-D
18.11.2017 19:58может быть они не любят ВЧ шум в несколько десятков милливольт от самого преобразователя?
А если это не АКБ, а солнечная панель, с довольно большим внутренним сопротивлением на этих частотах? Блокировочных конденсаторов на входе будет достаточно? Это проверялось на прототипах?
Элементарный TVS-диод сделает тоже самое
Ок, спасибо, это я упустил из виду.
есть защита от КЗ
Я так понял, что это защита от КЗ в нагрузке. Разве нет? А вот как раз защиты от пробоя в мосте я не увидел
обратная связь по напряжению.
Это понятно. Она остановит генерацию. Но если диагональ пробита, то постоянка пойдет на выход.
может что-то пробиться, но пока от этого никто не умирал
Речь же о потребителях. Я думаю импульсные источники в зарядках или в компах не скажут спасибо от DC 380в на их входе. Старые трансформаторные ИП тоже не будут в восторге от постянки.
Такие модули позволяют уже 1 кВт впихнуть в пачку сигарет
Да, прогресс не стоит на месте.NordicEnergy Автор
18.11.2017 20:59Панель напрямую к инвертору включать нельзя. На панели напряжение пляшет от 0 до 38В. Инвертор на какое напряжение? 24В — сгорит, 48В не взлетит. Для этого идет схема: панели -> контроллер -> АКБ -> инвертор -> нагрузка.
Если мост пробьет, то тоже будет КЗ. Датчик измеряет ток на ключах. Плечо пробило — + и — соединился и все стало весело и защита сработает. Так же есть датчик ACS758 по входу, он медленней тех, что на ключах, но загореться железке тоже не даст.
Если диагональ пробита, то напруга на выходе будет больше 230В и ОС это увидит и погасит генерацию в DC/DC шине. 380В просто неоткуда будет браться. К тому же защита от КЗ есть и по 24В. Если на двигатель подать 380В постоянки, то для шины 24В будет КЗ, т.к. ток потребления вырастит сильно.
Да, никто не скажет спасибо 380В на выходе. Срочно пишем Илону Маску, чтобы сворачивал свои заводы и прекращал клепать инвертора. Это же спалит зарядки для айфончиков!)))
Dmitri-D
19.11.2017 00:59Мы говорим о разных системах. Я о той, где панели, соединенные последовательно, выдают порядка 400-500v. Этот DC поступает именно на инертер, который подключается уже в двухфазную сеть 240в (2 противофазы по 120в). Устройство grid tie, контролирует и свое напряжение и отдаваемую мощность, и фазу генерируемого напряжения. Никаких АКБ там по-умолчанию нет. Но _в некоторых_ разновидностях, при наличие специального отдельного контроллера, АКБ _может_ быть подключена.
Шутку про Маска не понял. Компания, которую он контролирует, Solar City далеко не единственная на рынке и решения с АКБ не особо распространены, потому что генерация излишков, т.е. с отдачей наружу — легальна, и компенсируется (т.е. покупается) энергетической компанией. Какой тогда смысл в дорогой АКБ сроком службы порядка 3х лет? Я говорю сейчас про рынок северной америки.
NordicEnergy Автор
19.11.2017 02:32Я не знаю о чем вы там говорите и что в вашей голове, но я делаю железку с двойным преобразованием 24-380-230В. Мне если честно все равно на решения с 400-500В последовательно, т.к. это уже речь о промышленных решениях и мощностях более 10 кВт. При вход 400-500В будет совсем иная схемотехника, которая в принципе отлична от предложенной.
Вы в своей голове там фантазию сгенерировали, другим рассказать забыли, а я тут должен угадывать…
Хотя в глобальном смысле защиты останутся точно такие же. И в любом устройстве вход может оказаться на выходе. Даже если устройство с гальванической развязкой. 3кВ импульс и развязки нет.
Собственно не понятно что вы от меня в итоге то хотите?
Dmitri-D
19.11.2017 02:52Зачем мне что-либо фантазировать, если всё что вы сами выложили — это вот эта схема drive.google.com/file/d/15Z1f4nJWIszjpOfJq5Cy0yaBCHMGtCWM/view где на входе 380DC и на выходе 230AC? Я же это не с луны взял. И мне было очевидно, что это применимо к преобразованию DC с панелей.
Вы сейчас начали к этой схеме поверх еще говорить про какой-то второй преобразователь 24-380, про какую-то защиту от пробоя моста, которой тут на схеме в помине нет. Выкладывайте тогда что есть, тогда будем, вероятно, лучше понимать друг друга.
sim2q
17.11.2017 23:54Спасибо за наводку: IR25750!
У меня PWM «китайский киловатник» по топологии «полумост» (как на картинке выше, с удвоением). Не смотря на анонсированный «плавный старт и защиту по выходу в тч и КЗ» уже несколько раз улетают IGBT формирующие синус стоит только забыться и включить что то с конденсаторами на входе больше чем один за раз.
В поддержки схему зажали, а отреверсить четырёхслойку до конца не смог, не звонится никуда как раз таки одна из ветвей с токового компаратора нагрузки. Может в этом и дело? Но это преамбула…
Надоело мне всё это, хочу навесить аппаратную цепь мимо МК и по превышении тока IGBT тупо перекидывать RS триггер и запирать драйвера перед оптронами IGBT, в свете этой идеи эта няшечка IR25750 очень понравилась! Сначала даже не понял, что это и пошел гуглить — не зря)NordicEnergy Автор
18.11.2017 11:07Пожалуйста! Сам для себя эти «датчики» не так давно открыл, около года назад, когда пришлось токи в пару сотен ампер коммутировать))
ОС по току, вернее защита от КЗ должна выключать аппаратно. Я всегда беру драйвера с возможностью вырубить его, т.к. пару раз видел как и злые tms320f28335 подвисали в момент КЗ на IGBT сборки, подозреваю ЭМИ. Поэтому по хорошему вырубаем драйвера + дублируем сигнал на управляющий МК, чтобы он тоже был в курсе об аварии.
AbnormalHead
Спасибо. Очень хорошо разжевано, осталось только проглотить и пойти жечь транзисторы ;).
n-krd
Очень точно сказано, если сразу 380 подавать. Можно с 24 начать и не очень мощным БП. Автору большое спасибо!!! Если ли понимание можно ли использовать индуктивную нагрузку, дрель например, китайские поделки с подобной схемотехникой горят…
NordicEnergy Автор
Мастерство в силовой электронике — пропорционально количеству спаленных транзисторов, поэтому без этого не обойтись))