微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 测试测量 > Labview > PID 输出数据 如何转换为控制变量。

PID 输出数据 如何转换为控制变量。

时间:10-02 整理:3721RD 点击:
如题,PID的输出数据如何转换为控制变量。
××××××××××
模型一:加热箱
设定值SV, 检测值PV,PID计算结果MV。 执行结构是加热块。
MV是一个数值,无单位。 执行结构通常是PWM控制的固态继电器。
PWN和MV之间是如何转换的?
×××××××××××
模型二:调速电机(电压调速)
设定值SV(转速),检测值PV(编码器返回的速度),PID计算结果MV,执行结构:可编程电源
MV是一个数值,无单位。MV和如何和可编程电源的的输出电压建立关系?
×××××××××××××××××
参考资料:http://www.docin.com/p-220191301.html

1.实际PID工作时是根据检测值与设定值的偏差进行调节的,直到偏差接近0。
2.PID计算值其实是PWM的占空比,模型一、模型二都是。
PID程序你可以参考http://bbs.elecfans.com/jishu_1147002_1_1.html
float PID_Regulator(float Reference, float PresentFeedback, _pid *PID_Struct)
模型1中国设定值SV为Reference,检测值PV为PresentFeedback,函数的输出值为MV即PWM
模型2同理

PID输出值与PWM对应关系需要自己去处理,通常我们是直接将PID的输出值作为PWM的值。值得注意的地方是需要对输出值进行限幅,不要超过让PWM的占空比超出100%或者低于0%(不同系统有不同要求)。

各家的PID算法会有些区别,所以我让认为抛开算法谈 输出值(MV)如何使用是空中楼阁。
××
目前做基于三菱PID的张力控制,模型是:


设定值(SV):张力100N,  检测值(PV)。 PV和SV之间的差值(CV)是PID的输入参数。注意这个CV是有符号的。
主动轴的速度恒定, 通过调节从动轴的速度来实现张力的调整。 从动轴速度大于主动轴速度,则产品变得松弛。
从动轴速度小于主动轴度,则产品被拉伸,张力就会变大。
××××××××××××××××××××××××××××××
张力函数如下:


××××××××××××××
根据直接测试的效果:
当误差值在正的方向越大(10->100->1000)这样的变化后,PID输出值也会变大(例如:10-20-30.。)
当误差在负的方向越大(-10-》-100-》-1000)这样的变化后,PID的输出值也这样变化(例如-10--》-100--》-1000)
××××××××××××××××××××××
这个输出值的用法很多,可以的用法是:
从动轴转速=主轴转速+MV  。
当然了也可以给MV乘上一个比例关系,在添加到运算里面。
从动轴转速=主轴转速+MV*@
  。

对于同一个PID系统:
当误差值在正方向不断增加的时候(10 20  30  50  60 ),PID的输出值是不是也会不断加大(10 20   60  ).

当误差值在负方向不断增加的时候(-10    -20     -30     -50    -60 ),PID的输出值是不是也会不断加大(-10     -20   -  60  ).
×××××××××××××××××××××
PID的输出值MV,如何转化为占空比,比如说,MV的值是13,那么对应的占空比是多少? 13%吗? 还是其他的什么。 另外占空比自身的时间需要设定为多少比较合适。是1S 还是2S, 还是说使用 PID的采样周期呢?
谢谢

float PID_Regulator(float Reference, float PresentFeedback, _pid *PID_Struct)
{
  float Error;
  float output;
  /* 偏差计算  */
  Error= (Reference - PresentFeedback);

  /* 积分计算  */
  if (PID_Struct->Ki == 0)
  {
    PID_Struct->Integral = 0;
  }
  else
  {
    PID_Struct->Integral += PID_Struct->Ki * Error;
    if (PID_Struct->Integral > PID_Struct->Upper_Limit_Integral)
    {
      PID_Struct->Integral = PID_Struct->Upper_Limit_Integral;
    }
    else if (PID_Struct->Integral Lower_Limit_Integral)
          {
            PID_Struct->Integral = PID_Struct->Lower_Limit_Integral;
          }
          else
          {         
          }
  }
  output= (PID_Struct->Kp * Error +
                     PID_Struct->Integral +
                   PID_Struct->Kd*(Error - PID_Struct->PreviousError) );
   
  PID_Struct->PreviousError = Error;    // store value
    if (output >= PID_Struct->Upper_Limit_Output)
      {
      return(PID_Struct->Upper_Limit_Output);                                                  
      }
    else if (output Lower_Limit_Output)
      {
      return(PID_Struct->Lower_Limit_Output);
      }
    else
      {
        return output;                
      }
}       
××××××××××××××××××××××××××××××××××
  output= (PID_Struct->Kp * Error +
                     PID_Struct->Integral +
                   PID_Struct->Kd*(Error - PID_Struct->PreviousError) );
输出= 误差*比例 +积分+微分(当前误差-上次误差)
××××××××××××××××××××
这个积分项 似乎没有和误差建立计算关系。

积分相那不和误差相关吗ki*偏差

PID是一个自动调节的过程,当误差越来越大时,输出值会越来越使输出减少。甚至输出可以为0或者负值(反转)
你不用管到底PID输出对应的是多少,先做一个小的实验理解下PID控制

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top