要实时地采样一个按钮、光开关、分解器、压力、化学或其它传感器,需要以多高的速率来对输入进行采样呢?是间隔10ms还是30ms?怎样才知道最佳速率是多少呢?我曾问一位工程师在某个应用中最佳的采样速率是多少,他回答5ms。至于原因,他说:“因为在这个速率下应用能够工作,我们花了几天时间来测试各种采样速率,只有这个速率能很好地工作。”
在另一个应用中,说明书列出了一个采样速率,这是根据一个类似应用得到的。在说明书上规定这个数值使得系统的设计人员丧失了任何灵活性。如果事实上这个速率不是应用的最佳采样速率该怎么办呢?如果新的软件看来能够在规定的采样速率下工作,那么在应用的整个生命周期中,这个速率将很可能将一直固定不变。只有在当采样软件不能工作时,采样速率才可能会受到怀疑。
为什么要采用试探纠错法?
在能够采用科学和数学的方法时,为什么还要通过试探纠错法来确定采样速率呢?本文将详细讨论一个更为有效的简单过程。利用特别的方法选择采样速率会带来几个问题。
首先,对于一个给定的应用,不应该花费几天的时间通过试探纠错试验来确定恰当的采样速率。如果能进行系统的工程分析,只需少量的实验便可得出正确的答案。
其次,“最佳”的定义是什么?某个应用的最佳答案对于另一个应用未必也是最佳答案。试探纠错法常用来确定采样速率,而且测试是在只包含了传感器采样程序的最小系统(而非完整系统)上进行的。本文开始时所提到的那个工程师选择“5ms”的采样间隔,他的程序是为一个需要去抖动处理的按钮开关所编写的。通过测试,他最终选择了5ms的查询间隔时间,因为这时系统不会把单次按压误记为双次按压,另一方面这个间隔也足够短,不至于把一个真正的双次按压误认为抖动。
事实上,5ms的查询时间对于这个系统来说或许可以接受,但在考虑其它因素(特别是系统的实时响应)之前,很难断定它是否是最佳选择。
例如,如果处理器负担过重,而5ms一次的采样需要占用CPU 40%的能力时怎么办呢?一种选择是将采样间隔时间增加到10ms,这样可以把对CPU的占用率降低一半,另一种选择是以半速执行控制程序。从系统的角度看,哪一种方案更好呢?或者更重要的是,在采样占用的资源与采样对处理器使用的影响,以及实时调度能力和优先级转换等其它因素之间是否有一个很好的折衷呢?
在选择采样速率时,通常有几个供选择的目标,如:
* 尽可能快地采样,以获得最高的精度;
* 尽可能慢地采样,以节省处理器的时间;
* 采样速率足够低,使噪声对输入信号的影响不大;
* 采样速率足够高,以提供足够的响应时间;
* 采样速率是控制算法频率的倍数,以便将抖动降到最低。
事实上,没有任何答案能够最佳地适合所有系统,但在针对某个特定应用和目标硬件的特性时,通常有一个答案比其它大多数答案更好。
本文将示范如何结合试验和数学分析,系统地确定一组较好的采样速率,并讨论当应用的实时要求给定时,如何从这组采样速率中选择一个恰当的数值。
以下是一种确定采样速率的系统方法:
1. 测量应用的传感器特性;
2. 如果输入信号中包含噪声,选择一种对数据进行滤波的算法;
3. 根据其功能计算出采样速率的上限和下限;
4. 分析采用上限和下限采样速率时对各种性能的影响;
5. 区分各种影响的轻重主次,在计算出的上限和下限之间确定一个适当的采样速率。
为了设计一个优秀的解决方案,这种方法结合了实验测量和对应用需求的分析理解。虽然此方法可用于大多数类型的传感器,但本文将集中讨论模拟输入传感器。
模拟输入传感器
模拟输入传感器通过模数转换器(ADC)为处理器提供数据。采样速率是指单位时间内从ADC读取数据并传递给使用该数据的其它应用部件的次数。采样速率直接影响输入信号的时间分辨率,其方式与ADC的位数对空间分辨率的影响大致类似。
最大误差是采样速率的函数。我们将误差e(t)定义为任意时刻t实际传感器的值与控制算法所用值之间的差异。注意t是连续的,因此随着采样速率Ts提高,输入值恒定,误差通常会增大,如图1所示。
信号处理技术中常用奈奎斯特准则来确定采样速率。奈奎斯特准则规定,采样速率至少必须为输入信号中最高频率分量的两倍。采样频率满足这一要求时,才可以重建原始输入信号。
但是,在读取模拟传感器时,奈奎斯特准则无法适用于大部分嵌入式控制应用。重建原始信号需要较强的计算能力,从而需要数字信号处理器。另一方面,在嵌入式控制系统中无需重建模拟输入,它的输入信号一般是用来提供敏感输入,以作为反馈控制基础的,因而系统只需要最近的数据。因此,这里的问题是数据必须要多“近”,才能将误差保持在应用规定的最大范围之内。
确定采样速率的范围
对于微控制器而言,采用奈奎斯特准则时,可以通过系统中的最高频率分量来决定最低采样速率fmin。我们将最高频率分量记为F,并定义w=2pF。则模拟输入中最坏的变化可表示为:
上式中,n为ADC的位数。当g(t)的导数最大时,g(t)的最大变化率G出现。因此:
在许多应用中,最大变化速率可能已由最大斜率限定,例如对于一个数字温度计,可能规定为“1度/秒”。根据ADC的取值范围,通过简单的比例关系,可将此最大变化率转换为Da/Dt(ADC单位/秒)的形式。
在其它的场合,可以通过试验来合理估计最大值。例如,假设将一个模拟速度传感器连接到一台带有最小负载的发动机上,则速度的最大变化率将发生在发动机开足马力后到达稳态的时候。测量时可使用模拟传感器作为输入,按处理器的最大能力快速采样,并按照ADC的单位来记录速度值。
假设采样速率为Dt。在一个Dt的间隔期间,读取测量结果将产生一个DA。如果Da是两个连续ADC读数之间的差值,且DA=max(Da),我们就可以计算DA/Dt。如果由于Dt太小,输入DA的有效位成为问题,则可以结合多个采样转而计算kDA/kDt,这里k为采样的个数目,且k>1。
注意,这个Dt只用于本次试验,目的是找出Ts(最终应用的最恰当的Dt值),以便在占用资源最少的情况下保证足够的精度。
由于DA/Dt是规定的最大变化率,在定义上也称为G,我们将关系记为:
设E为允许的最大误差,它表示为信号最大范围的一个百分比。即,对于一个最大值为5%的误差,E=0.05。
因此,ADC的最低采样速率fmin可计算如下:
例如,如果一个应用的最大变化率相当于采样一个50Hz的正弦波,用一个8位ADC来读取传感器,且最大误差为5%。则fmin=50p/0.05=3.1kHz,采样周期Tmin=1/fmin=318μs。
有意思的是需要注意,最低采样速率不是ADC位数的函数。但是,ADC的位数为最大误差确定了一个边界:
那么,如果应用规定的最大误差为1个ADC单位(即ADC的最佳分辨率),多高的采样速率能满足这个误差要求呢?答案是DA=1。为了计算这个值,在式4中设E=2-n,有:
式中fmax为实现最高分辨率的采样速率。
对于一个具体的ADC器件和应用,比fmax更高的采样速率毫无必要,因为器件的分辨率限制了误差的降低。
模拟输入传感器的采样速率下限如式4,上限如式6。作为小结,如果给定F:
或者如果已知DA/Dt:
注意,这些式子给出了一个限制,它在ADC满刻度范围(即0到2n-1)的基础上假设了一个最大误差。在一些应用中,可能没有使用ADC的全部满刻度范围,此时应该用ADC的实际范围来代替2n。
例如,为了确定fs的有效范围,考虑一个应用在受控高功率加热系统中的温度传感器。这个传感器连接到一个转换时间为50μs的10位ADC。系统设计为在-20°C到200°C的温度范围之间工作。此外,控制算法要求在所有给定点传感器读数的误差不超过0.5°C,以保证平稳控制。
系统开发的起始阶段通过一个实验来确定DA/Dt。传感器在一个小型温度绝缘密封装置中被冷却到-20°C。密封装置中放置有一个加热器,它只对传感器进行加热。如果同时还对其它物体进行加热,将使系统的负载增大,并且延缓加热的速度。编写并执行对传感器进行采样和记录数据的程序代码后,加热器被开到最大功率。当传感器被加热到200°C时,切断加热器。此时,在一个反映实际应用的环境下对最大冷却速率进行测量。如果是被动冷却,只需打开热封闭装置即可;如果是主动冷却 (如使用风扇),则应开启有关的制冷设备。
这里的目标是为了获得近似的测量值。可能还需要一个更为完善的设备(如反映系统实际负载的设备)来对测量结果进行精密调整。但是,这些初步的估计值可以给出对所需采样速率的一个相当好的一阶近似,用作系统设计和实现中的指导。
假设将传感器从-20°C加热到200°C需要380秒。仔细考察这些数据后我们发现,在1秒的间隔时间内,最大温升为3.5°C。假设这个10位ADC已经过校准,ADC输出为0时对应温度-20°C,输出0x3FF时对应温度200°C,并且这个对应关系是线性的,则每秒变化3.5°C对应每秒变化16个ADC单位。因此,DA/Dt=16。同时,由于在220°C的范围内规定的最大误差为0.5°C,因此传感器读数的最大误差为0.23%,即E=0.0023。
采用式8计算模拟传感器的采样速率范围,得:
或:
这意味着,采样速率低于每秒6.8次可能会导致超出控制系统算法规定范围的误差,尤其是在最大加热或冷却周期期间。采样速率的上限是每秒16次。但是注意,与信号跳跃变化的数字输入传感器不同,过快地采样模拟传感器不会导致误差。事实上,采样速率上限标志着一个阈值,超过这个速率更快地采样也不会提高控制系统的精度。
确定最佳采样速率
现在已经得到了可用值的一个范围,下一步是根据应用和硬件的各种属性,在这个取值范围内确定最佳的采样速率。以下是在确定最佳采样速率时可能遇到的一些问题。
你可能注意到了,ADC的实际转换时间并不影响采样速率。当转换时间与采样速率相比可以忽略时,这是一种普遍情况。另一方面,假设转换时间为60ms(对于高分辨率ADC来说这个转换时间是相当普遍的)。由于转换时间较长,将ADC配置为连续模式工作,并将采样速率设置为16.67Hz(正好是转换速率的一个倍数)相当理想。如果想节省处理器的时间,也可以按照这个速率的一半-即8.33Hz-进行采样。由于这个速率处在计算范围之内,应用仍能正确工作。但是,不能以四分之一速率(4.16Hz)对模拟输入进行采样,因为这个速率在计算范围之外,并且会导致超出规定范围的误差。以非转换时间倍数的任何频率采样都将导致时钟畸变,并有可能引发更多的问题,即使采样速率在计算范围之内亦然。
作为另一个微幅调整的例子,假设已经确定控制系统需要更精确的传感器读数,即传感器读数的百分数误差E必须降低。这使得fmin的下限必须提高,意味着传感器需要更快地采样。在新的规定值E已经给定的情况下,可以采用式8来快速确定新的最低采样速率。这样只花几分钟便可分析确定对采样速率的调整,而不必花上几小时或几天来尝试通过实验进行调整。
注意,这个例子考虑采用未经滤波的模拟输入数据,如果需要采用输入滤波来减小噪声,那么在分析中必须考虑对滤波算法的需求。
概括地说,采样速率的取值范围为设计提供了一个起点。如果有任何参数发生变化,可以相应地改变计算,根据需要获得新的采样速率。
本文小结
本文提供的方案不是一个适用于所有模拟传感器的解决方案,而是展示了一条分析与实验相结合的途径。读者应根据所选用的特定传感器、具体应用的需求,以及自己通过简单实验获得的合理测量结果,不断修改这一方法。需要记住的一点是,在为嵌入式系统开发软件时,应用基本设计可以显著节省开发过程中的时间,并能获得更好的结果,至少是与任何特别的方法同样好的结果。