OpenEdv-开源电子网

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

STM32F407测两路高速(最高200K)脉冲频率

[复制链接]

4

主题

7

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-5-10
在线时间
7 小时
发表于 2021-7-13 17:20:49 | 显示全部楼层 |阅读模式
5金钱
使用的定时器3和定时器4的ETR引脚,定时器6开250ms中断,中断里读定时器3和4的计数值并清零,乘以4得到频率。
问题:不准,500HZ得到的有580、560等等,示波器开着波形很好是500HZ。

  1. static void mTIM3_ETR_cfg(void)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStructure;
  4.   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  5.        
  6.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);  //PORTD 时钟使能
  7.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  //TIM3 时钟使能
  8.        
  9.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;  //GPIOD2
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  //复用功能
  11.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  //速度 100MHz
  12.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  13.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  //外部已有100K上拉
  14.         GPIO_Init(GPIOD, &GPIO_InitStructure);  //初始化 PD2
  15.        
  16.         GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_TIM3); //PD2 复用为定时器3
  17.        
  18.         TIM_TimeBaseStructure.TIM_Period = 0xFFFF;  //自动重装载值
  19.         TIM_TimeBaseStructure.TIM_Prescaler = 0x00;  //定时器分频
  20.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  //时钟分频
  21.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
  22.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  23.        
  24.         TIM_ETRClockMode2Config(TIM3, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted, 0);

  25.   TIM_SetCounter(TIM3, 0);
  26.   TIM_Cmd(TIM3, ENABLE);  //使能定时器
  27. }

  28. static void mTIM4_ETR_cfg(void)
  29. {
  30.   GPIO_InitTypeDef GPIO_InitStructure;
  31.   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  32.        
  33.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);  //PORTE 时钟使能
  34.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);  //TIM4 时钟使能
  35.        
  36.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  //GPIOE0
  37.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  //复用功能
  38.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  //速度 100MHz
  39.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  40.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  //外部已有100K上拉
  41.         GPIO_Init(GPIOE, &GPIO_InitStructure);  //初始化 PE0
  42.        
  43.         GPIO_PinAFConfig(GPIOE, GPIO_PinSource0, GPIO_AF_TIM4); //PE0 复用为定时器4
  44.        
  45.         TIM_TimeBaseStructure.TIM_Period = 0xFFFF;  //自动重装载值
  46.         TIM_TimeBaseStructure.TIM_Prescaler = 0x00;  //定时器分频
  47.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  //时钟分频
  48.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
  49.         TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  50.        
  51.         TIM_ETRClockMode2Config(TIM4, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted, 0);

  52.   TIM_SetCounter(TIM4, 0);
  53.   TIM_Cmd(TIM4, ENABLE);  //使能定时器
  54. }

  55. void mTIM6_Config(u16 TIM_period, u16 TIM_prescaler, u8 TIM_clockDivision)
  56. {
  57.   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

  58.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);

  59.   TIM_TimeBaseInitStructure.TIM_Period = TIM_period;  //自动重装载值
  60.   TIM_TimeBaseInitStructure.TIM_Prescaler = TIM_prescaler;  //定时器分频
  61.   TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_clockDivision;  
  62.   TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
  63.   TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStructure);

  64.   TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
  65.   TIM_Cmd(TIM6, ENABLE);  //使能TIMx外设
  66.   TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);  //使能指定的TIM中断
  67. }

  68. static u32 pulse1_250ms_Cnt = 0, pulse2_250ms_Cnt = 0;
  69. void TIM6_DAC_IRQHandler(void)   //定时器6中断函数,不能重命名
  70. {
  71.   if(TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)
  72.   {
  73.                 TIM_ClearITPendingBit(TIM6, TIM_IT_Update);  //清中断标志
  74.                 pulse1_250ms_Cnt = TIM3->CNT;
  75.                 pulse2_250ms_Cnt = TIM4->CNT;
  76.                 TIM3->CNT = 0;
  77.                 TIM4->CNT = 0;
  78.   }
  79. }

  80. void mDIN_pulseMeasInit(void)
  81. {
  82.   mTIM3_ETR_cfg();
  83.         mTIM4_ETR_cfg();
  84.         mTIM6_Config(2500 - 1, 8400 - 1, 0);  //250ms中断一次(1000/250*65535>200000)
  85. }

  86. void mDIN_pulseGetFre(u32 fre[2])
  87. {
  88.   fre[0] = pulse1_250ms_Cnt * 4;  //转为hz
  89.         fre[1] = pulse2_250ms_Cnt * 4;
  90. }
复制代码


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

使用道具 举报

4

主题

7

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-5-10
在线时间
7 小时
 楼主| 发表于 2021-7-13 17:24:32 | 显示全部楼层
程序是参考的网上,大家都这么写,之前有一个大哥也遇到了同样的问题
http://www.openedv.com/posts/list/33674.htm
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2021-7-14 02:42:22 | 显示全部楼层
帮顶
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8204
金钱
8204
注册时间
2020-5-11
在线时间
3697 小时
发表于 2021-7-14 09:31:00 | 显示全部楼层
定时器6中断里让IO翻转,看是不是250ms中断一次.
专治疑难杂症
回复

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
发表于 2021-7-14 10:04:43 | 显示全部楼层
你这明显不正常,1m pwm 外部计数记得当时1s计数误差不超过60
回复

使用道具 举报

4

主题

7

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-5-10
在线时间
7 小时
 楼主| 发表于 2021-7-14 11:06:42 | 显示全部楼层
nashui_sx 发表于 2021-7-14 10:04
你这明显不正常,1m pwm 外部计数记得当时1s计数误差不超过60

是用的ETR引脚吗?
回复

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
发表于 2021-7-14 11:31:24 | 显示全部楼层
hangeV 发表于 2021-7-14 11:06
是用的ETR引脚吗?

是的外部计数模式
回复

使用道具 举报

4

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2019-4-9
在线时间
79 小时
发表于 2021-7-15 17:16:52 | 显示全部楼层
可以用定时器6定时1s,频率=定时器3运行的个数*65536+TIM3->CNT
我用的STM32F1,用3种方法(外部中断触发、输入捕获、外部计数)都测过频率,没有问题的
回复

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4100
金钱
4100
注册时间
2018-8-14
在线时间
695 小时
发表于 2021-7-15 18:05:43 | 显示全部楼层
还用了其它中断? 其它中断都关了它再试一下吧, 我猜是因为别的中断函数内占用时间太长而引起的
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2021-7-16 02:05:23 | 显示全部楼层
最好用外部脉冲计数模式来做频率统计,精度可以做到很高
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 18:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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