1. 程式人生 > >Pid控制演算法-積分分離pid演算法C++實現

Pid控制演算法-積分分離pid演算法C++實現

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; }