Arduino PID 库函数指南

虽然PID的原理并不难,但是实现起来未免会给Arduino的许多创客玩家带来些许困难。本文将不对PID的具体实现细节Arduino的PID库函数使用方法分享给大家,以供参考。

另注:此Arduino库使用的是位置式的PID算法。

  1. 官方介绍:http://playground.arduino.cc/Code/PIDLibrary
  2. 一个倒立摆的例子:http://www.arduino.cn/forum.php?mod=viewthread&tid=3826&highlight=%E5%80%92%E7%AB%8B%E6%91%86
  3. 官方文档译文(一):http://www.arduino.cn/forum.php?mod=viewthread&tid=4535&highlight=PID
  4. 官方文档译文(二):http://www.arduino.cn/forum.php?mod=viewthread&tid=4536&highlight=PID

PID()

PID的初始化函数,并设置输入、输出、目标值等参数。具体语法格式如下:

PID(&Input, &Output, &Setpoint, Kp, Ki, Kd, Direction)
PID(&Input, &Output, &Setpoint, Kp, Ki, Kd, POn, Direction)

参数:

参数介绍
Input(double)输入参数,待控制的量
Output(double)输出参数,指经过PID控制系统的输出量
Setpoint(double)目标值,希望达到的数值
Kp, Ki, Kd(double)PID控制的比例、积分、微分系数
DirectionDIRECTREVERSE,指的是当输入与目标值出现偏差时,向哪个方向控制。笔者发现,当设置为REVERSE时,会在初始化时将Kp, Ki, Kd变化为原来的负值。
POnP_ON_E (默认) 或 P_ON_M,传统PID控制一定会出现超调值,但是P_ON_M可以稍微缓解这一现象,但是会牺牲一些上升时间,对比图如下:
默认(P_ON_E):P_ON_E P_ON_M:P_ON_M

Compute()

包含PID的控制算法,应该在loop()函数之中反复调用。但是具体的输出和采样时间有关,否则很可能会出现什么也不做,输出为0的情况。

无参数,但是有一个返回值。

返回值说明
True输出是经过计算的输出
False啥也没做,不输出或输出为0

SetMode()

指定PID算法的运行计算过程是自动(AUTOMATIC)还是手动(MANUAL)。手动就是关闭PID算法的计算功能。调为AUTOMATIC模式时才会初始化PID算法,进行输出。
例:

SetMode(AUTOMATIC);

SetOutputLimits()

调用此函数,将会使得Output输出范围钳制在一定的范围之内。若不进行设置,则默认以Arduino的PWM输出模式(0-255)进行输出。最小值和最大值都是double类型。

//SetOutputLimits(min, max);
SetOutputLimits(200, 300);  // 输出在200-300之间

SetTunings()

PID()函数中已经对其进行初始化,但是在某些情况下,可能会需要随时调整比例积分微分系数或工作模式(P_ON_E/P_ON_M),此时则可调用此函数进行设置,语法如下:

SetTunings(Kp, Ki, Kd);
SetTunings(Kp, Ki, Kd, POn);

Kp, Ki, Kd, POn的具体含义详见如上PID()函数的说明。在此不再赘述。

SetSampleTime()

用以控制PID算法的采样时间,默认采样时间为200ms。输入的参数类型为int类型的毫秒数。在大多数场合下,这一时间足够快了。在Arduino中文社区的翻译帖中,贴出了常见被控参数的采样周期,这里笔者将其贴在这里以供参考:

被控参数采样周期备注
流量1-5s优先选1-2s
压力3-10s优先选6-8s
液位6-8s
温度15-20s
直流电机100ms

SetControllerDirection()

官方文档对此函数的介绍比较详细,现翻译如下:

如果我的输入值高于设定值,输出是否增加或减少? 结合现实的情况,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;}
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值