虽然PID的原理并不难,但是实现起来未免会给Arduino的许多创客玩家带来些许困难。本文将不对PID的具体实现细节Arduino的PID库函数使用方法分享给大家,以供参考。
另注:此Arduino库使用的是位置式的PID算法。
PID的初始化函数,并设置输入、输出、目标值等参数。具体语法格式如下:
PID(&Input, &Output, &Setpoint, Kp, Ki, Kd, Direction)
PID(&Input, &Output, &Setpoint, Kp, Ki, Kd, POn, Direction)
参数:
包含PID的控制算法,应该在loop()
函数之中反复调用。但是具体的输出和采样时间有关,否则很可能会出现什么也不做,输出为0的情况。
无参数,但是有一个返回值。
返回值 | 说明 |
---|---|
True | 输出是经过计算的输出 |
False | 啥也没做,不输出或输出为0 |
指定PID算法的运行计算过程是自动(AUTOMATIC)还是手动(MANUAL)。手动就是关闭PID算法的计算功能。调为AUTOMATIC
模式时才会初始化PID算法,进行输出。
例:
SetMode(AUTOMATIC);
调用此函数,将会使得Output输出范围钳制在一定的范围之内。若不进行设置,则默认以Arduino的PWM输出模式(0-255)进行输出。最小值和最大值都是double类型。
//SetOutputLimits(min, max);
SetOutputLimits(200, 300); // 输出在200-300之间
PID()函数中已经对其进行初始化,但是在某些情况下,可能会需要随时调整比例积分微分系数或工作模式(P_ON_E/P_ON_M),此时则可调用此函数进行设置,语法如下:
SetTunings(Kp, Ki, Kd);
SetTunings(Kp, Ki, Kd, POn);
Kp, Ki, Kd, POn的具体含义详见如上PID()函数的说明。在此不再赘述。
用以控制PID算法的采样时间,默认采样时间为200ms。输入的参数类型为int类型的毫秒数。在大多数场合下,这一时间足够快了。在Arduino中文社区的翻译帖中,贴出了常见被控参数的采样周期,这里笔者将其贴在这里以供参考:
被控参数 | 采样周期 | 备注 |
---|---|---|
流量 | 1-5s | 优先选1-2s |
压力 | 3-10s | 优先选6-8s |
液位 | 6-8s | |
温度 | 15-20s | |
直流电机 | 100ms |
官方文档对此函数的介绍比较详细,现翻译如下:
如果我的输入值高于设定值,输出是否增加或减少? 结合现实的情况,PID的控制可能有不同的选择。 用一辆车,输出应该减小,以减速。 对于冰箱来说,情况恰恰相反。 需要增加输出(冷却)以降低温度。 此函数指定PID连接到哪种类型的进程。 此信息也在PID构建时指定。 由于该过程不太可能从直接转换到反向,所以任何人都不会真正使用此功能。
语法格式及使用示例如下:
SetControllerDirection(DIRECT);
SetControllerDirection(REVERSE);
此库的作者是以C++的类来封装的,所以当我们需要一些参数时,则要通过函数来访问变量的当前值。函数作用如函数名,就不再赘述,但将源码放出。
GetKp()
GetKi()
GetKd()
GetMode()
GetDirection()
double PID::GetKp(){ return dispKp; }
double PID::GetKi(){ return dispKi;}
double PID::GetKd(){ return dispKd;}
int PID::GetMode(){ return inAuto ? AUTOMATIC : MANUAL;}
int PID::GetDirection(){ return controllerDirection;}