前言
本篇文章属于PID控制算法的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。
PID入门教程-电机控制 倒立摆 持续更新中_哔哩哔哩_bilibili
一、PID简介
二、PID公式与系统框图
三、详解PID中的各项
1.比例项
纯比例项控制时,系统会出现稳态误差
稳态误差介绍如下
例如电机控速的例子
当电机的误差变为0时,输出值也为0,电机驱动力也为0,电机就会因为摩檫力减速,减速后,误差加大,输出值变大,电机驱动力也变大,最终驱动力和摩擦力会达到一个平衡,此时的平衡速度是小于目标速度的。
2.积分项
误差累积来进行控制
3.微分项
作用是阻碍系统产生的变化,跟楞次定律有点像,加了微分项的控制与阻尼振动图像相似,因此也可以理解为微分项是给系统增加阻尼的,防止系统超调,超调的意思是假如实际值是从小于目标值的方向往目标值变,但实际值会因为惯性变到比目标值大,这时又要把实际值拉回来,拉回来又会小于目标值,最终会导致误差越来越大
四、离散PID 和程序实现思路
1.离散PID
位置式PID与增量式PID公式
比较
五、C语言程序实现
1.确定一个调控周期T,每隔时间T,程序执行一次调控(使用定时器来确定这个时间)
2.代入公式
float Target,Autual,Out;
float Kp = ,Ki = ,Kd = ;
float Error0,Error1,ErrorInt;
int main(void)
{
Timer_Init();
while (1)
{
}
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITstatus(TIM2,TIM_IT_Update)= SET)
{
Actual=读取传感器();
/*获取本次误差和上次误差*/
Error1 = Error0;
Error0 =Target -Actual;
/*误差积分(累加)*/
ErrorInt += Error0;
/*PID计算*/
Out =Kp*Error0 +Ki *ErrorInt + Kd *(Error0 - Error1);
/*输出限幅*/
if(out >上限){out=上限;}
if(out<下限){out=下限;)
/*执行控制*/
输出至被控对象(out);
TIM_ClearITPendingBit(TIM2,TIM IT_Update);
}
}