MSPF新编测周法测量信号频率
一种基于MSP430F149单片机的频率测量模块设计

一种基于MSP430F149单片机的频率测量模块设计雷宇;任文静;焦新程【摘要】频率信号具有抗干扰性强、易于传输、测量准确度较高等优点,因此在电子产品设计中经常需要对频率信号进行测量;设计基于MSP430F149单片机捕获模块的运用,通过计算信号周期实现对频率信号的测量,同时利用滤波电路和放大电路的特性,保障了该模块的抗干扰能力,并对其相关寄存器的设置及硬件电路连接做出了详细的阐述;实现了对小信号频率的精准测量,在对35kHz~50kHz频率进行测量时,最大测试误差为0.5%;该测频模块能准确地对低频信号进行测量,具有体积小、成本低、功耗低、精度高、可靠性强等优点。
【期刊名称】《石油管材与仪器》【年(卷),期】2018(004)006【总页数】4页(P16-19)【关键词】测量频率;捕获比较;滤波放大【作者】雷宇;任文静;焦新程【作者单位】[1]中国石油集团东方地球物理公司西安物探装备分公司,陕西西安710077;[1]中国石油集团东方地球物理公司西安物探装备分公司,陕西西安710077;[1]中国石油集团东方地球物理公司西安物探装备分公司,陕西西安710077;【正文语种】中文【中图分类】P631.430 引言通常石油仪器中的频率,指的是单位时间内电信号周期变化的次数。
由于频率信号具有抗干扰性强、易于传输、测量准确度较高等优点,因此在石油仪器领域被广泛应用。
频率信号的测量一般通过FFT数字信号处理来实现,这种方法能保障测量精度,但软件算法复杂,硬件电路需要将模拟信号转换为数字信号后才能对频率进行测量,设计成本高。
本文利用MSP430F149单片机的捕获比较寄存器实现对频率的测量,无需进行模数转换,有效降低硬件成本,减少程序复杂性,提高系统稳定性。
为了有利于对小信号的测量,本文中使用了滤波放大电路,能有效的提高抗干扰能力及对小信号的识别能力。
1 设计原理与思路1.1 设计原理我们已经知道了频率即是单位时间内信号周期变化的次数,该测频模块的设计原理则是通过测量电路内一个脉冲信号的周期,然后对其求倒数,得出其频率。
STM32F103频率测量方法

频率测量可以用测周法和测频法:1.测周法:通过一个方波的两个上升沿或下降沿触发中断,然后定时器计数,计数的总个数乘以计数单位时间即该方波的周期。
实际程序如下:void TIM3_Encoder_IN_Init(u16 arr,u16 psc){GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin= GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);TIM_TimeBaseStructure.TIM_Prescaler=psc; //TIM时钟频率100kHz,10us//56M//24M//TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD-1; //ENCODER_TIM_PERIOD=(u16)(65000)TIM_TimeBaseStructure.TIM_Period=arr; //测频范围在1.6Hz到100kHzTIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //计数模式向上TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);//定时器初始化//通道1TIM_ICInitStructure.TIM_Channel =TIM_Channel_1; //通道选择TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿触发TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //管脚与寄存器对应关系TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //输入预分频。
信号频率的测量方法与误差

信号频率的测量方法与误差【摘要】本文介绍了几种信号频率的测量方法,并对实现电路的构成和特点进行比较,探讨了误差引起的原因。
【关键词】电桥;谐振;差拍;时标信号信号频率的测量在电子测量技术领域中具有重要的地位,深入了解信号频率的测量方法可以帮助我们掌握其它物理量的测量。
1.直接法直接法是利用电路频率响应特性的可调无源网络测量频率值。
如果电路的频率特性为:(式中为己知参数),根据函数关系式可以求出频率。
这种测频方法的优点是简单、价廉,但精确度不高。
无源测频法常用的有电桥测频法和谐振测频法,主要用于频率粗测。
1.1 电桥测频法电桥法测频是利用交流电桥平衡条件和电桥电源频率有关这一特性来测量频率的,原理电路如图1.1所示,调节电桥平衡的可变电阻和电容的调节旋钮,电桥指示平衡时,被测频率值为。
在高频时,由于电阻或电容带来的寄生参数影响比较严重,会大幅降低测量精度,所以电桥法测频一般只适用于低频段10kHz以下的音频范围的测量。
1.2 谐振测频法谐振法测量频率的原理和测量方法都比较简单,可作为频率粗测,误差来源主要有:(1)实际中电感、电容损耗越大,品质因数越低,不容易找出真正的谐振点。
(2)面板上的频率刻度是在规定的标定条件下刻度的,当环境温度和湿度等因数变化时,将使电感、电容的实际值发生变化,从而使回路的固有频率变化。
(3)由于频率刻度不能分得无限细,人眼读数常常有一定误差。
2.比较法利用标准频率与被测频率比较测量,测量是要求标准频率连续可调,并能保持其准确度。
比较法可以为差拍法、差频法、示波器法。
2.1 差拍法差拍法是利用已知的参考频率和被测频率进行差拍,产生差频,再精确差频来确定频率值,拍频法通常只用于音频的测量,而不宜用于高频测量。
差拍法通过提取待测信号相对于参考信号的相位差信息作为差拍信号,差拍信号的频率值远小于原待测信号,较之直接测量待测信号,差拍法提高了测量的分辨率,但不能测量两个频率的相位差。
一种多周期测量频率的方法及应用

一种多周期测量频率的方法及应用作者:李广明杨雷来源:《现代电子技术》2008年第12期摘要:利用多周期测量方法,通过对信号进行分频准确测量出气压传感器输出信号的周期和频率。
利用P89LPC935内部的A/D转换器测量环境温度进行温度补偿,选取准确度优于5 ppm的晶振,测量周期的误差最小可控制在0.001 1 μs。
该测量方法成功地应用于与河南省气象局合作开发的自动气象站中。
用多周期测量的方法快速准确测量信号的频率(周期)基于2个条件:信号是连续的;单片机的晶振必须使用外接的高精度、高稳定晶体振荡器。
关键词:频率测量;多周期测量法;测量误差;A/D转换器Method and Appication of Multi-Abstract: To measure frequency of the atmospheric pressure by using the electrically-induced resonator pressure transducer,multi-period measurement method is employed,which obtains accurate results by dividing signal frequency.Accurate atmospheric pressure is obtained via temperature compensation with the environmental temperature acquired from the ADC on P89LPC935.The prerequisite for using this period measuring method is choosing a crystal oscillator with its accuracy better than 5 ppm.Thereby the minimum measuring error can b e controlled within 0.001 1 μs.The presented measuring method is successfully used in the automatic weather station developed through our cooperation with Henan Weather Bureau.The two important conditions for using the multi-period measurement method to measure a signal period (frequency accurately and fast are: the signal has highly-stable frequency and is a continuous signal;the crystal oscillator of the single chip is an external highly-accurate and highly-eywords:frequency measurement;multi-period measurement method;measuring error;A/D1 引言多周期测量法是一种很灵活的频率测量方法,通过调整被测信号的周期个数可以在测量精度和测量时间二者之间做出最佳选择,对于用普通的测频法和测周法难以保证测量精度的非等周期信号,如气压传感器的输出信号,多周期测量法是最佳选择。
单片机测周法测频法程序

单片机测周法测频法程序单片机是现代电子设备中常见的一种微型控制器,它可以完成各种功能,包括测量周波或频率。
在单片机中使用测周法或测频法测量信号的周期或频率是一种常见的应用。
本文将介绍如何使用单片机编写程序进行测周法和测频法测量。
首先,我们来介绍测周法。
测周法是一种通过测量信号的周期来确定频率的方法。
在单片机中实现测周法的程序可以分为以下几个步骤:1.初始化IO口和定时器首先,我们需要将单片机的IO口和定时器进行初始化。
这包括设置IO口为输入模式以接收信号,设置定时器的工作模式和时钟源。
2.开始计时接下来,我们需要开始定时器进行计时。
当信号的上升沿到来时,我们需要记录当前定时器的计数值。
3.等待信号下降沿到来在信号的下降沿到来之前,我们需要等待信号的下降沿到来。
4.停止计时并记录计数值当信号的下降沿到来时,我们需要停止定时器进行计时,并记录当前的计数值。
5.计算周期并计算频率最后,我们可以通过计算上升沿到下降沿的计数差,并结合定时器的时钟频率来计算信号的周期。
然后我们可以通过周期的倒数来计算信号的频率。
下面是一个简单的单片机测周法测量程序的伪代码示例:```c//初始化IO口和定时器init_io();init_timer();//开始计时start_timer();//等待信号下降沿到来wait_falling_edge();//停止计时并记录计数值stop_timer();record_count();//计算周期并计算频率calculate_period();calculate_frequency();```接下来我们来介绍测频法。
测频法是一种通过测量信号的频率来确定周期的方法。
在单片机中实现测频法的程序可以分为以下几个步骤:1.初始化IO口和计数器同样,我们需要将单片机的IO口和定时器进行初始化。
这包括设置IO口为输入模式以接收信号,设置计数器的工作模式和时钟源。
2.开始计数接下来,我们需要开始计数。
msp430f449测方波周期、频率、占空比程序.doc

}
void xians4(uchar x,uchar y2,uint shu1) { uint ge,shi,bai,qian,wan; lcd_xy(x,y2); wan=shu1/10000; qian=shu1/1000%10; bai=shu1/100%10; shi=shu1/10%10; ge=shu1%10; wr_lcd(dat,wan+0x30); wr_lcd(dat,qian+0x30); wr_lcd(dat,bai+0x30); wr_lcd(dat,shi+0x30); wr_lcd(dat,ge+0x30); } /******************************************************************* 中断处理函数 *******************************************************************/ #pragma vector=TIMERA0_VECTOR //==定时器 A 中断处理== __interrupt void TimerA0(void) {
cap_diff=new_cap-old_cap; } old_cap=new_cap; } else if (CCTL1&CM_2) //==捕获到下降沿==
{ down_cap=T ACCR0; CCTL1=(CCTL1&(~CM_2))|CM_1; //==更变设置为上升沿触发== if(old_cap>down_cap)
上升沿同步cci0ap10信号源捕获功能捕获中断允许tactltassel2mc2
#include <msp430x44x.h> #include "12864c.h" #define uint unsigned int #define uchar unsigned char
测频法和测周法转速测量的课程设计报告

一、任务要求1.性能要求:测量范围: 5~5000rpm;2.功能要求:采用 MCS51 系列单片机完成测量,并将测量值显示于数码管上。
分别采用测频法和测周法进行设计,并比较不同速度段的测量精度。
二、方案论证系统组成:图 1-1 系统组成框图如图 1-1 所示,本次设计的系统主要由以下几个部分组成,即:传感器、单片机以及显示部分组成。
各个部分的方案论证如下:2.1 传感器的选择目前,可用于测速的传感器有很多,例如:光电传感器,开关型霍尔传感器,电涡流传感器以及光电编码器等。
方案一:采用光电传感器光电传感器是通过光电二极管和光敏三极管把光输入信号转化为磁输入信号的器件。
光电传感器的优点是响应速度快、测量精度高,能够直接输出高低电平,缺点是容易受外来光线、灰尘等的影响,即对周围环境的要求比较高。
方案二:采用开关型霍尔传感器开关型霍尔传感器是利用霍尔效应把磁输入信号转换成电信号的器件。
开关型霍尔的优点是能够直接输出高低电平,属于大信号传感器,对外部的信号调理电路要求不高,缺点是响应速度不如光电传感器。
方案三:采用电涡流传感器电涡流传感器是利用电涡流效应来工作的传感器,具有长期工作稳定性好,抗干扰能力强,但是输出信号比较弱,后续处理电路比较复杂,且一般价格比较高。
在灰尘和粉尘较少而要求频率响应范围比较宽的情况下,可以采用光电传感器。
而在灰尘和粉尘比较多的情况下,则选用开关型霍尔传感器。
由于本次设计主要针对自行车和汽车的测速,故选用开关型霍尔传感器。
2.2 显示模块的选择方案一:采用 LED数码管LED数码管只可以显示数字和简单的字母,其优点是价格便宜,程序编写比较简单,功耗低,缺点是亮度不高,在要显示数字多的场合下,体积较大,比较占空间。
方案二:采用LCD1602液晶显示LCD1602液晶显示模块具有体积小、功耗低,对比度可调且能够显示 ASC II码和简单的汉字等优点,其缺点是成本比数码管高,而且程序编写相对复杂。
基于MSP430F5438A单片机测量频率的程序实例

基于MSP430F5438A单片机测量频率的程序实例基于MSP430F5438A单片机测量频率的程序实例/*****************************************************程序描述:利用Timer_A捕获脉冲宽度利用MSP430单片机定时器A和捕获/比较功能模块结合使用,实现脉冲宽度的测量程序用到了定时器A的CCI1A端口(MSP430F14X的P1.2引脚)作捕获外部输入的脉冲电平跳变,start,end,两个个变量来计算脉冲宽度*****************************************************/#include"msp430x14x.h"#include"lcd12864.h"uint start,end;uint width;//==用于存放脉宽==uint period;//==用于存放周期==uint frequency;//==用于存放频率==uint fy[7];//==用于存放频率显示数据==uint pd[7];//==用于存放周期显示数据==uint wh[6];//==用于存放脉宽显示数据==const unsigned char zhouqi[]={"周期为:(us) "};const unsigned char us[]={"us "};const unsigned char pinlv[]={"频率为:(Hz) "};const unsigned char hz[]={"HZ "};void process(void);//==函数声明==void delay();//==延时函数==void InitSys(); //==初始化时钟==/****************************************************主函数****************************************************/int main(void){WDTCTL = WDTPW + WDTHOLD;//==关狗==InitSys();//==初始化时钟,SMCLK,MCLK均为8M==P1DIR&=~BIT2;P1SEL = BIT2;//==设置P1.2端口为功能模块使用,即:做捕获源==TACTL = TASSEL_2+ID_3+TACLR+TAIE+MC1;//==定时器A时钟信号选择SMCLK,8分频,同时设置定时器A计数模式为连续增计模式==CCTL1 =CM_1+SCS+CAP+CCIE;//==输入上升沿捕获,CCI0A为捕获信号源==_EINT();//==开全局中断允许==Ini_Lcd();//==初始化液晶==Clear_GDRAM();//==清屏==Disp_HZ(0x80,zhouqi,8);Disp_HZ(0x88,pinlv,8);while(1){process();Write_Cmd(0x90);//==写地址==Write_Data(0x30+pd[6]);Write_Data(0x30+pd[5]);Write_Data(0x30+pd[4]);Write_Data(0x30+pd[3]);Write_Data(0x30+pd[2]);Write_Data(0x30+pd[1]);Write_Data(0x30+pd[0]);Write_Cmd(0x98);//==写地址==Write_Data(0x30+fy[6]);Write_Data(0x30+fy[5]);Write_Data(0x30+fy[4]);Write_Data(0x30+fy[3]);Write_Data(0x30+fy[2]);Write_Data(0x30+fy[1]);Write_Data(0x30+fy[0]);delay();}}/*****************************************************初始化时钟*****************************************************/ void InitSys(){unsigned int i;//--- 使用XT2振荡器---BCSCTL1&=~XT2OFF;//==打开XT2振荡器==do{IFG1 &=~OFIFG;//==清除振荡器失效标志==for(i = 0xFF; i > 0; i--);//==延时,等待XT2起振==}while((IFG1 & OFIFG)!= 0);//==判断XT2是否起振== BCSCTL2 =SELM_2+SELS;//==选择MCLK、SMCLK为XT2,8M== }/*****************************************************延时函数*****************************************************/void delay(){unsigned int i;unsigned int j=10;for(i=10;i>0;i--){while(j--);}}/***************************************************数据处理***************************************************/void process(void){while(end<start);< bdsfid="155" p=""></start);<>//while(endstart width = end-start;//==实际脉冲宽度的计算==period = 2* width;frequency=1000000/period;pd[6]=period/1000000;pd[5]=(period-1000000*pd[6])/100000;pd[4]=(period-1000000*pd[6]-100000*pd[5])/10000;pd[3]=(period-1000000*pd[6]-100000*pd[5]-10000*pd[4])/100 0;pd[2]=(period-1000000*pd[6]-100000*pd[5]-10000*pd[4]-1000*pd[3])/100;pd[1]=(period-1000000*pd[6]-100000*pd[5]-10000*pd[4]-100 0*pd[3]-100*pd[2])/10;pd[0]=period%10;fy[6]=frequency/1000000;fy[5]=(frequency-1000000*fy[6])/100000;fy[4]=(frequency-1000000*fy[6]-100000*fy[5])/10000;fy[3]=(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4])/10 00;fy[2]=(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4]-100 0*fy[3])/100;fy[1]=(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4]-100 0*fy[3]-100*fy[2])/10;fy[0]=frequency%10;}/***************************************************中断处理函数***************************************************/#pragma vector=TIMERA1_VECTOR //==定时器A中断处理==__interrupt void timer_a(void){switch(TAIV)//==向量查询=={case 2://==捕获中断==if(CCTL1&CM0)//==捕获到上升沿=={CCTL1=(CCTL1&(~CM0))|CM1;//==更变设置为下降沿触发== start=TAR;//==记录初始时间==}else if(CCTL1&CM1)//==捕获到下降沿=={CCTL1=(CCTL1&(~CM1))|CM0;//==更变设置为上升沿触发== end=TAR;//==用start,end,overflow计算脉冲宽度==}break;default: break; } }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
M S P430F5529测量频率
-----测周法信号变换电路
过零比较器,lm393输出上拉电阻,两电阻分压
程序
#include<>
#include""
#include""
//测周法,在捕获过程中,定时溢出不能被检测出,选择时钟频率为低频时能测出低频,频率高能测出频率高的部分
/*
*
*/
longlongstart=0;
//longlongintstop=0;
doublefre=;
unsignedchari=0;
unsignedcharover=0;
voidSetVcoreUp(unsignedintlevel)
{
//OpenPMMregistersforwrite
PMMCTL0_H=PMMPW_H;
//SetSVS/SVMhighsidenewlevel
SVSMHCTL=SVSHE+SVSHRVL0*level+SVMHE+SVSMHRRL0*level;
//SetSVMlowsidetonewlevel
SVSMLCTL=SVSLE+SVMLE+SVSMLRRL0*level;
//WaittillSVMissettled
while((PMMIFG&SVSMLDLYIFG)==0);
//Clearalreadysetflags
PMMIFG&=~(SVMLVLRIFG+SVMLIFG);
//SetVCoretonewlevel
PMMCTL0_L=PMMCOREV0*level;
//Waittillnewlevelreached
if((PMMIFG&SVMLIFG))
while((PMMIFG&SVMLVLRIFG)==0);
//SetSVS/SVMlowsidetonewlevel
SVSMLCTL=SVSLE+SVSLRVL0*level+SVMLE+SVSMLRRL0*level;
//LockPMMregistersforwriteaccess
PMMCTL0_H=0x00;
}
voidinit_clock()
{
SetVcoreUp(0x01);
SetVcoreUp(0x02);
SetVcoreUp(0x03);
UCSCTL3=SELREF_2;//SetDCOFLLreference=REFO
UCSCTL4|=SELA_2;//SetACLK=REFO
__bis_SR_register(SCG0);//DisabletheFLLcontrolloop
UCSCTL0=0x0000;//SetlowestpossibleDCOx,MODx
UCSCTL1=DCORSEL_7;//SelectDCOrange50MHzoperation UCSCTL2=FLLD_0+609;//SetDCOMultiplierfor25MHz
//(N+1)*FLLRef=Fdco
//(762+1)*32768=25MHz
//SetFLLDiv=fDCOCLK/2
__bic_SR_register(SCG0);//EnabletheFLLcontrolloop
__delay_cycles(782000);
do
{
UCSCTL7&=~(XT2OFFG+XT1LFOFFG+DCOFFG);
//ClearXT2,XT1,DCOfaultflags
SFRIFG1&=~OFIFG;//Clearfaultflags
}while(SFRIFG1&OFIFG);//Testoscillatorfaultflag
}
voidsend_char(charsc)
{
UCA0TXBUF=sc;
while(!(UCA0IFG&UCTXIFG));
}
voidsend_string(char*s)
{
while(*s!='\0')
{
send_char(*s++);
}
}
init_uart()
{
P3SEL|=BIT3+BIT4;//,4=USCI_A0TXD/RXD
UCA0CTL1|=UCSWRST;//**Putstatemachineinreset**
UCA0CTL1|=UCSSEL__SMCLK;//SMCLK
UCA0BR0=173;//1MHz115200(seeUser'sGuide)
UCA0BR1=0;//1MHz115200
UCA0MCTL|=UCBRS_5+UCBRF_0;//ModulationUCBRSx=1,UCBRFx=0
UCA0CTL1&=~UCSWRST;//**InitializeUSCIstatemachine**
UCA0IE|=UCRXIE;//EnableUSCI_A0RXinterrupt
send_string("CLS(0);\r\n");
}
intmain(void){
charbuf[60]="\0";
WDTCTL=WDTPW+WDTHOLD;//StopWDT
init_clock();
init_uart();
P1DIR&=~BIT2;//
P1SEL|=BIT2;//捕获输入
TA0CTL=TASSEL_2+ID__8+MC_2+TACLR+TAIE;//SMCLK,连续mode,clearTAR8分频下限可以测到8Hz。
上限200K左右
TA0CCTL1=CM_1+SCS+CAP+CCIE;
__bis_SR_register(GIE);//EnterLPM0,enableinterrupts
while(1)
{
sprintf(buf,"DS16(0,60,'频率:%',4);\r\n",fre);
send_string(buf);
__delay_cycles(314574);
}
}
//下限频率15,上限200K左右
#pragmavector=TIMER0_A1_VECTOR
__interruptvoidTIMER0_A1_ISR(void)
{
switch(__even_in_range(TA0IV,14))
{
case0:break;//Nointerrupt
case2://CCR1
{
i++;
if(i==1)
{ over=0;
TA0CTL|=TACLR;
}
if(i>=51)
{
i=0;
TA0CCTL0&=~CCIE;
start=over*65536+TA0CCR1;
TA0CTL|=TACLR;
}
}
break;
case4:break;//CCR2notused
case6:break;//CCR3notused
case8:break;//CCR4notused
case10:break;//CCR5notused
case12:break;//CCR6notused
case14:over++;
break;//定时器溢出
default:break;
}
}。