📄 pid1.txt
字号:
// 闭环控制算法
// 功能:
// 输入:*p PID控制结构体
// 输出:电机控制输出值——PWM波脉冲宽度
int count=0;
unsigned int speed_PID_Calc( struct PID *p )
{
int ek;
int tmpValue = p->ControlValue;
int deltaValue = 0;
ek = p->Reference - p->FeedBack; // 本次误差 = 参考值 - 反馈值
//将PID公式离散化后,采用增量式PID控制,更新电机控制输出值
// 遇限削弱积分法,如果进入饱和区,并且积分增加,则不进行积分运算,尽快离开饱和。
// 增量的范围(0~10)*(1+10+10)*256=53760)线性转换为(0~550),移位数, 在4~7之间为好
if ( ( p->ControlValue >=550 && ek>0 ) || ( p->ControlValue <= 0 && ek<0 ))
//进入饱和区则不再进行积分运算
deltaValue = ((int)( p->Ka * ((ek - p->ek_1) + p->Kc * ( (ek - p->ek_1) - (p->ek_1 - p->ek_2) ))))>>5 ;
else//不在饱和区,则按正常离散的PID公式计算
deltaValue = ((int)( p->Ka * ((ek - p->ek_1) + p->Kb * ek + p->Kc * ( (ek - p->ek_1) - (p->ek_1 - p->ek_2) ))))>>5 ;
// 更新前两次误差
p->ek_2 = p->ek_1;
p->ek_1 = ek;
tmpValue = p->ControlValue + deltaValue;
// 返回值
if ( tmpValue >= 551 )
return 550;
else
if ( tmpValue <= 0 )
return 1;
else return tmpValue;
}
主要原理是上面的,如果需要和实际应用结合起来,那就依据所留I/O口进行适当的修改参数。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -