OpenEdv-开源电子网

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

谁用过STM32的编码器接口,我用TIM4的CH1和CH2分别接增量编码器的A、B怎么读出的计数器的数值和实际数值不匹配啊,求指点

[复制链接]

16

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2014-11-21
在线时间
10 小时
发表于 2015-8-11 13:53:10 | 显示全部楼层 |阅读模式
5金钱
我用TIM4的CH1和CH2分别接增量编码器的A、B怎么读出的计数器的数值和实际数值不匹配啊,哪位高手帮指点下,附上代码
#include "timer.h"

//#define ENCODER_PPR           (u16)(1000)   // number of pulses per revolution
u16 hEncoder_Timer_Overflow=0;


void Tim4_Init(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//????
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_ResetBits(GPIOD,GPIO_Pin_12);//????

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//????
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_ResetBits(GPIOD,GPIO_Pin_13);//????

GPIO_PinRemapConfig(GPIO_Remap_TIM4,ENABLE);

TIM_DeInit(TIM4);
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
 
TIM_TimeBaseStructure.TIM_Period=0xC350;
TIM_TimeBaseStructure.TIM_Prescaler=0x0;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);

      
    TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, 
                             TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); 
    TIM_ICStructInit(&TIM_ICInitStructure);
    //TIM_ICInitStructure.TIM_ICFilter = 0X0F;        
   // TIM_ICInit(TIM4, &TIM_ICInitStructure);  

NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); 

TIM4->CNT =0;
TIM_ClearFlag(TIM4, TIM_FLAG_Update);
TIM_ITConfig( TIM4,TIM_IT_Update|TIM_IT_CC1|TIM_IT_CC2,ENABLE);
TIM_Cmd(TIM4,ENABLE );                             
 
}
             

void TIM4_IRQHandler(void)
{
 TIM_ClearFlag(TIM4, TIM_FLAG_Update);
  
   if (hEncoder_Timer_Overflow != 65535)  
   {
    hEncoder_Timer_Overflow++;
   }

}

代码是参照网上写的,我是要求直接读出编码器脉冲的个数计算位置,但是读出的数据和实际行走的距离不一致,谁做过帮我看看哪有问题



最佳答案

查看完整内容[请看2#楼]

这个我前几天刚弄过,很准,给你说一下吧。stm32的编码器模式其实就是捕获模式,只不过是把编码器的两路AB信号接到定时器的输入脚。这里有个注意的地方就是除了高级定时器,其他通用定时器只有ch1/ch2两个输入通道能用编码器模式。然后定时器会捕获你输入的脉冲数量和编码器转向。 更需要注意的地方是,并不是你来一个脉冲就是+1,你遇到的问题就在这里:先看手册 按照你现在的配置模式 TIM_EncoderInterfaceConfig(TIM4, TI ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1684
金钱
1684
注册时间
2014-2-25
在线时间
230 小时
发表于 2015-8-11 13:53:11 | 显示全部楼层
这个我前几天刚弄过,很准,给你说一下吧。stm32的编码器模式其实就是捕获模式,只不过是把编码器的两路AB信号接到定时器的输入脚。这里有个注意的地方就是除了高级定时器,其他通用定时器只有ch1/ch2两个输入通道能用编码器模式。然后定时器会捕获你输入的脉冲数量和编码器转向。

更需要注意的地方是,并不是你来一个脉冲就是+1,你遇到的问题就在这里:先看手册
QQ截图20160106114508.png QQ截图20160106114621.png
按照你现在的配置模式 TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12,
                             TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
所以应该是来一个脉冲技术值+4;懂没?我先去吃饭了,不会回来再给你说说。

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-11 23:08:19 | 显示全部楼层
帮顶....
回复

使用道具 举报

16

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2014-11-21
在线时间
10 小时
 楼主| 发表于 2015-8-12 08:44:30 | 显示全部楼层
回复【2楼】正点原子:
----------------------------
谢谢
回复

使用道具 举报

16

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2014-11-21
在线时间
10 小时
 楼主| 发表于 2015-8-12 08:44:58 | 显示全部楼层
没人做过吗?
回复

使用道具 举报

12

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-1-5
在线时间
22 小时
发表于 2015-12-6 18:06:39 | 显示全部楼层
回复【4楼】冰冷的游客:
---------------------------------
请教楼主,定时器编码器模式下定时器中断是有脉冲发生时进中断还是预装载值到了进中断呢?
天道酬勤
回复

使用道具 举报

16

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2014-11-21
在线时间
10 小时
 楼主| 发表于 2015-12-9 16:46:10 | 显示全部楼层
回复【5楼】落月枫情:
---------------------------------
脉冲发生变化时吧,我没有中断,直接读得计数器
回复

使用道具 举报

12

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-1-5
在线时间
22 小时
发表于 2015-12-9 21:51:20 | 显示全部楼层
回复【6楼】冰冷的游客:
---------------------------------
应该是计数值到达预装载值时进中断,这个我试过了,对于赋初值要注意,假如初值为0,反转时立马进中断
天道酬勤
回复

使用道具 举报

12

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-1-5
在线时间
22 小时
发表于 2015-12-9 21:53:38 | 显示全部楼层
我试了不同的编码模式,除了双通道上下沿都计数是一个脉冲计数+4之外,其他的针对一项计数每个脉冲都是+2
天道酬勤
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-11-7
在线时间
2 小时
发表于 2016-1-6 11:37:46 | 显示全部楼层
楼主解决这个问题了吗,”除了双通道上下沿都计数是一个脉冲计数+4之外,其他的针对一项计数每个脉冲都是+2“
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-2-27
在线时间
3 小时
发表于 2016-2-27 17:44:40 | 显示全部楼层
结果除以2就是了
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-2-27
在线时间
3 小时
发表于 2016-2-27 17:47:04 | 显示全部楼层
2楼说的是双边缘触发的
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-2-27
在线时间
3 小时
发表于 2016-2-27 17:48:56 | 显示全部楼层
落月枫情 发表于 2015-12-9 21:53
我试了不同的编码模式,除了双通道上下沿都计数是一个脉冲计数+4之外,其他的针对一项计数每个脉冲都是+2

一个是双边缘触发,一个是单边缘触发
回复

使用道具 举报

12

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-1-5
在线时间
22 小时
发表于 2016-4-21 11:05:57 | 显示全部楼层
雨枫 发表于 2016-1-6 11:37
楼主解决这个问题了吗,”除了双通道上下沿都计数是一个脉冲计数+4之外,其他的针对一项计数每个脉冲都是+2 ...

采用单边缘出发,结果除以2就是想要的结果了
天道酬勤
回复

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2017-2-22
在线时间
7 小时
发表于 2017-4-11 17:38:05 | 显示全部楼层
请教一下,为什么
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 10;
TIM_ICInit(TIM4, &TIM_ICInitStructure);
这里没有设置通道呢,TIM_ICStructInit里面只设置了通道一,通道二不需要设置吗????
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2016-10-29
在线时间
15 小时
发表于 2017-4-12 21:50:44 | 显示全部楼层
1201yuge 发表于 2015-8-11 13:53
这个我前几天刚弄过,很准,给你说一下吧。stm32的编码器模式其实就是捕获模式,只不过是把编码器的两路AB ...

你好,请问如果只需要TI1计数,TI2关闭,编码器模式要怎么配置呢?因为我的编码器只有一个输出脉冲,谢谢
回复

使用道具 举报

huang633 该用户已被删除
发表于 2017-4-17 17:12:07 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-22 03:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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