PID控制学习代码(三)

本篇博客主要介绍PID控制的C++语言实现。

位置型PID控制代码实现:

#include<iostream>
using namespace std;
//PID各项参数的变量结构体

struct _pid {
	float SetSpeed;//输入变量,即期望输出的变量值
	float ActualSpeed;//实际输出变量,即采样回来的输出变量
	float Err; //误差值
	float Err_last;//上一次误差值
	float Kp, Ki, Kd;//比例 积分 微分系数
	float Voltage;//定义电压值,最后的输出都要转化为电压来控制
	float Integral; //积分值
} pid;

//PID控制的初始化函数
//初始化完成后主要对Kp、Ki、Kd不断地调节来优化控制效果
void PID_Init() {
	cout << "PID_Init begin!" << endl;

	pid.SetSpeed = 0;
	pid.ActualSpeed = 0;
	pid.Err = 0;
	pid.Err_last = 0;
	pid.Kp = 0.2;
	pid.Ki = 0.015;
	pid.Kd = 0.2;
	pid.Voltage = 0;
	pid.Integral = 0;

	cout << "PID_Init end!" << endl;
}

/*
PID控制的计算函数
功能:PID控制
Speed 要设定的输出变量的值
返回值调节后实际输出的值
*/ 
float PID_Cal(float Speed)
{
	pid.SetSpeed = Speed;
	pid.Err = pid.SetSpeed - pid.ActualSpeed;//误差的计算,即比例控制
	pid.Integral += pid.Err;//误差相加,即积分控制
	pid.Voltage = pid.Kp * pid.Err + pid.Ki * pid.Integral + pid.Kd *
		(pid.Err - pid.Err_last);//根据位置型PID控制的公式
	pid.Err_last = pid.Err;
	pid.ActualSpeed = pid.Voltage * 1.0; //转换
	return pid.ActualSpeed;//PID控制后的实际输出值
}

//main函数
int main() {

	int count = 0;
	cout << "SYSTEM BEGIN!" << endl;
	PID_Init();
	while (count < 1000)//执行1000次PID控制,并输出每一次控制的值
	{
		float speed = PID_Cal(200.0);
		cout << "-" << count << "-" << speed << "-" << endl;
		count++;
	}
	return 0;
}

 

输出结果:

增量型PID控制代码实现:

#include<iostream>
using namespace std;

//PID 各项参数的结构体
struct _pid {
	float SetSpeed;//输入变量,即期望输出的变量值
	float ActualSpeed;//实际输出变量,即采样回来的输出变量
	float Err; //误差值
	float Err_last;//上一次误差值
	float Err_Next;//下一次误差值
	float Kp, Ki, Kd;//比例 积分 微分系数
} pid;

//各项参数的初始化函数
void PID_Init()
{
	cout << "PID_Init begin!" << endl;
	pid.SetSpeed = 0;
	pid.ActualSpeed = 0;
	pid.Err = 0;
	pid.Err_last = 0;
	pid.Err_Next = 0;
	pid.Kp = 0.2;
	pid.Ki = 0.015;
	pid.Kd = 0.2;
	cout << "PID_Init end!" << endl;
}

//PID算法的计算函数
float PID_Calc(float speed) {
	float incrementSpeed;
	pid.SetSpeed = speed;
	pid.Err = pid.SetSpeed - pid.ActualSpeed;
	incrementSpeed = pid.Kp*(pid.Err - pid.Err_Next) + pid.Ki*pid.Err +
		pid.Kd * (pid.Err - 2 * pid.Err_Next + pid.Err_last);
	pid.ActualSpeed += incrementSpeed;
	pid.Err_last = pid.Err_Next;
	pid.Err_Next = pid.Err;
	return pid.ActualSpeed;
}

//main函数
int main() {
	int count = 0;
	cout << "SYSTEM BEGIN!" << endl;
	PID_Init();
	while (count < 1000) {
		float speed = PID_Calc(200.0);
		cout << "-" << count << "-" << speed << "-" << endl;
		count++;
	}
	return 0;
}

输出结果:

猜你喜欢

转载自blog.csdn.net/github_39611196/article/details/81163694