在具体数据采集应用中,试错测试可能使用得最为普遍,但它既不是最快的也不是最好的确定抽样率的方法。采用系统工程分析并通过一系列预先设计好的试验,可以帮助快速找到适合的采样率。本文以弹球开关为例,介绍选择采样率时应考虑的一些因素。
最近我问一个工程师他系统所使用的采样率是多少,他回答说:“5毫秒”。我接着问他为什么,“因为它合适,”他说道。“我们花了很多天来测试不同的采样率,只有这个最合适。”
他的系统是一个按钮开关,要求去除掉一些反弹效应。他和他的试验小组最后选择5ms作为间隔是因为在测试过程中,采用这样的采样率既不会将一个信号错误地认为是两个信号,且由于速度快,也不会将有用的双击误认为是反弹。
5毫秒也许是一个可以接受的数值,但由于没有考虑系统其它因素,尤其是实时反应时间,我们确实无法知道这是不是最好的答案。
假设处理器过载,例如5ms采样时间造成40%过载,情况会怎样呢?可以将采样时间间隔增加到10ms而把代码占用的CPU资源降低到20%,另外一种方法是保持采样率不变,而将控制码执行的速度降低一半。那么从系统的角度来看哪一种方法更好呢?在采样资源和处理器利用率以及其它实时因素(如调度与优先级调换)间有没有一种好的折衷方法呢?下面让我们具体来看一看。
选择标准
在选择采样率时,有几个对立的因素要考虑,这些因素包括:
采样应尽可能快,这样精度才高
采样应尽可能慢,以节约处理器的时间
采样应快到能提供足够的响应时间
采样应慢到输入信号不受噪声的影响
采样率应为控制算法频率的倍数,以减少抖动
由于没有一个答案能满足所有的要求,所以在考虑具体应用特性时只能找到一种比其它都更好的采样率,本文介绍的技术将有助于确定这个采样率,包括下面几个步骤:
测量传感器的特性。
如果输入有噪声,应选择合适的算法将其滤掉。
只在满足功能的基础上计算采样率的最高和最低界限。
在最高和最低界限之间确定均衡点。
按均衡点优先次序在最高和最低界限间确定采样率。
这种方法适用于所有传感器,下面我们以实例集中讨论数字开关的情形。
数字开关
数字输入最简单的形式是开关,当开关合上时,开关的值是1,打开时值为0,如果是负逻辑,结果刚好相反。很多嵌入式系统都有一个或多个开关,如果开关很少,少于纯数字输入/输出(DIO)端口数量时,它们通常直接接到DIO端口上;开关数量多的时候则由一个开关矩阵来控制,这个以后另文再述。
一个理想的开关在合上时的信号为1,打开时信号是0,从一种状态到另一种状态的转换是瞬时完成的。但实际上,还有上升和下降时间需要考虑,由于这些时间和电路电容成正比,所以通常只有几个纳秒。在我们的分析中,只要传感器数据读取速度慢过每秒10万次,就可以将上升和下降时间忽略不计,因为读取速度慢,有些开关如光开关和结构紧固的瞬态开关其特性还是非常理想的。
然而大多数机械开关都有反弹效应。当开关合上时,从0到1的转换不是在瞬间完成或者说不是连续上升的。图1a显示了从示波器上看到的一个机械开关输出转换过程的波形,图1b是开关输出的数字信号波形。主脉冲前后多余的脉冲就是所谓的反弹,它产生于开关内部机械弹片发生接触的时候。如果反弹会造成不良的影响,就必须对其进行滤波,这个过程通常称为去反弹。
测量关闭时间
要决定采样率,就需要知道最小开关关闭时间,我们用σmin表示,它也是确保采样软件探测到开关状态的最短时间。有时候系统会具体规定,在没有规定的情况下,就需要通过实验,在具体系统需求和硬件特性的基础上确定。
最小开关时间一般用来作为数据噪声的阈值使用,而不是实际开关打开或关闭的时间。如果在输入端检测到脉冲的持续时间小于最小关闭时间,软件就可能把它漏过,我们不把这个看作是故障。另一方面,如果脉冲时间等于或大于σmin,软件将保证检测到开关的状态。
下面是我和一些工程技术人员对弹球机的研究经验分析,弹球机是一种很好的实验工具,因为它具备好几种类似于数字输入开关的机构,每种都有不同的特性,图2显示了其中的一些。
图2a中的开关必须经常监测,因为弹球运行速度很快,对于这类开关,我们测量得到它的σmin大概是10ms。(实际测量值带有小数位,我们分析时也是使用带小数的实际测量值,但为讨论方便起见本文中我们都四舍五入取为整数。)这个值根据环境不同而有所不同,改变环境特性可能会得到不同的最快开关关闭时间。也可以通过测量和分析来确定弹球通过开关的最快速度,如果这样的话,σmin可通过数学方法推导出来,它是最大球速和开关尺寸的函数。
图2b是一个中速开关。由于弹球方向改变,球通过开关时的速度值范围比最高速度要慢很多。在这个实验中,我们测得这些开关的最短开关关闭时间是50ms。
慢速开关是指在软件检测到之前它总是关闭的,直到发出重新打开的命令,图2c就是这样一种开关。在上面一个图中,球落在装有开关的洞里,当软件检测到有球存在以后,再触发电磁阀将球弹出去;在下面图中,球打在挡片上使弹簧将挡片拉下来,然后电磁阀再启动将挡片重新推上去。
对于慢速开关,最短开关闭合时间是触发电磁阀的控制软件的函数,在我们实验中电磁阀触发频率是10Hz。
一般我们假定开关闭合后没有被锁住,采用锁住的方法通常不现实,有时候根本不可能,如像开关矩阵。如果把开关锁住,结果就如图2c中的开关一样,其速度是发出解除锁存信号任务的函数。
如果开关不是理想的,还必须测量它的稳定时间,我们用τ来表示,它指达到正确反映开关状态的稳定值之前,开关可能弹起的时间。
我们发现图2a中左边的滚轮开关并不理想,但右边的光电开关却非常理想,它没有任何反弹。出于分析的目的,我们对最坏情况稳定时间τmax特别感兴趣。
通过实验我们可得到σmin和τmax。测量时我们把开关放在Vcc和GND之间,并通过一个限流下拉电阻,Vout接在逻辑分析仪上,然后将逻辑分析仪设定为上升沿触发(图3)。
用最快的速度将开关闭合后再打开。如果是一个理想的或接近理想的开关,你可以看到开关很平滑地从0变为1,再从1变为0;如果是一个有反弹的开关,输出的波形跟图4就有点类似。将这个实验反复几十次,记录下每次的σmin和τmax。
在进行这些实验的时候,必须要考虑最终应用中开关的工作情况。在弹球机上,球通过开关的速度比人按下再放开的速度要快,也比人用手将球滚过开关的速度要快,正因为此,在测试过程中我们采用电磁阀来触动推杆将球推过开关,而不是用手指来触动开关或用手将球滚过开关。
设计为手工操作的开关要经历各种按压,因此应针对不同情况重复进行实验。例如轻轻按下时开关稳定时间快,但闭合时间也短;而使劲按下开关闭合时间长,但也许由于反弹其稳定时间也长,实验时要记录下最小、平均及最大σmin和τmax。为了使采样数据真实,可以在工休场所进行实验,要求进来休息的每一个人很快地按几下开关,再慢慢地按几下,再几次连着按两下,其目的是为了能得到尽可能接近使用者的数据。如果是小孩用的东西,就叫小孩来按开关;如果使用者是18至80岁的人,就让这个年龄段的人来试。多收集数据或许可以防止灾难性的结果,不会使生产出来的产品有些人根本就不能正常使用。
理想开关
理想开关的稳定时间永远是0,采样率要保证所有开关的闭合都检测到,因此比最小闭合时间短。虽然看起来简单,但也有一个取舍的问题,如果σmin是10μs,我们是否要每10μs就检测一次?这样做肯定会耗尽CPU所有的可用资源。
克服这种问题的最好方法是考虑实际应用状况然后再做取舍。假如10μs的闭合时间确实是有可能的,但在每一千次闭合中才会出现一次(0.1%),由于99.9%的时间里σmin都大于10μs,那么5ms最小闭合时间更加切合实际,而且比10μs最小闭合时间使用的CPU资源要少很多。但漏掉一个10μs开关闭合对于一个具体的应用来说是不是可以接受呢?
答案取决于实际的应用。如果开关闭合是由人来操纵,我们可以假设按开关时太轻了,使用者只要按重一点就可以了;如果闭合是弹球机中的一个开关,我们可以认为开关没有真正闭合,结果也就是玩的人得不到分;但是如果开关的闭合与有毒气体的释放有关,那么我们就要把它测出来,在这种情形下,我们要将开关锁住,或者由一个专门的小处理器每隔10μs读取一次数据。
我们假设只有检测到σmin大于5ms的开关闭合是可以接受的,这时精度也有99.9%,但如果此时CPU过载了又怎么办?可不可以用10ms来代替5ms从而进一步使CPU负载减半呢?根据实验,这样精度会降到99.0%。如果在实际应用中没有问题,那么这种取舍还是值得的。但是如果采样率改为10ms后精度降到了85%,这种取舍就有点危险了。记录下所有σmin的实验结果能有助于你正确评估如何在精度和CPU的利用率间找到平衡。
到现在为止所提到的开关都是理想状态下的开关,开关反弹对选择合适采样率又增加了一些影响。非理想开关
我们来看一下图2a中的滚球开关。该开关的输出如图4a,过滤后的波形如图4b。输出通过去反弹算法过滤,以给应用处理代码提供一个纯净的信号,表示开关的闭合状态。已有很多文献介绍了多种硬件和软件去反弹算法。下面分析中所用到的算法如图5所示,它是一个同步状态机,需要对同一数值进行两次连续采样,以记录开关的状态改变。对不同的算法,采样率分析和结果会有所不同。
在嵌入式处理器中可以直接用布尔代数执行这种算法,该方法的另一个优点是可对多个开关同时去反弹。例如表1中的代码显示了图5去反弹算法执行情况,这里同时对8个独立的输入进行处理,假设每个输入都用输入变量x的一位来表示。
如果硬件设计可以灵活改变,也可采用FPGA在硬件中执行状态机逻辑。在这种情形下,不需要再用软件对开关进行去反弹,可以认为开关是理想的,硬件状态机的时序和我们下面的分析没有太大区别。
如果开关关闭后在最小关闭时间内采样少于两次,开关的动作就会被过滤掉,这也就决定了采样周期的上限是σmin/2。
现在我们来看看采样周期的下限,我们将去反弹算法的最低要求看作是不能将两次连续的开关动作搞错。例如我们得到两个为1的样本,后面是两个0,然后又是两个1。假定只有最后两个1是稳定状态,此时过滤后的输出在稳定时间内至少有4个样本。为防止出现误判断,在开关关闭瞬间我们必须最多取三次样,所以采样周期要大于τmax/3。
将上限和下限合在一起,对于图5所示的状态机数字输入去反弹输入驱动器我们可得采样周期Ts(采样率fs=1/Ts)的条件:
有可能出现的值表明了采样率可接受取舍范围。假设τmax是3ms,σmin是10ms,那么由等式1可得1mss<5ms。为了尽量减少采样占用的CPU时间资源,我们把采样时间定在5ms附近。
采取快速采样(如1ms)的另一个理由是试验获得的关闭时间也许不是最小值。如果希望采集到99.0%的开关闭合,快一些的采样率也许能将这个数值提高一点。但为了避免系统将反弹误认为是开关闭合,采样率绝不要小于1ms。
当然,也可能采样率范围都不可接受。我们以一个特殊的反弹开关作为例子,它的稳定时间是6ms,最小关闭时间是4ms。此时,式1得到一个空集,没有一个采样率可以保证捕获到开关的闭合且确保反弹不会误认为是好几次开关闭合。
要解决这个问题,设计人员就必须考虑其它的方法。有一种办法是采用不同的去反弹算法,如在三个1而不是两个连续的1中找出两个1;另一种办法是考虑开关闭合时的内部到达时间;第三种办法是要么提高σmin,偶尔错过开关的闭合,要么减少τmax,偶尔将一次开关闭合当作两个事件。不管选择哪一种,这些方法都要容易记录下来,如果选择被证明不好,更变设计仅仅只需改变采样率就可以了,或者改变有限状态机定义的算法。
本文结论
归纳起来,我们用试验和分析得到输入的采样率有效范围,当范围确定以后,再考虑实际应用的其它因素,在可接受范围内选择一个最佳采样率。采用这种方法可以相对较快地得到合适采样率,因其它应用和系统问题进行调节也只要几分钟就可以了,不需要用几天或几个星期的时间进行试错测试和微调。
虽然本文中提到的数字开关代表了很多嵌入式系统器件,但是它们还很不全面,不过我的目的是证明组合式分析实验方法的有效性,而不是提供对所有可能存在的传感器都适用的解决办法。该方法依具体使用的传感器、使用场合以及通过简单试验获得合理数据的能力的不同而需要作不同程度的修正。
作者:DaveStewart博士执行副总裁兼技术总监
EmbeddedResearchSolutionsLLC
Email:
[email protected]