Chinaunix首页 | 论坛 | 博客
  • 博客访问: 54581
  • 博文数量: 11
  • 博客积分: 185
  • 博客等级: 入伍新兵
  • 技术积分: 135
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-09 11:07
文章分类

全部博文(11)

文章存档

2020年(1)

2013年(10)

我的朋友

分类: Python/Ruby

2013-01-09 13:18:09

工作需要,搜遍网络,但没有现成的,故自行解决,秉承开源之原力,

有不足之处,诸君海涵

  1. --[[结构体:]]

  2. local pid_struct = {pv=0.0,sp=0.0,integral=0,
  3.         pgain=1.5, igain=0.1,dgain=0.0,
  4.         deadband=1.0,last_error=0.0,
  5.         max_value=50.0,min_value=30.0,
  6.         stable_time=1, modify_time=current};

  7. --[[计算PID函数]]

  8. function pid_calc(pid)
  9.     local err;
  10.     local pterm;
  11.     local dterm;
  12.     local result;
  13.     local ferror;
  14.     err = (pid.sp) - (pid.pv);
  15.    
  16.    
  17.     if (math.abs(err) > pid.deadband) then
  18.         ferror = err;
  19.        
  20.         pterm = pid.pgain * ferror;
  21.        
  22.         if (pterm > 100 or pterm < -100) then
  23.             pid.integral = 0.0;
  24.         else
  25.            
  26.             pid.integral = pid.integral + pid.igain * ferror;
  27.            
  28.             if (pid.integral > 3.0) then
  29.                 pid.integral = 3.0;
  30.             end
  31.             if (pid.integral < -3.0) then
  32.                 pid.integral = -3.0;
  33.             end
  34.         end
  35.        
  36.         dterm = (err - pid.last_error) * pid.dgain;
  37.         result = pterm + pid.integral + dterm;
  38.     else
  39.         --进入死区
  40.         result = pid.integral;
  41.     end
  42.    
  43.     result = pid.sp + result;
  44.    
  45.     --极值限制
  46.     if(result > pid.max_value) then
  47.         result = pid.max_value;
  48.     end
  49.     if(result < pid.min_value) then
  50.         result = pid.min_value;
  51.     end
  52.    
  53.     return result;

  54. end



 

阅读(3300) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~