请选择 进入手机版 | 继续访问电脑版

PID算法C语言例程

[复制链接]
二次方先生 发表于 2021-1-3 12:16:34 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
一个PID的demo:
参考:https://blog.csdn.net/u010160335/article/details/87373031
https://www.cnblogs.com/cjq0301/p/5184808.html
  1. #include "pch.h"#include //增量式PIDtypedef struct {    int SetPoint;       //目的值    long SumError;      //误差累计    float P;            //比例常数    float I;            //积分常数    float D;            //微分常数    int LastError;      //上次毛病值    int PrevError;      //上上次毛病值}PID;/************************************************* *函数名称:void PID_Arg_Init(PID* sptr)          * *功    能:参数初始化                            * *参    数:PID* sptr                             * *返 回 值:void                                  * *************************************************/void PID_Arg_Init(PID* sptr){    sptr->SumError = 0;         //误差累计     sptr->LastError = 0;        //上次毛病值    sptr->PrevError = 0;        //上上次毛病值    sptr->P = 0;                //比例常数    sptr->I = 0;                //积分常数    sptr->D = 0;                //微分常数    sptr->SetPoint = 0;         //目的值}/**************************************************************** *函数名称:int PID_Contrl(PID* sptr,int NextPoint)              * *功    能:PID控制                                              * *参    数:PID* sptr:上次参数  int NextPoint:当前实际值       * *返 回 值:void                                                 * ****************************************************************/void PID_Arg_Set(PID* sptr, float P,float I, float D,int Aims){    /*P-I-D参数初始化*/    sptr->P = P;  /*0.6*/    sptr->I = I;  /*0.15*/    sptr->D = D;  /*0.1*/    /*目的值设定*/    sptr->SetPoint = Aims;}/**************************************************************** *函数名称:int PID_Contrl(PID* sptr,int NextPoint)              * *功    能:PID控制                                              * *参    数:PID* sptr:上次参数  int NextPoint:当前实际值       * *返 回 值:void                                                 * ****************************************************************/int PID_Contrl(PID* sptr, int NextPoint){    register int iError, iIncPid;    /*当前误差  设定的目的值和实际值的毛病*/    iError = sptr->SetPoint - NextPoint;       /*增量盘算*/    iIncPid = int((sptr->P * iError) - (sptr->I * sptr->LastError) + (sptr->D * sptr->PrevError));            /*存储误差  用于下次盘算*/    sptr->PrevError = sptr->LastError;    sptr->LastError = iError;    /*返回增量值*/    return iIncPid;                         }int main(){    int temp = 0;    int add = 0;    PID PID_Temp;    /*PID参数初始化*/    PID_Arg_Init(&PID_Temp);    /*PID参数设定*/    PID_Arg_Set(&PID_Temp,0.6,0.15,0.1,50);    /**/    for (int i = 0; i < 100; i++)    {        add = PID_Contrl(&PID_Temp, temp);        temp += add;        printf("下次增量 add = %d\n", add);        printf("当前增量 temp = %d\n", temp);        printf("目的值PID_Temp.SetPoint = %d\n", PID_Temp.SetPoint);        printf("当前误差PID_Temp.LastError = %d\n", PID_Temp.LastError);        printf("\n");    }    return 0;}
复制代码
来源:https://blog.csdn.net/qq_38158479/article/details/112049748
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

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

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )