10878|14

64

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

STM32编码器接口的问题 [复制链接]

void ENC_Init(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_ICInitTypeDef TIM_ICInitStructure;
  
/* Encoder unit connected to TIM3, 4X mode */   
  GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* TIM3 clock source enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  /* Enable GPIOA, clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  
  GPIO_StructInit(&GPIO_InitStructure);
  /* Configure PA.06,07 as encoder input */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* Enable the TIM3 Update Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  /* Timer configuration in Encoder mode */
  TIM_DeInit(TIM3);
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  
  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling
  TIM_TimeBaseStructure.TIM_Period = (4*2000)-1;  
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;   
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,
                             TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
  TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;
  TIM_ICInit(TIM3, &TIM_ICInitStructure);
  
// Clear all pending interrupts
  TIM_ClearFlag(TIM3, TIM_FLAG_Update);
  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
  //Reset counter
  TIM3->CNT = COUNTER_RESET;
  
// ENC_Clear_Speed_Buffer();
  
  TIM_Cmd(TIM3, ENABLE);  
}
版主,你好。(1)我调了旋转编码器,正向正确,反向不正确。程序如上,硬件是用TLP521-2接入的。能给个解决方案吗?
(2)STM32的编码器接口是不是只能2倍频或着4倍频,能不能不倍频啊?
(3)ICFilter的设置是怎么对应的?
此帖出自stm32/stm8论坛

最新回复

                                 一般编码器出来后再接个缓冲芯片 电路上有空间的话最好留上这个缓冲 用与不用由成本和实际效果决定  详情 回复 发表于 2010-5-8 10:14
点赞 关注
 

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 没有人知道吗?继续等待高人的出现。
此帖出自stm32/stm8论坛
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

STM32编码器接口的问题

版主版主,你好。(1)我调了旋转编码器,正向正确,反向不正确。程序如上,硬件         是用TLP521-2接入的。能给个解决方案吗?
(2)STM32的编码器接口是不是只能2倍频或着4倍频,能不能不倍频啊?
(3)ICFilter的设置是与寄存器怎么对应的,作用是什么?
void ENC_Init(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_ICInitTypeDef TIM_ICInitStructure;
  
/* Encoder unit connected to TIM3, 4X mode */   
  GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* TIM3 clock source enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  /* Enable GPIOA, clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  
  GPIO_StructInit(&GPIO_InitStructure);
  /* Configure PA.06,07 as encoder input */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* Enable the TIM3 Update Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  /* Timer configuration in Encoder mode */
  TIM_DeInit(TIM3);
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  
  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling
  TIM_TimeBaseStructure.TIM_Period = (4*2000)-1;  
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;   
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,
                             TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
  TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;
  TIM_ICInit(TIM3, &TIM_ICInitStructure);
  
// Clear all pending interrupts
  TIM_ClearFlag(TIM3, TIM_FLAG_Update);
  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
  //Reset counter
  TIM3->CNT = COUNTER_RESET;
  
// ENC_Clear_Speed_Buffer();
  
  TIM_Cmd(TIM3, ENABLE);  
}
此帖出自stm32/stm8论坛
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
ST网站上有应用笔记和例程,可以看看:
STM32F10xxx 正交编码器接口应用笔记
例程下载
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 
                                 版主,非常感谢你的回复,但是,你给的资料我都有了,还有我的程序你能看出来就是上面的例子,我拷的例子的。现在还是不行,能不能给个方法啊?
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
                                 版主,非常感谢你的回复,但是,你给的资料我都有了,还有我的程序你能看出来就是上面的例子,我拷的例子的。现在还是不行,能不能给个方法啊?
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 
                                 顶一下,期待版主主的回复
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
版主,非常感谢你的回复,但是,你给的资料我都有了,还有我的程序你能看出来就是上面的例子,我拷的例子的。现在还是不行,能不能给个方法啊? ...
1)你用示波器看看。

2)你只说不行,到底什么现象、什么环境也没有描述,我无法知道发生了什么事情。
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
版主,你好。我侧过了,但是只能是一路信号,我们示波器就一路,从旋转编码器上出来的信号,在示波器中可以看到脉冲。但是STM32却读不准。看见STM32都做出伺服电机控制器来,估计应该是我某些方面做得不好,希望能赐教。
我硬件电路是用TLP521_2上拉电阻直接接入的,然后就是直接用的ST给的电机库里面编码器的代码,现在只读旋转的脉冲数,还不计算速度。但是现在记不准。
我知道自己看不到现象,只听描述,判断故障挺难,还是希望赐教,谢谢!
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

10
 
                                 还有一点没有说清楚,现在我只是有手转,还没有接电机,速度可以不太考虑,现在最大的问题是读不准。
此帖出自stm32/stm8论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

11
 
工欲善其事
必先利其器

楼主还是换个能同时看两路的示波器吧
如果编码器的输入不对,也会导致计数器不准

还有一点,实际使用时用ST的电机库中的编码器处理方fa会出现不准的情况
建议楼主把ST库中有关方向判断的代码注释掉,还有编码器计数中断处理相关代码也注释掉
开一个大数组,在一个定时发生的中断中把编码器的计数值写入数组中,一定时间后查看这个数组中的数据是否正确
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

12
 
我一开始也是怀疑是编码器的问题,我到卖方那里检测过,正反转都没有问题。我现在就是用你说的方法,但是计数记不准。非常郁闷。
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

13
 
请检查编码器的输出信号是否正常,幅值、上升下降沿的时间、脉宽、是否有毛刺等。

还有所谓不正确的现象是什么?计数次数增多、减少,还是根本不计数?
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

14
 
                                 LZ是否详细说明一下具体原因?
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

15
 
一般编码器出来后再接个缓冲芯片
电路上有空间的话最好留上这个缓冲
用与不用由成本和实际效果决定
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表