鱼C论坛

 找回密码
 立即注册
查看: 886|回复: 2

[已解决]为什么这个 输出值不变

[复制链接]
发表于 2020-10-18 12:29:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <Windows.h>
typedef struct
{
    float                kp;         //P
    float                ki;         //I
    float                kd;         //D
    float                imax;       //积分限幅

    float                out_p;  //KP输出
    float                out_i;  //KI输出
    float                out_d;  //KD输出
    float                out;    //pid输出

    float                integrator; //< 积分值
    float                last_error; //< 上次误差
    float                last_derivative;//< 上次误差与上上次误差之差
    float                     last_t;     //< 上次时间
}pid_param_t;




float constrain_float(float amt, float low, float high)
{
        return ((amt)<(low)?(low):((amt)>(high)?(high):(amt)));
}




/*!
  * @brief    pid参数初始化函数
  *
  * @param    无
  *
  * @return   无
  *
  * @note     无
  *
  * @see      无
  *
  * @date     2020/6/8
  */
void PidInit(pid_param_t * pid)
{
        pid->kp        = 0;
        pid->ki        = 0;
        pid->kd        = 0;
        pid->imax      = 0;
        pid->out_p     = 0;
        pid->out_i     = 0;
        pid->out_d     = 0;
        pid->out       = 0;
        pid->integrator= 0;
        pid->last_error= 0;
        pid->last_derivative   = 0;
        pid->last_t    = 0;
}


/*!
  * @brief    pid位置式控制器输出
  *
  * @param    pid     pid参数
  * @param    error   pid输入误差
  *
  * @return   PID输出结果
  *
  * @note     无
  *
  * @see      无
  *
  * @date     2020/6/8
  */
float PidLocCtrl(pid_param_t * pid, float error)
{
        /* 累积误差 */
        pid->integrator += error;

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

        pid->last_error = error;
        pid->out_p = pid->kp * error;
        pid->out_i = pid->ki * pid->integrator;
        pid->out_d = pid->kd * (error - pid->last_error);



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

        return pid->out;
}




int main ()
{
        pid_param_t pid1; 
        int T=100;  
        PidInit(&pid1);
        pid1.kp = 0.2;
        pid1.ki = 0.1;
        
         PidLocCtrl(&pid1, 100);
         while(pid1.out != 100)
          {
                 printf("pid1.out  %f\n",pid1.out);
                Sleep(T);//延时ms         
         }
         
}
为什么 这段代码的输出值 恒不变
struct _pid{
    float SetSpeed;           //定义设定值
    float ActualSpeed;        //定义实际值
    float err;               //定义偏差值
    float err_last;           //定义上一个偏差值
    float Kp,Ki,Kd;           //定义比例、积分、微分系数
    float voltage;         //定义电压值(控制执行器的变量)
    float integral;           //定义积分值
}pid;
void PID_init(){
    printf("PID_init begin \n");
    pid.SetSpeed=0.0;
    pid.ActualSpeed=40.0;
    pid.err=0.0;
    pid.err_last=0.0;
    pid.voltage=0.0;
    pid.integral=0.0;
    pid.Kp=0.2;
    pid.Ki=0.1;
    pid.Kd=0;
    printf("PID_init end \n");
}


float PID_realize(float speed){
    pid.SetSpeed=speed;
    pid.err=pid.SetSpeed-pid.ActualSpeed;
    pid.integral+=pid.err;
    pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);
    pid.err_last=pid.err;
    pid.ActualSpeed=pid.voltage*1.0;
    return pid.voltage;
}

int main(){
    PID_init();
    int count=0;
    while(count<100)
    {
        float speed=PID_realize(200.0);
        printf("%f\n",speed);
        
        count++;
    }
return 0;
}
而这段输出值会变啊
最佳答案
2020-10-18 14:39:37
虽然不知道你要干嘛,但是,你上面的代码,while循环里面只有sleep()跟printf(),肯定不会有数值改变。你应该把需要的函数放到while里面。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-18 14:39:37 | 显示全部楼层    本楼为最佳答案   
虽然不知道你要干嘛,但是,你上面的代码,while循环里面只有sleep()跟printf(),肯定不会有数值改变。你应该把需要的函数放到while里面。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-18 15:25:29 | 显示全部楼层
这个题目我在某个论坛已经回复过了,怎么又拿到这里来了?

while(pid1.out != 100)
{
      printf("pid1.out  %f\n",pid1.out);
      Sleep(T);//延时ms        
}

pid1.out != 100 没有改变,因而进入死循环,输出30.000

while(count<100)
{
        float speed=PID_realize(200.0);
        printf("%f\n",speed);
        
        count++;
}

这里因为每循环一次,调用一次PID_realize(float speed)函数,同时count 就加1,所以,count < 100,在count自加到100时,退出循环,输出当然就会变啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 22:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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