打印

STM32F10xxx 正交编码器接口-官方应用笔记

[复制链接]
4826|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiaxinhui|  楼主 | 2013-4-25 21:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在马达控制类应用中, 正交编码器可以反馈马达的转子位置及转速信号。TM32F10x系列MCU集成了正交编码器接口,增量编码器可与MCU直接连接而无需外部接口电路。该应用笔记详细介绍了STM32F10x与正交编码器的接口,并附有相应的例程,使用户可以很快地掌握其使用方法。
正交编码器.pdf (323.4 KB)


沙发
bsz84| | 2013-4-26 08:26 | 只看该作者
谢谢楼主!

使用特权

评论回复
板凳
ranqingfa| | 2013-10-24 11:05 | 只看该作者
很好,在认真看……

使用特权

评论回复
地板
menghe96| | 2014-4-22 15:07 | 只看该作者
有官网链接吗?  在官网哪里可以找到类似的例程资料啊? 谢谢

使用特权

评论回复
5
tianli1980| | 2014-4-22 16:50 | 只看该作者
搭车请教:编码器的A B 可以连接到 TIM 的 TI1 TI2 上 ,编码器的零点信号 一般是连到外部中断 里边清除CNT  还是连接到 TIM 在捕获中断清除CNT  个人感觉不出区别来?!

使用特权

评论回复
6
qqq_147258| | 2014-5-9 16:50 | 只看该作者
各位,如果想要检测编码器翻转时的计数值怎么处理?
有对应的中断吗?

使用特权

评论回复
7
804431966| | 2015-3-8 22:31 | 只看该作者
谢谢

使用特权

评论回复
8
qq84395064| | 2016-3-7 15:47 | 只看该作者
/**************************************************************************************
********???ìê?è??ì2a*********°′?üê?è?
TIM3 ó?à′?ì2a???ì
PA.6-> RUN-A2         TIM3-CH1//        
PA.7-> RUN-B2         TIM3-CH2//
PB.0-> RUN-A1         TIM3-CH3//
PB.1-> RUN-B1         TIM3-CH4//
?y??±à???÷ò23???á?ê?±à???÷
****************************************************************************************/
#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;
}



我的程序死活不行,请楼主帮忙分析下,谢谢。

使用特权

评论回复
9
zhangxuzhaodan| | 2016-9-6 16:27 | 只看该作者
能够把你的参考例程给我看看,很多都不懂,谢谢了,QQ624323244

使用特权

评论回复
10
Double-明| | 2017-4-5 09:57 | 只看该作者
qq84395064 发表于 2016-3-7 15:47
/**************************************************************************************
********??? ...

你的编码器程序可以用了吗?你用的是什么芯片啊?

使用特权

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

本版积分规则

个人签名:点击进入—》我的淘宝店 数据采集板 RS485 CAN 总线通讯评估套件

71

主题

921

帖子

9

粉丝