有时,由于电磁干扰或其自身固有特性的缘故,DC信号从物理参数(温度、电流、电压等)上可能会表现出一些变化。比如,在直流发电设备中,当管理大负载时,连高频的整流器也输出一个0.2V波动。当MCU显示其自身(或外部)模数转换器(ADC)的不同时间取样的变换时,这种信号变化就会被观察到。图示为在一定时间内有变化的直流信号。如果在t0、t1、t2、t3、t4等时间点取样,并且每个样本被显示在一个LCD上,用户可能不知道测量信号的真实水平。
这种不稳定性可能看起来像系统故障,并导致真实测量值的不确定性。在一些情况下,一个低通滤波器可以解决这样的问题。但对于其它情况,比如当硬件受PCB空间或预算限制时,最好选择把信号平均。这是由多次取样以及从数据中得出来的。参数X的N个样本的平均值为:
其中,Xi是从参数X取得的第i个样本值,而N是样本的总数。10b数的增加变得容易,因为它们可以分为两个寄存器。只要在两个最低有效字节以外发生进位,最高有效字节必须要增加。
图:因为在不同时间对DC信号进行采样,所以结果显示出不同的值,致使无法确定信号真正的DC值。 |
在一些基于8b RISC的MCU中,没有可供执行算术除法的指令。原理上,任何数字都可以通过被2除转换成二进制表示法。例如,数字(14)10=(1110)2,然后(14/2)10=(7)10=(0111)2。同样的,任何数被4, 8, 16, 32除都是可能的,诸如此类。既然这样,对于微芯片的PIC MCU系列来说,一个短小的子程序(见表)可以解决这个问题。
表:子程序示例。 |
前九行是使用子程序“Average”计算从特别的ADC 信道(此例中为信道3)取样的64个样本平均值的范例源码。如其所示,这九行只要改变在第五行定义的变量值,就可同样地用于调用相同的子程序去计算任何其它信道的平均值。这个“Average”子程序首先调用一个延迟用于调整时间去转换64个样本。建议在一个相当于多个波周期的时间里取64个样本,如果波动不十分大,这个子程序会被忽略,如果TEMPO按如下计算将会产生最好的结果。
这里m是一个整数,TR是以秒为单位的波动周期时间。
从第10行到第18行,样本总数是给定的。整个子程序也许和这个一样短,因为平均值最后将被记录在AddM(8个最高有效字节)的和AddL(2个最低有效字节)寄存器中,而当满足第17行的条件时将使PC计数器跳到第19行。如果程序有子程序去转换二进制到BCD格式(LCD显示字符的特殊格式),那么算出正确结果,然后第35行的代码将被写到第19行而退出这个子程序。
从第19行到第34行,子程序只是用这样的方式移动平均值:8个最低位被存储到LSB寄存器中,并且2个最高字节被存储到MSB寄存器中,这更像转换成BCD格式,最后的结果将稳定的确定的可信赖的显示在屏幕上,LCD或是七段显示。
作者:Jorge M. Briseno,Multielectrica Industrial公司
文章评论(0条评论)
登录后参与讨论