简易PID_

本文详细介绍了一种PID控制器的参数设置与实现方法,通过具体的代码示例,展示了如何初始化PID控制器并进行实时的速度控制。文章深入探讨了比例(P)、积分(I)、微分(D)三个关键参数的作用及调整策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pid.Kp=0.2;  
   pid.Ki=0.04; 
     pid.Kd=0.2;  //初始化过程  
  if(abs(pid.err)>200)
     {    
  index=0;
     }
else
{     
index=1;  
    pid.integral+=pid.err; 
    }  
  pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last); 

#include<stdio.h>
 #include<stdlib.h>  
 struct _pid
{      
float SetSpeed;           //定义设定值     
float ActualSpeed;        //定义实际值     
float err;                //定义偏差值      
float err_next;            //定义上一个偏差值     
float err_last;            //定义最上前的偏差值      
float Kp,Ki,Kd;            //定义比例、积分、微分系数 
}pid;   
void PID_init()
{   
   pid.SetSpeed=0.0;   
  pid.ActualSpeed=0.0;   
  pid.err=0.0;    
  pid.err_last=0.0;  
   pid.err_next=0.0;   
  pid.Kp=0.2; 
    pid.Ki=0.015;  
   pid.Kd=0.2;
 }


float PID_realize(float speed)
{  
   pid.SetSpeed=speed;    
  pid.err=pid.SetSpeed-pid.ActualSpeed; 
    float  incrementSpeed=pid.Kp*(pid.err-pid.err_next)+pid.Ki*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last);  
   pid.ActualSpeed+=incrementSpeed;   
  pid.err_last=pid.err_next;  
   pid.err_next=pid.err;  
   return pid.ActualSpeed;
 }


  int main()
{    
  PID_init();     
int count=0;     
 while(count<1000)  
   {       
   float speed=PID_realize(200.0);    
     printf("%f\n",speed);    
     count++;   
  }      
return 0;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值