[经验分享] PID控制算法的C语言实现

[复制链接]
 楼主| mnynt121 发表于 2023-10-22 23:07 | 显示全部楼层 |阅读模式
  1. 第一步:定义PID变量结构体,代码如下:

  2. struct _pid{
  3.    
  4.     float SetSpeed;            //定义设定值
  5.     float ActualSpeed;        //定义实际值
  6.     float err;                //定义偏差值
  7.     float err_last;            //定义上一个偏差值
  8.     float Kp,Ki,Kd;            //定义比例、积分、微分系数
  9.     float voltage;          //定义电压值(控制执行器的变量)
  10.     float integral;            //定义积分值
  11. }pid;
  12. 复制
  13. 控制算法中所需要用到的参数在一个结构体中统一定义,方便后面的使用。
  14. 第二部:初始化变量,代码如下:

  15. void PID_init(){
  16.    
  17.     printf("PID_init begin \n");
  18.     pid.SetSpeed=0.0;
  19.     pid.ActualSpeed=0.0;
  20.     pid.err=0.0;
  21.     pid.err_last=0.0;
  22.     pid.voltage=0.0;
  23.     pid.integral=0.0;
  24.     pid.Kp=0.2;
  25.     pid.Ki=0.015;
  26.     pid.Kd=0.2;
  27.     printf("PID_init end \n");
  28. }
  29. 复制
  30. 统一初始化变量,尤其是Kp,Ki,Kd三个参数,调试过程当中,对于要求的控制效果,可以通过调节这三个量直接进行调节。
  31. 第三步:编写控制算法,代码如下:

  32. float PID_realize(float speed){
  33.    
  34.     pid.SetSpeed=speed;
  35.     pid.err=pid.SetSpeed-pid.ActualSpeed;
  36.     pid.integral+=pid.err;
  37.     pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);
  38.     pid.err_last=pid.err;
  39.     pid.ActualSpeed=pid.voltage*1.0;
  40.     return pid.ActualSpeed;
  41. }
  42. 复制
  43. 注意:这里用了最基本的算法实现形式,没有考虑死区问题,没有设定上下限,只是对公式的一种直接的实现,后面的介绍当中还会逐渐的对此改进。
  44. 到此为止,PID的基本实现部分就初步完成了。下面是测试代码:

  45. int main(){
  46.    
  47.     printf("System begin \n");
  48.     PID_init();
  49.     int count=0;
  50.     while(count<1000)
  51.     {
  52.    
  53.         float speed=PID_realize(200.0);
  54.         printf("%f\n",speed);
  55.         count++;
  56.     }
  57. return 0;
  58. }


cemaj 发表于 2023-11-5 14:45 | 显示全部楼层
代码结构需要清晰、简洁、易读、易懂。建议采用模块化编程方式,将代码分成多个函数或模块,以提高代码的可读性和维护性。
zerorobert 发表于 2023-11-5 15:28 | 显示全部楼层
在C语言中,变量的类型决定了其所能表示的数值范围和精度
juliestephen 发表于 2023-11-5 16:58 | 显示全部楼层
实现PID控制算法时,需要设置一个控制循环。在循环中,不断计算误差、速度和加速度,并根据这些值调整控制输出。
modesty3jonah 发表于 2023-11-5 17:39 | 显示全部楼层
在实现PID控制算法时,需要编写清晰、简洁的代码,提高代码的可读性和可维护性。这有助于其他开发者理解和维护PID控制算法的实现。
timfordlare 发表于 2023-11-5 18:12 | 显示全部楼层
在实现PID控制算法时,需要提供一种机制来允许用户或系统根据实际运行情况进行参数调整和优化。
jonas222 发表于 2023-11-5 20:24 | 显示全部楼层
在实际应用中,系统可能会受到各种干扰因素的影响,如负载变化、传感器噪声等
primojones 发表于 2023-11-5 21:00 | 显示全部楼层
PID控制算法需要三个参数,即比例(P)、积分(I)和微分(D)系数。这些参数需要根据具体应用进行调整和优化
updownq 发表于 2023-11-5 21:27 | 显示全部楼层
函数参数是通过值传递的方式进行的,也就是说,当函数被调用时,实参的值会被复制一份传递给形参,然后在函数内部对形参进行处理。
cashrwood 发表于 2023-11-5 21:55 | 显示全部楼层
PID控制算法需要较高的计算精度,因此在进行代码实现时,需要注意对输入参数和计算结果的精度控制,避免出现误差和偏差。
biechedan 发表于 2023-11-5 22:17 | 显示全部楼层
实现PID控制算法后,需要进行充分的测试和调试。
primojones 发表于 2023-11-6 19:56 | 显示全部楼层
在PID控制算法中,积分环节可能导致积分饱和。为避免积分饱和,可以采用抗积分饱和算法,如对积分环节进行限幅或采用增量式PID算法。
olivem55arlowe 发表于 2023-11-6 22:14 | 显示全部楼层
在实现PID控制算法时,需要注意代码的可读性和可维护性
minzisc 发表于 2023-11-7 17:42 | 显示全部楼层
PID控制器涉及到一系列数学计算,如比例、积分和微分等。
modesty3jonah 发表于 2023-11-7 19:06 | 显示全部楼层
由于PID控制器的输出范围通常较小,因此在计算控制量时需要注意防止溢出问题的发生。
robincotton 发表于 2023-11-7 20:14 | 显示全部楼层
PID控制算法的参数(Kp、Ki、Kd)需要根据实际情况进行调整,以达到最佳的控制效果。在代码实现中,需要提供参数调整的功能,以便根据实际情况进行调整
hilahope 发表于 2023-11-7 20:54 | 显示全部楼层
在实现PID控制算法之前,需要明确所需的参数。
pmp 发表于 2023-11-7 22:15 | 显示全部楼层
在某些情况下,可能需要通过中断服务的方式来实时地更新反馈值,然后根据反馈值和目标值来计算控制量。在实现中断服务时,需要注意中断函数的编写,以及中断向量的配置。
cemaj 发表于 2023-11-8 13:10 | 显示全部楼层
PID控制算法的实现涉及浮点数运算,因此需要选择合适的变量类型。通常使用浮点型(float)或双精度浮点型(double)来存储和计算误差、速度和加速度等。
mmbs 发表于 2023-11-8 13:55 | 显示全部楼层
需要处理输入输出数据,包括设定值、反馈值、控制输出等。在代码实现中,需要确保输入输出的正确性和稳定性,避免出现数据丢失或异常情况。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

3322

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部