新鲜出炉C语言PID算法代码
时间:2026-04-28
时间: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字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:风力发电项目成本管理的研究
下一篇:三路长拳动作名称