新鲜出炉C语言PID算法代码

时间:2026-04-28

这个程序是在网上一个程序的基础上修改过来的。 看了看觉得那个程序有点不对的地方~所以自己写了写,运行效果还可以。不知道是不是自己理解有偏差,欢迎大家拍砖拍砖请发邮件 ygm5169@qq.com

#include <stdio.h>
#include "string.h"
#include "windows.h"
#include "math.h"

/*
这个程序是在网上一个程序的基础上修改过来的。
看了看觉得那个程序有点不对的地方~所以自己写了写,运行效果还可以。
不知道是不是自己理解有偏差,欢迎大家拍砖

拍砖请发邮件 ygm5169@http://www.77cn.com.cn

*/

typedef struct{
double CurrentPoint;/*the current value*/
double TargetPoint;/*the target point*/

double Kp;/*比例系数*/
double Ki;/*积分常数*/
double Kd;/*微分常数*/
double T;/*采样周期*/
double Ti;/*积分周期*/
double Td;/*微分周期*/
double Ei;/*误差e(i)*/
double Ei_1;/*误差e(i-1)*/
double Ei_2;/*误差e(i-2)*/

double Output;/*输出值*/
double maxTargetPoint;/*设定点限幅*/
double minTargetPoint;/*设定点限幅*/
double MaxOutput;/*输出限幅值(抗积分饱和)*/
double MinOutput;/*输出限幅值(抗积分饱和)*/

double IntegralBand;/*积分有效区(积分分离)*/
double IntegralResidual;/*消除积分不灵敏区域*/
double IntegralSum;/*积分残差累加和*/
}CPID, *pCPID;



/*------------------------------------------------------------------------
pid_init

初始化PID结构体
------------------------------------------------------------------------*/
void pid_init(CPID *pPid)
{
memset(pPid, 0, sizeof(CPID));
}


/*------------------------------------------------------------------------
pid_Set_Gain

设置PID参数
pPid
p_gain
i_gain
d_gain
------------------------------------------------------------------------*/

void pid_Set_Gain(CPID *pPid, double samplecycle, double p_gain, double i_gain, double d_gain)
{
pPid->Kp = p_gain;
pPid->Ki = i_gain;
pPid->Kd = d_gain;
pPid->T = samplecycle;
}

/*------------------------------------------------------------------------
pid_Set_Cycle

通过设置采样周期的方式设置PID参数
pPid
p_gain
samplecycle
i_cycle
d_cycle
------------------------------------------------------------------------*/

void pid_Set_Cycle(CPID *pPid, double p_gain, double samplecycle, double i_cycle, double d_cycle)
{
pPid->Kp = p_gain;
pPid->Ki = p_gain * samplecycle / i_cycle;
pPid->Kd = p_gain * d_cycle / samplecycle;
pPid->T = samplecycle;
pPid->Ti = i_cycle;
pPid->Td = d_cycle;
}
/*------------------------------------------------------------------------
pid_Set_OutputBand

通过设置采样周期的方式设置PID参数
pPid
p_gain
samplecycle
i_cycle
d_cycle
------------------------------------------------------------------------*/
void pid_Set_OutputBand(CPID *pPid, double OutputMax, double
OutputMin)
{
pPid->MaxOutput = OutputMax;
pPid->MinOutput = OutputMin;
}
/*-------------------------------------------------------

这个程序是在网上一个程序的基础上修改过来的。 看了看觉得那个程序有点不对的地方~所以自己写了写,运行效果还可以。不知道是不是自己理解有偏差,欢迎大家拍砖拍砖请发邮件 ygm5169@qq.com

-----------------
pid_Set_TargetBand

通过设置采样周期的方式设置PID参数
pPid
p_gain
samplecycle
i_cycle
d_cycle
------------------------------------------------------------------------*/
void pid_Set_TargetBand(CPID *pPid, double MaxTargetPoint, double MinTargetPoint)
{
pPid->maxTargetPoint = MaxTargetPoint;
pPid->minTargetPoint = MinTargetPoint;
}
/*------------------------------------------------------------------------
pid_Set_TargetPoint

通过设置采样周期的方式设置PID参数
pPid
p_gain
samplecycle
i_cycle
d_cycle
------------------------------------------------------------------------*/
void pid_Set_TargetPoint(CPID *pPid, double TargetPoint)
{
pPid->TargetPoint = TargetPoint;
}
/*------------------------------------------------------------------------
pid_Set_Integral

通过设置采样周期的方式设置PID参数
pPid
p_gain
samplecycle
i_cycle
d_cycle
------------------------------------------------------------------------*/
void pid_Set_Integral(CPID *pPid, double IntegralBand, double IntegralResidual)
{
pPid->IntegralBand = IntegralBand;
pPid->IntegralResidual = IntegralResidual;
pPid->IntegralSum = 0;
}

// void pid_Set_DeadBand(CPID *pPid, double DeadBand)
// {
// pPid->deadband = DeadBand;
// }
/*------------------------------------------------------------------------
pid_setinteg

预置PID输出值,这在开始计算PID的时候非常有用
------------------------------------------------------------------------*/
void pid_Set_Output(CPID *pPid,double new_output)
{
pPid->Output = new_output;
pPid->Ei = 0;
pPid->Ei_1 = 0;
pPid->Ei_2 = 0;
}
/*------------------------------------------------------------------------
pid_Set_Input

通过设置采样周期的 …… 此处隐藏:4496字,全部文档内容请下载后查看。喜欢就下载吧 ……

新鲜出炉C语言PID算法代码.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:4.9 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:19元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219