DEV C++实现简单PID控制算法

#include <stdio.h>
#include <math.h>

typedef struct {
	float kp, ki, kd;
	float error;
	float last_error;
	float sum_error;
	float tar;
	float now;
} PID;

/**
  * @brief  PID算法初始化函数,数值可根据自身需求进行调整
  * @param  PID类型结构体
  * @retval 无
  */
void pid_init(PID *pid) {
	pid->kp = 0.5;              //比例系数,根据实际情况调整
	pid->ki = 0.5;              //积分系数,根据实际情况调整
	pid->kd = 0.1;              //微分系数,根据实际情况调整
	pid->error = 0;             //当前偏差
	pid->last_error = 0;        //上一次的偏差
	pid->sum_error = 0;         //历史偏差总和,使用积分隔离效果更好
	pid->tar = 50;              //目标值
	pid->now = 0;               //当前值
}

/**
  * @brief  PID算法控制函数
  * @param  PID类型结构体,积分隔离标志
  * @retval 无
  */
void pid_control(PID *pid, bool ki_flag) {
	pid->error = pid->tar  - pid->now ;
	if (ki_flag)//积分隔离
		pid->sum_error += pid->error ;
	pid->now += pid->kp * pid->error + pid->ki * pid->sum_error + pid->kd * (pid->error - pid->last_error );
	pid->last_error = pid->error ;
}

int main() {
	bool ki_flag = 0;//积分隔离标志,避免一开始偏差太大导致需要更长时间调整
	float temp;//暂存目标值,一旦目标值改变了,做好积分隔离
	int j = 2;
	PID pid;
	pid_init(&pid);
	while (j--) {
		if (abs(pid.tar - temp) > pid.tar * 0.2)//达到积分隔离要求,进行积分隔离
			ki_flag = 0;
		temp = pid.tar ;
		for (int i = 0; i < 20; ++i) {
			pid_control(&pid, ki_flag);
			if (pid.error   < (pid.tar * 0.2))//脱离积分隔离要求,可以进行积分
				ki_flag = 1;
			printf("error = %f\n", pid.error );
			printf("sum_error = %f\n", pid.sum_error );
			printf("now = %f\n", pid.now );
			printf("tar = %f\n", pid.tar );
			printf("\n\n");
		}
		pid.tar += 70;//模拟目标值改变
	}
	return 0;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值