增量式PID示例算法

#include <stdio.h>
#include <stdlib.h>

float point =200.0;
typedef struct _pid{
    float setpoint;  //设定值
    float nowpoint;  //当前值
    float error;     //设定值与当前值的误差
    float error_before;     //上一个误差
    float error_last;       //上上一个误差
    float kp,ki,kd;          //比例,积分,微分三个参数
}PID;
PID pid;
void PID_init(){          //pid参数初始化
   pid.setpoint=0.0;
   pid.nowpoint=0.0;
   pid.error=0.0;
   pid.error_before=0.0;
   pid.error_last=0.0;
   pid.kp=0.2;            //三个参数可通过MATLAB调参调为最优
   pid.ki=0.015;
   pid.kd=0.2;
}


float PID_update(){          //PID算法更新
    pid.setpoint=point;
    pid.error=pid.setpoint-pid.nowpoint;
    float SUM=pid.kp*(pid.error-pid.error_before)+pid.ki*pid.error+pid.kd*(pid.error-2*pid.error_before+pid.error_last);     //增量式PID公式
    pid.nowpoint+=SUM;
    pid.error_last=pid.error_before;   // 误差更新
    pid.error_before=pid.error;
    return pid.nowpoint;
}

int main()
{
    int count=0;
    PID_init();
    while(count<1000)  //范围可自行设定
    {
        float actually=PID_update();
        printf("nowpoint is %f\n",actually);
        printf("setpoint is %f\n",point);
        count++;
    }
    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值