永发信息网

PID编程的实例!

答案:2  悬赏:40  手机版
解决时间 2021-11-16 15:34
PID编程的实例!
最佳答案
C语言实现PID算法
BC31 TC30 编译过,可运行。
    
  #include
  #include
  
  struct _pid {
   int pv;
   int sp;
   float integral;
   float pgain;
   float igain;
   float dgain;
   int deadband;
   int last_error;
  };
  
  struct _pid warm,*pid;
  int process_point, set_point,dead_band;
  float p_gain, i_gain, d_gain, integral_val,new_integ;;
    
  
  void pid_init(struct _pid *warm, int process_point, int set_point)
  {
   struct _pid *pid;
  
   pid = warm;
   pid->pv = process_point;
   pid->sp = set_point;
  }
  

  
  
  void pid_tune(struct _pid *pid, float p_gain, float i_gain, float d_gain, int dead_band)
  {
   pid->pgain = p_gain;
   pid->igain = i_gain;
   pid->dgain = d_gain;
   pid->deadband = dead_band;
   pid->integral= integral_val;
   pid->last_error=0;
  }
  
  
  void pid_setinteg(struct _pid *pid,float new_integ)
  {
   pid->integral = new_integ;
   pid->last_error = 0;
  }
  
  
  void pid_bumpless(struct _pid *pid)
  {
     pid->last_error = (pid->sp)-(pid->pv);
  }
  
  
  USAGE #include "control.h"*/
   
  float pid_calc(struct _pid *pid)
  {
   int err;
   float pterm, dterm, result, ferror;
  
   err = (pid->sp) - (pid->pv);
   if (abs(err) > pid->deadband)
   {
   ferror = (float) err;
   pterm = pid->pgain * ferror;
   if (pterm > 100 || pterm < -100)
   {
   pid->integral = 0.0;
   } else {
   pid->integral += pid->igain * ferror;
   if (pid->integral > 100.0)
    {
   pid->integral = 100.0;
   } else if (pid->integral < 0.0) pid->integral = 0.0;
   }
   dterm = ((float)(err - pid->last_error)) * pid->dgain;
   result = pterm + pid->integral + dterm;
   } else result = pid->integral;
   pid->last_error = err;
   return (result);
  }
  
  void main(void)
  {
   float display_value;
   int count=0;
  
   pid = &warm;
  
  // printf("Enter the values of Process point, Set point, P gain, I gain, D gain \n");
  // scanf("%d%d%f%f%f", &process_point, &set_point, &p_gain, &i_gain, &d_gain);
    
   process_point = 30;
   set_point = 40;
   p_gain = (float)(5.2);
   i_gain = (float)(0.77);
   d_gain = (float)(0.18);
  
     dead_band = 2;
   integral_val =(float)(0.01);
   
   printf("The values of Process point, Set point, P gain, I gain, D gain \n");
   printf(" %6d %6d %4f %4f %4f\n", process_point, set_point, p_gain, i_gain, d_gain);
  
   printf("Enter the values of Process point\n");
  
   while(count<=20)
   {
      scanf("%d",&process_point);
  
   pid_init(&warm, process_point, set_point);
   pid_tune(&warm, p_gain,i_gain,d_gain,dead_band);
   pid_setinteg(&warm,0.0); //pid_setinteg(&warm,30.0);
  
   //Get input value for process point
   pid_bumpless(&warm);
  
   // how to display output
   display_value = pid_calc(&warm);
   printf("%f\n", display_value);
   //printf("\n%f%f%f%f",warm.pv,warm.sp,warm.igain,warm.dgain);
   count++;
  
  }
  }
全部回答
编程的实例
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
皇马全称是什么?
江西省抚州市唱凯镇低保标准
望江梅李煜词中体现芳春的景物有
解方程:x2-5x-6=0
下胸围80.5,上胸围90.5,穿什么尺码的文胸呢
在JAVA中如何将String转换成Datetime类型
家里的锅盖突然碎了
克和毫克是怎样换算的啊?
关于竹子,请问以竹子为材料,做一些容器,托盘,
淘宝新店商品自动下架什么原因?
在德国有哪些中国企业
求无心法师2全集的百度云资源,谢谢
西藏拉萨宏发保健品有限公司 一粒金装 100%有
微信表情手指朝下什么意?
EZ传统流与蛋刀流哪个更实用
推荐资讯
理文造纸 使用什么ERP系统
植被破坏的解决措施是什么?
32/42保留两位小数(竖式)
镶嵌在墙上方的一长排的隐藏空调叫什么
平和到江城有多远
儿子二十七岁生日父亲致
学号44的结局是什么?.......看不懂
随身wif1有什么好处
火车和坦克的区别是什么
灯具安装有哪些平台?
学海网吧地址好找么,我有些事要过去,
奔富707特性
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?