MSPF测周法测量信号频率
电子计数器测频和测周的原理

电子计数器测频和测周的原理一、实验目的1. 了解频率测量的基本原理。
2. 了解电子计数器测频/测周的基本功能。
3. 熟悉电子计数器的使用方法。
二、实验内容1. 频率测量,并了解测频方式下:闸门时间与测量分辨率关系。
2. 周期测量,并了解测周方式下:时标、周期倍增与测量分辨率关系。
三、实验器材1. SJ-8002B 电子测量实验箱1台 2.双踪示波器(20MHz 模拟或数字示波器) 1台3.函数信号发生器(1Hz ~1MHz ) 1台 4.计算机(具有运行windows2000和图形化控件的能力) 1台四、实验原理1.测频原理所谓“频率”,就是周期性信号在单位时间变化的次数。
电子计数器是严格按照/f N T =的定义进行测频,其对应的测频原理方框图和工作时间波形如图1 所示。
从图中可以看出测量过程:输入待测信号经过脉冲形成电路形成计数的窄脉冲,时基信号发生器产生计数闸门信号,待测信号通过闸门进入计数器计数,即可得到其频率。
若闸门开启时间为T 、待测信号频率为xf ,在闸门时间T内计数器计数值为N ,则待测频率为/x f N T = (1)若假设闸门时间为1s ,计数器的值为1000,则待测信号频率应为1000Hz 或1.000kHz ,此时,测频分辨力为1Hz 。
图1 测频原理框图和时间波形2.测周原理由于周期和频率互为倒数,因此在测频的原理中对换一下待测信号和时基信号的输入通道就能完成周期的测量。
其原理如图2所示。
图2 测周原理图待测信号Tx 通过脉冲形成电路取出一个周期方波信号加到门控电路,若时基信号(亦称为时标信号)周期为0T ,电子计数器读数为N ,则待测信号周期的表达式为x N T MT ⨯=(2) 例如:x f = 50Hz ,则主门打开1/50Hz (= 20ms )。
若选择时基频率为0f = 10MHz ,时基0T =0.1us ,周期倍乘选1,则计数器计得的脉冲个数为0x N T T == 200000 个,如以ms 为单位,则计数器可读得20.0000(ms) ,此时,测周分辨力为0.1us 。
STM32单片机测量方波频率方法总结

STM32单片机测量方波频率方法总结一、测周法:通过一个方波的两个上升沿或下降沿触发中断,然后定时器计数,计数的总个数乘以计数单位时间即该方波的周期,具体可通过单片机输入捕获功能实现,以下为参考代码//输入捕获初始化函数void input_frequent_init(void) //采用TIM4的Channel_1通道作为输入捕获通道{//声明结构体变量,用来初始化定时器TIM_TimeBaseInitTypeDef TIM4_TimeBaseInitStructure;TIM_ICInitTypeDef TIM4_ICInitStructure;NVIC_InitTypeDef TIM4_NVIC_InitStructure;/* 开启定时器4时钟 */RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);TIM_ClearITPendingBit(TIM4,TIM_IT_Update|TIM_IT_CC1); //清除捕获和中断标志位TIM4_TimeBaseInitStructure.TIM_Period = 0xffff;//设定计数器自动重装值(设置为最大)TIM4_TimeBaseInitStructure.TIM_Prescaler = 1; //设置分频系数TIM4_TimeBaseInitStructure.TIM_ClockDivision = TIM_C KD_DIV1; //设置时钟分割:TDTS = Tck_timTIM4_TimeBaseInitStructure.TIM_CounterMode = TIM_Cou nterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM4,&TIM4_TimeBaseInitStructure);/ /根据结构体参量初始化定时器TIM4_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入捕获的输入端,IC1映射到TI1上TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity _Rising; //设置为上升沿捕获TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelecti on_DirectTI; //映射到TI1上TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV 1; //配置输入分频,不分频TIM4_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=000 0 配置输入滤波器,此处不滤波TIM_ICInit(TIM4, &TIM4_ICInitStructure); //初始化TIM 4通道1//中断分组初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);TIM4_NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;//打开TIM4的全局中断TIM4_NVIC_InitStructure.NVIC_IRQChannelPreemptionPri ority=1; //抢占优先级配置为1TIM4_NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //响应优先级配置为1TIM4_NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能NVIC_Init(&TIM4_NVIC_InitStructure); //初始化中断TIM_Cmd(TIM4,ENABLE); //使能中断TIM_ITConfig(TIM4, TIM_IT_Update|TIM_IT_CC1, ENABLE ); //使能捕获和更新中断}需要注意的是,如果所测信号中存在尖峰干扰信号,则TIM4_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器,此处不滤波这一行应根据干扰信号的高电平时间来赋予合适的滤波器的值,具体计算方法参考芯片手册或自行百度。
信号频率的测量方法与误差

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

单片机测周法测频法程序单片机是现代电子设备中常见的一种微型控制器,它可以完成各种功能,包括测量周波或频率。
在单片机中使用测周法或测频法测量信号的周期或频率是一种常见的应用。
本文将介绍如何使用单片机编写程序进行测周法和测频法测量。
首先,我们来介绍测周法。
测周法是一种通过测量信号的周期来确定频率的方法。
在单片机中实现测周法的程序可以分为以下几个步骤: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
基于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; } }。
频率测量原理及应用-精品文档

fs=1/Ts 晶振
倍频器(m)
Ts/m
闸门
计数显示
TX
放大整 TX 分频器 Kf TX
型电路
(1/Kf)
门控电路
电子计数Kf
注意:适用于测量低的频率
误差分析
测量最本质的原理图
t1
t2
误差的主要来源:
1. 基准频率的误差: 准确度与稳定度 2. 频率源:晶振、有源晶振、原子钟、光钟 2. 电子计数器的舍入误差:±1
无源测量方法
3、频率—电压变换法:
频率—电压变换法测频就是先把频率信号变换为 电压或电流信号,然后用带有频率刻度的电压表或
电流表直接得出被测频率。
ux
A
B
U0
脉冲形成
单稳态多谐振荡器
积分
有源测量方法
1、拍频法:
将被测信号与标准信号经线性元件直接进 行叠加来实现频率的测量。通常只用于音 频的测量。
M
fx ~
LC
v
谐振法测频原理
fx
c
无源测量方法
平衡条件与频率有关的电桥都可以用来测量
2、电桥法: 频率,电桥的频率特性应尽可能尖锐。常用的电
桥有:文氏电桥、谐振电桥、双T电桥。
fx ~
C1
R3
R1
R2 R4
C2
fx
R
C
取R1= R2=R,C1=C2=C,则由f= ω/2 π 得 fx=1/2πRC
fx ~ fs ~
v
耳机
示波器
有源测量方法
2、差频法:
利用非线性器件和标准信号对被测信号 进行差频变换来实现频率的测量。适用 于高频段的测量。
fx ~
混频
电子测量与常用仪器的使用 (4)

tφ
φ TX 3600
图4.22 相位差测量的原理
(c)脉冲宽度 图4.19 脉冲参数测量原理框图
(d)上升沿时间
4.6 相位差的测量方法 4.6.1 用示波器测量相位 差 x 360 x 1.单踪示波器法 AB 360 2、双踪示波器法 AC
0 T
u1(t) C
A
B
u2(t)
图4.20 直线扫描法测量相位差
3、李沙育图形法 4.6.2 用电子计数器测量相位差 1.电路组成 2.测量原理
4.垂直方式的选择 (1)垂直方式的选择 (2)输入耦合方式的选择 (3)灵敏度选择(V/div)的设定 5.触发源的选择 (1)触发源的选择 (2)内触发源选择 6.水平系统的操作 (1)扫描速度选择(t/div)的设定 (2)触发方式的选择 (3)“极性”的选择 (4)“电平”的位置
4.2.3使用示波器测量频率的操作方法 1.操作步骤 (1)将示波器的扫描速度微调旋钮置于“校准”位 置。 (2)将待测信号送至示波器的垂直输入端。 (3)将示波器的输入耦合开关置于“AC”位置。 (4)调节扫描速度开关(时基开关),使选择的扫 描恰当,屏上显示适中稳定的波形,记录值。 (5)读出被测交流信号的一个周期在荧光屏水平方 向所占的距离。 (6)计算被测交流信号的周期并求出信号频率。
第4章 频率和时间的测量技术与测 量仪器
4.1频率和时间测量的基本要求和方法 4.2 使用示波器测量频率的操作方法 4.3 使用电子计数器测量频率 4.4 使用数字频率计测量频率的操作方法 4.5 时间间隔的测量方法 4.6 相位差的测量方法
4.1频率和时间测量的基本要求和方法
1 频率和周期的关系为: T f
4.4 使用数字频率计测量频率的操作方 法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
M S P430F5529测量频率
-----测周法信号变换电路
过零比较器,lm393输出上拉电阻,两电阻分压
程序
#include <>
#include ""
#include ""
//测周法,在捕获过程中,定时溢出不能被检测出,选择时钟频率为低频时能测出低频,频率高能测出频率高的部分
/*
*
*/
long long start=0;
//long long int stop=0;
double fre=;
unsigned char i=0;
unsigned char over=0;
void SetVcoreUp (unsigned int level)
{
// Open PMM registers for write
PMMCTL0_H = PMMPW_H;
// Set SVS/SVM high side new level
SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;
// Set SVM low side to new level
SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;
// Wait till SVM is settled
while ((PMMIFG & SVSMLDLYIFG) == 0);
// Clear already set flags
PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);
// Set VCore to new level
PMMCTL0_L = PMMCOREV0 * level;
// Wait till new level reached
if ((PMMIFG & SVMLIFG))
while ((PMMIFG & SVMLVLRIFG) == 0);
// Set SVS/SVM low side to new level
SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;
// Lock PMM registers for write access
PMMCTL0_H = 0x00;
}
void init_clock()
{
SetVcoreUp (0x01);
SetVcoreUp (0x02);
SetVcoreUp (0x03);
UCSCTL3 = SELREF_2; // Set DCO FLL reference = REFO UCSCTL4 |= SELA_2; // Set ACLK = REFO
__bis_SR_register(SCG0); // Disable the FLL control loop UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx UCSCTL1 = 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; // ,4 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSWRST; // **Put state machine in reset** UCA0CTL1 |= UCSSEL__SMCLK; // SMCLK
UCA0BR0 = 173; // 1MHz 115200 (see User's Guide) UCA0BR1 = 0; // 1MHz 115200
UCA0MCTL |= 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) {
char buf[60]="\0";
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
init_clock();
init_uart();
P1DIR &= ~BIT2; // in
P1SEL |= BIT2; //捕获输入
TA0CTL = TASSEL_2 +ID__8 + MC_2 + TACLR+TAIE; // SMCLK, 连续mode, clear TAR 8分频下限可以测到8Hz。
上限200K左右
TA0CCTL1 =CM_1 +SCS +CAP +CCIE;
__bis_SR_register( GIE); // Enter LPM0, enable interrupts
while(1)
{
sprintf(buf,"DS16(0,60,'频率:%',4);\r\n",fre);
send_string( buf);
__delay_cycles(314574);
}
}
//下限频率15,上限200K左右
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
switch(__even_in_range(TA0IV,14))
{
case 0: break; // No interrupt
case 2: //CCR1
{
i++;
if(i==1)
{ over=0;
TA0CTL |=TACLR;
}
if(i>=51)
{
i=0;
TA0CCTL0&=~CCIE;
start=over*65536+TA0CCR1;
fre=0/start;
TA0CTL |=TACLR;
}
}
break;
case 4: break; // CCR2 not used
case 6: break; // CCR3 not used
case 8: break; // CCR4 not used case 10: break; // CCR5 not used case 12: break; // CCR6 not used case 14: over++;
break; //定时器溢出 default: break;
}
}。