加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

定时器TIM1的CH2捕获通道测量外部输入信号频率

发布时间:2020-12-15 06:13:54 所属栏目:百科 来源:网络整理
导读:定时器TIM1的CH2捕获通道测量外部输入信号频率(硬件已整形为方波 思路: 定时器TIM1的CH2捕获通道测量外部输入信号频率(硬件已整形为方波); 我的思路. ? 设定时器输入时钟的频率是72MHZ,预分配系数为0,则该定时器能够测量的最低频率是1100HZ,(若想测更低

定时器TIM1的CH2捕获通道测量外部输入信号频率(硬件已整形为方波

思路:
定时器TIM1的CH2捕获通道测量外部输入信号频率(硬件已整形为方波);
我的思路.
?设定时器输入时钟的频率是72MHZ,预分配系数为0,则该定时器能够测量的最低频率是1100HZ,(若想测更低的频率,可以另取通道分频。预分频系数的计算CK_INT/(Prescaler+1)??Prescaler介于0x0000到0xffff之间)
定时器TIM1设为输入捕获模式,外部信号(经整形后)从通道CH2进入,并相应串口设为浮空输入,高电平有效,在捕获中断中计算2次捕获值的差值,从而计算信号频率。
主程序如下:

int main(void)

{

??RCC_Configuration();
??SysTick_Configuration();
???
?
??NVIC_Configuration();

?
??GPIO_Configuration();
?//??TIM_Configuration( );//TIM初始化函数?
?

TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; //选择通道2
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入上升沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // 通道方向选择(相位)
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //每次检测到捕获输入就触发一次捕获
//(预分频系数)

TIM_ICInitStructure.TIM_ICFilter = 0x0; //滤波系数

TIM_ICInit(TIM1,&TIM_ICInitStructure);

?
?

TIM_ITConfig(TIM1,TIM_IT_CC2,ENABLE); //打开中断

TIM_Cmd(TIM1,ENABLE); //启动TIM1
while(1);

?

}

?void GPIO_Configuration();

{
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);

}
?Tim1_SetupNVIC();
}
中断配置:
void Tim1_SetupNVIC(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM

NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
#else

NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
#endif

NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

中断里面做的事情:
void TIM1_IRQHandler(void)// 用相应的定时器中断?

if (TIM_GetITStatus(TIM1,TIM_IT_CC2) != RESET)//是TIM1CH2
{
TIM_ClearITPendingBit(TIM1,TIM_IT_CC2);//清空捕获标志
if(capture_number==0 )//第一次捕获
{
?Ic1_readvalue1 = TIM_GetCapture2(TIM1);//保留捕获值

?capture_number=1;//设置标志

}

else if(capture_number==1)//第二次捕获

{

??Ic1_readvalue2 = TIM_GetCapture2(TIM1);//保留捕获值

}

if(Ic1_readvalue1>Ic1_readvalue2)//考虑是否溢出,计算两次的差值

{

?CAPTURE=Ic1_readvalue2-Ic1_readvalue1-1;

}

else

{

?CAPTURE=Ic1_readvalue2-Ic1_readvalue1-1+0xffff;

}

TIM1_FREQ =(u32)72000000/ CAPTURE;计算实际频率值 若是已经分频或者时钟也改变则相应的也对改变

?}
capture_number=0;
}

} }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读