问题
PID设计为无规则调用,存在2个问题:
- 你不能从PID得到确定的行为,因为调用时可能是频繁的也可能不是。
- 你需要做额外的微分和积分数学计算,因为它们都依赖于时间变化。
方案
确保PID在规律的时间间隔调用。通过指定每个调用PID循环,基于预定义的一个样本时间,PID决定计算还是立即返回。
当我们知道PID在固定的间隔被调用,微分和积分运算就可以简化。
代码
/*working variables*/
unsigned long lastTime;
double Input, Output, Setpoint;
double errSum, lastErr;
double kp, ki, kd;
int SampleTime = 1000; //1 sec
void Compute()
{
unsigned long now = millis();
int timeChange = (now - lastTime);
if(timeChange>=SampleTime)
{
/*Compute all the working error variables*/
double error = Setpoint - Input;
errSum += error;
double dErr = (error - lastErr);
/*Compute PID Output*/
Output = kp * error + ki * errSum + kd * dErr;
/*Remember some variables for next time*/
lastErr = error;
lastTime = now;
}
}
void SetTunings(double Kp, double Ki, double Kd)
{
double SampleTimeInSec = ((double)SampleTime)/1000;
kp = Kp;
ki = Ki * SampleTimeInSec;
kd = Kd / SampleTimeInSec;
}
void SetSampleTime(int NewSampleTime)
{
if (NewSampleTime > 0)
{
double ratio = (double)NewSampleTime
/ (double)SampleTime;
ki *= ratio;
kd /= ratio;
SampleTime = (unsigned long)NewSampleTime;
}
}
算法可以判断是否是计算的时间了。同样,我们现在知道算法使用相同的样本时间,我们不需要常常乘以时间变化。我们仅仅适当调整Ki和Kd,哪样在数学上是相等的,而且更加有效。
一个小缺陷是。如果用户决定修改样本时间,Ki和Kd需要重新调整以反应新的修改,SetSampleTimp就是做这个事的。
需要注意,我把样本时间的单位换算成秒。严格来说这不是必须的,但是这让用户可以输入Ki和Kd的单位是1/秒和秒,而不是1/毫秒和毫秒。
结果
上面的修改为我们做了三件事
- 不管Compute()的调用频率是多少,PID算法始终是固定的间隔调用。
- millis()为0时,时间相减不再是问题。
- 我们再也不需要去乘除时间变化。因为这是个常数,我们将它从计算代码中移除,整合进调整常数中。从数学上来说是等价的,但是节约了每一次乘除带来的成本。
Side note about interrupts
如果这个PID运行在单片机中,一个非常好的想法是使用一个中断。SetSampleTime设置中断频率,然后到时调用Compute。在这种情况下时间计算和判断就不会有需要。
这里有三个原因我没有使用中断:
- 不是每个人都能用中断。
- 同一时间实现多个PID控制器将变得棘手。
- 我将在以后的PID实现中使用终端。
分享到:
相关推荐
PID学习——PID源码 包含学习套件地址,PID学习资料,对于的源码,源码对应的原理图 内含 PID源码 电机速度闭环控制 电机位置闭环控制 代码对应原理图
淘宝客劫持PID插件——收入到爆
PID学习——PID的PDF(器件介绍+原理+调试+入门) 包含学习套件地址,PID学习资料,对于的源码,源码对应的原理图 内含 PID源码 电机速度闭环控制 电机位置闭环控制 代码对应原理图
PID控制——比例控制、积分控制、微分控制
博文 PID控制器——MATLAB/Simulink仿真以及性能分析 的附件,内含我搭建的一个多功能PID控制器Simulink仿真文件
pid调节器算法研究,适用于大学生计算机控制课程的设计~~
本文主要研究的课题是:炉温系统的PID控制器设计...常规PID控制算法、Smith控制算法、带死区修正后的Smith控制算法、模糊控制算法和模糊PID控制控制算法,我们可以通过比较最终得出最优控制算法——模糊PID控制算法。
包含1.位置型PID控制算法2.增量型PID控制算法3.积分分离PID控制算法4.抗积分饱和PID控制算法5.梯形积分PID控制算法6..变积分PID控制算法的C语言实现
我们在用到PID算法时,有时候会使用积分分离的抗饱和算法,或是另一类属于增量式的PID算法。这时,需要提供一个PID采样间隔来控制采样率,大部分无人机类工程用到的采样为10ms,视具体情况而定。 本文提供一个...
模糊PID控制.rar——matlab程序
一种新颖优化的算法PID算法,对编程员来说很有学习意义。
PID算法 C语言实现 绝对好 计算机分类
搭建了连续和离散两种情况下的pid s函数,效果可以,互相学习参考。
使用Matlab中的Simulink来建立的模糊控制仿真,通过大偏差来利用模糊推理调整控制量,小偏差使用PID控制,根据误差E和误差的变化率EC及输出量U,设计模糊控制规则。其中压缩包里有模糊9条,25条以及49条的控制规则,...
本程序基于STM32 F103RCT6,使用TB6612FNG驱动模块来实现对电机的速度控制,使用了3个定时器分别执行3种功能。具体内容请见代码注释。 本资源中各个参数都很大的原因是因为我的ARR值达到了7200,同时存在启动时直接...
无人自主水下航行器(AUV)的模型搭建以及PID控制仿真程序。
数字PID控制器的设计——毕业设计论文.doc
此源代码为stm32直流电机控制—PID算法篇的工程代码。包涵STM32单片机对直流电机转速...详细介绍说明可观看本博主的博客——“stm32直流电机控制—PID算法篇”。欢迎广大技术发烧友与小编一起共同学习,多提意见。。。
基于MATLAB的PID控制器设计——界面设计.doc
基于遗传算法的PID参数整定研究 基于遗传算法的PID参数整定研究(七-九)是基于精确的传递函数...———————————————— 资源介绍的链接:https://blog.csdn.net/qq_42249050/article/details/106117671