01 前言
前面完成了基于STM32F103C8T6+L298N+MG513P30直流电机的PWM控制和两种方法的编码器实时速度反馈,拿到这个反馈值后我们就可以使用经典的PID算法,对电机的转速进行准确的控制了,这篇文章主要分享PID基本原理和Keil5的PID编程。
(资料图片仅供参考)
02 PID的基本原理
PID算法是上个世纪30年代左右提出的控制算法,大至航空航天、小至家庭温度调控都可以使用PID算法,虽然PID算法从提出到现在已经历经了快一个世纪,其后也出现了很多现代的智能算法,比如蒙特卡洛、智能控制等等,但现在PID仍然经久不衰,可以说目前80%以上的控制仍然使用PID算法。
PID算法是自动控制原理课程学习的一部分,但在课程中老师讲解的是最基本的原理,没有任何拓展,更别提应用了,首先,先简单说一下PID控制算法的原理。
上图为PID算法的控制框图,在我们控制电机速度时,期望输入就是电机的期望速度值,期望输入与由编码器测得的实际速度作差,求出的误差值传给PID的控制部分,算出需要输出的控制信号,将该控制信号传给控制器,也就是输出给电机驱动板L298N,这样形成一个循环,就实现了对电机速度的精准控制。
中间PID的控制部分的连续型公式如下:
但是在计算机中计算机很难实现连续型变量的积分或者微分操作,因此在计算机中,我们使用离散型的积分和微分,就是取时间间隔T为1,离散型PID公式如下:
各个项的主要作用及效果如下:
P:增加快速性,过大会引起震荡和超调,P单独作用会一直有静态误差I:减少静态误差,过大会引起震荡D:减小超调,过大会使响应速度变慢在实际的应用中,有可能不需要PID同时使用,比如在速度控制中一般只使用PI控制就够了
03变式PID
PID算法有很多进化版本,分类别的简单阐述一下
增量式PID
在电机的速度PID控制算法中,因为我们一般使用PI算法就够了,所以我们可以使用增量式PID算法,这样可以让我们的公式和代码更加简洁。
积分限幅
因为积分的效果是累加,随着时间的推移,积分项的值会升到很高,积分本来的作用是用来减小静态误差,但积分项过大会引起过大的震荡,所以我们可以加一个判断函数if,当积分项的值达到一定值后,就让积分项保持这个值,避免引起更大的震荡。
积分分离
如果刚开始的误差比较大,那么积分项则会在刚开始就累计到了一个很大的数值,那么当第一次实际输出达到期望值时,不会立刻停止,而是会产生一个很大的过冲。这时就需要用到积分分离,就是当误差值过大时,我们就不使用积分项,只让PD项单独作用,当误差值较小后,再加入积分项,以减小静态误差。
04 Keil5程序
为了使用方便,我们先定一个PID结构体,结构体储存左右轮的PID参数、限幅值、误差等参数。
typedefstruct{//相关速度PID参数floatVelcity_Kp;floatVelcity_Ki;floatVelcity_Kd;floatUr;//限幅值u8PID_is_Enable;//PID使能intUn;//期望输出值intEn_1;//上一次的误差值intEn_2;//上上次的误差值intPWM;//输出PWM值}PID_InitDefStruct;
在程序初始化部分,定义一个初始化函数,对其中的参数进行初始化配置。
voidPID_Init(PID_InitDefStruct*p){p- >Velcity_Kp=5;p- >Velcity_Ki=0.5;p- >Velcity_Kd=0;p- >Ur=7100;p- >PID_is_Enable=1;p- >Un=0;p- >En_1=0;p- >En_2=0;p- >PWM=0;}
当编码器的定时器,每隔10ms反馈一次编码器测出的实际速度后,调用PID函数,求解输出给电机驱动板的PWM值,然后通过Set_Pwm函数进行设置,以此控制电机转速。
voidVelocity_PID(intTargetVelocity,intCurrentVelocity,PID_InitDefStruct*p){if(p- >PID_is_Enable==1){intEn=TargetVelocity-CurrentVelocity;//误差值p- >Un+=p- >Velcity_Kp*(En-p- >En_1)+p- >Velcity_Ki*En+p- >Velcity_Kd*(En-2*p- >En_1+p- >En_2);//增量式PIDp- >En_2=p- >En_1;p- >En_1=En;p- >PWM=p- >Un;/*输出限幅*/if(p- >PWM >p- >Ur)p- >PWM=p- >Ur;if(p- >PWM< -p- >Ur)p- >PWM=-p- >Ur;}else{PID_Init(p);}}
测试给电机输入理想转速为1500mm/s,随便设置了一组PI参数,得到实验结果如下:
可以通过上位机看一下波形,可以看到在稳定状态的静差是比较小的。
05 总结
对于PID算法这才是万里长征的第一步吧,想要调出完美的控制程序,还需要复杂的PID参数整定,这里可以配合上位机进行调试。
上一篇:维海德跌5.16% 上市即巅峰超募5.5亿方正证券保荐
下一篇:最后一页
X 关闭
X 关闭
中新网上海3月30日电 (记者 陈静)上海正面临常态化防控以来疫情形势最严峻复杂的挑战,单日新增阳性感染者数量不断刷新纪录。记者30
中新网3月30日电 据国家地震台网官方微博消息,中国地震台网正式测定:3月30日18时14分在新疆和田地区皮山县(北纬36 01度,东经77 89
上海市委常委会今天上午(3月30日)举行会议,听取当前疫情应急处置和核酸筛查相关工作汇报,研究部署下一步疫情防控重点工作。市委书记
(抗击新冠肺炎)江苏无锡一男子隐匿行程轨迹被警方立案侦查 中新网无锡3月30日电 (记者 孙权)3月30日,无锡市在“应检尽检”人员核
(抗击新冠肺炎)官方称吉林市疫情扩散势头得到遏制 中新网吉林3月30日电 (记者 石洪宇)记者30日从吉林市政府新闻办召开的疫情防控
中新网唐山3月30日电 (白云水 孟潮)3月30日,河北省唐山市召开新冠肺炎疫情防控工作新闻发布会通报称,3月29日0时至24时,唐山市新增
浙江省嘉兴市秀洲区新型冠状病毒感染肺炎疫情防控指挥部办公室发布通告: 3月30日上午,秀洲区发现1例新冠肺炎阳性感染者,该感染者
今天(3月30日)下午,新疆乌鲁木齐市人民政府新闻办公室召开疫情防控新闻发布会,通报乌鲁木齐市新冠肺炎疫情和疫情防控最新情况。会上
中新网天津3月30日电 (记者 王君妍)记者30日从天津市水务局获悉,为充分发挥河湖长制优势,近日,天津市将南水北调中线天津干线(天津
(抗击新冠肺炎)河北廊坊累计治愈出院673例 5县区恢复域内交通 中新网廊坊3月30日电 (宋敏涛 郭京泉)30日,河北省廊坊市召