找回密码
 注册

QQ登录

只需一步,快速开始

搜索

增量式PID算法C++源码

[复制链接]
山海致远 发表于 2020-5-1 23:54:12 | 显示全部楼层 |阅读模式
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <Windows.h>

  5. //定义PID变量的结构体
  6. struct _pid
  7. {
  8.         float SetSpeed;
  9.         float ActualSpeed;
  10.         float err;
  11.         float err_last;        //定义上上个偏差
  12.         float err_next;       //定义上一个偏差值
  13.         float Kp,Ki,Kd;
  14.       
  15. }pid;

  16. //初始化变量
  17. void PID_init(void)
  18. {
  19.         printf ("pid_value_init_begin\n");

  20.         pid.ActualSpeed = 0.0;
  21.         pid.SetSpeed = 0.0;

  22.         pid.err = 0.0;
  23.         pid.err_last = 0.0;
  24.         pid. err_next = 0.0;
  25.       
  26.       
  27.         pid.Kp = 0.2;
  28.         pid.Ki = 0.015;
  29.         pid.Kd = 0.2;

  30.         printf("pid_init end \n");
  31. }

  32. //增量式算法
  33. float PID_calculate(float speed)
  34. {

  35.         pid.SetSpeed = speed;
  36.         pid.err = pid.SetSpeed - pid.ActualSpeed;
  37.       
  38.         float incrementSpeed = pid.Kp * (pid.err - pid.err_next) + pid.Ki * pid.err + pid.Kd * (pid.err - 2 * pid.err_next + pid.err_last);

  39.         pid.ActualSpeed += incrementSpeed;

  40.         pid.err_last = pid.err_next;     //定义上一个偏差值
  41.         pid.err_next = pid.err;

  42.         return pid.ActualSpeed;

  43. }




  44. int main(void)
  45. {
  46.         int setcount = 0;
  47.         printf ("Please begin \n");
  48.         PID_init();

  49.         while (setcount < 100)
  50.         {
  51.                 float speed = PID_calculate(250.0);
  52.                 printf ("value is %f\n",speed);
  53.                 setcount++;
  54.                 Sleep(300);
  55.         }
  56.         system("pause");
  57.         return 0;
  58. }
复制代码


您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-12-27 11:40

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表