Поведение интегратора в ПИД-регуляторе
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 21.03.23 11:15
Оценка:
Здесь еще остались те, кому приходилось программно делать ПИД-регуляторы? Последнее сообщение по этой теме было 15 лет назад.

Пытаюсь приспособить ПИД-регулятор к уравниванию скоростей потоков данных, обрабатываемых двумя устройствами. У одного скорость потока жестко определяется внутренним тактовым генератором, другое позволяет подстраивать ее в пределах +/- 5%.

Основная проблема в том, что реализуется все это в винде, и скорости потоков можно измерять только косвенно, через объем переданных данных. Каждое устройство передает данные дискретными порциями, примерно раз в 5-10 мс, на это накладывается дискретность диспетчеризации в винде, которая может сильно гулять при изменении нагрузки, так что за один цикл опроса любое из устройств может как не передать ничего, так и передать две порции данных.

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

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

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

Фишка в том, что средние скорости потоков на долговременных (десятки секунд, минуты, часы) интервалах очень стабильны, отклонение не превышает 0.01%. Но начальные скорости, пока они не уравнены, могут различаться на 0.5-1%. При малых (на единицы миллисекунд) объемах буферов нужно начинать корректировать скорость достаточно быстро, иначе возникнет переполнение/опустошение. Так что вся проблема именно в принятии решения на кратковременных интервалах, где непонятно — то ли это тенденция к уходу, то ли просто неудачное наложение периодов.

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

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

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