PID регулиране със self-tuning
15 отговора
0 прегледа
PID регулиране със self-tuning
Някои има ли идея за алгоритъм/блок-схема и да може да даде такъв/такива за нещото от заглавието на темата? Ако може на Асемблер за PIC или на C.
Благодаря за всякакви идеи!
Link:
[линк]
Благодаря за всякакви идеи!
Link:
[линк]
Re: PID регулиране със self-tuning
Точно на страницата, към която си постнал линк, има алгоритъм.
Re: PID регулиране със self-tuning
на страницата също има интеграли и диференциални уравнения , а тоя е завършил китаистика, смятай
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));
}
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));
}
Re: PID регулиране със self-tuning
Да, да, точно така! Висшата математика за мен е тъмна Индия.
Макар че не питам за мен точно де.
Макар че не питам за мен точно де.
Редактирано от Naki на
Re: PID регулиране със self-tuning
Много благодаря!
Ако не ти е проблем, би ли го сложил примера във pre тагове, за да се запазят табовете и редовете?
Ако може дай и източника на лична.
Ако не ти е проблем, би ли го сложил примера във pre тагове, за да се запазят табовете и редовете?
Ако може дай и източника на лична.
Re: PID регулиране със self-tuning
Добре, ве, мой, вземи един ред от кода или коментарите и го пусни в Гуугъл, да те еба. Бахти, как функционирате в реалния живот некои от вас не моа да схвана.
[линк]
--
One day it will make sense.
[линк]
--
One day it will make sense.
Re: PID регулиране със self-tuning
къв ти гугъл, проблемът можеше да се реши в стаковърфлоу за 1 мин.
Al: A Bundy never wins, but a Bundy never quits.
Al: A Bundy never wins, but a Bundy never quits.
Re: PID регулиране със self-tuning
Някои се пише Някой
И се надявам да си наясно, че проЗ PID регулатор има много, ама наистина много недостатъци и поради това само малоумник може да си позволи да го използва в директен вид.
И се надявам да си наясно, че проЗ PID регулатор има много, ама наистина много недостатъци и поради това само малоумник може да си позволи да го използва в директен вид.
Re: PID регулиране със self-tuning
Глупости, да не говорим, че в повечето случаи обикновен пропорционален/пропорционално-интегрален е напълно достатъчен. 
Re: PID регулиране със self-tuning
Мда, сори, въобще не видях какво съм писал.
Бързах и затова така.
Бързах и затова така.
Re: PID регулиране със self-tuning
Отделни модули изградени на P и PI може да има, но нека не забравяме, че живеем е реален свят.
Re: PID регулиране със self-tuning
Няма проблем.
Само исках да ти покажа, че на всеки му се случва да направи дребна филологическа грешка. А този клуб е да се обсъждат все пак IT въпросите.
P, PI, PIDI регулаторите са най-често използваните съставни модули (звена) от които се сглобяват автоматите в реалния свят.
Автоматиката се учи И в средните училища. Казано по друг начин - има учебници без висша математика по тези важни въпроси.
Само исках да ти покажа, че на всеки му се случва да направи дребна филологическа грешка. А този клуб е да се обсъждат все пак IT въпросите.
P, PI, PIDI регулаторите са най-често използваните съставни модули (звена) от които се сглобяват автоматите в реалния свят.
Автоматиката се учи И в средните училища. Казано по друг начин - има учебници без висша математика по тези важни въпроси.
Re: PID регулиране със self-tuning
Глупости на търкалета дрънкаш, ама няма накъде! Автоматика се учило в средните училища! От СМГ съм, имам сума ти познати в ТУЕС, такова чудо никой сериозно не е учил. най много някой единичен учител напънител се е опитвал да блесне с нещо като спомене сложни думички.
Най сложното нещо което братчед ми се опита да ме "сблъска" когато беше в 10ти клас на ТУЕС (като се правеше на голЕм и можещ всьо), бяха невронните мрежи и графи. Еми усмихнах се Сократски и почнах да го подпитвам кво аджеба знае, ми не можеше да осмисли обхождане, камо ли нещо по-сериозно.
Толкова се дразня понякога на някои учители! Заради такива ненормалници това момче си загуби математическата и физическата подготовка, и му напълниха младата неузряла тиква с некви ИТ булшит термини които дори и създателите им не разбират много точно!
А да! Под физическа подготовка нямам предвид гимнастика!
<- coder panic!
Най сложното нещо което братчед ми се опита да ме "сблъска" когато беше в 10ти клас на ТУЕС (като се правеше на голЕм и можещ всьо), бяха невронните мрежи и графи. Еми усмихнах се Сократски и почнах да го подпитвам кво аджеба знае, ми не можеше да осмисли обхождане, камо ли нещо по-сериозно.
Толкова се дразня понякога на някои учители! Заради такива ненормалници това момче си загуби математическата и физическата подготовка, и му напълниха младата неузряла тиква с некви ИТ булшит термини които дори и създателите им не разбират много точно!
А да! Под физическа подготовка нямам предвид гимнастика!
<- coder panic!
Редактирано от Accolade на
Re: PID регулиране със self-tuning
Има нещо вярно в думите ти.
За 500 лв. няма как да намериш свестен даскал. Има и "отровни даскали", няма какво да се лъжем.
Обаче във връзка с изборите в началото на месеца ходих до началното си училище. Там са направили да се учи до 10-ти клас, като последните две години са само с технически предмети. Учат се всякакви техники съобразно нивото на "съзнание" на оставащите там.
Няма как да си кадърен и да не те вземат в някое средно училище (бивш техникум, а не бивша гимназия) и да не продължиш по-задълбочено да учиш. Но все пак който си има "златни ръце" може да постигне способността да сглобява модули с PID регулатори и да ги настройва без висша математика!
Така, че и в моите думи има голяма доза истина.
За 500 лв. няма как да намериш свестен даскал. Има и "отровни даскали", няма какво да се лъжем.
Обаче във връзка с изборите в началото на месеца ходих до началното си училище. Там са направили да се учи до 10-ти клас, като последните две години са само с технически предмети. Учат се всякакви техники съобразно нивото на "съзнание" на оставащите там.
Няма как да си кадърен и да не те вземат в някое средно училище (бивш техникум, а не бивша гимназия) и да не продължиш по-задълбочено да учиш. Но все пак който си има "златни ръце" може да постигне способността да сглобява модули с PID регулатори и да ги настройва без висша математика!
Така, че и в моите думи има голяма доза истина.
Re: PID регулиране със self-tuning
>>Но все пак който си има "златни ръце" може да постигне способността да сглобява модули с PID регулатори и да ги настройва без висша математика!
Ааа за тая част на думите ти съм съгласен! да! който има "златни ръце" а не отбива номера колкото да мине пред родителя, даскала, шефа, себе си, се справя по-добре от тия... "професионалните"
По принцип мнението ми е, че университетите трябва да се превърнат в музеи в които да се събират млади готини хора и да си приказват философско-вселенски лафчета на по биричка или някой друг коз...
<- coder panic!
Ааа за тая част на думите ти съм съгласен! да! който има "златни ръце" а не отбива номера колкото да мине пред родителя, даскала, шефа, себе си, се справя по-добре от тия... "професионалните"
По принцип мнението ми е, че университетите трябва да се превърнат в музеи в които да се събират млади готини хора и да си приказват философско-вселенски лафчета на по биричка или някой друг коз...
<- coder panic!