本帖最后由 pig881 于 2016-4-18 11:05 编辑
我把 Arduino 官方的 PID_V1.h 库 的 Basic 代码 稍微改动了一下:
#include <PID_v1.h>
#define PIN_INPUT 0
#define PIN_OUTPUT 3
//Define Variables we'll be connecting to
double Setpoint, Input, Output, Result;
//Specify the links and initial tuning parameters
double Kp=1, Ki=0, Kd=0.22;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
void setup()
{ Serial.begin(9600);
//initialize the variables we're linked to
Input = analogRead(PIN_INPUT);
Input=map(Input,0,1023,0,254);
Setpoint = 100; // 我希望的 最终输出值 维持在100
myPID.SetOutputLimits(-255,255); //加入这一句试试看
//turn the PID on
myPID.SetMode(AUTOMATIC);
}
void loop()
{
Input = analogRead(PIN_INPUT); // 输入是由 一个 电位器 来控制
Input=map(Input,0,1023,0,254); // 把输入值映射一下
myPID.Compute();
analogWrite(PIN_OUTPUT, Input+Output);
Serial.print(Input);
Serial.print(",");
Serial.print(Output);
Serial.print(",");
Serial.print(Output+ Input); // 我觉得输出的最终结果就是 对 Input 进行补偿
Serial.print("\n");
delay(500);
}
Serial chart 图: 这里我用 电位器 手动 调整 变化大小来作为输入 Input
图中 Input 值是 绿色线,Output 是 红色线, 输出的最终结果 是蓝色线
不手动调节电位器 也会有波动,如下图:
我也不知道是不是就是这个效果, 好像 如果 输入变化比较大,那么最终结果也会有一段时间变化比较大,是不是要加入 delay 来消除变化输出呢
|