实在是搞不懂,为什么PID 里OUTPUT总是趋向0-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4588|回复: 4

实在是搞不懂,为什么PID 里OUTPUT总是趋向0

[复制链接]
发表于 2016-4-15 19:16 | 显示全部楼层 |阅读模式
本帖最后由 pig881 于 2016-4-15 19:19 编辑

我的码盘是 20格的,Input 也是根据码盘测速来变化,speeds 测速代码大概是这样



#include <PID_v1.h>


int OUT1=2;
int OUT2=3;


volatile int scode = 0; //speed test
volatile int scode1 =0; // speed test


unsigned long oldtime = 0,newtime;
unsigned long oldtime1=0,newtime1;


float speeds,speeds1; // speeds Left , speeds1  Right





// PID 定义 在这里 ================并不华丽的分割线 ==========================


double Setpoint, Input, Output;


double  Kp=1, Ki=5, Kd=1;   //Kp=2, Ki=5, Kd=1;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);





volatile int scode = 0; //speed test

void setup() {
    attachInterrupt(digitalPinToInterrupt(OUT1),code,CHANGE);
    attachInterrupt(digitalPinToInterrupt(OUT2),code1,CHANGE);
    setMotor();
    Serial.begin(9600);


   //设置 PID 输入以及参数
  //  Input=speeds;
  //  Serial.print("Initial Input ");
  //  Serial.println(Input);
   
    Setpoint=75;  //貌似 这里要跟其中一个 马达实际输出 一致
     myPID.SetTunings(Kp,Ki,Kd);
     myPID.SetSampleTime(5);
      
      myPID.SetMode(AUTOMATIC);
}




void code() //interrputer
{
    scode = scode + 1;
}


void speedtest() {
    detachInterrupt(digitalPinToInterrupt(OUT1));
    oldtime = newtime;
    speeds = scode / 2;
    scode = 0;
    delay(1);
    attachInterrupt(digitalPinToInterrupt(OUT1), code, CHANGE);
}


void loop() {

newtime =newtime1= millis();
    if (newtime - oldtime > 1000) {
        Serial.println("begin test...");
        speedtest();
        speedtest1();
       // Setpoint=speeds1;         // 曾经把 Setpoint 放在这里,试图用另外一边轮子的速度作为标准 ,但是OUTPUT值不是趋向于0就是趋向于255
    }

   Input =speeds;
    myPID.Compute();

   Serial.print("OUTput= ");    Serial.println(Output);         // 每次输出都是趋向于0,最终变成0,然后不变了,短暂的一段时间会稳定在某个数字左右


    delay(500);

}

 楼主| 发表于 2016-4-16 09:02 | 显示全部楼层
开心咔咔 发表于 2016-4-15 23:04
pid默认输出是[0,255],你要改下,函数名忘记了,自己看下pid.h

if(ITerm > outMax) ITerm= outMax;
      else if(ITerm < outMin) ITerm= outMin;

改这里吗?我觉得没意义啊,因为无论改多少,都是两个极端值,而不是我期望的输出值
发表于 2016-4-15 23:04 | 显示全部楼层
pid默认输出是[0,255],你要改下,函数名忘记了,自己看下pid.h
发表于 2019-3-16 11:18 | 显示全部楼层
你的脉冲转换成轮子速度是怎样转换的
发表于 2019-3-16 11:19 | 显示全部楼层
你用的是直流电机吗
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 11:35 , Processed in 0.078857 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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