VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 143|回复: 1

pid 输出问题

[复制链接]
91_avatar_middle
最佳答案
0 
在线会员 发表于 2020-10-18 12:41:33 | 显示全部楼层 |阅读模式
如题 为什么
  1. #include <stdio.h>
  2. #include <Windows.h>
  3. typedef struct
  4. {
  5.     float                kp;         //P
  6.     float                ki;         //I
  7.     float                kd;         //D
  8.     float                imax;       //积分限幅

  9.     float                out_p;  //KP输出
  10.     float                out_i;  //KI输出
  11.     float                out_d;  //KD输出
  12.     float                out;    //pid输出

  13.     float                integrator; //< 积分值
  14.     float                last_error; //< 上次误差
  15.     float                last_derivative;//< 上次误差与上上次误差之差
  16.     float                     last_t;     //< 上次时间
  17. }pid_param_t;




  18. float constrain_float(float amt, float low, float high)
  19. {
  20.         return ((amt)<(low)?(low):((amt)>(high)?(high):(amt)));
  21. }




  22. /*!
  23.   * @brief    pid参数初始化函数
  24.   *
  25.   * @param    无
  26.   *
  27.   * [url=home.php?mod=space&uid=440653]@return[/url]   无
  28.   *
  29.   * [url=home.php?mod=space&uid=20012]@note[/url]     无
  30.   *
  31.   * [url=home.php?mod=space&uid=405924]@see[/url]      无
  32.   *
  33.   * [url=home.php?mod=space&uid=488358]@date[/url]     2020/6/8
  34.   */
  35. void PidInit(pid_param_t * pid)
  36. {
  37.         pid->kp        = 0;
  38.         pid->ki        = 0;
  39.         pid->kd        = 0;
  40.         pid->imax      = 0;
  41.         pid->out_p     = 0;
  42.         pid->out_i     = 0;
  43.         pid->out_d     = 0;
  44.         pid->out       = 0;
  45.         pid->integrator= 0;
  46.         pid->last_error= 0;
  47.         pid->last_derivative   = 0;
  48.         pid->last_t    = 0;
  49. }


  50. /*!
  51.   * @brief    pid位置式控制器输出
  52.   *
  53.   * @param    pid     pid参数
  54.   * @param    error   pid输入误差
  55.   *
  56.   * @return   PID输出结果
  57.   *
  58.   * @note     无
  59.   *
  60.   * @see      无
  61.   *
  62.   * @date     2020/6/8
  63.   */
  64. float PidLocCtrl(pid_param_t * pid, float error)
  65. {
  66.         /* 累积误差 */
  67.         pid->integrator += error;

  68.         /* 误差限幅 */
  69.         constrain_float(pid->integrator, -pid->imax, pid->imax);

  70.         pid->last_error = error;
  71.         pid->out_p = pid->kp * error;
  72.         pid->out_i = pid->ki * pid->integrator;
  73.         pid->out_d = pid->kd * (error - pid->last_error);



  74.         pid->out = pid->out_p + pid->out_i + pid->out_d;

  75.         return pid->out;
  76. }




  77. int main ()
  78. {
  79.         pid_param_t pid1;
  80.         int T=100;  
  81.         PidInit(&pid1);
  82.         pid1.kp = 0.2;
  83.         pid1.ki = 0.1;
  84.        
  85.         PidLocCtrl(&pid1, 100);
  86.         while(pid1.out != 100)
  87.          {
  88.                  printf("pid1.out  %f\n",pid1.out);
  89.                 Sleep(T);//延时ms        
  90.          }
  91.        
  92. }
复制代码
该段代码的输出值 不变


  1. struct _pid{
  2.     float SetSpeed;           //定义设定值
  3.     float ActualSpeed;        //定义实际值
  4.     float err;               //定义偏差值
  5.     float err_last;           //定义上一个偏差值
  6.     float Kp,Ki,Kd;           //定义比例、积分、微分系数
  7.     float voltage;         //定义电压值(控制执行器的变量)
  8.     float integral;           //定义积分值
  9. }pid;
  10. void PID_init(){
  11.     printf("PID_init begin \n");
  12.     pid.SetSpeed=0.0;
  13.     pid.ActualSpeed=40.0;
  14.     pid.err=0.0;
  15.     pid.err_last=0.0;
  16.     pid.voltage=0.0;
  17.     pid.integral=0.0;
  18.     pid.Kp=0.2;
  19.     pid.Ki=0.1;
  20.     pid.Kd=0;
  21.     printf("PID_init end \n");
  22. }


  23. float PID_realize(float speed){
  24.     pid.SetSpeed=speed;
  25.     pid.err=pid.SetSpeed-pid.ActualSpeed;
  26.     pid.integral+=pid.err;
  27.     pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);
  28.     pid.err_last=pid.err;
  29.     pid.ActualSpeed=pid.voltage*1.0;
  30.     return pid.voltage;
  31. }

  32. int main(){
  33.     PID_init();
  34.     int count=0;
  35.     while(count<100)
  36.     {
  37.         float speed=PID_realize(200.0);
  38.         printf("%f\n",speed);
  39.         
  40.         count++;
  41.     }
  42. return 0;
  43. }
复制代码
而这段代码的输出呈现出了闭环控制啊




上一篇:软件操作问题
下一篇:为什么字符型指针和整形指针得到的结果不一样?
70_avatar_middle
最佳答案
23 
在线会员 发表于 2020-10-19 08:58:27 | 显示全部楼层
        while(pid1.out != 100)
         {
                 printf("pid1.out  %f\n",pid1.out);
                Sleep(T);//延时ms        
         }
建议巩固下基础知识
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-11-29 15:56

Powered by CcTry.CoM

© 2009-2020 cctry.com

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