ARM DSP-PID Algorithmus mit Windup-Effekt

#3728171
Lesenswert?

Hallo!

Könnte man die PID ARM Core Funktion der DSP Library um den 
Windup-Effekt erweitern? Sehe bei dem Quelltext nicht so richtig durch.
1
/**
2
 * @brief Instance structure for the Q31 PID Control.
3
*/
4
typedef struct
5
{
6
    q31_t A0;            /**< The derived gain, A0 = Kp + Ki + Kd . */
7
    q31_t A1;            /**< The derived gain, A1 = -Kp - 2Kd. */
8
    q31_t A2;            /**< The derived gain, A2 = Kd . */
9
    q31_t state[3];      /**< The state array of length 3. */
10
    q31_t Kp;            /**< The proportional gain. */
11
    q31_t Ki;            /**< The integral gain. */
12
    q31_t Kd;            /**< The derivative gain. */
13

14
} arm_pid_instance_q31;
15

16
void arm_pid_init_q31(arm_pid_instance_q31 * S, int32_t resetStateFlag)
17
{
18
 /* Derived coefficient A0 */
19
  S->A0 = __QADD(__QADD(S->Kp, S->Ki), S->Kd);
20

21
  /* Derived coefficient A1 */
22
  S->A1 = -__QADD(__QADD(S->Kd, S->Kd), S->Kp);
23
}
24

25
static __INLINE q31_t arm_pid_q31(arm_pid_instance_q31 * S, q31_t in)
26
{
27
    q63_t acc;
28
    q31_t out;
29

30
    /* acc = A0 * x[n]  */
31
    acc = (q63_t) S->A0 * in;
32

33
    /* acc += A1 * x[n-1] */
34
    acc += (q63_t) S->A1 * S->state[0];
35

36
    /* acc += A2 * x[n-2]  */
37
    acc += (q63_t) S->A2 * S->state[1];
38

39
    /* convert output to 1.31 format to add y[n-1] */
40
    out = (q31_t) (acc >> 31u);
41

42
    /* out += y[n-1] */
43
    out += S->state[2];
44

45
    /* Update state */
46
    S->state[1] = S->state[0];
47
    S->state[0] = in;
48
    S->state[2] = out;
49

50
    /* return to application */
51
    return (out);
52

53
}

VG Deepdiver99
Gast #3731557
Lesenswert?

Würde schon gerne die Core Funktion nutzen. Leider ist dort keine 
Anti-Windup Möglichkeit eingebaut wie oben im Quelltext zu sehen. Ist es 
möglich dort eine Anti-Windup Routine hinzu zu fügen?
Gast #3744219
Lesenswert?

> Es geht um die Umsetzung in C.

Wenn ich mich nicht vertue, würde es reichen, vor der Zuweisung an "out" 
"acc" nach oben und unten auf den Bereich, der tatsächlich ausgegeben 
werden kann, zu begrenzen.
Gast #3762083
Lesenswert?

Anti-Windup is bei vielen Bibliotheken nicht integriert, der Grund ist 
der dass es bei einer Vernünftigen Regelung nicht zu einer Stellgrößen 
beschränkung kommen sollte, wesswegen ein Anti-Windup hinfällig wird.

Anti-Windup ist ja eigentlich ein nichtlineares Verhalten des Reglers 
bei nichtlinearem verhalten der strecke und das sollte beides nicht 
vorkommen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren