MSPF新编测周法测量信号频率

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;
}
}。

合集下载

一种基于MSP430F149单片机的频率测量模块设计

一种基于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频率测量方法

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

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; } }。

电设工作小结之——MSP430G2553学习笔记—3

电设工作小结之——MSP430G2553学习笔记——3接上一篇继续:二,MSP430G2553的应用设计(一),频率计的设计1,频率计的实现方法有:测频法,测周法,等精度测频。

一般是低频用测周法较准,高频用测频法较准。

等精度测频是比较准的。

2,测周法:(1)可以使用定时器的输入捕获功能,捕获上升沿或下降沿,然后就可以计算出信号的周期,从而得出频率。

(2)也可以把待测信号接到IO上,然后用无限循环不停的查询电平的高低,从而得出信号的周期。

丁老师建议:以丁老师的经验,这种方法测量的精度比用捕获中断的精度要高,因为中断的进入和退出都要占用时间。

(3)但这种侧周法适用于低频信号频率的测量,对于高频信号精度不好。

3,测频法:(1)可以定时一定的时间,然后计算捕获脉冲的个数,从而得出周期。

(2)把待测信号接到IO脚上,然后用IO的中断功能在一定时间内记录脉冲数。

(3)设置Timer0_A的时钟为外接时钟TACLK,然后把待测信号接到该时钟上,把Timer0用作计数器,在一定时间内读取TAR寄存器,得出脉冲个数,从而得出频率。

(4)测频法,使用与测高频信号,对于低频信号误差较大。

4,等精度测频:(1)把Timer0_A工作于计数器模式,计数待测信号。

然后把Timer1_A的时钟设为ACLK,32768Hz的标准晶振,作为标准信号。

然后再外部输入一个控制闸门信号PWM(我觉得也可以用看门狗定时器工作在间隔定时器模式来控制),和待测信号一起通过D触发器控制计数的开始和结束。

这个外接的闸门信号可以用555振荡器产生一个周期可调的PWM,这个PWM 的周期不需要精确的控制,只有知道大概的范围就可,保证计数器不溢出即可,最终测的精度和它的周期没有绝对的关系。

(也可以在计数器溢出时,在溢出中断中记录溢出的次数,这样的话也可以,但是这样中断的进入和退出会对测量精度产生影响)(2) 如果Timer0_A用于其他用途的话,也可以接一个计数器,然后把计数值在输入给单片机(如小车上测速所采用的方法)。

MSPF测频法测量信频率

MSP430F5529测量频率-----测频法信号变换电路过零比较器,lm393输出上拉电阻,两电阻分压程序#include <msp430f5529.h>#include "stdio.h"//测频法,上限1Mhz//看门狗定时1s,开门狗中断处理程序开启捕获器,捕获1s中所有的上升脉冲,脉冲个数即为频率/*优化的反向可以将开门够定时1S使用定时器去定时1s* main.c*/long fre=0;char buf[60]="\0";void SetVcoreUp (unsigned int level){// Open PMM registers for writePMMCTL0_H = PMMPW_H;// Set SVS/SVM high side new levelSVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;// Set SVM low side to new levelSVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;// Wait till SVM is settledwhile ((PMMIFG & SVSMLDL YIFG) == 0);// Clear already set flagsPMMIFG &= ~(SVMLVLRIFG + SVMLIFG);// Set VCore to new levelPMMCTL0_L = PMMCOREV0 * level;// Wait till new level reachedif ((PMMIFG & SVMLIFG))while ((PMMIFG & SVMLVLRIFG) == 0);// Set SVS/SVM low side to new levelSVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;// Lock PMM registers for write accessPMMCTL0_H = 0x00;}void init_clock(){SetVcoreUp (0x01);SetVcoreUp (0x02);SetVcoreUp (0x03);UCSCTL3 = SELREF_2; // Set DCO FLL reference = REFOUCSCTL4 |= SELA_2; // Set ACLK = REFO__bis_SR_register(SCG0); // Disable the FLL control loopUCSCTL0 = 0x0000; // Set lowest possible DCOx, MODxUCSCTL1 = DCORSEL_7; // Select DCO range 50MHz operation UCSCTL2 = FLLD_0 + 609; // Set DCO Multiplier for 25MHz// (N + 1) * FLLRef = Fdco// (762 + 1) * 32768 = 25MHz// Set FLL Div = fDCOCLK/2 __bic_SR_register(SCG0); // Enable the FLL control loop__delay_cycles(782000);do{UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);// Clear XT2,XT1,DCO fault flags SFRIFG1 &= ~OFIFG; // Clear fault flags}while (SFRIFG1&OFIFG); // Test oscillator fault flag}void send_char(char sc){UCA0TXBUF=sc;while(!(UCA0IFG&UCTXIFG));}void send_string(char *s){while(*s!='\0'){send_char(*s++);}}init_uart(){P3SEL |= BIT3+BIT4; // P3.3,4 = USCI_A0 TXD/RXDUCA0CTL1 |= UCSWRST; // **Put state machine in reset**UCA0CTL1 |= UCSSEL__SMCLK; // SMCLKUCA0BR0 = 173; // 1MHz 115200 (see User's Guide) UCA0BR1 = 0; // 1MHz 115200UCA0MCTL |= UCBRS_5 + UCBRF_0; // Modulation UCBRSx=1, UCBRFx=0 UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** //UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt send_string("CLS(0);\r\n");}int main(void) {WDTCTL = WDTPW | WDTHOLD;// Stop watchdog timerinit_clock();//初始化系统时钟为20MHzinit_uart();//串口波特率为115200bpsWDTCTL=WDT_ADLY_1000 ;//开门狗定时1sP1DIR &= ~BIT2; // P1.2 inP1SEL |= BIT2; //捕获输入SFRIE1|=WDTIE; //开看门狗定时器中断__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, enable interrupts__no_operation(); // For debuggerreturn 0;}void measure_fre(){if(fre>=500)sprintf(buf,"DS16(0,60,'频率:%1.1f ',4);\r\n",fre*1.008);if(fre<=52)sprintf(buf,"DS16(0,60,'频率:%1.1f ',4);\r\n",(fre)*1.0);else if(fre<=208)sprintf(buf,"DS16(0,60,'频率:%1.1f ',4);\r\n",(fre+1)*1.0);else if(fre<=496)sprintf(buf,"DS16(0,60,'频率:%1.1f ',4);\r\n",(fre+3)*1.0);send_string( buf);fre=0;TA0CTL = TASSEL_2 + MC_2 + TACLR+TAIE; // SMCLK, 连续mode, clear TAR 8分频下限可以测到8Hz。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档