雷 宇,任文静,焦新程
(中国石油集团东方地球物理公司西安物探装备分公司 陕西 西安 710077)
通常石油仪器中的频率,指的是单位时间内电信号周期变化的次数。由于频率信号具有抗干扰性强、易于传输、测量准确度较高等优点,因此在石油仪器领域被广泛应用。频率信号的测量一般通过FFT数字信号处理来实现,这种方法能保障测量精度,但软件算法复杂,硬件电路需要将模拟信号转换为数字信号后才能对频率进行测量,设计成本高。本文利用MSP430F149单片机的捕获比较寄存器实现对频率的测量,无需进行模数转换,有效降低硬件成本,减少程序复杂性,提高系统稳定性。为了有利于对小信号的测量,本文中使用了滤波放大电路,能有效的提高抗干扰能力及对小信号的识别能力。
我们已经知道了频率即是单位时间内信号周期变化的次数,该测频模块的设计原理则是通过测量电路内一个脉冲信号的周期,然后对其求倒数,得出其频率。由于MSP430系列单片机定时器结构复杂,功能强大,适用于工业控制,如数字化电机控制,电表和手持仪表的理想配置。它给开发人员提供了较多灵活的选择余地。MSP430系列单片机,采用16位的定时器,加上内部的比较器,至少能达到10位的A/D测量精度。本设计主要是采用定时器的捕获/比较模式,主要是用于捕获事件发生的时间或者是产生的时间间隔,该功能的引入主要是为了提高I/O端口处理事务的能力与速度。
在捕获模式中,当满足捕获条件时,硬件自动将计数器TAR的值写入CCRx寄存器中。如测量某脉冲(高电平)的脉冲长度,可定义为上升沿和下降沿都捕获,在上升沿时,捕获一个定时器数据,这个数据在捕获寄存器中读出,在等到下降沿到来时,在下降沿又捕获一个定时器数据,那么两次捕获的定时器数据差就是脉冲的高电平时间。同理若要测量脉冲的周期,一个脉冲的周期包括高电平与低电平,若要从高电平开始捕获,可定义为两次上升沿捕获,两次捕获的定时器数据差即为该脉冲的周期通过倒数可以求出该频率(若是从低电平开始捕获则定义为两次下降沿捕获)。
若输入信号较小,不满足单片机采集要求,需要对信号进行放大处理,同时为了减小系统的噪音水平,提高抗干扰能力,需要进行滤波处理,本文提供了作者针对30 kHz~50 kHz的信号进行采集处理的方案,以供参考。
本设计采用有源带通滤波器,该滤波器输入阻抗高,输出阻抗低,具有良好的隔离性能,因此各级之间不需要进行阻抗匹配。在滤波电路中使用轨对轨运放正负电压供电,实现信号的滤波放大,该电路具有失真小,动态范围大特性。
由于单片机使用3.3 V供电电压,采集信号范围为0~3.3V,因此需要对放大后的信号进行处理,满足单片机采集要求。信号处理使用3.3 V供电的门电路。
总体设计框图1所示。
图1 总体设计框图
2.1.1 有源带通滤波器设计
使用运算放大器OPA1611来实现滤波放大电路,电路如图2所示。
图2 滤波放大电路图
电路性能参数:
(1)
(2)
(3)
使用PSPICE软件对滤波电路频域进行仿真,连接硬件电路,仿真结果如图3所示。
图3 电路仿真图
具体参数见表1。
表1 仿真结果参数
2.1.2 信号整形设计
由于运放使用+3.3V电压供电,因此输出信号最大峰-峰值为6.6 Vpp,单片机的供电范围为0~3.3 V,因此,可以使用两输入与非门,实现输出0~3.3 V的方波信号。电路图如图4所示。
输入35 kHz的频率信号,经过滤波后输出波形如图5所示。
图4 最终电路图
图5 滤波输入图形
经过两输入与非门后输出波形如图6所示。
图6 最终输出波形
从上图可以看出,输出波形满足单片机要求,即可对该频率进行检测。
本设计采用定时器Timer A的捕获比较模块1即为P1.2端口的第二功能。采用系统外部高速时钟,在此处系统外部时钟越高,则测量精度相对来说越高。采用连续计数模式,Timer A中计数模式共分为4种分别是停止模式:该模式用于定时器暂停,并不发生复位,所有寄存器现行的内容在停止模式结束后都可用,当定时器暂停后重新计数时,计数器将从暂停时的值开始以暂停前的计数方向计数;第二种是增计数模式,该模式适用于小于65 536的连续计数情况。计数器TAR可以增计数到CCRx的值,当计数值与CCRx的值相等(或大于CCRx的值)时,定时器复位并从0重新开始计数。第三种为连续计数模式,在需要65 536个时钟周期的定时应用场合常采用此模式。定时器从当前计数值计数到65 536后,又从0重新开始计数。第四种为增/减计数模式,在生成对称波形的情况下可以采用此模式,该模式下,定时器先增计数到CCR0的值,然后反向计数到0。
为了测量频率为30 kHz以上的信号的周期,需要使用连续计数模式,采用两次上升沿同步捕获。
经过整形后的方波信号,连接MSP430F149的P1.2端口,首先对P1.2端口进行初始化,程序如下所示:
P1SEL |= BIT2;
//P1.2选择第二功能
P1DIR &= ~BIT2;
//P1.2选择为输入口
TACTL = TASSEL_2 + MC_2+ID_0+TAIE;
//定时器使用主时钟、连续计数模式
TACCTL1 |= CAP+CM_1 + SCS + CCIS_0+ CCIE;
//选择捕获模式、使用上升沿同步捕获
当检测到输入信号上升沿时,会进入捕获中断程序,如下所示:
#pragma vector=TIMERA1_VECTOR
//捕获中断子程序
__interrupt void TimerA1(void)
{
switch(TAIV)
//判断中断向量寄存器
{
case 2://比较/捕获模块1中断
x++;
if(x==1)old_cap=TACCR1;
//第一次上升沿捕获计数值
if(x==2)
{
period=TACCR1+65536*TA_ov_num-old_cap;
//计算脉冲周期
TA_ov_num=0;
x=0;
}
break;
case 4:break;
//比较/捕获模块2中断未使用
case 10:TA_ov_num++;
//是否溢出
break;
}
程序中old_cap表示第一次上升沿捕获的值,TACCR1为第二次上升沿捕获的值,当计数值到65 536时从0开始重新计数即为溢出,溢出后TA_ov_num加1,否则为0,period为当前计算出的脉冲周期。
使用信号源输出峰峰值为3.3Vpp的方波信号,单片机外接8MHz高速晶振作为主时钟,使用该程序对频率进行检测,结果如表2所示。
表2 标准频率测量结果
从上表可以看出,使用该程序测试,最大误差为0.5%。
从上述可以看出,本设计能对频率信号进行精确测量,最大测试误差为0.5%。这种基于MSP430F149单片机的频率测量模块,体积小巧,设计成本不高,可集成到各种对测量频率信号有需求电子仪器当中。