各路高手:大家好,我想用一个定时器采集四路频率信号,频率较低大概几十HZ,
现在我用定时器3产生待测信号10HZ,定时器4用来测试,结果用串口调试助手显示采集
数据不正确,时而为1HZ,时而为10HZ,帮忙看下是不是我配置问题了,谢谢!
定时器配置如下:
void TIM_Configuration(void)
{
//定义结构体
GPIO_InitTypeDef GPIO_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// 使能时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
// GPIOA and GPIOB clock enable
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//端口配置
//TIM3 channel 1 pin (PA.06)channel 2 pin (PA.07) configuration
// 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);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA , &GPIO_InitStructure);
TIM_DeInit(TIM4); //将TIM3设为缺省值
TIM_TimeBaseStructure.TIM_Period = 0xffff;
//自动重装值
TIM_TimeBaseStructure.TIM_Prescaler = 719;
//预分频值, 使TIMx_CLK=1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//输入时钟不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//向上计数
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
//根据指定的参数初始化 TIM3的时间基数单位
//通道1
TIM_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; //TIM捕获在捕获输入上每探测到一个边沿执行一次
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM4, &TIM_ICInitStructure);
//通道2
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //TIM捕获在捕获输入上每探测到一个边沿执行一次
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM4, &TIM_ICInitStructure);
//通道3
TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //TIM捕获在捕获输入上每探测到一个边沿执行一次
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM4, &TIM_ICInitStructure);
//通道4
TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //TIM捕获在捕获输入上每探测到一个边沿执行一次
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM4, &TIM_ICInitStructure);
// 使能中断
TIM_ITConfig(TIM4, TIM_IT_CC1, ENABLE);
TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE);
TIM_ITConfig(TIM4, TIM_IT_CC3, ENABLE);
TIM_ITConfig(TIM4, TIM_IT_CC4, ENABLE);
// 清除中断标志位
TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);
TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);
TIM_ClearITPendingBit(TIM4, TIM_IT_CC4);
// 使能定时器
TIM_Cmd(TIM4, ENABLE);
//定时器3产生PWM用于测试
TIM_TimeBaseStructure.TIM_Period = 999;
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3 , &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3 , TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3, ENABLE);
// 使能 TIM 计数器
TIM_Cmd(TIM3, ENABLE);
}
中断函数:
void TIM4_IRQHandler(void)
{
//通道1
if(TIM_GetITStatus(TIM4, TIM_IT_CC1) == SET)
{
// Clear TIM3 Capture compare interrupt pending bit
TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
if(CC1CaptureNumber == 0)
{
// Get the Input Capture value
CC1ReadValue1 = TIM_GetCapture2(TIM4);
CC1CaptureNumber = 1;
}
else if(CC1CaptureNumber == 1)
{
// Get the Input Capture value
CC1ReadValue2 = TIM_GetCapture2(TIM4);
// Capture computation
if (CC1ReadValue2 > CC1ReadValue1)
{
CC1Capture = (CC1ReadValue2 - CC1ReadValue1);
}
else
{
CC1Capture = ((0xFFFF - CC1ReadValue1) + CC1ReadValue2);
}
// Frequency computation
CC1TIM3Freq = TIM3BaseClock / CC1Capture;
CC1CaptureNumber = 0;
}
}
//通道2
if(TIM_GetITStatus(TIM4, TIM_IT_CC2) == SET)
{
// Clear TIM3 Capture compare interrupt pending bit
TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);
if(CC2CaptureNumber == 0)
{
// Get the Input Capture value
CC2ReadValue1 = TIM_GetCapture2(TIM4);
CC2CaptureNumber = 1;
}
else if(CC2CaptureNumber == 1)
{
// Get the Input Capture value
CC2ReadValue2 = TIM_GetCapture2(TIM4);
// Capture computation
if (CC2ReadValue2 > CC2ReadValue1)
{
CC2Capture = (CC2ReadValue2 - CC2ReadValue1);
}
else
{
CC2Capture = ((0xFFFF - CC2ReadValue1) + CC2ReadValue2);
}
// Frequency computation
CC2TIM3Freq = TIM3BaseClock / CC2Capture;
CC2CaptureNumber = 0;
}
}
//通道3
if(TIM_GetITStatus(TIM4, TIM_IT_CC3) == SET)
{
// Clear TIM3 Capture compare interrupt pending bit
TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);
if(CC3CaptureNumber == 0)
{
// Get the Input Capture value
CC3ReadValue1 = TIM_GetCapture2(TIM4);
CC3CaptureNumber = 1;
}
else if(CC3CaptureNumber == 1)
{
// Get the Input Capture value
CC3ReadValue2 = TIM_GetCapture2(TIM4);
// Capture computation
if (CC3ReadValue2 > CC3ReadValue1)
{
CC3Capture = (CC3ReadValue2 - CC3ReadValue1);
}
else
{
CC3Capture = ((0xFFFF - CC3ReadValue1) + CC3ReadValue2);
}
// Frequency computation
CC3TIM3Freq = TIM3BaseClock / CC3Capture;
CC3CaptureNumber = 0;
}
}
//通道4
if(TIM_GetITStatus(TIM4, TIM_IT_CC4) == SET)
{
// Clear TIM3 Capture compare interrupt pending bit
TIM_ClearITPendingBit(TIM4, TIM_IT_CC4);
if(CC4CaptureNumber == 0)
{
// Get the Input Capture value
CC4ReadValue1 = TIM_GetCapture2(TIM4);
CC4CaptureNumber = 1;
}
else if(CC4CaptureNumber == 1)
{
// Get the Input Capture value
CC4ReadValue2 = TIM_GetCapture2(TIM4);
// Capture computation
if (CC4ReadValue2 > CC4ReadValue1)
{
CC4Capture = (CC4ReadValue2 - CC4ReadValue1);
}
else
{
CC4Capture = ((0xFFFF - CC4ReadValue1) + CC4ReadValue2);
}
// Frequency computation
CC4TIM3Freq = TIM3BaseClock / CC4Capture;
CC4CaptureNumber = 0;
}
}
}
主程序显示部分:
while (1)
{
i++;
switch(i)
{
case 1:
printf("\r\n The TIM4CC1 Frequency of input pulse is %.2fHz\r\n" , (CC1TIM3Freq));
break;
case 2500:
printf("\r\n The TIM4CC2 Frequency of input pulse is %.2fHz\r\n" , (CC2TIM3Freq));
break;
case 5000:
printf("\r\n The TIM4CC3 Frequency of input pulse is %.2fHz\r\n" , (CC3TIM3Freq));
break;
case 7500:
printf("\r\n The TIM4CC4 Frequency of input pulse is %.2fHz\r\n" , (CC4TIM3Freq));
break;
}
if(i==10000)
{
i=0;
}
}
|