OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6407|回复: 6

STM32利用两个定时器测频率,有测量数据,但外部频率改变,测量显示值不变,是啥原因? 这种频率测量的误差有多大?

[复制链接]

23

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2019-7-20
在线时间
108 小时
发表于 2019-8-30 09:35:58 | 显示全部楼层 |阅读模式
1金钱
#include "time.h"
#include "led.h"
u32 TIM4_LastCnt;
extern u32 TIM_ExtCntFreq;
/*******************************************************************************
* 函 数 名         : TIM4_Init
* 函数功能     : TIM4初始化函数
* 输    入         : per:重装载值
      psc:分频系数
* 输    出         : 无
*******************************************************************************/
void TIM4_Init(u16 per,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4|RCC_APB1Periph_TIM3,ENABLE);//使能TIM4时钟,定时器4定时1s,定时3 计数外部脉冲
//定时器4配置
TIM_TimeBaseInitStructure.TIM_Period=per;   //自动装载值

TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);

TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //开启定时器中断
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);

NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;//定时器中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;  //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //IRQ通道使能
NVIC_Init(&NVIC_InitStructure);

TIM_Cmd(TIM4,ENABLE); //使能定时器
//定时器2配置

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //GPIOD2
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//复用功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度 50MHz
    GPIO_Init(GPIOD,&GPIO_InitStructure); //初始化 PD2
TIM_TimeBaseInitStructure.TIM_Period=0xffff;   //自动装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=0;  //定时器分频
    TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;  
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
//TIM_TIxExternalClockConfig(TIM1,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Rising,0); //外部时钟源
TIM_ETRClockMode2Config(TIM3, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);
TIM_SetCounter(TIM3,0);
TIM_Cmd(TIM3,ENABLE); //使能定时器


}
/*******************************************************************************
* 函 数 名         : TIM4_IRQHandler
* 函数功能     : TIM4中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void TIM4_IRQHandler(void)
{
static unsigned char count;
if(TIM_GetITStatus(TIM4,TIM_IT_Update))
{
  led2=!led2;
  //TIM4_LastCnt=TIM3->CNT;
  //TIM4_LastCnt=TIM3->CNT;
  TIM4_LastCnt+=TIM3->CNT;
  count++;
  if(count==4)
  {
   TIM_ExtCntFreq=TIM4_LastCnt/4/4/2;
   TIM4_LastCnt=0;
   count=0;
   
  }
     TIM_SetCounter(TIM3,0);
}
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

178

帖子

0

精华

高级会员

Rank: 4

积分
672
金钱
672
注册时间
2019-7-28
在线时间
61 小时
发表于 2019-8-30 09:59:17 | 显示全部楼层
频率测量方法有2种,你能确定是那种吗?
两种适合不同的频率范围(相对于测量时钟),
如果不考虑太高精度,简单定时计数就可以,
计数的时间不要大于2秒即可,但也不要小于10ms,否则误差太大。

测宽法适应于脉冲宽度较大的(例如大于20ms),否则,精度又会又问题。
自己可以评估以下。
回复

使用道具 举报

1

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2019-3-5
在线时间
42 小时
发表于 2019-8-30 14:12:02 | 显示全部楼层
还是很准确的吧 我之前用过 计数器基本上该计多少就是多少 可能是其他地方出了问题
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2020-10-23
在线时间
56 小时
发表于 2021-8-26 11:39:18 | 显示全部楼层
这个代码的写法是不是只能测试低频信号?因为计数器只有16位,如果在输入高频信号,定时器4定时1s,而此时定时器3计数器已经发生溢出,这要怎么处理呢?
回复

使用道具 举报

11

主题

2147

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4902
金钱
4902
注册时间
2015-1-10
在线时间
614 小时
发表于 2021-8-26 14:16:04 | 显示全部楼层
kanehu 发表于 2021-8-26 11:39
这个代码的写法是不是只能测试低频信号?因为计数器只有16位,如果在输入高频信号,定时器4定时1s,而此时 ...

定时器输入捕获+超时溢出,一个定时器就可以,不香?
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2020-10-23
在线时间
56 小时
发表于 2021-8-26 16:09:17 | 显示全部楼层
阿侑kevin 发表于 2021-8-26 14:16
定时器输入捕获+超时溢出,一个定时器就可以,不香?

可是定时器捕获的方式测试高频信号时,频率不准
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2021-8-26 17:26:35 | 显示全部楼层
如果说用输入捕获不准, 那你现在的方法就更加更加不准, 中断响应有延迟, 用软件复位CNT会差生误差。。。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-30 13:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表