位置式PID测试代码
位置式PID的测试demo
/*** @file pid.cpp* @author man, what can I say* @brief 位置式pid的测试文件* @version 0.1* @date 2024-10-17** @copyright Copyright (c) 2024**/#define MIN(X, Y) (X) < (Y) ? (X) : (Y)
#define MAX(X, Y) (X) > (Y) ? (X) : (Y)#include <stdio.h>
#include <unistd.h>struct pid_parameter
{float pid_1;float pid_2;float pid_3;float up;float ui; // 积分项float ud; // 微分项float min; // 限幅float max;float output;
};int set_pid_param(float pid_1, float pid_2, float pid_3, struct pid_parameter *ptr_pid_param)
{ptr_pid_param->pid_1 = pid_1;ptr_pid_param->pid_2 = pid_2;ptr_pid_param->pid_3 = pid_3;ptr_pid_param->up = 0.0;ptr_pid_param->ui = 0.0;ptr_pid_param->ud = 0.0;ptr_pid_param->min = -0.008333333; // 1/120ptr_pid_param->max = 0.008333333;ptr_pid_param->output = 0.0;return 0;
}int pid_calculate(float reference_value, float actual_value, struct pid_parameter *ptr_pid_param)
{float error = reference_value - actual_value;ptr_pid_param->up = ptr_pid_param->pid_1 * error;ptr_pid_param->ui = ptr_pid_param->pid_2 * error + ptr_pid_param->ui;ptr_pid_param->ud = ptr_pid_param->pid_3 * error - ptr_pid_param->ud;ptr_pid_param->output = ptr_pid_param->up + ptr_pid_param->ui + ptr_pid_param->ud;ptr_pid_param->ui = MAX(MIN(ptr_pid_param->ui, ptr_pid_param->max), ptr_pid_param->min);ptr_pid_param->ud = MAX(MIN(ptr_pid_param->ud, ptr_pid_param->max), ptr_pid_param->min);ptr_pid_param->output = MAX(MIN(ptr_pid_param->output, ptr_pid_param->max), ptr_pid_param->min);return 0;
}int main()
{float target = 100.0;float current = 10.0;struct pid_parameter pid_param;set_pid_param(0.5, 0.02, 0.0, &pid_param);while (1){pid_calculate(target, current, &pid_param);current = current + pid_param.output;printf("current : %f \n", current);fflush(stdout);usleep(2000);}return 0;
}
参考链接
【1】https://baijiahao.baidu.com/s?id=1788508113911352020&wfr=spider&for=pc
【2】pid控制器输出的量到底是什么? - 凸头匠的回答 - 知乎
https://www.zhihu.com/question/316306877/answer/1313013059