等精度测量频率
常用的频率测量方法有直接测频法,测周期法和等精度测频法。
直接测频法是由时基信号产生闸门,对被测信号进行计数,此法只适合测高频信号。测周期法是由被测信号产生闸门,对时基脉冲进行计数,此法只适合测低频信号(周期长)。等精度测频,设置一个与被测信号同步的闸门,同时对被测信号和时基脉冲进行计数。两个计数值之比即等于其频率比。此法可消除被测计数器的正负一个脉冲的误差,使其误差与被测频率无关,达到等精度测频。
等精度测频的示意图如下。sys_clk是系统时钟,也就是时基信号,sequence是被测信号,gate是闸门信号,使它与被测信号同步,得到gatebuf信号。在gatebuf信号为高(红线区域)时,对系统时钟和被测信号计数。假设系统时钟50MHz,计数结果是有10000个系统时钟周期,5个被测信号周期,则被测信号频率f0=50M*5/10000=25KHz。
比较器整形
采用TLV3501将正弦波整形成方波
74LS74触发
中断代码
void TIM2_Init(void)//定时器TIM2初始化配置
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //使能TIM2时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //TIM2外部计数管脚接PA0
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //允许TIM2更新中断
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级0级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
TIM_SetCounter(TIM2, 0); // 清零TIM2计数器
TIM_Cmd(TIM2,ENABLE); //使能定时器2
}
///****************************************************************************************/
void TIM3_Init(void)//定时器TIM2初始化配置
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能TIM3时钟
TIM_TimeBaseInitStructure.TIM_Period = 0xffff; //自动重装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=0; //定时器分频
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up