ПИД-регулятор и передаточная функция в C ++ - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть PID-контроллер, работающий в simulink, но я хочу передать его в код C ++. Я нашел, как сделать PID с кодом, что-то вроде этого:

error = input - refeed;
iError += error * sampleTime;
dError = (error - lastError)/ sampleTime;
//PID Function
output = Kp * error + Ki * iError + Kd * dError;
refeed = output;
lastError = error;

Но это единственное, что я понял в своем исследовании.

Мне нужно знать, что будет следующим шагом, у меня есть функция передачи, но я не уверен, что мне делать с параметрами "z", временами, ...

Можно ли вручную передать ПИД-контроллер в C ++? Как?

Ответы [ 3 ]

0 голосов
/ 11 апреля 2019

Для цифровых систем управления вам необходимо производить выборку данных и запускать контроллер каждый раз. Z-преобразование преобразует непрерывную систему в дискретную систему.
Например, если ваше время выборки равно 1, вы можете выразить простую модель временного ряда, как показано ниже:

y (t) = a1 * u (t-1) + a2 * u (t-2)
-> y (t) = a1 * z ^ -1 * u (t) + a2 * z ^ -2 * u (t)
-> y (t) = A (z) u (t), где A (z) = a1 * z ^ -1 + a2 * z ^ -2
a1, a2 = коэффициенты FIR

Однако, этот оператор сдвига времени 'z ^ -1' не появляется в вашем коде. Это неявно выражается вашим временем выборки и циклом FOR или DO в зависимости от языка, который вы используете. Пожалуйста, смотрите код Python для формы скорости ПИД-регулятора. Форму скорости немного проще реализовать, потому что вы не беспокоитесь о дополнительной логике для анти-сброса windup.

for i in range(1, ns):  #ns = simulation time
    # PID Velocity form
    e[i] = sp[i] - pv[i]
    P[i] = Kc * (e[i] - e[i-1])
    I[i] = Kc*delta_t/tauI * (e[i])
    D[i] = Kc*tauD/delta_t * (pv[i] - 2*(pv[i-1]) + pv[i-2])
    op[i] = op[i-1] + P[i] + I[i] + D[i]
    if op[i] < oplo or op[i] > ophi:
        # clip output
        op[i] = max(oplo,min(ophi,op[i]))

Вы также можете найти пример ПИД-регулятора, использующего пакет GEKKO, по следующей ссылке.

https://apmonitor.com/wiki/index.php/Main/GekkoPythonOptimization

0 голосов
/ 11 апреля 2019

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

По сути, выведитеданные в текстовом файле, а затем используйте gnuplot для их отображения.

0 голосов
/ 25 апреля 2018

Да, это возможно.Рассматривали ли вы использовать чужой код?Или ты хочешь написать это сам?Если у вас нет проблем с использованием уже написанного кода, проверьте Github.В нем много проектов PID.Например ПИД-контроллер .У него есть пример использования, и вам нужно только передать параметры p, i и d (которые вы уже получили от Matlab).

Удачи!

...