Pull to refresh

Comments 23

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Sign up to leave a comment.

Articles