【分享】增量式PID的stm32实现,整定过程

2019-12-11 18:19发布

本帖最后由 tim4146 于 2014-4-6 08:32 编辑

感谢大家最近的帮忙,让我顺利做完增量PID功能,虽然PID不是什么牛逼的东西,但是真心希望以后刚刚接触这块的人能尽快进入状态。
也下面我分享一下近期的这些工作吧。欢迎大家批评指点~

首先说说增量式PID的公式,这个关系到MCU算法公式的书写,实际上两个公式的写法是同一个公式变换来得,不同的是系数的差异。
资料上比较多的是:
A0006DS_副本.jpg (30.87 KB, 下载次数: 37) 下载附件 2014-4-6 00:27 上传
最后欢迎大家拍砖,有批评才会让我更加进步!
最后把PID文件放上来
pid.zip (2.88 KB, 下载次数: 1587) 2014-4-6 08:28 上传 点击文件名下载附件
.C .H


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
99条回答
tim4146
2019-12-14 03:28
aming2046 发表于 2014-4-7 08:25
大哥能详细分析下这句吗? pwm3=PID3.sum_error*4.6875 ;   //将要输出PWM的占空比,他的pid输出与pwm是怎 ...

电机反馈信号的频率f 和电机是成正比的,也就是说,我如果需要电机转速 w=2pi rad/s的话,我对应的捕获频率是电机在这个转速时光电编码器反馈波形的频率大小。所以我PID计算的其实是以这个频率为标准的调整量,PID的设定值也是频率,增量计算的也是频率,当然你用转速 w 和PWM占空比 a 做PID的计算也是可行的,只要找到 转速=(系数1)*频率=(系数2)*占空比 这个关系里面的系数就行。
我来说说这个4.6875怎么来的吧,这里我把占空比看成“占空量”(占空比:在一串理想的脉冲周期序列中(如方波),正脉冲的持续时间与脉冲总周期的比值。),如果PWM周期是1000份,高电平是300份,那我的占空量就是300,在STM32里面这个占空量是可以直接作为参数设定给定时器的,用的函数就是setcompare(),你自己查一下历程看看。
好,我的电机的最大转速是2rps,也就是一秒2圈,我的编码器这个时候的反馈频率应该是1536(查看编码器的参数),这个时候占空比需要100%,也就是1000的占空量。电机不转呢,反馈频率就是0,占空量就是0。
简单的就是占空量对应0频率,1000占空量对应1536频率。得到 占空量=0.651*频率。
那我程序是4.6875呢?我继续说!
例程里面关于PWM波形输出的TIM3的初始化是:TIM3_PWM_Init(1000-1,72-1);
这样就是72分频,定时器频率变成1M,对应成1 us计算很方便。1000是指PWM波形的周期是1000,这里正好是1000us(注意:这里1000这个参数越大,说明占空比的分辨率越高,但是在定时器频率不变的前提下,pwm周期越大,输出PWM的频率就越小)。但是这样的参数下,PWM的频率只有1K,电机产出明显的噪音,经过调试,电机在10K的频率下控制的效果比较好。也就是说我要凑个10Kpwm输出,但是pwm周期不能太小,咱要保证控制精度啊。
所以通过计算:TIM3_PWM_Init(7200-1,1-1);//定时器72M运行,周期7200份,电机频率正好是10K
好了这里的7200放到之前的计算中,系数就是4.6875了。

小弟的方法都是自己的摸索出来的,在资料里面根本没人说这个细节,相关讨论群里面大家也不说。所以,虽然我实现了PID并且能得到较好的动态响应曲线,但是我能保证这样的办法是否存在漏洞,以分享的方式公布出来,就是希望各位路过的同仁能给予指点。

一周热门 更多>