位置型PID增量PID调节直流电机
一、思路:
无论是位置型还增量型的PID都是为了调节PWM波,使电机的转速达到设定值。这次实验目的主要是实现用机智云app控制电机并使电机的转速达到设定值后保持稳定。
二、实现过程:
- 材料:正点原子stmf4探索板及其配套的esp8266、0~6v直流电机、L9110s芯片的驱动模块,对射光计数芯片。
- 接下来要实现一个闭环的,主要的思路是将,通过计数器的算成对应的速度,通过pid公式调节,反馈回去,调节PWM波自至速度达到设定值。
- 我是通过TIM4_CH1输出PWM波,控制电机转速;通过短时间定时器和对射管计数器传过来的信号,高低电平来测量速度的。
- 这是我的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的资料及相关思路写了下来。