ARM DSP-PID Algorithmus mit Windup-Effekt

OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.