当前位置:文档之家› STM32定时器输入捕获模式测频率

STM32定时器输入捕获模式测频率


频)72M/2M //以 2MHz 计数
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//向上计数
TIM_TimeBaseStructure.TIM_Period = 65535;
//装载值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
/* Get the Input TIM2IC_ReadValue value */ TIM2IC_ReadValue2[0] = TIM_GetCapture1(TIM2);
/* TIM2IC_ReadValue computation */ if (TIM2IC_ReadValue2[0] > TIM2IC_ReadValue1[0]) {
TIM2Capture[0] = (TIM2IC_ReadValue2[0] - TIM2IC_ReadValue1[0]); } else {
TIM2Capture[0] = ((0xFFFF - TIM2IC_ReadValue1[0]) + TIM2IC_ReadValue2[0]); } /* Frequency computation */ Frequency0= 2000000/ TIM2Capture[0];// 计算频率=2MHz/时钟计数 IM2CaptureNumber[0] = 0; TIM_ITConfig(TIM2, TIM_IT_CC1, DISABLE); } } else if(TIM_GetITStatus(TIM2, TIM_IT_CC2) == SET) { /* Clear TIM3 TIM2IC_ReadValue compare interrupt pending bit */ TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
/*TIM2 的通道四设置为 输入捕获 模式*/ TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; TIM_ICInit(TIM2, &TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_3; TIM_ICInit(TIM2, &TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_4; TIM_ICInit(TIM2, &TIM_ICInitStructure);
//NVIC 配置
//第三步:定时器初始化
//测频率配置,捕获两个上升沿,计算频率
void TIM2_Freq_Config(void) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//第二步:中断向量初始化 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
if(TIM2CaptureNumber[1] == 0) {
/* Get the Input TIM2IC_ReadValue value */ TIM2IC_ReadValue1[1] = TIM_GetCapture2(TIM2); TIM2CaptureNumber[1] = 1; } else if(TIM2CaptureNumber[1] == 1) { /* Get the Input TIM2IC_ReadValue value */ TIM2IC_ReadValue2[1] = TIM_GetCapture2(TIM2);
//上升沿触发
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //管脚与寄存器对应关系
//输入预分频。意思是控制在多少个输入周期做一次捕获,如果
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE); TIM_ITConfig(TIM2, TIM_IT_CC3, ENABLE); TIM_ITConfig(TIM2, TIM_IT_CC4, ENABLE); TIM_Cmd(TIM2, ENABLE); }
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // TIM2 clock enable
TIM_DeInit(TIM2);
/*TIM2 时钟配置*/
TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t) (72000000 / 2000000) - 1 ; // 预 分 频 ( 时 钟 分
//使能中断 //启动 TIM2
//第四步:中断服务程序
/*********** TIM2 CH1~4***************/ __IO uint16_t TIM2IC_ReadValue1[4] , TIM2IC_ReadValue2[4]; __IO uint16_t TIM2CaptureNumber[4] ;
//记录各通道的捕获值 //捕获次数
__IO uint32_t TIM2Capture[4] ;
//最终计算捕获差值
void TIM2_IRQHandler(void)
{
u8 i=0;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
//输入的信号频率没有变,测得的周期也不会变。比如选择 4 分频,
//则每四个输入周期才做一次捕获,这样在输入信号变化不频繁的情况下,
//可以减少软件被不断中断的次数。
TIM_ICInitStructure.TIM_ICFilter = 0x01;
//滤波设置,经历几个周期跳变
认定波形稳定 0x0~0xF
//使用 PA0、PA1、PA2、PA3 做为上拉输入,用来测频率
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;
TIM2Capture[2] = ((0xFFFF - TIM2IC_ReadValue1[2]) + TIM2IC_ReadValue2[2]); } /* Frequency computation */ Frequency2= 2000000/ TIM2Capture[2];// 计算频率=2MHz/时钟计数 TIM2CaptureNumber[2] = 0; TIM_ITConfig(TIM2, TIM_IT_CC3, DISABLE); } } else if(TIM_GetITStatus(TIM2, TIM_IT_CC4) == SET) { /* Clear TIM3 TIM2IC_ReadValue compare interrupt pending bit */ TIM_ClearITPendingBit(TIM2, TIM_IT_CC4); if(TIM2CaptureNumber[3] == 0) {
/* TIM2IC_ReadValue computation */ if (TIM2IC_ReadValue2[1] > TIM2IC_ReadValue1[1]) {
TIM2Capture[1] = (TIM2IC_ReadValue2[1] - TIM2IC_ReadValue1[1]); } else {
if(TIM2CaptureNumber[0] == 0)
{
/* Get the Input TIM2IC_ReadValue value */
TIM2IC_ReadValue1[0] = TIM_GetCapture1(TIM2);
TIM2CaptureNumber[0] = 1;
} else if(TIM2CaptureNumber[0] == 1) {
TIM2Capture[1] = ((0xFFFF - TIM2IC_ReadValue1[1]) + TIM2IC_ReadValue2[1]); } /* Frequency computation */ Frequency1= 2000000/ TIM2Capture[1];// 计算频率=2MHz/时钟计数 TIM2CaptureNumber[1] = 0; TIM_ITConfig(TIM2, TIM_IT_CC2, DISABLE); } } else if(TIM_GetITStatus(TIM2, TIM_IT_CC3) == SET) { /* Clear TIM3 TIM2IC_ReadValue compare interrupt pending bit */ TIM_ClearITPendingBit(TIM2, TIM_IT_CC3); if(TIM2CaptureNumber[2] == 0) { /* Get the Input TIM2IC_ReadValue value */ TIM2IC_ReadValue1[2] = TIM_GetCapture3(TIM2); TIM2CaptureNumber[2] = 1; } else if(TIM2CaptureNumber[2] == 1) { /* Get the Input TIM2IC_ReadValue value */ TIM2IC_ReadValue2[2] = TIM_GetCapture3(TIM2);
相关主题