6840|5

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

PID算法实现(C语言) [复制链接]

这是一个PID算法的C语言实现程序:"double sensor (void),void actuator(double rDelta,double LastrDelta )各函数的功能及语句的作用, 以及主函数里的变量j和数值a[]的设置的作用,以及for循环语句的作用,"望大家再分享的同时,给份详细注释,在线等待,大家帮助大家,^_^.
#include
#include
typedef struct PID {             /*K1=实际放大倍数,T1=实际积分时间,T2=实际微分时
间,T=采样周期*/

    double  SetPoint;     /*定义PID结构体*/   

    double  K1;
    double  T1;               
    double  T2;
        double  T;
        double  Err1;       /*前一时刻误差,E(K-1)*/   
} PID;
double PIDCalc( PID *pp, double NextPoint,double Ud1,double Ui1)  /*PID计算
*/   
{
   double Ti,Td,Kp,Ki,Kd,Ud,Up,Ui,Err;        
    Ti = pp->T1 + pp->T2;                           /*积分时间*/
    Td = (pp->T1 * pp->T2) / (pp->T1 + pp->T2);     /*微分时间*/
    Kp = pp->K1 * ((pp->T1 + pp->T2) / pp->T1);      /*比例系数*/
    Ki =pp->T / Ti * Kp;                             /*积分系数*/
    Kd = Td / pp->T * Kp;                            /*微分系数*/   

     Err = pp->SetPoint-NextPoint;                    /*当前误差*/
    Ud = pp->T2 / ((Kd * pp->T) + pp->T2) * Ud1+ Kd * (pp->T2 + pp->T) / (Kd *
pp->T + pp->T2) * Err - Kd * pp->T2 / (Kd * pp->T + pp->T2) *pp->Err1;   /*微分
作用*/
    Ui = Ui1 + pp->K1 * (pp->T / pp->T1) * Ud;         /*积分作用*/     
    Up = pp->K1 * Ud;                                  /*比例作用*/
    Ud1=Ud;                                          /*UD1=ud(k-1),ui1=ui(k-1)
*/
    Ui1=Ui;
return (Ud + Up + Ui);                               /*y(k)*/
}
void PIDInit (PID *pp)
{
    memset ( pp,0,sizeof(PID));                  
}





/*double sensor (void)                                      
{
    return 1.0;
}*/                                                    /*输入口*/

void actuator(double rDelta,double LastrDelta )             /*输出口*/
{
  double n;                                                
  n=rDelta-LastrDelta;                                   /*y(k)-y(k-1)*/
  LastrDelta=rDelta;                                 
  printf ("%f\n",n);
  }

void main(void)                        
{
int j,a[]=
{15,14,12.5,10.5,5.5,6.7,9.5,11.3,9.6,10.2,10.035,9.2356,10.2356,9.3654,10.01101
};
    PID         sPID;
    double      rOut;
    double      LastrOut=0;                             /*y(k-1)*/
    double      rIn;
    double       Ud1 = 1;
    double       Ui1 = 1;
    PIDInit ( &sPID );                                    /*PID初始化*/
    sPID.K1 = 1;
    sPID.T1 = 1;
    sPID.T2 = 1;
    sPID.T  = 1;
    sPID.SetPoint = 10.0;                                   /*设定值*/
    sPID.Err1 = 1;


    for (j=0;j<15;j++)
     {
    rIn = a[j];  /*sensor ();*/                     /*输入*/
    rOut= PIDCalc ( &sPID,rIn,Ud1,Ui1 );                 
    actuator ( rOut, LastrOut );           
}
}
此帖出自编程基础论坛

最新回复

No good...  详情 回复 发表于 2015-4-2 12:15
点赞 关注
 

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这应该是个仿真程序.
sensor原来是个输入函数,后来注释掉了,用数组代替了.
actuator输出函数,这里现示跟踪情况.
j,是15个点的循环变量.
a[j],是个模拟的输入.

此帖出自编程基础论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
语句:return 1.0;
变量:rDelta LastrDelta
  语句:n=rDelta-LastrDelta; LastrDelta=rDelta;                                                                    printf ("%f\n",n);又分别如何解释呢,新手上路,多指教.^_^
此帖出自编程基础论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
我仔细看了看,这个程序的问题很多,应该不是个标准的程序.不要学.

比如void actuator(double rDelta,double LastrDelta )这样的定义和他的意图不匹配,LastrDelta 该用传址的方式.否则赋值没有意义.

找个好的程序看看吧.
此帖出自编程基础论坛
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(中级)

5
 
找时间看看
此帖出自编程基础论坛
 
 
 

回复

30

帖子

0

TA的资源

一粒金砂(中级)

6
 
No good...
此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表