zoukankan      html  css  js  c++  java
  • PID控制

    PID控制是一种线性控制,它将给定值r(t)与实际输出值y(t)的偏差的比例(P)、积分(I)、微分(D)通过线性组合形成控制量,对被控对象进行控制。
    PID控制的微分方程为:
    y(t)——系统的输出;
    n(t)——给定值;
    e(t)——控制的输入,即偏差:e(t)=n(t)-y(t)被控量与给定值的偏差;
    u(t)——控制的输出;
     ——比例系数;
     ——积分时间常数;
     ——微分时间常数; [1] 
     
     
    #include <stdio.h>

    // 第一步:定义PID变量结构体,控制算法中所需要用到的参数在一个结构体中统一定义,方便后面的使用。
    //代码如下:
    struct _pid
    {
        float SetSpeed;         //定义设定值
        float ActualSpeed;      //定义实际值
        float err;              //定义偏差值
        float err_last;         //定义上一个偏差值
        float Kp,Ki,Kd;         //定义比例、积分、微分系数
        float voltage;          //定义电压值(控制执行器的变量)
        float integral;         //定义积分值
    }pid;


    // 第二部:初始化变量,统一初始化变量,尤其是Kp,Ki,Kd三个参数,调试过程当中,对于要求的控制效果,可以通过调节这三个量直接进行调节。
    //代码如下:
    void PID_init()
    {
        printf("PID_init Begin  ");
        pid.SetSpeed = 0.0;
        pid.ActualSpeed = 0.0;
        pid.err = 0.0;
        pid.err_last = 0.0;
        pid.voltage = 0.0;
        pid.integral = 0.0;
        pid.Kp = 0.2;
        pid.Ki = 0.015;
        pid.Kd = 0.2;
        printf("PID_init End  ");
    }


    // 第三步:编写控制算法,这里用了最基本的算法实现形式,没有考虑死区问题,没有设定上下限,只是对公式的一种直接的实现,后面的介绍当中还会逐渐的对此改进。,
    //代码如下:
    float PID_realize(float speed)
    {
        pid.SetSpeed = speed;                           //定义设定值
        pid.err = pid.SetSpeed - pid.ActualSpeed;       //定义偏差值 = 设定值 - 实际值
        pid.integral += pid.err;                        //定义积分值 = 当前积分值 + 当前偏差值
        
        //定义电压值(控制执行器的变量) = 比例*偏差值 + 积分*积分值 + 微分*(偏差值-上一个偏差值)
        pid.voltage = pid.Kp*pid.err + 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;
    }

    int main()
    {
        printf("System Begin  ");
        PID_init();
        int count=0;
        while(count < 1000)
        {
            float speed = PID_realize(200.0);
            printf("%f ",speed);
            count++;
        }
        +printf("PID_init End  ");
        return 0;
    }
  • 相关阅读:
    Vue--运行项目发送http://localhost:8080/sockjs-node/info请求报错,造成浏览器不能热更新
    Vue笔记--同局域网下访问本地项目
    Vue笔记--通过自定义指令实现按钮操作权限
    css/css3实现未知宽高元素的垂直居中和水平居中
    【转载】Vue路由history模式踩坑记录:nginx配置解决404问题
    给动态生成的input框,添加readonly属性
    layui-form下隐藏元素的验证问题
    layui的省市县三级联动
    webstorm-激活码
    采坑
  • 原文地址:https://www.cnblogs.com/hbtmwangjin/p/13994293.html
Copyright © 2011-2022 走看看