PID регулиране със self-tuning

15 отговора 0 прегледа
#1

PID регулиране със self-tuning

Някои има ли идея за алгоритъм/блок-схема и да може да даде такъв/такива за нещото от заглавието на темата? Ако може на Асемблер за PIC или на C.
Благодаря за всякакви идеи!

Link:
[линк]


Отговор
в отговор на Naki #2

Re: PID регулиране със self-tuning

Точно на страницата, към която си постнал линк, има алгоритъм.

Отговор
в отговор на Pekoнcтpykтop #3

Re: PID регулиране със self-tuning

на страницата също има интеграли и диференциални уравнения , а тоя е завършил китаистика, смятай

Отговор
в отговор на Naki #4

Re: PID регулиране със self-tuning

struct _pid {
int *pv; /*pointer to an integer that contains the process value*/
int *sp; /*pointer to an integer that contains the set point*/
float integral;
float pgain;
float igain;
float dgain;
int deadband;
int last_error;
};


/*----------------------------------------------------------------- -------
pid_init

DESCRIPTION This function initializes the pointers in the _pid structure
to the process variable and the setpoint. *pv and *sp are
integer pointers.
------------------------------------------------------------------- -----*/
void pid_init(a, pv, sp)
struct _pid *a;
int *pv, *sp;
{
a->pv = pv;
a->sp = sp;
}


/*----------------------------------------------------------------- -------
pid_tune

DESCRIPTION Sets the proportional gain (p_gain), integral gain (i_gain),
derivitive gain (d_gain), and the dead band (dead_band) of
a pid control structure _pid.
------------------------------------------------------------------- -----*/
void pid_tune(a, p_gain, i_gain, d_gain, dead_band)
struct _pid *a;
float p_gain, i_gain, d_gain;
int dead_band;
{
a->pgain = p_gain;
a->igain = i_gain;
a->dgain = d_gain;
a->deadband = dead_band;
a->integral=0.0;
a->last_error=0;
}

/*----------------------------------------------------------------- -------
get_gains

DESCRIPTION Returns the gains and dead band in a _pid control structure
in the locations pointed to by the p_gain, i_gain, d_gain,
and dead_band pointers.

ALSO SEE pid_tune
------------------------------------------------------------------- -----*/
void get_gains(a, p_gain, i_gain, d_gain, dead_band)
struct _pid *a;
float *p_gain, *i_gain, *d_gain;
int *dead_band;
{
*p_gain = a->pgain;
*i_gain = a->igain;
*d_gain = a->dgain;
*dead_band = a->deadband;
}



/*----------------------------------------------------------------- -------
pid_setinteg

DESCRIPTION Set a new value for the integral term of the pid equation.
This is useful for setting the initial output of the
pid controller at start up.
------------------------------------------------------------------- -----*/
void pid_setinteg(a,new_integ)
struct _pid *a;
float new_integ;
{
a->integral=new_integ;
a->last_error=0;
}

/*----------------------------------------------------------------- -------
pid_bumpless

DESCRIPTION Bumpless transfer algorithim. When suddenly changing
setpoints, or when restarting the PID equation after an
extended pause, the derivative of the equation can cause
a bump in the controller output. This function will help
smooth out that bump. The process value in *pv should
be the updated just before this function is used.
------------------------------------------------------------------- -----*/
void pid_bumpless(a)
struct _pid *a;
{
a->last_error = *(a->sp) - *(a->pv);
}

/*----------------------------------------------------------------- -------
pid_calc

DESCRIPTION Performs PID calculations for the _pid structure *a. This
function uses the positional form of the pid equation, and
incorporates an integral windup prevention algorithim.
Rectangular integration is used, so this function must be
repeated on a consistent time basis for accurate control.

RETURN VALUE The new output value for the pid loop.

USAGE #include "control.h"
main() {
struct _pid PID;
int process_variable, set_point;
pid_init(&PID, &process_variable, &set_point);
pid_tune(&PID, 4.3, 0.2, 0.1, 2);
set_point = 500;
pid_setinteg(&PID,30.0);
process_varialbe = read_temp();
pid_bumpless(&PID);
for(;;) {
process_variable = read_temp();
output( pid_calc(&PID) );
wait(1.0);
}
}
------------------------------------------------------------------- -----*/
float pid_calc(a)
struct _pid *a;
{
int err;
float pterm, dterm, result, ferror;
err = *(a->sp) - *(a->pv);
if (abs(err) > a->deadband) {
ferror = (float) err; /*do integer to float conversion only once*/
pterm = a->pgain * ferror;
if (pterm > 100 || pterm < -100)
a->integral = 0.0;
else {
a->integral += a->igain * ferror;
if (a->integral > 100.0) a->integral=100.0;
else if (a->integral < 0.0) a->integral=0.0;
}
dterm = (err - a->last_error) * a->dgain;
result = pterm + a->integral + dterm;
}
else result = a->integral;
a->last_error=err;
return (result > 100.0 ? 100.0 : (result < 0.0 ? 0.0 : result));
}

Отговор
в отговор на Federer #5

Re: PID регулиране със self-tuning

Да, да, точно така! Висшата математика за мен е тъмна Индия.
Макар че не питам за мен точно де.


Редактирано от Naki на

Отговор
в отговор на ThunderFuck #6

Re: PID регулиране със self-tuning

Много благодаря!
Ако не ти е проблем, би ли го сложил примера във pre тагове, за да се запазят табовете и редовете?

Ако може дай и източника на лична.


Отговор
в отговор на Naki #7

Re: PID регулиране със self-tuning

Добре, ве, мой, вземи един ред от кода или коментарите и го пусни в Гуугъл, да те еба. Бахти, как функционирате в реалния живот некои от вас не моа да схвана.

[линк]

--
One day it will make sense.
Отговор
в отговор на Гypy #8

Re: PID регулиране със self-tuning

къв ти гугъл, проблемът можеше да се реши в стаковърфлоу за 1 мин.

Al: A Bundy never wins, but a Bundy never quits.
Отговор
в отговор на Naki #9

Re: PID регулиране със self-tuning

Някои се пише Някой

И се надявам да си наясно, че проЗ PID регулатор има много, ама наистина много недостатъци и поради това само малоумник може да си позволи да го използва в директен вид.

Отговор
в отговор на Refurbished #10

Re: PID регулиране със self-tuning

Глупости, да не говорим, че в повечето случаи обикновен пропорционален/пропорционално-интегрален е напълно достатъчен.

Отговор
в отговор на Refurbished #11

Re: PID регулиране със self-tuning

Мда, сори, въобще не видях какво съм писал.
Бързах и затова така.


Отговор
в отговор на Pekoнcтpykтop #12

Re: PID регулиране със self-tuning

Отделни модули изградени на P и PI може да има, но нека не забравяме, че живеем е реален свят.

Отговор
в отговор на Naki #13

Re: PID регулиране със self-tuning

Няма проблем.

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

P, PI, PIDI регулаторите са най-често използваните съставни модули (звена) от които се сглобяват автоматите в реалния свят.

Автоматиката се учи И в средните училища. Казано по друг начин - има учебници без висша математика по тези важни въпроси.

Отговор
в отговор на Refurbished #14

Re: PID регулиране със self-tuning

Глупости на търкалета дрънкаш, ама няма накъде! Автоматика се учило в средните училища! От СМГ съм, имам сума ти познати в ТУЕС, такова чудо никой сериозно не е учил. най много някой единичен учител напънител се е опитвал да блесне с нещо като спомене сложни думички.

Най сложното нещо което братчед ми се опита да ме "сблъска" когато беше в 10ти клас на ТУЕС (като се правеше на голЕм и можещ всьо), бяха невронните мрежи и графи. Еми усмихнах се Сократски и почнах да го подпитвам кво аджеба знае, ми не можеше да осмисли обхождане, камо ли нещо по-сериозно.

Толкова се дразня понякога на някои учители! Заради такива ненормалници това момче си загуби математическата и физическата подготовка, и му напълниха младата неузряла тиква с некви ИТ булшит термини които дори и създателите им не разбират много точно!

А да! Под физическа подготовка нямам предвид гимнастика!
<- coder panic!

Редактирано от Accolade на

Отговор
в отговор на Accolade #15

Re: PID регулиране със self-tuning

Има нещо вярно в думите ти.

За 500 лв. няма как да намериш свестен даскал. Има и "отровни даскали", няма какво да се лъжем.

Обаче във връзка с изборите в началото на месеца ходих до началното си училище. Там са направили да се учи до 10-ти клас, като последните две години са само с технически предмети. Учат се всякакви техники съобразно нивото на "съзнание" на оставащите там.

Няма как да си кадърен и да не те вземат в някое средно училище (бивш техникум, а не бивша гимназия) и да не продължиш по-задълбочено да учиш. Но все пак който си има "златни ръце" може да постигне способността да сглобява модули с PID регулатори и да ги настройва без висша математика!

Така, че и в моите думи има голяма доза истина.

Отговор
в отговор на Refurbished #16

Re: PID регулиране със self-tuning

>>Но все пак който си има "златни ръце" може да постигне способността да сглобява модули с PID регулатори и да ги настройва без висша математика!

Ааа за тая част на думите ти съм съгласен! да! който има "златни ръце" а не отбива номера колкото да мине пред родителя, даскала, шефа, себе си, се справя по-добре от тия... "професионалните"

По принцип мнението ми е, че университетите трябва да се превърнат в музеи в които да се събират млади готини хора и да си приказват философско-вселенски лафчета на по биричка или някой друг коз...

<- coder panic!
Отговор