改进PID(微分先行)——C语言实现


一、微分先行PID介绍

 

PID控制器开发笔记之七:微分先行PID控制器的实现_foxclever的博客-CSDN博客_微分先行

 


二、代码实现

代码如下:

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


struct derivation_in_advance_PID
{
    float SetPoint;
    float ActualSpeed;    
    float Kp;
    float Ki;
    float Kd;
    float c1;
    float c2;
    float c3;
    float error;
    float error_last;
    float interal;
    float gama;
    float control;
    float control_dk;
    float control_dk_last;
}pid;


void PID_init();
float PID_realize(float speed);


void PID_init()
{
    pid.Kp = 0.2;
    pid.Ki = 0.1;
    pid.Kd = 0.2;
    pid.error = 0.0;
    pid.error_last = 0.0;
    pid.interal = 0.0;
    pid.gama = 0.1;
    pid.control = 0.0;
    pid.control_dk =0.0;
    pid.control_dk_last = 0.0;
    pid.ActualSpeed = 0.0;
    pid.c1 = 0.0;
    pid.c2 = 0.0;
    pid.c3 = 0.0;
}


void PID_realise(float speed)
{
  pid.SetPoint = speed;

  pid.error = pid.SetPoint - pid.ActualSpeed;
  pid.interal += pid.error;

  pid.c1 = (pid.gama*pid.Kd)/(pid.gama*pid.Kd+pid.Kp);
  pid.c2 = (pid.Kd+pid.Kp)/(pid.gama*pid.Kd+pid.Kp);
  pid.c3 = pid.Kd/(pid.gama*pid.Kd+pid.Kp);

  pid.control_dk = pid.c1*pid.control_dk_last + pid.c2*pid.control_dk + pid.c3*pid.control_dk_last;

  pid.control = pid.Kp*pid.error + pid.Ki*pid.interal + pid.control_dk;

  pid.error_last = pid.error;
  pid.control_dk_last = pid.control_dk;
  pid.ActualSpeed = pid.control*1.0;

}


int main()
{
    PID_init();
    int count;
    while(count<1000)
    {
        float speed = PID_realize(200);
        printf("%f\n",speed);
        count++;
    }
    return 0;
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值