2014-12-18 3 views
0

я реализовал контроллер простой PI, код выглядит следующим образом:Настройка и ограничение выходной сигнал ПИ-регулятора

PI_controller() { 

    // handling input value and errors 
    previous_error = current_error; 
    current_error = 0 - input_value; 

    // PI regulation 
    P = current_error //P is proportional value 
    I += previous_error; //I is integral value 
    output = Kp*P + Ki*I; //Kp and Ki are coeficients 

} 

входное значение всегда находится между -π и + я. Выходное значение должно быть от -4000 до +4000.

Мой вопрос - как настроить и (что наиболее важно) ограничить ПИ-контроллер должным образом.

+0

Пожалуйста, объясните, как настроить часть вашего вопроса? Как как выбрать Kp и Ki для вашего контроллера? По ограничению PI, вы имеете в виду какой-то алгоритм борьбы с отключением? – macduff

+0

Я имею в виду - как заставить контроллер не давать меньшее число, чем -4000 и большее число +4000 на выходе, при условии, что вход находится в диапазоне между -3.14 и +3.14. Спасибо за помощь. – jurij

ответ

0

Чтобы настроить ваш Kp и Ki вы действительно должны проанализировать частотную характеристику вашей системы и создать свой PI, чтобы дать желаемый ответ. Чтобы просто ограничить выход, решите, нужно ли замораживать интегратор или просто ограничить непосредственный вывод. Я бы рекомендовал заморозить интегратора.

I_tmp = previous_error + I; 
output_tmp = Kp*P + Ki*I_tmp; 
if(output_tmp < -4000) 
{ 
    output = -4000; 
} 
else if(output_tmp > 4000) 
{ 
    output = 4000; 
} 
else 
{ 
    I = I_tmp; 
    output = output_tmp; 
} 

Это не супер элегантный, проверенный алгоритм, но он дает вам представление.

1

Слишком много комментариев, но не окончательный ответ. Что такое «простой PI-контроллер»? И «как долго это кусок струны»? Я не понимаю, почему вы (эффективно) код

P = (current_error = 0 - input_value); 

который просто отрицает ошибку -π на π. Затем агрегировать ошибка с

I += previous_error; 

, но не указано кумулятивные оценки погрешности, а затем вычислить

output = Kp*P + Ki*I; 

который должен быть -4000 <= output <= 4000. Таким образом, вы ищете значения Kp и Ki, которые держат вас в пределах границ, или, возможно, не удерживают вас в пределах, за исключением средних условий.

Предлагаю эмпирическое решение. Попробуйте выполнить ряд прогонов, подав результаты, наведя значения Kp и Ki на 5 шагов каждый, начиная с крайних значений neg до pos. Ограничьте вывод, как вы сказали, подсчитывая количество результатов, которые нарушают предел.

Далее, уменьшите диапазон один из Kp и Ki и сделайте более информированный выбор относительно того, какой из них следует ограничить. И так далее. «Разделите и победите».

Что касается вашего требования «как правильно ограничить ПИ-контроллер», вы уверены, что 4000 - это предел, а не 4096 или даже 4095?

if (output < -4000) output = -4000; 
if (output > 4000) output = 4000; 
+0

Вход, находящийся в диапазоне от -π до π, представляет собой фактически фазовый сдвиг входного сигнала. Я хочу сохранить сигнал на (постоянном) сдвиге фазы на 0 градусов, изменяя частоту сигнала. Итак, если я рассчитываю отрицательный фазовый сдвиг, я должен увеличить частоту или уменьшить ее, если узнаю, что фазовый сдвиг положительный. Поэтому мне нужно, чтобы выход находился в диапазоне от -4000 до +4000. – jurij

+0

@jurij Вот что делает 'if (output' .... statement. – nos

+0

Я понимаю, но я не понимаю оператор, который просто отрицает ошибку -π для π. » – jurij

0

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

Есть более умные способы к нему, а просто

if (abs (I) < x) 
{ 
    I += previous_error; 
} 

предотвратит заводной интегратора.

Затем вы должны выяснить х, Kp и Ki, так что abs(x*Ki) + abs(3.14*Kp) < 4000

[править] Off причины как Макдуфа состояний, в первую очередь необходимо проанализировать систему и выбрать korrect Ki и Kp, х является единственным действительно свободной переменной в приведенном выше уравнении.

Смежные вопросы