打印

STM32F103正交编码器丢脉冲?

[复制链接]
6127|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
68336016|  楼主 | 2012-3-22 17:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F103接一个光栅位移传感器,A,B相,X4模式。
1um精度
10ms读取一次计数器,我用手反复按传感器的测量头,读取到的结果都是正确的。
也就是正向+1,反向-1都是正常的。(当然,我手按动幅度比较大,不存在颤抖)

当我传感器测量一个颤抖的平面上(幅度很小,um级别),可能由于颤抖的幅度在传感器精度范围内,造成反复换向。最后测量结果就不准了。

沙发
wenwenyuanyuan| | 2013-10-24 12:23 | 只看该作者
楼主给下程序我测试看看!!

使用特权

评论回复
板凳
airwill| | 2013-10-24 14:16 | 只看该作者
我觉得是硬件问题, 信号不干净或者没有处理干净. 因为编码器的读硬件比较笨, 请给它喂精饲料吧.

使用特权

评论回复
地板
qq84395064| | 2016-3-7 16:01 | 只看该作者
#include "encoding_disk.h"
#include "delay.h"

/**************************************************************************************
********ÂëÅÌÊäÈë¼ì²â*********°´¼üÊäÈë
TIM3 ÓÃÀ´¼ì²âÂëÅÌ
PA.6-> RUN-A2         TIM3-CH1//        
PA.7-> RUN-B2         TIM3-CH2//
PB.0-> RUN-A1         TIM3-CH3//
PB.1-> RUN-B1         TIM3-CH4//
Õý½»±àÂëÆ÷Ò²³ÆÔöÁ¿Ê½±àÂëÆ÷
****************************************************************************************/
#define ENCODER_TIMER   TIM3  // Encoder unit connected to TIM3
#define ENCODER_PPR           (u16)(100)   // number of pulses per revolution
#define SPEED_BUFFER_SIZE 8

#define COUNTER_RESET   (u16)0
#define ICx_FILTER      (u8) 6 // 6<-> 670nsec

#define TIMx_PRE_EMPTION_PRIORITY 1
#define TIMx_SUB_PRIORITY 0

#define ENCODER_TIM_PERIOD 0xffff//???????65536-1
#define MAX_COUNT          10000//10000???1ms?????10000???


void  EncodingDisk_Init(void)
{           

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_ICInitTypeDef TIM_ICInitStructure;
  /* Encoder unit connected to TIM1, 4X mode */   
  GPIO_InitTypeDef GPIO_InitStructure;
  //NVIC_InitTypeDef NVIC_InitStructure;
  /* TIM1 clock source enable */
  RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//
  /* Enable GPIOA, clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//??GPIOA??
  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;//PA8 PA9????
  GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Enable the TIM3 Update Interrupt */
//        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
//        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY;
//        NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY;
//        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//        NVIC_Init(&NVIC_InitStructure);
  /* Timer configuration in Encoder mode */
  TIM_DeInit(ENCODER_TIMER);
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling //??????????0,???
  //TIM_TimeBaseStructure.TIM_Period = (4*ENCODER_PPR)-1;  //????????
  TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD-1;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//?????? T_dts = T_ck_int
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //TIM????
  TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);
  TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//???????3
  TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_ICFilter =ICx_FILTER;//?????????

  TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);
  // Clear all pending interrupts
  TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);//??TIM1??????
  TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);
  //ENC_Clear_Speed_Buffer();
  //Reset counter
  TIM3->CNT = 0;
  //CurrentCount = TIM1->CNT;
  TIM_Cmd(ENCODER_TIMER, ENABLE);
// System.Device.Encoder.Enc_GetCount = Enc_GetCount;

}
s16 Enc_GetCount(void)
{
    static  u16   lastCount = 0;
    u16  curCount = ENCODER_TIMER->CNT;//?????
    s32 dAngle = curCount - lastCount;
    if(dAngle >= MAX_COUNT)
    {
      dAngle -= ENCODER_TIM_PERIOD;
    }
    else if(dAngle < -MAX_COUNT)
    {
      dAngle += ENCODER_TIM_PERIOD;
    }
    lastCount = curCount;
    return (s16)dAngle;
}
/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/


/*s16 Enc_GetCount(void)
{
  static  u16   lastCount = 0;
  u16  curCount = ENCODER_TIM->CNT;
  s32 dAngle = curCount - lastCount;
  if(dAngle >= MAX_COUNT){
    dAngle -= ENCODER_TIM_PERIOD;
  }else if(dAngle < -MAX_COUNT){
    dAngle += ENCODER_TIM_PERIOD;
  }
  lastCount = curCount;
  return (s16)dAngle;
}*/
/*
1s¶¼²»»áÒç³öÖжϣ¬¿ÉÒÔ×öÒ»¸ö10ms²úÉúÒ»´ÎµÄÖжÏ
ÔÚÖжÏÖе÷ÓÃÉÏÃæµÄ´úÂë   ÉÏÊö´úÂëÖÐMAX_COUNTÊDZÈ10msÄÚ¿ÉÄܳöÏֵļÆÊý×î´óÖµ »¹Òª´òµÄÖµ
ENCODER_TIM_PERIODÊǶ¨Ê±Æ÷periodÖµ£¬×îºÃ±ÈMAX_COUNT´ó£¬È»ºó¶¨ÒåÒ»¸ö32λµÄÓзûºÅ±äÁ¿£¬
ÈçcurrentCount

*/


使用特权

评论回复
5
qq84395064| | 2016-3-7 16:02 | 只看该作者
我的为什么捕捉不到,请楼主帮忙看看程序。

使用特权

评论回复
6
zhangxuzhaodan| | 2016-9-6 16:25 | 只看该作者
你好,能够把你编码器程序看看,谢谢了,QQ624323244

使用特权

评论回复
7
Double-明| | 2017-4-5 10:10 | 只看该作者
楼主的编码器程序还在么,我现在遇到和你一样的问题了,弄了好多天都没搞定。

使用特权

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

本版积分规则

13

主题

167

帖子

0

粉丝