OpenEdv-开源电子网

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

为什么用STM32的TIM2定时器读取编码器时,TIM2->CNT的值会从32767突然跳变到94934528,这是为什么?

[复制链接]

29

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2014-9-11
在线时间
8 小时
发表于 2015-10-7 17:00:43 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]void TIM2_Configuration(void)//编码器接口设置(TIM2)/PA15-A相 PB3-B相[/mw_shl_code] [mw_shl_code=c,true]{ GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; //GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); //关闭JTAG接口 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //关闭JTAG接口 开启SWD RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE); //TIM2引脚重定向 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PA15 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_WriteBit(GPIOA, GPIO_Pin_15,Bit_SET); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PB3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_WriteBit(GPIOB, GPIO_Pin_3,Bit_SET); TIM_DeInit(TIM2); TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = 0xffff; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler = 0; //设置用来作为TIMx时钟频率除数的预分频值 不分频 TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //设置定时器2为编码器模式 IT1 IT2为上升沿计数 TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = 6; //输入滤波器 TIM_ICInit(TIM2, &TIM_ICInitStructure); TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除所有标志位 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //允许中断更新 TIM2->CNT = 0; TIM_Cmd(TIM2, ENABLE); }[/mw_shl_code]

encoder_num=TIM_GetCounter(TIM2);

encoder_num的值从1一直到32767,然后突然跳变到94934528



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

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
889
金钱
889
注册时间
2014-8-16
在线时间
193 小时
发表于 2015-10-7 17:47:17 | 显示全部楼层
你使用无符号的变量取值
回复

使用道具 举报

29

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2014-9-11
在线时间
8 小时
 楼主| 发表于 2015-10-7 19:12:25 | 显示全部楼层
回复【2楼】Theone:
---------------------------------
这个计数器每加1,所需的时间是多少呢
回复

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-4-3
在线时间
0 小时
发表于 2015-10-7 22:50:07 | 显示全部楼层
你的encoder_num变量选择了16位的int。最大的计算是32767,+1之后就溢出了
看不开,那就闭上眼;
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-10-8 23:45:40 | 显示全部楼层
回复【3楼】心染红尘:
---------------------------------
看你的主频和分频系数
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2015-11-30
在线时间
0 小时
发表于 2015-12-8 10:33:29 | 显示全部楼层
我的TIM2的编码器模式也是这样设置的   怎么pb3不能用
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-2-27
在线时间
3 小时
发表于 2016-2-27 17:57:25 | 显示全部楼层
一看就是用有符号取值的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 06:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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