实在是搞不懂,为什么PID 里OUTPUT总是趋向0
本帖最后由 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 , speeds1Right
// PID 定义 在这里 ================并不华丽的分割线 ==========================
double Setpoint, Input, Output;
doubleKp=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-15 23:04
pid默认输出是,你要改下,函数名忘记了,自己看下pid.h
if(ITerm > outMax) ITerm= outMax;
else if(ITerm < outMin) ITerm= outMin;
改这里吗?我觉得没意义啊,因为无论改多少,都是两个极端值,而不是我期望的输出值 pid默认输出是,你要改下,函数名忘记了,自己看下pid.h 你的脉冲转换成轮子速度是怎样转换的 你用的是直流电机吗
页:
[1]