Перейти к содержанию
    

Большая задержка при обработки данных от АЦП

Добрый вечер!

Возникла проблема с компинсацией 300 Гц состовляющей на выходе ИП.

Таймер генерирует ШИМ (который компенсирует 300 Гц синус) с запаздованием на 1/4 периода . Т.е. запаздывание от момента начала преобразования АЦП до момента выдачи таймером ШИМ с компенсацией состовляет 0.5мс.

Алгоритм преобразования - таймер генерит прерывание АЦП, в обработчике прерывания происходят расчеты ,которые передаются на таймер.

Частота ШИМ 200кГц.

Длительность прерывания 3 мкс при периоде ШИМ 5 мкс.

Попробовал АЦП запускать без прерывания, а прерывание делать от таймера - величена задержки не изменилась.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

расшифруйте все свои сокращения и опишите систему целиком, откуда появляется то, что надо компенсировать, стабильность параметров и тп - ничего не понятно.

 

P.S. Sanes, сколько вам лет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имеется источник питания с входом 3/380 В и выходом 48 В (постоянный ток).

Управление осуществляется с помощью микроконтроллера STM32F334.

После выпрямления и фильтрации входного переменного тока, в цепи постоянного тока (540 В) остается переменная составляющая около 40 В при 300 Гц.

Далее стоят 2 транзистора по топологии «полумост», понижающий трансформатор и выходной фильтр.

Проблема в том , что система управления на основе микроконтроллера не компенсирует (не сглаживает) переменную составляющую цепи постоянного тока.

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

И вместо того чтобы её компенсировать , она наоборот её увеличивает.

В идеале огибающая ШИМ должна находится в противофазе с переменой составляющей.

По примерным расчетом запаздывание составляет 0.5 мс, частота ШИМ 200кГц.

Обработка сигнала происходит следующим образом.

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

Потом полученный результат подается на таймер для формирования ШИМ.

Длительность прерывания составляет 3 мкс при периоде ШИМ 5 мкс.

У меня вызывает затруднение понять, почему происходит такая большая задержка ?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

АЦП

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

 

Далее в обработчике прерывания происходят расчёты скважности ШИМ в зависимости от ошибки выходного сигнала относительного опорного.

и это тоже покажите

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Далее в обработчике прерывания происходят расчёты скважности ШИМ

Длительность прерывания составляет 3 мкс при периоде ШИМ 5 мкс.

У меня вызывает затруднение понять, почему происходит такая большая задержка ?

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

 

PS: А вообще - отладчик позволяет посмотреть количество тактов, затрачиваемое на каждую инструкцию или группу инструкций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня вызывает затруднение понять, почему происходит такая большая задержка ?

Есть смысл смоделировать мат. модель в соотв. среде (матлабе например) и уже потом запихивать ее в контроллер.

Можно пойти другим путем: упрощать программу (расчеты), чтобы локализовать источник задержки.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извиняюсь за долгий ответ.

Частично вопрос разрешился. В RC цепочки (для определения огбающей ШИМ) стоял конденсатор с слишком большой ёмкостью .

Вот часть кода позаимствованного и переделанного из примеров STM.

 

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);

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

 

 

000.jpg

 

 

В данный момент проблема состоит в том что не получается качественно настроить ПИД регулятор.

При Кр относитльно большом (30...50) амплитуда колебаний уменьшается в разы ,но появляются треугольники с увеличеной частотой 600...900 Гц

Если уменьшить Кр (10...3) - синусоида компенсируется плохо см. на фото , нижняя осциллограмма.

 

 

111.jpg

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извиняюсь за долгий ответ.

Частично вопрос разрешился.

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

А для этого, надо понимать то, как пройдет ЛАХ. В ОС у Вас сначала RC фильтрик, потом АЦП и Микроконтроллер. Так вот, надо понимать, кто задает первую постоянную времени. Либо эта RC цепочка, либо интегратор в МК, либо силовой фильтр.

Если хотите, могу по скайпу показать, что примерно у Вас может быть...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А для этого, надо понимать то, как пройдет ЛАХ. В ОС у Вас сначала RC фильтрик, потом АЦП и Микроконтроллер. Так вот, надо понимать, кто задает первую постоянную времени. Либо эта RC цепочка, либо интегратор в МК, либо силовой фильтр.

Если хотите, могу по скайпу показать, что примерно у Вас может быть...

А для всех запись можно выложить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А для всех запись можно выложить?

Попробую сделать...

Но общая идея такая.

Есть 3 "золотые точки".

Я вместо "круговой" буду просто говорить "частота".

Крайне-правая - это частота коммутации транзисторов. Это по "горизонтали". А по "вертикали" откладываем вниз 60-80 Дб в соответствии с тем, насколько хотим подавить пульсации на частоте квантования силовым фильтром. И через эту точку ЛАХ пройдет под углом, как минимум соотв. степени силового фильтра. Правда туда могут добавиться еще -20Дб/дек от цепи коррекции...

Крайне-правая - это там где 0 частота. А по "вертикали" берем вверх столько, сколько хотит получить точность в статике. Т.е. например при подавлении ошибки в 100 раз это будет 40 Дб. При статическом регуляторе ЛАХ через эту почку пройдет горизонтально.

И третья точка - это где ЛАХ пересекает 0 Дб. Там его наклон должен быть не более -20Дб/дек, иначе будет колебательность. По горизонтали этот кусок ЛАХа должен иметь запасы, чтобы был запас по фазе.

А еще надо учесть добротность силового фильтра, потому как он при хорошей добротности в точке излома имеет подъем, который может привести к неустойчивости...

Вот попробуйте хотя бы грубо нарисовать эти куски и увидите счастье...

А чтобы его "услышать" я когда-то вместо нагрузки включил колонки. В ОС, на самом входе вешается огромный конденсатор, чтобы стабилизировать только "постоянку", а вот сразу после него в ОС подается сигнал от генератора. И снимается полоса пропускания ОС и силового тракта... И тогда уже видно сигналы каких частот и амплитуд через них могут пройти...

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так как я в теории ТАУ плохо ориентируюсь, было бы хорошо если выложете наглядное видео или картинки.

 

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

Счётчик таймера считает до 5760.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так как я в теории ТАУ плохо ориентируюсь, было бы хорошо если выложете наглядное видео или картинки.

 

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

Счётчик таймера считает до 5760.

 

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

Достаточно ориентироваться немного в физике, немного в математике.

Стоит напомнить, и неплохо проверить, что если обновляете относительную длительность ШИМ с частотой 100кГц, то у Вас на всю обработку 10мкс.

Т.е. чтобы алгоритм управление хоть как то работал, нужно, чтобы время обработки прерывания не превышало 70-80% от этого времени, т.е. не более 7-8мкс. Проверяли это?

Далее:

Вас спрашивали про таймер, который Вы используете для формирования PWM.

У STM32 таймера достаточно тупенькие и не могут работать на частотах выше тактовой ядра.

Если у Вас частота ШИМ 200кГц и при этом таймер считает до 5760.

Это должно бы было означать, что частота ядра равна 5760 * 200000 = 1152 МГц.

Такого быть не может, поэтому следует уточнить Ваши ответы.

А вообще при проектировании ШИМ контроллеров на базе МК нужно чётко представлять длительности и частоты всех процессов.

А особенно работу критичных по времени модулей, таки как PWM и ADC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Длительность прерывания проверял - 3 мкс.

В расчёт надо принимать частоту таймера а не ядра. В таймере есть модуль умножения частоты.

"fHRTIM x 8U = 1.152 GHz - Resolution: 868 ps - Min PWM frequency: 17.6 kHz (fHRTIM=144MHz)"

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Длительность прерывания проверял - 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 или что-то подобное. Проверьте ещё раз код, чудес не бывает.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...