积分分离数字PID控制器C语言

//  积分分离数字PID


#include<stdio.h>
struct pid
{
    float Setspeed;
    float Actualspeed;
    float Err;
    float Err_last;
    float Kp,Ki,Kd;
    float Voltage;
    float Integral;
} pid;

void PID_Init(void);
float PID_Cal(float Speed);

int main()
{
    struct pid;
    int count=0;
    printf("SYSTEM BEGIN!\n");
    PID_Init();
    while(count<200)
    {
        float speed=PID_Cal(200.0);
        printf("-%d  %f\n",count,speed);
        count++;
    }
    return 0;
}

float PID_Cal(float Speed)
{
    unsigned char index;
    pid.Setspeed      =  Speed;
    pid.Err           =  pid.Setspeed-pid.Actualspeed;
    pid.Setspeed      =  Speed;
    pid.Err           =  pid.Setspeed - pid.Actualspeed;
    if(abs(pid.Err) >=100) //取绝对值
    {
        index = 0;
    }
    else
    {
        index =1;
        pid.Integral      += pid.Err;
    }
    pid.Voltage        =pid.Kp*pid.Err+index*pid.Ki*pid.Integral+pid.Kd*(pid.Err-pid.Err_last);
    pid.Err_last       =pid.Err;
    pid.Actualspeed    =pid.Voltage*1.0;
    return pid.Actualspeed;
}

void PID_Init(void)
{
    printf("PID_Init begin!\n");
    pid.Setspeed=       0;
    pid.Actualspeed=    0;
    pid.Err=            0;
    pid.Err_last=       0;
    pid.Kp=             0.2;
    pid.Ki=             0.15;
    pid.Kd=             0.2;
    pid.Voltage=        0;
    pid.Integral=       0;
    printf("PID_Init end!\n");
}


  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值