OpenEdv-开源电子网

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

如何利用STM32实现精确的脉冲计数啊,小弟写了一个程序但是不精确,求大侠指点

[复制链接]

9

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2014-3-15
在线时间
0 小时
发表于 2014-5-28 20:24:43 | 显示全部楼层 |阅读模式
5金钱
如何利用STM32实现精确的脉冲计数啊,小弟写了一个程序但是不精确,求大侠指点,思路是利用STM32的外部时钟模式
[mw_shl_code=c,true] /////////////////////////////////////////////////////////////////////////////////// // 函数: TIM2_GPIO_Configuration(void) // 功能: 配置定时器的引脚为模拟输入 // 输入: 无 // 输出: 无 // 接口:PA0,TIM3的接口 //////////////////////////////////////////////////////////////////////////////// void TIM2_GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* PA0,PA12-> 左右脉冲输入 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度 GPIO_Init(GPIOA, &GPIO_InitStructure); } ////////////////////////////////////////////////////////////////////// //函数: TIM2_Configuration(void) // 功能: 配置定时器为计数器,时钟模式为外部时钟模式 // 输入: 无 // 输出: 无 ///////////////////////////////////////////////////////////////////// void TIM2_Configuration(void) //只用一个外部脉冲端口 { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure ; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE) ; //配置TIMER2作为计数器 TIM_DeInit(TIM2); TIM_TimeBaseStructure.TIM_Period = 0xFFFF ; TIM_TimeBaseStructure.TIM_Prescaler = 0x00 ; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0 ; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up ; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // Time base configuration //TIM_ITRxExternalClockConfig(TIM2,TIM_TS_ETRF); //我测试中一直不能用的原因是缺少外部时钟模式 //TIM_TIxExternalClockConfig(TIM2, TIM_TS_TI1FP1,TIM_ICPolarity_Rising, 0);//设置TIMx触发为外部时钟 TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);//该参数取值在0x0和0xF之间。 //TIM_ExtTRGPolarity_NonInverted//TIM外部触发极性非翻转:高电平或上升沿有效 TIM_SetCounter(TIM2, 0); //TIM_ExtTRGPSC_OFFTIM; ETRP 预分频 OFF TIM_Cmd(TIM2, ENABLE); } //////////////////////////////////////////////////////////////////////////////////////////// ////// 函数名: TIM4_Init ///////// 函数功能:配置定时器4 ////////////函数输入:无 ///////////函数输出: 无 ////////////////////////////////////////////////////////////////////////////////////////// void TIM4_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能 TIM_TimeBaseStructure.TIM_Period =5000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms TIM_TimeBaseStructure.TIM_Prescaler =7199; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_ITConfig( //使能或者失能指定的TIM中断 TIM4, //TIM2 TIM_IT_Update | //TIM 中断源 TIM_IT_Trigger, //TIM 触发中断源 ENABLE //使能 ); TIM_ARRPreloadConfig(TIM4, ENABLE); //使能TIMx在ARR上的预装载寄存器 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel =TIM4_IRQn; //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 TIM_Cmd(TIM4, ENABLE); //使能TIMx外设 } /////////////////////////////////////////////// ////////////函数名:TIM4_IRQHandler ////////////功能: 定时器中断处理函数 ///////////////////////////////////// void TIM4_IRQHandler(void) //TIM3中断 { TIM_Cmd(TIM2, DISABLE); if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 { TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源 counter=TIM_GetCounter(TIM2); printf("%d",counter); printf("\n"); TIM_SetCounter(TIM2,0); } TIM_Cmd(TIM2, ENABLE); } void Pluse_Get_init(void) { TIM2_GPIO_Configuration(); TIM2_Configuration(); TIM4_Init(); } [/mw_shl_code]


但是测定的脉冲数误差太大了

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

使用道具 举报

7

主题

123

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2014-3-5
在线时间
3 小时
发表于 2014-5-28 21:43:53 | 显示全部楼层
回复

使用道具 举报

9

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2014-3-15
在线时间
0 小时
 楼主| 发表于 2014-5-28 23:10:47 | 显示全部楼层
回复【2楼】破隆冬之晓:
---------------------------------
我上面用了啊,TIM4的中断里面
回复

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2014-5-29 07:28:36 | 显示全部楼层
精确计数有点难,脉冲过滤器还差不多。就是把符合一定宽度的脉冲过滤出来。
手艺人要内外兼修。
回复

使用道具 举报

7

主题

123

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2014-3-5
在线时间
3 小时
发表于 2014-5-29 20:57:26 | 显示全部楼层
回复【3楼】小石头:
---------------------------------
好吧,我用过这个还不错啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-29 22:47:06 | 显示全部楼层
多测试几次试试,差多少?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2014-3-15
在线时间
0 小时
 楼主| 发表于 2014-6-3 20:29:43 | 显示全部楼层
回复【5楼】破隆冬之晓:
---------------------------------
我测500HZ的脉冲,七八十的误差,然后到6M的脉冲时就相差五六百
回复

使用道具 举报

9

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2014-3-15
在线时间
0 小时
 楼主| 发表于 2014-6-3 20:32:03 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
我测500HZ的脉冲,六七十的误差,然后到6M的脉冲时就相差五六百,而且误差也是波动中,原子哥,用STM32自带的正交编码器采集脉冲误差会不会小一点,对前面的脉冲计数我采用了均值滤波也还是有百分之10的误差
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-3 22:03:30 | 显示全部楼层
回复【8楼】小石头:
---------------------------------
你这误差太大了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2014-3-15
在线时间
0 小时
 楼主| 发表于 2014-6-3 23:04:08 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
就是啊,原子哥有资料分享吗,最近就是做智能小车的编码器脉冲采集啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-5 00:01:33 | 显示全部楼层
我有发过脉冲计数的代码,你论坛找找参考着看看吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2014-3-15
在线时间
0 小时
 楼主| 发表于 2014-6-5 22:55:31 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
我记得您发的那个代码是关于捕获的吧
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-6 00:21:50 | 显示全部楼层
回复【12楼】小石头:
---------------------------------
论坛搜索:脉冲计数。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-9-21
在线时间
1 小时
发表于 2015-12-9 10:05:02 | 显示全部楼层
原子哥,我用stm32f103rc芯片进行外部脉冲计数,最大能计到22M左右。但是现在有一个问题,计数值一直有波动,按理我是计数器清零后定时器清零,有一个时间差,计数有误差可以理解,但是输入信号固定应该是一个固定的计数值误差,我测得信号一直有波动,这是为什么?一直没想明白,希望原子哥帮忙解答一下,谢谢~我用信号发生器给输入方波信号,占空比50%,这是10M信号输入,1s定时串口调试助手上的计数结果。

回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-9-21
在线时间
1 小时
发表于 2015-12-9 10:06:14 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
原子哥,我用stm32f103rc芯片进行外部脉冲计数,最大能计到22M左右。但是现在有一个问题,计数值一直有波动,按理我是计数器清零后定时器清零,有一个时间差,计数有误差可以理解,但是输入信号固定应该是一个固定的计数值误差,我测得信号一直有波动,这是为什么?一直没想明白,希望原子哥帮忙解答一下,谢谢~我用信号发生器给输入方波信号,占空比50%,这是10M信号输入,1s定时串口调试助手上的计数结果。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-12-9 23:26:36 | 显示全部楼层
回复【15楼】浪客剑心lu:
---------------------------------
这个有一定误差是正常的啊,你计算下误差.
最大是830左右
830/10M=0.0083%....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-3-20
在线时间
6 小时
发表于 2016-5-29 09:36:17 | 显示全部楼层
你这个误差这么大后来是怎么解决的?我也遇到了这个问题,误差太大
回复

使用道具 举报

5

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2017-7-13
在线时间
14 小时
发表于 2017-7-26 19:40:26 | 显示全部楼层
误差怎么解决的
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2020-6-3
在线时间
3 小时
发表于 2021-3-3 20:42:23 | 显示全部楼层
正点原子 发表于 2015-12-9 23:26
回复【15楼】浪客剑心lu:
---------------------------------
这个有一定误差是正常的啊,你计算下误差.
最 ...

原子哥,脉冲计数值有波动咋解决
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-29 06:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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