[应用相关]

STM32的DSP库中的pid源代码分析

[复制链接]
840|2
手机看帖
扫描二维码
随时随地手机跟帖
叶春勇|  楼主 | 2020-6-8 09:52 | 显示全部楼层 |阅读模式
一、PID基本公式:
stm32 DSP库中的PID公式如下:
394855edd998689b8d.png
二、转化成Z域:
43195edd99b4cbae0.png
三、转化成差分方程:
890815edd99d7a76ed.png

使用特权

评论回复
叶春勇|  楼主 | 2020-6-8 09:54 | 显示全部楼层
本帖最后由 叶春勇 于 2020-6-8 09:56 编辑

四、源代码分析:
初始化程序,系数计算

void arm_pid_init_f32(
  arm_pid_instance_f32 * S,
  int32_t resetStateFlag)
{

  /* Derived coefficient A0 */
  S->A0 = S->Kp + S->Ki + S->Kd;

  /* Derived coefficient A1 */
  S->A1 = (-S->Kp) - ((float32_t) 2.0 * S->Kd);

  /* Derived coefficient A2 */
  S->A2 = S->Kd;

  /* Check whether state needs reset or not */
  if(resetStateFlag)
  {
    /* Clear the state buffer.  The size will be always 3 samples */
    memset(S->state, 0, 3u * sizeof(float32_t));
  }

}

此为A0,A1,A2的计算,同上式第三步算出的系数。当采样率为1时。

使用特权

评论回复
叶春勇|  楼主 | 2020-6-8 10:00 | 显示全部楼层
此为增量PID
采用步骤三的差分方程:
18875edd9bbbe7794.png
  static float32_t arm_pid_f32(
  arm_pid_instance_f32 * S,
  float32_t in)
  {
    float32_t out;

    /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]  */
    out = (S->A0 * in) +
      (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]);

    /* Update state */
    S->state[1] = S->state[0];
    S->state[0] = in;
    S->state[2] = out;

    /* return to application */
    return (out);

  }

其中
S->state[0]为e(n-1)
S->state[1]为e(n-2)
S->state[2]存储的是上一周期的输出。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

151

主题

4800

帖子

49

粉丝