Forum: Compiler & IDEs ARM DSP-PID Algorithmus mit Windup-Effekt


von deep d. (deepdiver99)


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

: Bearbeitet durch User
von deepdiver99 (Gast)


Lesenswert?

Hat keiner eine Idee? Oder bin ich mit der Frage im falschen Forum?

VG

von scuba pro (Gast)


Lesenswert?

deepdiver99 schrieb:
> Oder bin ich mit der Frage im falschen Forum?

Das kommt drauf an, ob dein Problem eins mit den Grundlagen von C oder 
ein regelungstechnisches ist.

von Werner M. (Gast)


Lesenswert?

> PID Algorithmus mit Windup-Effekt

Gewöhnlich versucht man, einen Wind-Up Effekt in der Regelung zu 
vermeiden.

von Deepdiver99 (Gast)


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?

von Deepdiver99 (Gast)


Lesenswert?

Es geht um die Umsetzung in C.

von der mechatroniker (Gast)


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.

von Deepdiver99 (Gast)


Lesenswert?

Das wäre ja die Stellgrößenbegrenzung. Die macht man ja dann sowieso. 
Beim Anti-Windup wird aber Ki begrenzt um ein aufschwingen zu 
verhindern.

von Frank K. (fchk)


Lesenswert?


von Peter K. (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.