Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Большая задержка при обработки данных от АЦП
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Sanes
Добрый вечер!
Возникла проблема с компинсацией 300 Гц состовляющей на выходе ИП.
Таймер генерирует ШИМ (который компенсирует 300 Гц синус) с запаздованием на 1/4 периода . Т.е. запаздывание от момента начала преобразования АЦП до момента выдачи таймером ШИМ с компенсацией состовляет 0.5мс.
Алгоритм преобразования - таймер генерит прерывание АЦП, в обработчике прерывания происходят расчеты ,которые передаются на таймер.
Частота ШИМ 200кГц.
Длительность прерывания 3 мкс при периоде ШИМ 5 мкс.
Попробовал АЦП запускать без прерывания, а прерывание делать от таймера - величена задержки не изменилась.
1113
расшифруйте все свои сокращения и опишите систему целиком, откуда появляется то, что надо компенсировать, стабильность параметров и тп - ничего не понятно.

P.S. Sanes, сколько вам лет?
Sanes
Имеется источник питания с входом 3/380 В и выходом 48 В (постоянный ток).
Управление осуществляется с помощью микроконтроллера STM32F334.
После выпрямления и фильтрации входного переменного тока, в цепи постоянного тока (540 В) остается переменная составляющая около 40 В при 300 Гц.
Далее стоят 2 транзистора по топологии «полумост», понижающий трансформатор и выходной фильтр.
Проблема в том , что система управления на основе микроконтроллера не компенсирует (не сглаживает) переменную составляющую цепи постоянного тока.
Происходит это из-за того , что огибающая ШИМ сигнала, которая должна компенсировать (сгладить) переменную составляющую, опаздывает от от этой переменной составляющей на ¼ периода.
И вместо того чтобы её компенсировать , она наоборот её увеличивает.
В идеале огибающая ШИМ должна находится в противофазе с переменой составляющей.
По примерным расчетом запаздывание составляет 0.5 мс, частота ШИМ 200кГц.
Обработка сигнала происходит следующим образом.
По таймеру запускается прерывание по АЦП. Далее в обработчике прерывания происходят расчёты скважности ШИМ в зависимости от ошибки выходного сигнала относительного опорного.
Потом полученный результат подается на таймер для формирования ШИМ.
Длительность прерывания составляет 3 мкс при периоде ШИМ 5 мкс.
У меня вызывает затруднение понять, почему происходит такая большая задержка ?

1113
Цитата(Sanes @ Sep 17 2017, 23:19) *
АЦП

схему обратной связи покажите

Цитата(Sanes @ Sep 17 2017, 23:19) *
Далее в обработчике прерывания происходят расчёты скважности ШИМ в зависимости от ошибки выходного сигнала относительного опорного.

и это тоже покажите
jcxz
Цитата(Sanes @ Sep 18 2017, 03:19) *
Далее в обработчике прерывания происходят расчёты скважности ШИМ

Цитата(Sanes @ Sep 18 2017, 03:19) *
Длительность прерывания составляет 3 мкс при периоде ШИМ 5 мкс.
У меня вызывает затруднение понять, почему происходит такая большая задержка ?

Как вариант: "расчёты скважности" производятся на программно-эмулируемой плавучке.

PS: А вообще - отладчик позволяет посмотреть количество тактов, затрачиваемое на каждую инструкцию или группу инструкций.
Forger
Цитата(Sanes @ Sep 17 2017, 23:19) *
У меня вызывает затруднение понять, почему происходит такая большая задержка ?

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

CODE
int32_t seterr, pid_out;
int32_t error;

error = Vout - Vref;
seterr = (-Kp * error) / 200;
term_Volt = term_Volt + ((-Ki * error) / 200);

if (term_Volt > SAT_LIMIT)//B40
{
term_Volt = SAT_LIMIT;
}
if (term_Volt < -(SAT_LIMIT))
{
term_Volt = -(SAT_LIMIT);
}

dif = (-Kd*(error-error_old))/200;

pid_out = seterr + term_Volt + dif ;
pid_out += 5760;//5760 максимальное скважность ШИМ.

if (pid_out >= MAX_DUTY_A)//B40
{
pid_out = MAX_DUTY_A;
}

if (pid_out < MIN_DUTY_A)//480
{
pid_out = MIN_DUTY_A;
}
CurrentDutyA = pid_out;
__HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_TIMER_C, HRTIM_COMPAREUNIT_2, CurrentDutyA);

Схема входной цепи





В данный момент проблема состоит в том что не получается качественно настроить ПИД регулятор.
При Кр относитльно большом (30...50) амплитуда колебаний уменьшается в разы ,но появляются треугольники с увеличеной частотой 600...900 Гц
Если уменьшить Кр (10...3) - синусоида компенсируется плохо см. на фото , нижняя осциллограмма.


iosifk
Цитата(Sanes @ Nov 1 2017, 20:21) *
Извиняюсь за долгий ответ.
Частично вопрос разрешился.

На самом деле не все упирается в прерывания. Чтобы при помощи ОС подавлять пульсации, нужно чтобы эти пульсации попадали в полосу пропускания ОС.
А для этого, надо понимать то, как пройдет ЛАХ. В ОС у Вас сначала RC фильтрик, потом АЦП и Микроконтроллер. Так вот, надо понимать, кто задает первую постоянную времени. Либо эта RC цепочка, либо интегратор в МК, либо силовой фильтр.
Если хотите, могу по скайпу показать, что примерно у Вас может быть...
Obam
Цитата(iosifk @ Nov 2 2017, 00:13) *
На самом деле не все упирается в прерывания. Чтобы при помощи ОС подавлять пульсации, нужно чтобы эти пульсации попадали в полосу пропускания ОС.
А для этого, надо понимать то, как пройдет ЛАХ. В ОС у Вас сначала RC фильтрик, потом АЦП и Микроконтроллер. Так вот, надо понимать, кто задает первую постоянную времени. Либо эта RC цепочка, либо интегратор в МК, либо силовой фильтр.
Если хотите, могу по скайпу показать, что примерно у Вас может быть...

А для всех запись можно выложить?
iosifk
Цитата(Obam @ Nov 2 2017, 10:30) *
А для всех запись можно выложить?

Попробую сделать...
Но общая идея такая.
Есть 3 "золотые точки".
Я вместо "круговой" буду просто говорить "частота".
Крайне-правая - это частота коммутации транзисторов. Это по "горизонтали". А по "вертикали" откладываем вниз 60-80 Дб в соответствии с тем, насколько хотим подавить пульсации на частоте квантования силовым фильтром. И через эту точку ЛАХ пройдет под углом, как минимум соотв. степени силового фильтра. Правда туда могут добавиться еще -20Дб/дек от цепи коррекции...
Крайне-правая - это там где 0 частота. А по "вертикали" берем вверх столько, сколько хотит получить точность в статике. Т.е. например при подавлении ошибки в 100 раз это будет 40 Дб. При статическом регуляторе ЛАХ через эту почку пройдет горизонтально.
И третья точка - это где ЛАХ пересекает 0 Дб. Там его наклон должен быть не более -20Дб/дек, иначе будет колебательность. По горизонтали этот кусок ЛАХа должен иметь запасы, чтобы был запас по фазе.
А еще надо учесть добротность силового фильтра, потому как он при хорошей добротности в точке излома имеет подъем, который может привести к неустойчивости...
Вот попробуйте хотя бы грубо нарисовать эти куски и увидите счастье...
А чтобы его "услышать" я когда-то вместо нагрузки включил колонки. В ОС, на самом входе вешается огромный конденсатор, чтобы стабилизировать только "постоянку", а вот сразу после него в ОС подается сигнал от генератора. И снимается полоса пропускания ОС и силового тракта... И тогда уже видно сигналы каких частот и амплитуд через них могут пройти...

А ТС давал показания "частота ШИМ 200кГц". Только чую я, что это не частота ШИМ, на которой работает счетчик периода ШИМ. И если счетчик считает хотя бы до 100, то это значит, что ШИМ может реализовать изменение сигнала не более чем в 20 кгц... А это очень мало...
Sanes
Так как я в теории ТАУ плохо ориентируюсь, было бы хорошо если выложете наглядное видео или картинки.

Частота обновления ШИМ 100 КГц . Частота импуьсов 200 КГц. Именно с такой частотой оцифровыется сигнал и запускаеться прерывание. Это всё проверялось.
Счётчик таймера считает до 5760.

Вопрос модераторам. Можно ли переместить тему в другой раздел?
amiller
Цитата(Sanes @ Nov 6 2017, 17:56) *
Так как я в теории ТАУ плохо ориентируюсь, было бы хорошо если выложете наглядное видео или картинки.

Частота обновления ШИМ 100 КГц . Частота импуьсов 200 КГц. Именно с такой частотой оцифровыется сигнал и запускаеться прерывание. Это всё проверялось.
Счётчик таймера считает до 5760.

Вопрос модераторам. Можно ли переместить тему в другой раздел?

Достаточно ориентироваться немного в физике, немного в математике.
Стоит напомнить, и неплохо проверить, что если обновляете относительную длительность ШИМ с частотой 100кГц, то у Вас на всю обработку 10мкс.
Т.е. чтобы алгоритм управление хоть как то работал, нужно, чтобы время обработки прерывания не превышало 70-80% от этого времени, т.е. не более 7-8мкс. Проверяли это?
Далее:
Вас спрашивали про таймер, который Вы используете для формирования PWM.
У STM32 таймера достаточно тупенькие и не могут работать на частотах выше тактовой ядра.
Если у Вас частота ШИМ 200кГц и при этом таймер считает до 5760.
Это должно бы было означать, что частота ядра равна 5760 * 200000 = 1152 МГц.
Такого быть не может, поэтому следует уточнить Ваши ответы.
А вообще при проектировании ШИМ контроллеров на базе МК нужно чётко представлять длительности и частоты всех процессов.
А особенно работу критичных по времени модулей, таки как PWM и ADC.
Sanes
Длительность прерывания проверял - 3 мкс.
В расчёт надо принимать частоту таймера а не ядра. В таймере есть модуль умножения частоты.
"fHRTIM x 8U = 1.152 GHz - Resolution: 868 ps - Min PWM frequency: 17.6 kHz (fHRTIM=144MHz)"

amiller
Цитата(Sanes @ Nov 7 2017, 00:30) *
Длительность прерывания проверял - 3 мкс.
В расчёт надо принимать частоту таймера а не ядра. В таймере есть модуль умножения частоты.
"fHRTIM x 8U = 1.152 GHz - Resolution: 868 ps - Min PWM frequency: 17.6 kHz (fHRTIM=144MHz)"

Ок. Я просто не пытался использовать STM32 для сложных проектов. Там где нужен ШИМ на высокой частоте, мой выбор - Texas.
Но если таймер этого семейства STM32 может работать в режиме Hi Resolution, то вопрос по этому поводу снимается.
Если у Вас частота обновления ШИМ 100кГц, то вся обработка данных (и все измерения), задействованных для расчётов ШИМ, должна проводится с этой частотой.
Если у Вас по факту задержки сравнимы с частотой сети, то вероятно в алгоритм где то затесались параметры, которые рассчитываются с этой частотой.
RMS или что-то подобное. Проверьте ещё раз код, чудес не бывает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.