OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4982|回复: 5

谁有账号帮忙下载个资料

[复制链接]

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-4-25 11:38:51 | 显示全部楼层 |阅读模式

最佳答案

查看完整内容[请看2#楼]

http://bbs.ednchina.com/BLOG_ARTICLE_282960.HTM[/backcolor] STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。 [/backcolor] [/backcolor] 如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到 ...
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-4-25 11:38:52 | 显示全部楼层
http://bbs.ednchina.com/BLOG_ARTICLE_282960.HTM

STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。



    如下图,编码器使用了A,B两相信号,但是我只需要对TI1信号进行计数(第一行),我也是刚发现了这个错误,原来对两个信号都计数,导致码盘转一周得到不止100个脉冲(100线的光电码盘)。通过STM32的编码器模块比较两想的电平信号就可以很容易地计算出编码器的运行情况了。



下面是我调试OK的代码:


void Encoder_Configration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_ICInitTypeDef TIM_ICInitStructure;



  //PC6 A相 PC7 B相
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC,&GPIO_InitStructure);
  
/* Enable the TIM3 Update Interrupt */
  /*NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;
  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_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling
  TIM_TimeBaseStructure.TIM_Period = 10000;  
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

  TIM_EncoderInterfaceConfig(TIM8, TIM_EncoderMode_TI12,
                             TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
  TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_ICFilter = 6;//ICx_FILTER;
  TIM_ICInit(TIM8, &TIM_ICInitStructure);
  
// Clear all pending interrupts
  TIM_ClearFlag(TIM8, TIM_FLAG_Update);
  TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);
  //Reset counter
  TIM2->CNT = 0;

  TIM_Cmd(TIM8, ENABLE);  



}



n_Counter = TIM_GetCounter(TIM8);
Diled_Disp_Num((float)n_Counter);



    另外一个值得注意的问题是,STM32 的定时器是16位的,意思是只能计数到65535,有两种方法,一是采用链式的方式用两个定时器将16位扩展为32位,还有一种简单的方法就是开启定时器的溢出中断,每中断一次就代表编码器运转了特定的角度。



    比如编码器是400线的,将ARR寄存器设置为400,每溢出中断一次就代表电机转了一圈,以此类推。



    另外,关于输入脉冲的检测,其实是类似的,只不过在STM32内部是专门用了一个外部触发模块来实现的,如图一中紫色框的标注,编码器模块应该是在这个模块上的升级,下面是配置代码:



void TIM3_ETR_GetDropCounts_Configuration(void)
{  
   GPIO_InitTypeDef GPIO_InitStructure;
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
   //test PA0 TIM8_ETR
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOD, &GPIO_InitStructure);
   
   TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
   TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
   TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  // Time base configuration
  
   TIM_ETRClockMode2Config(TIM3, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);
  
   TIM_SetCounter(TIM3, 0);
   
   TIM_Cmd(TIM3, ENABLE);
}



转帖》 http://blog.ednchina.com/yemingxp/269451/message.aspx
http://bbs.ednchina.com/BLOG_ARTICLE_1473143.HTM

STM32学习笔记之正交编码器接口

最近做一个项目,主控芯片用STM32RBT6,要用到光栅尺,本来带一个控制器的,通过控制器的232可以读取光栅尺的数据,但这个控制器太大,设备中放不下,于是,考虑自己做一个,网上看到很多有用CPLD的方案,后来无意间发现stm32的定时器可以配置成编码器,甚喜

高兴之余,突然发现stm32的定时器是16位的,我的光栅尺的计数会超过65535,于是在21ic论坛上和几位高手请教,最终确定的方案

工作过程是配置TIM3为正交编码器模式,并定一个10ms的中断,每10ms读取一次计数值,10ms的前提是在10ms内计数器不溢出(这个思想要感谢21ic的lxyppc)

以下是部分代码:(这些代码修改于ST官方的例程,但我的工程用的是V3的固件库,他们的例程貌似是0.3的,所以有些地方有改动)
下面是初始化TIM3为正交编码器模式
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_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
  TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD;  
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
  TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);

  TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI12,
                             TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
  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);
  TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);
  //Reset counter
  TIM2->CNT = COUNTER_RESET;
  
//  ENC_Clear_Speed_Buffer();
  
  TIM_Cmd(ENCODER_TIMER, ENABLE);  
}
以下为获取一次计数值,此算法来自lxyppc,可以规避超过16位的情况,具体细节见http://bbs.21ic.com/viewthread.php?tid=110623的讨论

s16 ENC_Get_Electrical_Angle(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;  
}

以下为系统滴答的初始化和中断函数
void TB_Init(void)
{   
  /* Setup SysTick Timer for 10 msec interrupts  */
  if (SysTick_Config(SystemFrequency / 100))
  {
    /* Capture error */
    while (1);
  }
}

void SysTick_Handler(void)
{   
  /*if (hTimebase_display_500us != 0)  
  {
    hTimebase_display_500us --;
  }
   */
  if (hSpeedMeas_Timebase_500us !=0)
  {
    hSpeedMeas_Timebase_500us--;
  }
  else
  {
    hSpeedMeas_Timebase_500us = SPEED_SAMPLING_TIME;

    CurrentCount += ENC_Get_Electrical_Angle();
        
    //ENC_Calc_Average_Speed must be called ONLY every SPEED_MEAS_TIMEBASE ms
    //ENC_Calc_Average_Speed();   
  }
}
以上代码已通过测试,固件库版本为:V3.1.2
ST官方例程和中文说明文档:http://www.stmicroelectronics.co ... oder_AN%28CH%29.pdf
http://images.stmicroelectronics ... 32F10xxx_Encoder_AN(CH).zip

最后抱怨一句,st为啥不把定时器做成32位的呢,能增加1分钱成本吗?

[tr][/tr]
本帖最后由 yongshi01 于 2013-4-26 11:32 编辑


上一贴中地址http://images.stmicroelectronics ... _Encoder_AN(CH).zip

官方文档下载
http://cache.amobbs.com/bbs_uplo ... ev_719342XZE026.zip
http://www.amobbs.com/forum.php? ... 6%E7%A0%81%E5%99%A8
http://wenku.baidu.com/view/88606e84ec3a87c24028c46b.html





回复
[url=]举报[/url]



[tr][/tr]
4楼
  楼主| 发表于 2013-4-26 10:38:28 | 只看该作者


本帖最后由 yongshi01 于 2013-4-26 13:37 编辑


此帖放关于电机控制的


STM32 电机控制库的资源贴 【2010.06.08 安哥收集】
http://www.amobbs.com/forum.php? ... B%E7%94%B5%E6%9C%BA

stm32电机控制套件资料
http://www.amobbs.com/forum.php? ... B%E7%94%B5%E6%9C%BA

ST 公开了基于STM8S的three-phase BLDC/AC induction motor 控制软件库用户手册下载
http://www.amobbs.com/thread-3433950-1-1.html

STM32硬件电路设计注意事项
http://www.amobbs.com/thread-2228567-1-1.html

ST 的 几个库  包含电机库
http://www.amobbs.com/forum.php? ... B%E7%94%B5%E6%9C%BA
http://www.amobbs.com/forum.php? ... DF8NDcwMDE1NQ%3D%3D
http://www.amobbs.com/forum.php? ... DF8NDcwMDE1NQ%3D%3D

STM32电机入门套件彩页的翻译
http://www.amobbs.com/forum.php? ... B%E7%94%B5%E6%9C%BA
http://cache.amobbs.com/bbs_uplo ... 0/ourdev_265142.rar
http://cache.amobbs.com/bbs_uplo ... 0/ourdev_265162.rar
http://cache.amobbs.com/bbs_uplo ... 0/ourdev_265522.pdf

STM32F10X-128K-EVAL 控制马达程序【恢复】
http://www.amobbs.com/forum.php?mod=viewthread&tid=1636101

st 电机库 2.0; 同时每天bs一次st
http://www.amobbs.com/forum.php?mod=viewthread&tid=3752979

[分享]STM32无刷直流电机库2.0!!!库文件生成器【恢复】
http://www.amobbs.com/forum.php?mod=viewthread&tid=1805923

stm32步进电机源代码
http://www.amobbs.com/forum.php? ... B%E7%94%B5%E6%9C%BA

STM32驱动BLDC电机程序
http://www.amobbs.com/forum.php? ... B%E7%94%B5%E6%9C%BA

stm32控制无刷直流电机的程序
http://www.amobbs.com/forum.php? ... B%E7%94%B5%E6%9C%BA

自己做的STM32 BLDC直流无刷电机控制器
http://www.amobbs.com/forum.php? ... B%E7%94%B5%E6%9C%BA





回复
[url=]举报[/url]



5楼
  楼主| 发表于 2013-4-26 10:40:58 | 只看该作者


本帖最后由 yongshi01 于 2013-4-26 11:27 编辑


一些有益的讨论:
想用STM32和360线的旋转编码器完成低速电机(100转/分钟)每转12度就停一下,是利用定时
http://www.amobbs.com/forum.php? ... %A0%81%E5%99%A8/url]

STM32正交编码器程序--附图
http://www.amobbs.com/forum.php? ... 6%E7%A0%81%E5%99%A8

STM8正交旋转编码器程序
http://www.amobbs.com/forum.php? ... 6%E7%A0%81%E5%99%A8

光电编码器TI例程问题
http://www.amobbs.com/forum.php? ... 6%E7%A0%81%E5%99%A8


旋转编码器资料:
http://www.amobbs.com/forum.php? ... 6%E7%A0%81%E5%99%A8

旋转编码器问答:
http://www.amobbs.com/forum.php? ... 6%E7%A0%81%E5%99%A8

STM32编码器接口模式--寄存器版 (转):
http://www.amobbs.com/forum.php? ... 6%E7%A0%81%E5%99%A8

请问STM32 编码器设定方式?
http://www.amobbs.com/forum.php? ... 6%E7%A0%81%E5%99%A8

STM32 正交编码器接口
http://www.amobbs.com/forum.php? ... 6%E7%A0%81%E5%99%A8

stm32配置成编码器模式,我不知道我的配置正确么
http://www.amobbs.com/forum.php? ... 6%E7%A0%81%E5%99%A8

关于编码器接口的疑问
http://www.amobbs.com/forum.php? ... 6%E7%A0%81%E5%99%A8

哪位用STM32做过正交编码器啊
http://www.amobbs.com/forum.php? ... 6%E7%A0%81%E5%99%A8
http://cache.amobbs.com/bbs_uplo ... 8/ourdev_548489.pdf 光栅尺AB相信号细分计数模块的设计.pdf
http://cache.amobbs.com/bbs_uplo ... 8/ourdev_548490.pdf 基于CPLD的光栅倍频细分电路的设计与实现.pdf







我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2014-8-13
在线时间
70 小时
发表于 2017-4-27 17:09:33 | 显示全部楼层
你是要正交编码的资料么?
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2017-4-27 21:56:55 | 显示全部楼层
CrazyMCU 发表于 2017-4-27 17:09
你是要正交编码的资料么?

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-4-28 19:24:23 | 显示全部楼层
并没有附件,都是一些链接
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2017-4-28 23:18:13 | 显示全部楼层
正点原子 发表于 2017-4-25 11:38
http://bbs.ednchina.com/BLOG_ARTICLE_282960.HTM

STM32的每个TIMER都有正交编码器输入接 ...

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-21 18:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表