打印

STM32编码器接口的问题

[复制链接]
14856|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 正交编码器接口应用笔记
例程下载

使用特权

评论回复
5
shizhewen|  楼主 | 2010-5-4 15:36 | 只看该作者
香主,非常感谢你的回复,但是,你给的资料我都有了,还有我的程序你能看出来就是上面的例子,我拷的例子的。现在还是不行,能不能给个方法啊?

使用特权

评论回复
6
shizhewen|  楼主 | 2010-5-4 15:38 | 只看该作者
4# 香水城 香主,非常感谢你的回复,但是,你给的资料我都有了,还有我的程序你能看出来就是上面的例子,我拷的例子的。现在还是不行,能不能给个方法啊?

使用特权

评论回复
7
yybj| | 2010-5-4 20:33 | 只看该作者
顶一下,期待香版主的回复

使用特权

评论回复
8
香水城| | 2010-5-4 21:23 | 只看该作者
香主,非常感谢你的回复,但是,你给的资料我都有了,还有我的程序你能看出来就是上面的例子,我拷的例子的。现在还是不行,能不能给个方法啊? ...
shizhewen 发表于 2010-5-4 15:36


1)你用示波器看看。

2)你只说不行,到底什么现象、什么环境也没有描述,我无法知道发生了什么事情。

使用特权

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

使用特权

评论回复
10
shizhewen|  楼主 | 2010-5-5 17:36 | 只看该作者
还有一点没有说清楚,现在我只是有手转,还没有接电机,速度可以不太考虑,现在最大的问题是读不准。 8# 香水城

使用特权

评论回复
11
lxyppc| | 2010-5-6 09:30 | 只看该作者
工欲善其事
必先利其器

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

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

使用特权

评论回复
12
shizhewen|  楼主 | 2010-5-6 11:35 | 只看该作者
我一开始也是怀疑是编码器的问题,我到卖方那里检测过,正反转都没有问题。我现在就是用你说的方法,但是计数记不准。非常郁闷。
11# lxyppc

使用特权

评论回复
13
香水城| | 2010-5-6 12:09 | 只看该作者
请检查编码器的输出信号是否正常,幅值、上升下降沿的时间、脉宽、是否有毛刺等。

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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
shizhewen + 1 谢谢香主,好了,就是电路的问题 ...
14
shizhewen|  楼主 | 2010-5-7 17:29 | 只看该作者
编码器一定要注意电路问题,现在可以肯定的告诉大家,上面的程序一点都没有问题,要是再有类似的问题,看看自己的硬件电路,主要要关注高低电平的大小,本人错在此,请引以为戒。
在此感谢香主的耐心指导!谢谢!!!
13# 香水城

使用特权

评论回复
15
bsz84| | 2010-5-7 20:21 | 只看该作者
LZ是否详细说明一下具体原因?

使用特权

评论回复
16
lxyppc| | 2010-5-8 10:14 | 只看该作者
一般编码器出来后再接个缓冲芯片
电路上有空间的话最好留上这个缓冲
用与不用由成本和实际效果决定

使用特权

评论回复
17
lh0602| | 2011-12-9 13:44 | 只看该作者
mark

使用特权

评论回复
18
qfggg| | 2011-12-9 22:12 | 只看该作者
是tlp521的问题吧!

使用特权

评论回复
19
28182900| | 2012-3-29 16:24 | 只看该作者
楼主不厚道,也不把怎么解决的说一下。

使用特权

评论回复
20
terack| | 2012-4-17 11:07 | 只看该作者
你的问题解决了吗,我也遇到和你一样的问题了 1# shizhewen

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

28

帖子

0

粉丝