Pid控制演算法-積分分離pid演算法C++實現
阿新 • • 發佈:2019-02-01
pid.h:
#ifndef _PID_H_
#define _PID_H_
typedef struct _pid{
float SetSpeed;
float ActualSpeed;
float err;
float err_last;
float Kp, Ki, Kd;
float voltage;
float integral;
float umax;
float umin;
}Pid;
class Pid_control
{
public:
void PID_init();
float PID_realize(float speed);
private:
int index;
Pid pid;
};
#endif
pid.cpp:
#include <iostream>
#include "pid.h"
using namespace std;
void Pid_control::PID_init()
{
pid.SetSpeed = 0.0;
pid.ActualSpeed = 0.0;
pid.err = 0.0;
pid.err_last = 0.0;
pid.voltage = 0.0;
pid.integral = 0.0;
pid.Kp = 0.2;
pid.Ki = 0.04;
pid.Kd = 0.2;
pid.umax = 400;
pid.umin = -200;
}
float Pid_control::PID_realize(float speed){
int index;
pid.SetSpeed = speed;
pid.err = pid.SetSpeed - pid.ActualSpeed;
if (pid.ActualSpeed>pid.umax)
{
if (abs(pid.err)>200)
{
index = 0;
}
else
{
index = 1;
pid.integral += pid.err;
}
pid.voltage = pid.Kp*pid.err + index*pid.Ki*pid.integral + pid.Kd*(pid.err - pid.err_last);
}
else if (pid.ActualSpeed<pid.umin){
if (abs(pid.err)>200)
{
index = 0;
}
else{
index = 1;
if (pid.err>0)
{
pid.integral += pid.err;
}
}
}
else{
if (abs(pid.err)>200)
{
index = 0;
}
else{
index = 1;
pid.integral += pid.err;
}
}
pid.voltage = pid.Kp*pid.err + index*pid.Ki*pid.integral + pid.Kd*(pid.err - pid.err_last);
pid.err_last = pid.err;
pid.ActualSpeed = pid.voltage*1.0;
return pid.ActualSpeed;
}
main.cpp
#include "pid.h"
#include <iostream>
using namespace std;
int main()
{
Pid_control Pid;
Pid.PID_init();
int count = 0;
while (count<1000)
{
float speed = Pid.PID_realize(200.0);
cout << speed << ";" << " ";
count++;
}
cout << endl;
system("pause");
return 0;
}