更新时间:2022-09-21 16:22:11
本节书摘来华章计算机《仿人机器人原理与实战》一书中的第3章 ,第3.1节,作者布莱恩·伯杰伦(Bryan Bergeron) 托马斯B. 塔尔博特(Thomas B. Talbot) 王伟 魏洪兴 刘斐 译, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
你应该能够依据真实温度和目标温度差值的函数来改变泵速,以避免setPoint的值明显超调。
清单3-2 利用分段响应的热平衡控制
注意,分段响应的变化性受限于热电偶的水温响应变量T1Temp高于变量setPoint的次数,否则泵速设定为0。
你应该能否发现分段速度控制的结果优于开关控制。问题在于,它是否足够优秀?如果不是,我们能改进吗?对这个简单的应用来说,简单的分段控制可能是足够的,但当我们面对更加复杂的系统和与PID控制相关的资源需求时,这种想法就很有价值。
假设我们没有使用Arduino监视多个传感器,那么RAM(Random Access Memory,随机存取存储器)和处理器资源就可以节省下来,但是通常情况下并不总是这样的。现在,我们假定简单的分段控制不够好,而且有足够的计算资源。
清单3-3 基于PID控制器的热平衡
这段代码的关键在于myPID()函数,它可在已知输入Input(热电偶读数)的情况下确定输出变量Output(马达转速)。调节PID算法必须要给PC、IC和DC三个常数赋新的值。清单中这些常数值是我们开始调试的***位置。
如果实验结果不如简单控制好,即快速达到设定温度而几乎没有超调,那么可能需要调节PID。Arduino中自带PID调节资源,而且本系统足够简单,多次尝试和错误是可以接受的。Arduino中常用的PID调节资源命名为PID autotune library,在Arduino Playground中可以获得。
另一种可能性是你的系统对于PID控制器来说很不稳定。在多次重复实验中,可能的情况有:水温和容积不同,储槽绝热性能不好,外界温度变化,热辐射器的转换效率低或者管路泄露。不管何种原因,如果基本系统不支持可重复的实验结果,那你永远都不能确定常数的值。
另外,回顾我们讨论PID微分分量的内容,系统整个微分项是常数DC的函数。在清单3-3中将DC设为0,便得到PI控制器。即使你拥有完整的PID控制器,但是调试一下PI控制器也是很不错的,以便感受只有PC和IC常数的系统。
通过使核心体温setPoint响应四肢温度,我们给系统增加一些生物学模拟。对于这次改进,我们增加第二个热电偶探头,并利用它的读数来修改变量setPoint。
清单3-4 适用于两个热电偶热平衡系统的Arduino代码
上述代码与之前单热电偶探头代码的最大区别在于,系统组成和评估两个热电偶返回值的方法不同。注意,在这段代码中变量SetPointHigh、SetPointMid和SetPointLow的间距是不对称的。你可以也应该尝试一下等间距、增大或者减小赋给这些变量的值的间距。