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- >pwmur)p- >pwm=-p- >ur;}else{pid_init(p);}}测试给电机输入理想转速为1500mm/s,随便设置了一组pi参数,得到实验结果如下:
可以通过上位机看一下波形,可以看到在稳定状态的静差是比较小的。
05 总结
对于pid算法这才是万里长征的第一步吧,想要调出完美的控制程序,还需要复杂的pid参数整定,这里可以配合上位机进行调试。
计算机房机房温湿度监控要怎么样选择传感器?
艾迈斯半导体推出先进的光谱ALS传感器,旨在帮助下一代智能手机摄像头获得更出色的性能
日立分析仪器EA1280X射线荧光分析仪产品介绍
小米11怎么样值得买吗
家电市场呈现智能化趋势 未来竞争将更加激烈
STM32F103C8T6实现直流电机速度PID控制
音乐爱好者首选这款MiniLED电视的音质绝对让你意想不到
GSA对全球370个专用移动网络进行了分类,包括涉及5G的120多个项目
openharmony不支持安卓
iPhone 12 Pro Max将在相机背面配备三个传感器和一个LiDAR传感器
Python协程与JavaScript协程的对比及经验技巧
Creaform形创HandySCAN MAX l Elite三维扫描仪便携式3D测量解决方案
三星可卷曲屏幕再爆黑科技:搭载类似3D Touch重力按压技术
PCB设计之电气(Electrical)规则设置
SD-WAN对您的物联网发展至关重要的3个原因
三星Note8再放大招!三星Note8将搭载双摄,支持三倍光学变焦!
LED驱动电源技术发展趋势解读
旭日x3派首百尝鲜——无线串口通信控制舵机
三星黑科技智能电子锁,让您告别钥匙烦恼
CMOS图像传感器简介