STM32编码器接口的问题

[复制链接]
16199|28
 楼主| shizhewen 发表于 2010-4-29 19:04 | 显示全部楼层 |阅读模式
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的设置是怎么对应的?
 楼主| shizhewen 发表于 2010-5-4 07:39 | 显示全部楼层
没有人知道吗?继续等待高人的出现。
 楼主| shizhewen 发表于 2010-5-4 09:23 | 显示全部楼层

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);  
}
香水城 发表于 2010-5-4 10:15 | 显示全部楼层
ST网站上有应用笔记和例程,可以看看:
STM32F10xxx 正交编码器接口应用笔记
例程下载
 楼主| shizhewen 发表于 2010-5-4 15:36 | 显示全部楼层
香主,非常感谢你的回复,但是,你给的资料我都有了,还有我的程序你能看出来就是上面的例子,我拷的例子的。现在还是不行,能不能给个方法啊?
 楼主| shizhewen 发表于 2010-5-4 15:38 | 显示全部楼层
4# 香水城 香主,非常感谢你的回复,但是,你给的资料我都有了,还有我的程序你能看出来就是上面的例子,我拷的例子的。现在还是不行,能不能给个方法啊?
yybj 发表于 2010-5-4 20:33 | 显示全部楼层
顶一下,期待香版主的回复
香水城 发表于 2010-5-4 21:23 | 显示全部楼层
香主,非常感谢你的回复,但是,你给的资料我都有了,还有我的程序你能看出来就是上面的例子,我拷的例子的。现在还是不行,能不能给个方法啊? ...
shizhewen 发表于 2010-5-4 15:36


1)你用示波器看看。

2)你只说不行,到底什么现象、什么环境也没有描述,我无法知道发生了什么事情。
 楼主| shizhewen 发表于 2010-5-5 17:33 | 显示全部楼层
香主,你好。我侧过了,但是只能是一路信号,我们示波器就一路,从旋转编码器上出来的信号,在示波器中可以看到脉冲。但是STM32却读不准。看见STM32都做出伺服电机控制器来,估计应该是我某些方面做得不好,希望能赐教。
我硬件电路是用TLP521_2上拉电阻直接接入的,然后就是直接用的ST给的电机库里面编码器的代码,现在只读旋转的脉冲数,还不计算速度。但是现在记不准。
我知道自己看不到现象,只听描述,判断故障挺难,还是希望赐教,谢谢!
8# 香水城
 楼主| shizhewen 发表于 2010-5-5 17:36 | 显示全部楼层
还有一点没有说清楚,现在我只是有手转,还没有接电机,速度可以不太考虑,现在最大的问题是读不准。 8# 香水城
lxyppc 发表于 2010-5-6 09:30 | 显示全部楼层
工欲善其事
必先利其器

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

还有一点,实际使用时用ST的电机库中的编码器处理方fa会出现不准的情况
建议楼主把ST库中有关方向判断的代码注释掉,还有编码器计数中断处理相关代码也注释掉
开一个大数组,在一个定时发生的中断中把编码器的计数值写入数组中,一定时间后查看这个数组中的数据是否正确
 楼主| shizhewen 发表于 2010-5-6 11:35 | 显示全部楼层
我一开始也是怀疑是编码器的问题,我到卖方那里检测过,正反转都没有问题。我现在就是用你说的方法,但是计数记不准。非常郁闷。
11# lxyppc
香水城 发表于 2010-5-6 12:09 | 显示全部楼层
请检查编码器的输出信号是否正常,幅值、上升下降沿的时间、脉宽、是否有毛刺等。

还有所谓不正确的现象是什么?计数次数增多、减少,还是根本不计数?

评分

参与人数 1威望 +1 收起 理由
shizhewen + 1 谢谢香主,好了,就是电路的问题 ...

查看全部评分

 楼主| shizhewen 发表于 2010-5-7 17:29 | 显示全部楼层
编码器一定要注意电路问题,现在可以肯定的告诉大家,上面的程序一点都没有问题,要是再有类似的问题,看看自己的硬件电路,主要要关注高低电平的大小,本人错在此,请引以为戒。
在此感谢香主的耐心指导!谢谢!!!
13# 香水城
bsz84 发表于 2010-5-7 20:21 | 显示全部楼层
LZ是否详细说明一下具体原因?
lxyppc 发表于 2010-5-8 10:14 | 显示全部楼层
一般编码器出来后再接个缓冲芯片
电路上有空间的话最好留上这个缓冲
用与不用由成本和实际效果决定
lh0602 发表于 2011-12-9 13:44 | 显示全部楼层
qfggg 发表于 2011-12-9 22:12 | 显示全部楼层
是tlp521的问题吧!
28182900 发表于 2012-3-29 16:24 | 显示全部楼层
楼主不厚道,也不把怎么解决的说一下。
terack 发表于 2012-4-17 11:07 | 显示全部楼层
你的问题解决了吗,我也遇到和你一样的问题了 1# shizhewen
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

28

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部