供你参考使用:
#define out_put 3//输出电压引脚驱动
double sensorinput; //
double Setpoint = 100.0; //设定液位值100mm
double Kp = 0.1, Ki = 0.7, Kd = 0.1; //pid参数
double Error; //偏差
double lastError1, lastError2; //上一时刻偏差,上两个时刻偏差
double out; //pid输出
int realout = 0; //第一时刻实际输出电压
void setup() {
Serial.begin(115200);
pinMode(out_put, OUTPUT);
}
void loop() {
int sensorinput = analogRead(A0); //0-1023
Error = (Setpoint - sensorinput); //偏差计算
out = Kp * (Error - lastError1) + Ki * Error + Kd * (Error - 2 * lastError1 + lastError2); // pid输出
realout = out; //实际输出
analogWrite(out_put, realout); //输出pwm波
Serial.print(realout); //串口打印 偏差值
Serial.print(" ");
Serial.println(sensorinput); //串口打印 偏差值
lastError2 = lastError1; //赋值,进入下一循环
lastError1 = Error;
delay(10);
} |