位置型PID增量型PID调节直流电机

位置型PID增量PID调节直流电机

一、思路
无论是位置型还增量型的PID都是为了调节PWM波,使电机的转速达到设定值。这次实验目的主要是实现用机智云app控制电机并使电机的转速达到设定值后保持稳定。
二、实现过程

  1. 材料:正点原子stmf4探索板及其配套的esp8266、0~6v直流电机、L9110s芯片的驱动模块,对射光计数芯片。
  2. 接下来要实现一个闭环的,主要的思路是将,通过计数器的算成对应的速度,通过pid公式调节,反馈回去,调节PWM波自至速度达到设定值。
  3. 我是通过TIM4_CH1输出PWM波,控制电机转速;通过短时间定时器和对射管计数器传过来的信号,高低电平来测量速度的。
  4. 这是我的pid笔记
PID算法重要知识点:一种可以自我调节,稳定输出,实现实际值十分接近设定值的方法。
一、类型
(1).位置型pid
实现的步骤:
	1.建立一个结构体其中包括:
          比例系数(Kp)Proportion,
          积分系数(Ki)Integral,
          微分系数(Kd)Derivative,
          当前误差current_error,
          上次误差S_error,
          累计误差Sum_error,
          设定目标SetValue
          实际数值actualValue

        2.位置型PID的公式:increment=(Pid->Kp)*(Pid->error)+(Pid->Ki)*(Pid
                            ->SUM_error)+(Pid->Kd)*(Pid->error-Pid->S_error);

	3.初始化函数,调整函数:
          /*------------------------------------------
           函数功能:位置型pid参数初始化min~max
           函数说明:			
          ------------------------------------------*/
           void PositionPid_Init(PID Pid)
          {
              Pid->Kp=0.8;
              Pid->Ki=0.1;   
              Pid->Kd=0.1;
	      Pid->error=0.0;
              Pid->S_error=0.0;
              Pid->SUM_error=0.0;
              Pid->actualvalue=0.0;
              Pid->setvalue=0.0;
          }
          /*------------------------------------------
   	   函数功能:位置型PID调整
	   函数说明:利用本次误差和上次误差进行反馈调节		
	  ------------------------------------------*/
	   float PositionPid_adjust(PID Pid,float setpoint)
	  {
 	     float increment;
	     Pid->setvalue=setpoint;
	     Pid->error=setpoint-Pid->actualvalue;
             Pid->SUM_error+=Pid->error; 
	     /*采用的是位置型pid*/
             increment=(Pid->Kp)*(Pid->error)+(Pid->Ki)*(Pid->SUM_error)+(Pid->Kd)*             (Pid->error-Pid->S_error);//这个是位置式PID的灵魂
              Pid->S_error=Pid->error;
             return (318-increment);//这里318是根据实际需要增加的。
           }
          

        4.思路及要点:位置型PID首先要解决的问题是闭环反馈的事,就是要有测量反馈给单片                      机结构体变量Pid->actualvalue,然后在调整中会根据不断更新的实际值,带入公式进行不断调节,以达到目标。

(2)增量型PID
        1.建立结构体
          /*------------------------------------------
 	   结构体说明:这是位置式、增量式PID的结构体,包括基本的
						PID调节参数.
	  ------------------------------------------*/
	  typedef struct node
	 {
 	  /*1.比例系数Kp 2.积分系数Ki 3.微分系数Kd
  	  4.本次的误差error 5.上次的误差S_error
  	  6.用于积分的误差和SUM_error
  	  7.设定的值setvalue 8.实际的值actualvalue
 	 */
	/*下没有特别说明就代表是共同变量*/
 	  float Kp;
 	  float Ki;
 	  float Kd;
	  float error;
          float S_error;
          float SS_error;   //上上次误差,增量型PID需要 
          float SUM_error; //累计误差,位置型PID需要
          float setvalue;
          float actualvalue;
	  }PIDN,*PID;
        2.初始化函数 ,调整函数:
 /*------------------------------------------
 函数功能:增量型PID初始化
 函数说明:			
------------------------------------------*/
void IncrementPid_Init(PID Pid)
{
	  
    Pid->Kp=0.1;
    Pid->Ki=0.85;
    Pid->Kd=0.15;
    Pid->error=0.0;
    Pid->S_error=0.0;
    Pid->SS_error=0.0;
    Pid->actualvalue=0.0;
    Pid->setvalue=0.0;
}
/*------------------------------------------
 函数功能:增量型PID调整
 函数说明:			
------------------------------------------*/
float IncrementPid_adjust(PID Pid,float setpoint)
{
   float increment;
   float fanhuizhi;
   Pid->setvalue=setpoint;
   Pid->error=setpoint-Pid->actualvalue;
   increment=(Pid->Kp)*((Pid->error)-(Pid->S_error))+(Pid->Ki)*(Pid->error)*i+(Pid->Kd)*(Pid->error-2*Pid->S_error+Pid->SS_error);//这个是增量式PID的灵魂
   adjust_shuzhi-=increment;//根据实际应用的时候adjust_shuzhi的值太大了,所以有点像下降型pid调节。
   Pid->SS_error=Pid->S_error;
   Pid->S_error=Pid->error;
}
一、实际使用PID的经验
    a.有些变量只能初始化一次,注意看
    b.对于直流电机调速的结果看,增量型越接近越慢
    c.实际值->公式-> =? 设定值,否则返回。
    d.在调节pid参数的时候,最好设置一个些printf用观察数字的变化。












4.这是我参考的pid算法的资料:
链接:https://pan.baidu.com/s/1bYmddMa1DavPCMzIDd9E1g
提取码:5lga
四、总结:首先声明我这里并没有将我这个项目的所有的资料,只是将其中对pid的资料及相关思路写了下来。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章