本节书摘来华章计算机《仿人机器人原理与实战》一书中的第3章 ,第3.1节,作者布莱恩·伯杰伦(Bryan Bergeron) 托马斯B. 塔尔博特(Thomas B. Talbot) 王伟 魏洪兴 刘斐 译, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
3.4 热平衡实验进阶
3.4.1 泵速分段控制
你应该能够依据真实温度和目标温度差值的函数来改变泵速,以避免setPoint的值明显超调。
- 编程
如清单3-2所示,系统的Arduino代码使用标准map()变换函数给变量pumpSpeed赋值。需要修改map函数中的变量值,以便符合你的系统。例如,在我们的实验系统中,从热水管中得到的热水温度变量hotTemp对应的热电偶读数值为760。你选定的值取决于热水加热设定值和热电偶传感器的响应。类似地,注意变量pumpSpeedMax,即最大泵速。如果你对管路连接有些不确定,那么刚开始请使用较小值。
清单3-2 利用分段响应的热平衡控制
注意,分段响应的变化性受限于热电偶的水温响应变量T1Temp高于变量setPoint的次数,否则泵速设定为0。
- 操作
系统组建和操作与开关控制实验相同。要么往储槽中加入确定量的热水,要么使用浸入式电加热器将储槽内的水温升高到超过setPoint值。理想情况下,泵速分段控制的超调量小于开关控制。
3.4.2 PID控制
你应该能否发现分段速度控制的结果优于开关控制。问题在于,它是否足够优秀?如果不是,我们能改进吗?对这个简单的应用来说,简单的分段控制可能是足够的,但当我们面对更加复杂的系统和与PID控制相关的资源需求时,这种想法就很有价值。
假设我们没有使用Arduino监视多个传感器,那么RAM(Random Access Memory,随机存取存储器)和处理器资源就可以节省下来,但是通常情况下并不总是这样的。现在,我们假定简单的分段控制不够好,而且有足够的计算资源。
- 编程
如清单3-3所示,PID系统的Arduino代码比清单3-2中的代码要稍微复杂一下,这还多亏我们使用了Arduino Playground中的PID库。这个库中包含了许多我们之前讨论的具体实施细节,可着重关注修正量PC、积分常数IC和微分常数DC等参数的最优值,并可关注整个系统的操作。
清单3-3 基于PID控制器的热平衡
这段代码的关键在于myPID()函数,它可在已知输入Input(热电偶读数)的情况下确定输出变量Output(马达转速)。调节PID算法必须要给PC、IC和DC三个常数赋新的值。清单中这些常数值是我们开始调试的最佳位置。
- 操作
系统操作与之前的两个例子相同,但是在确定初始条件时我们要做得更明确一些。不再是简单地加入热水或者插上电加热器直到温度超过setPoint值,而是或者向储槽中加入定量且定温的热水,或者接通电加热器并维持确定的时间。搅拌储槽中的水,跟踪热电偶读数变量Input和水泵的输出电平变量Output。为了达到调试目的,我们暂时在主回路中增加一个延时声明,以便实时读取变量Input和变量Output的值,这个延时会改变PID控制器的响应。
如果实验结果不如简单控制好,即快速达到设定温度而几乎没有超调,那么可能需要调节PID。Arduino中自带PID调节资源,而且本系统足够简单,多次尝试和错误是可以接受的。Arduino中常用的PID调节资源命名为PID autotune library,在Arduino Playground中可以获得。
另一种可能性是你的系统对于PID控制器来说很不稳定。在多次重复实验中,可能的情况有:水温和容积不同,储槽绝热性能不好,外界温度变化,热辐射器的转换效率低或者管路泄露。不管何种原因,如果基本系统不支持可重复的实验结果,那你永远都不能确定常数的值。
另外,回顾我们讨论PID微分分量的内容,系统整个微分项是常数DC的函数。在清单3-3中将DC设为0,便得到PI控制器。即使你拥有完整的PID控制器,但是调试一下PI控制器也是很不错的,以便感受只有PC和IC常数的系统。
3.4.3 四肢温度响应
通过使核心体温setPoint响应四肢温度,我们给系统增加一些生物学模拟。对于这次改进,我们增加第二个热电偶探头,并利用它的读数来修改变量setPoint。
- 器材清单
除了基本的PID系统外,我们还需要以下器材:
- 10kΩ热电偶
- 10kΩ、1/4W电阻
- 台灯、电吹风或其他热源
- 压缩空气罐或者散热器
- 电路
如图3-14所示,电路由之前的电路和第二套热电偶–电阻对T2-R2组成,用来监视人体模特头部和其他支撑件的温度。10kΩ电阻R2用来构造分压回路,使得温度上升时Arduino中的读数更大。
- 构造
将双绞线与第二个热电偶连接,并将热电偶缠绕或固定在人体模特的脖子或其他部位。在恰当的位置安装热电偶,以便其能够很容易地感受冷热变化。 - 编程
适用于两个热电偶电路的Arduino代码如清单3-4所示。再次重申,因为我们使用了Arduino的PID库,所以编程的工作量不大。如果热电偶T2的读数增加,变量setPoint的值就减小,这意味着泵马上就要开始工作,提前启动了冷却过程。相反,如果向热电偶T2喷射压缩空气,降低T2的温度,那么变量setPoint将会增大,水泵直到热电偶T1给出一个相对更高的读数时才会启动。
清单3-4 适用于两个热电偶热平衡系统的Arduino代码
上述代码与之前单热电偶探头代码的最大区别在于,系统组成和评估两个热电偶返回值的方法不同。注意,在这段代码中变量SetPointHigh、SetPointMid和SetPointLow的间距是不对称的。你可以也应该尝试一下等间距、增大或者减小赋给这些变量的值的间距。
- 操作
到现在为止,你应该知道操作规范了。仔细加入热水或者将电加热器按特定方式加热,以便在多次实验中能够重复这些初始条件。然后运行实验并跟踪输出数据。在模拟人的生理反应时,使用动态setPoint值会干扰PID控制器。如果过度修改变量setPoint的值,你可能需要立即利用PID库中的SetTunings()函数来为PID算法设定新的常数。