Pid控制器

本文详细介绍了PID控制器的操作函数及其实现细节。包括了PID参数结构体和数据结构体的设计,以及核心函数pidCalculate的具体实现过程。此外,还涉及到了误差、微分、积分等关键概念及其在PID控制中的应用。

pid.h

/* ---------------------------------------------------------------------
 *
 * PID库函数:
 * 控制器操作函数.
 *
 *   修订操作      版本号       日期         修订人
 * ------------    ------    ----------    ------------
 *     创建        1.0       2018.01.19      Universea
 *
 * ---------------------------------------------------------------------*/
#ifndef __PID_H
#define __PID_H
#include "BasicData.h"

typedef struct
{
    uint8_t feedbackDifferentialMode;
    float    kp;                                     /* 比例系数 */
    float    ki;                                     /* 积分系数 */
    float    kdExpect;                               /* 微分系数 */
    float    kdFeedback;                             /* 微分反馈系数 */
    float    kFeedForward;                           /* 前馈系数 */
}pidArgumentStruct;


typedef struct
{
    float    err;                                    /* 误差 */
    float    expectLast;                             /*上次的期望值 */
    float    feedbackLast;                           /*上次的反馈值 */
    float    feedbackDifferential;                   /* 反馈微分 */
    float    feedbackDifferential_ex;                /* 反馈微分 */
    float    expectDifferential;                     /* 期望微分 */
    float    errorIntegral;                          /* 误差积分 */
    float    out;                                    /* pid输出 */
}pidValueStruct;

float pidCalculate( float dTs,                          /* 周期 */
            float feedForward,                  /* 前馈 */
            float expect,                       /* 期望值(设定值) */
            float feedback,                     /* 反馈值 */
            pidArgumentStruct *pidArgument,     /* PID参数结构体 */
            pidValueStruct *pidValue,           /* PID数据结构体 */
            float integralErrorLimit,           /* 积分误差限幅 */
            float integralLimit                 /* 积分限幅 */
            );


#endif
View Code

pid.c

/* ---------------------------------------------------------------------
 *
 * PID库函数:
 * 控制器操作函数.
 *
 *   修订操作      版本号       日期         修订人
 * ------------    ------    ----------    ------------
 *     创建        1.0       2018.01.19      Universea
 *
 * ---------------------------------------------------------------------*/
#include "PID.h"
#include "MyMath.h"
#include "MyFilter.h"


float pidCalculate( float dTs,                                                  /* 周期(单位:秒) */
            float feedForward,                                          /* 前馈值 */
            float expect,                                               /* 期望值(设定值) */
            float feedback,                                             /* 反馈值() */
            pidArgumentStruct *pidArgument,                             /* PID参数结构体 */
            pidValueStruct *pidValue,                                   /* PID数据结构体 */
            float integralErrorLimit,                                   /* 积分误差限幅 */
            float integralLimit                                         /* 积分限幅 */
            )
{
    float differential, hz;
    hz                = safeDivision( 1.0f, dTs, 0 );         /* 控制器频率 */
    pidValue->err            = (expect - feedback);                  /* 误差 */
    pidValue->expectDifferential    = (expect - pidValue->expectLast) * hz; /* 期望值微分 */
    if ( pidArgument->feedbackDifferentialMode == 0 )                       /* 常规反馈值微分 */
    {
        pidValue->feedbackDifferential = (feedback - pidValue->feedbackLast) * hz;
    }      else{
        pidValue->feedbackDifferential = pidValue->feedbackDifferential_ex;
    }
    /* 微分值计算 期望值微分 - 反馈值微分 (微分先行,只对反馈微分) */
    differential = (pidArgument->kdExpect * pidValue->expectDifferential - pidArgument->kdFeedback * pidValue->feedbackDifferential);
    /* 误差积分 */
    pidValue->errorIntegral += pidArgument->ki * LIMIT( (pidValue->err), -integralErrorLimit, integralErrorLimit ) * dTs;
    /* 积分限幅 */
    pidValue->errorIntegral = LIMIT( pidValue->errorIntegral, -integralLimit, integralLimit );
    /* PID输出 */
    pidValue->out = pidArgument->kFeedForward * feedForward /* 前馈 */
            + pidArgument->kp * pidValue->err       /* 比例 */
            + differential                          /* 微分 */
            + pidValue->errorIntegral;              /* 积分 */

    pidValue->feedbackLast    = feedback;                     /*上次反馈值 */
    pidValue->expectLast    = expect;                       /*上次期望值 */
    return(pidValue->out);
}
View Code

 

转载于:https://www.cnblogs.com/universea/p/8385920.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值