zoukankan      html  css  js  c++  java
  • C 语言实现增量式PID

    一直以来,pid都是控制领域的经典算法,之前尝试理解了很久,但还是一知半解,总是不得要领,昨天模仿着别人的代码写了一个增量式pid的代码。

    我的理解就是pid其实就是对你设置的预定参数进行跟踪。在控制领域,他先采集目前的实时参数,与设定的参数进行比较,计算出误差,然后进行积分微分运算,计算出控制器需要的增量(正负),

    然后与实际参数相加,使他尽可能的接近设定值 。没有D参数的称为PI控制器,也比较常用。具体公式其实不理解也没关系,只要对照着差分方程,写出相应的算法即可,然后上网查查pid调节的经验。

    找到最适的pid参数。

    程序中的count为需要计算的次数,有兴趣的读者可以尝试着修改一下这个数值,当count值为100的时候,你会发现他最后迭代的值并不是设定值200.0.而是一个比他小的数,

    这是因为100次计算并不能使他达到设定值,毕竟我们设置的初始实际值为0,要让0直接跟踪到200需要一段跳跃时间。这个跳跃时间并不是100计算就能达到的;可以尝试几次试试。

    当然实际控制领域应用的时候,并没有这个count,他会一直进行 动态运算,使实际值一直保持在设定值附近。

    //实现增量式PID算法 
    
    #include "stdio.h" 
    void pid_init();//PID参数初始化 
    float pid_realise(float speed);//实现PID算法   
    
    struct {
        float set_speed;//设定速度 
        float actual_speed;//实际速度
        float error;//偏差  
        float error_next;//上一个偏差  
        float error_last;//上上一个偏差 
        float kp,ki,kd;//定义比例,积分,微分参数  
         
    }pid;
    
    
    int main()
    {
        pid_init();
        int count = 0;
        while(count<400)//进行400次 PID 运算,使初始值从0开始接近200.0   
        {
            float speed = pid_realise(200.0);//设定值设定为200.0  
            printf("%f
    ",speed);//输出每一次PID 运算后的结果  
            count++;
        }
    }
    
    
    void pid_init()
    {
        pid.set_speed = 0.0;
        pid.actual_speed = 0.0;
        pid.error = 0.0;
        pid.error_next = 0.0;
        pid.error_last = 0.0;
        //可调节PID 参数。使跟踪曲线慢慢接近阶跃函数200.0 // 
        pid.kp = 0.2;
        pid.ki = 0.01;
        pid.kd = 0.2;
    }
    
    
    float pid_realise(float speed)//实现pid  
    {
        pid.set_speed = speed;//设置目标速度  
        pid.error = pid.set_speed - pid.actual_speed;
        float increment_speed;//增量
         
        increment_speed = pid.kp*(pid.error-pid.error_next)+pid.ki*pid.error+
        pid.kd*(pid.error-2*pid.error_next+pid.error_last);//增量计算公式  
        
        pid.actual_speed+= increment_speed;
        pid.error_last = pid.error_next;//下一次迭代  
        pid.error_next = pid.error;
        return pid.actual_speed; 
        
    }
  • 相关阅读:
    音频播放
    控制器的创建和控制器View的创建
    UIWebView之获取所点位置的图片(放大webView中的图片)
    SQLite的应用
    数据库操作(SQLite)
    计算文件(文件夹)大小
    本人专访微信魔法表情“米悠”作者流星剑
    Swift给每个开发者赢取500万的机会!不看一生后悔。
    疯狂猜图产品和盈利模式分析
    开发者改变世界的初心!
  • 原文地址:https://www.cnblogs.com/qsyll0916/p/7518459.html
Copyright © 2011-2022 走看看