找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2451|回复: 1
打印 上一主题 下一主题
收起左侧

焊机PI调节程序,请大家看看有问题吗这样写

[复制链接]
跳转到指定楼层
楼主
ID:163950 发表于 2017-11-8 08:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
double ref = 0;     //设置参数 最大5V 对应512  1V对应102
double feb = 0;     //采样反馈 最大5V 对应512  1V对应102


int pwm_var = 0;    //PID调整量

int PWM_out = 0;    //PWM输出量
int index =0 ;
int abs (int j);   //绝对值函数定义

double Uo = 0;
double Ek = 0;        //定义当前偏差值
double Ek1 = 0; //定义上一次偏差值
double Ei = 0;
double Ed = 0;

#define Kp   0.4      //PID调节的比例常数
#define Ti   0.05     //PID调节的积分常数
#define Td   0.02     //PID调节的微分时间常数
#define T    0.02     //采样周期
#define A    0
//原0.02 0.005  0
#define Kpp  0.15//0.02//0.05//0.02//0.04//0.08//Kp * ( 1 + (T / Ti) + (Td / T) )        // 0.96
#define Ki   0.04//0.01/*0.01*//*0.005*///*(-Kp) * ( 1 + (2 * Td / T ) )        // -1.2        //0.02-0.024// 0.016
#define Kd   0 //0.01//0.02//0//0.002//0.01///*0*/*Kp * Td / T        //0.01对应-0.004                // 0.4        //0.025-0.01//
#define N 10
#define uint8 char


#define Emin 10          //误差的阀值即0.1V,避免误差较小时频繁调节引起震荡


#define Umax 180//8//6//25//100      //调整值上限,防止积分饱和
#define Umin 10//-8//-6//-25//-100 //调整值下限,防止积分饱和


#define Pmax  300//200//84           //输出值上限
#define Pmin  -100//75//10     //输出值下限
//----------------------PID执行程序---------------------------------------------

//-----------------------PID试行 ----------------------------------------------
void pid_ctrl(void)  
{ int index;
  Ek = ref - feb;      // 差值运算 误差=给定-反馈
    if( (Ek <= Emin)&&(Ek >=-10) )     // 误差的阀值小于10(即0.1V)
  {
    pwm_var = 0;                     // PID执行增量等于0 不加减

  }
   if( feb>Pmax  )     // 反馈值的阀值大于最大300 即3V
  {
    if(abs(Ek)>100)    // 误差绝对值大于100                  即1V
          {
         index=0;                   //取消积分环节
        }
        else                           //否则
        {                                  
         index=1;                   //加入积分环节
         if(Ek>0)                   //如果反馈值>0
         {
          Ei+=Ek;                   //积分项累积负值
         }
        }
  }
  else if( feb<Pmin)   //如果反馈值小于最小值-100         即-1V
        {
         if(abs(Ek)>80)   //如果误差绝对值>80            即0.8V
         {
         index=0;                   //取消积分环节
         }
         else                           //否则
         {
         index=1;                   //加入积分环节
         if(Ek<0)                   //如果误差值<0
          {
          Ei+=Ek;                   //累计负的积分值
          }
         }
        }
        else                             //否则
        {
          if(abs(Ek)>30)  //如果误差绝对值>200
          {
          index=0;                   //取消积分项
          }         else                    //否则
           {
           index=1;                   //加入积分项
           Ei+=Ek;                   //累计积分值
           }       
        }
    Uo = Kpp*Ek + Ki*Ei*index + Kd*(Ek-Ek1);    //PID增量计算
    Ek1= Ek;
    pwm_var = Uo*1.0;
        PWM_out =PWM_out+pwm_var;

  if(PWM_out > Umax ){PWM_out = Umax ;  }  //输出值最大限幅512   约5V
  if(PWM_out < Umin ){PWM_out = Umin ;  }  //输出最小限制
        CCAP1H=CCAP1L = 255- PWM_out;          //输出PWM暂空比 最大5V              


}  

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:581852 发表于 2019-7-10 19:12 来自手机 | 只看该作者
怎么联系你怎么联系你呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表