式f=1/T,计算出低频频率。由于单片机做浮点运算的精度有限,在编写单片机程序时,还应该注意采取有效算法控制运算精度。
1.3系统总体方案
1.3.1系统总体方案的比较与论证
方案一:传统51单片机和集成计数器。
传统51单片机功能简单,易于控制而且操作方便,但是工作速度慢,对于题中高频信号的测量会引起致命误差,而且传统51单片机片内资源不丰富,I/O口数量很少,需要通过8155扩展端口。对于集成计数器,测量高频信号时,计数值可达100000000,以10位计数器(74LS160)为例,需串联8个,单片机的外围电路非常复杂,同时复杂的外接电路会影响整个系统的响应时间,导致很大误差。
方案二:高性能AVR单片机与FPGA。
高性能AVR单片机是在传统51单片机的基础上发展起来的,它继承了传统51单片机的优点,并在此基础上有所提高。AVR单片机凭借高速、低功耗、丰富的片类资源等强大功能得到了广泛的应用。通过对FPGA的编程将复杂而庞大的外部硬件计数电路软件化,FPGA内自带的50MHz有源晶振保证了整个系统的响应速度,系统稳定性得到提高,误差减小。
1.3.2 系统总方框图
如下图所示,FPGA完成测量功能,AVR控制液晶显示、温度测量、语音报时、峰值测量、键盘输入等功能。
图3—系统总框图 1.4 各模块硬件实现
1.4.1 FPGA部分
FPGA部分由频率测量模块、周期/时间间隔测量模块、SPI通信模块,PLL等子模块组成。
1.4.1.1 频率测量模块
图4—频率测量模块
频率测量模块由分频模块、门控模块,BCD计数模块和数据锁存模块组成。其中分频模块将FPGA开发板的50M的时钟分频为2Hz门控时钟。门控模块收门控时钟的上升沿,对BCD计数器的使能(enable)、清零(clr)和数据锁存(lck)信号的时序进行控制图5所示。 值得注意的是,本频率测量模块使用的BCD计数器而不是普通二进制计数器。BCD码很大程度上方便了单片机将其转换成字符型数据,最终显示在LCD上。我们发现,二进制码转BCD码的算法较为复杂,同时占用的FPGA的片内资源也较多,故直接采用BCD计数方法。
图5—频率测量时序图
1.4.1.2 周期/时间间隔测量模块
周期测量使用两个状态机(主状态机和sig_sel状态机)实现。
对于低频信号(signal_x),我们直接计算其一个周期包含的量化时钟的数目。对高频信号,将其通过分频器分频后再计算包含的量化时钟的数目。由sig_sel
状态机选择被量化的信号。(如图6所示)
为达到精度0.01%的要求,每个signal时钟需包含大于10000个量化时钟。因此,我们对周期小于100us的信号进行1000倍分频。
图6—自动转量程原理图
时间间隔测量原理与周期测量相同。区别在于时间间隔测量为单次测量,周期测量为连续测量。单脉冲周期无频率而言,故不能经过分频器(sig_sel始终为0)。为区别周期测量和时间间隔测量这两种模式,本模块引入一个模式选择信号(mode)当mode=1时为侧周期模式,当mode=0是为测时间间隔模式。
主状态机:
测量一次上图中signal信号周期需要用3个signal的方波的周期。每一个signal周期对应一种状态,每种状态下执行不同的操作。状态转换图以及各状态的功能如表1所示。
表1—状态机功能 控制时钟 idle hold counting 被测方波(signal)的上升沿Hold,或者rst信号的下降沿: 周期计数器(cnt)清零,hold状态计数器(cnt_hold)*清0, *idle状态计数器(cnt_idle)计数 周期计数器(cnt)计数,idle状态计数器(cnt_idle)清0 周期计数器(cnt)保持,hold状态计数器(cnt_hold)计数 *设置hold状态计数器和idle状态计数器的目的是避免出现被测信号的频率过低而又被1000倍分频导致的电路所死(长时间处于idle或hold状态)的情况。
sig_sel状态机:
sig_sel状态用于控制被测方波是否经过分频,起到了扩大量程和提高测量精度的作用。
sig_sel两个状态的功能如下表2所示 表2—功能表
1 被测方波经过分频 0 被测方波没有经过分频 控制时钟 量化时钟clk_10M,或者rst信号的下降沿:
sig_sel状态机的verilog描述:
always @ (posedge clk) begin
if(rst==0 || mode==0) sig_sel<=0; else if (cnt>=1_0000_000 || cnt_hold>=1_0000_000 || cnt_idle>=1_0000_000) sig_sel<=0;
else if (curr_s==hold && sig_sel==0 && cnt<1_0000) sig_sel<=1; else
sig_sel<=sig_sel; end
计数器:
周期测量同时使用BCD码计数器和二进制计数器。二进制值用于状态的判断和转换。BCD码方便了单片机处理和显示数据,这与频率测量模块相同。
图8—ATmega128与FPGASPI通信
本接口模块中所需实现的逻辑功能是,从机FPGA在主机ATmega128提供的CLK时钟信号下,按照SPI接口规范,按照SPI时序图的规范接受数据,然后执行测量对象选择、液晶显示等操作。其工作流程如下,ATmega128通过MOSI向FPGA发送数据(该数据低八位储存地址信息,高八位储存数据信息,FPGA对地址译码,选择合适的数据输入端),AVR在load端产生下降沿,FPGA将相应数据读入寄存器中,当CS=0,load=1的情况下,在每一个SCLK时钟的上升沿,移位寄存器的数值左移一位。数据就通过MISO送到MCU中。
图9—SPI时序图
(2)量化时钟周期的选择
合适的量化时钟周期可以简化运算的复杂程度,提高测量效率。我们选择10ns为量化时钟信号,计算简单,而且保证了测量精度。
1.4.2信号预处理
系统中计数是以上升沿或下降沿为标准的,因此一般信号需通过电压比较器整形为方波信号。FPGA中的计数器是边沿触发而不是电平触发,整形后波形边沿的陡峭程度显得非常重要。 对于方波信号,我们应根据实际情况整形或者直接通过稳压管稳压后测量相关参数。
对高频信号,我们采用精密TTL比较器MAX941,该比较器具有低功耗、超高速(可达10ns)等优点,可以满足本系统中对高频信号的整形要求。
对于低频信号,经比较器整形后,由于采样速度快,进过比较处理后边沿的陡峭程度受到很大制约,在某种程度上影响了FPGA中计数器对这种非陡峭边沿的识别,从而导致测量中的计数误差。对于低频信号,我们采取可以外接其它整形电