设为首页收藏本站

arduino 单片机机器人爱好者之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: aosini

编码器速度和方向检测,371电机方向与速度检测,stm32编码器接口模式

  [复制链接]

签到天数: 63 天

[LV.6]常住居民II

 楼主| 发表于 2015-7-17 16:07:34 | 显示全部楼层
henidaguaishou 发表于 2015-7-17 10:21
楼主你好,请教你一个问题,STM32系列的芯片2个高级控制寄存器和4个通用定时器都具有支持针对定位的增量( ...

理论上是的
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2015-8-2 16:50:11 | 显示全部楼层
aosini 发表于 2015-6-1 08:03
您看一下是否初始化

我也是0,-1,1,2,9,之类的   。该怎么办  ?我用的是STM32F103。TIM3寄存器是由变化的,比如DIR CEN都是有的,但是接不接编码器都是收到随机数。
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2015-8-2 19:16:10 | 显示全部楼层
LZ 为什么你脉冲值可以直接就读出正负值,我的是如果正转的话就就向上计数,反转的话就向下计数。反正都是正值,还是你有在软件上做过处理 转化成有符号的?
回复 支持 反对

使用道具 举报

签到天数: 63 天

[LV.6]常住居民II

 楼主| 发表于 2015-8-3 08:16:29 | 显示全部楼层
笨笨牛 发表于 2015-8-2 16:50
我也是0,-1,1,2,9,之类的   。该怎么办  ?我用的是STM32F103。TIM3寄存器是由变化的,比如DIR CEN都是 ...

首先看一下时钟初始化是否正确,初始化时,涉及寄存器较多,一不小心,就会设置错误,还有就是注意对应的检测端口。
回复 支持 反对

使用道具 举报

签到天数: 63 天

[LV.6]常住居民II

 楼主| 发表于 2015-8-3 08:26:22 | 显示全部楼层
chd121487941 发表于 2015-8-2 19:16
LZ 为什么你脉冲值可以直接就读出正负值,我的是如果正转的话就就向上计数,反转的话就向下计数。反正都是 ...

在函数//读计数个数int TIM2_Encoder_Read(void)中有这么一句,return (int)((s16)(TIM2->CNT));  //数据类型转换,强制数据类型转化,您用0000-0001=1111,它就是-1的补码,数值都是以补码的形式标识的。
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2015-8-3 15:31:23 | 显示全部楼层
aosini 发表于 2015-8-3 08:26
在函数//读计数个数int TIM2_Encoder_Read(void)中有这么一句,return (int)((s16)(TIM2->CNT));  //数据 ...

原来是这样 ,不过这样的话如果正转超过32768就会变成反转吧
回复 支持 反对

使用道具 举报

签到天数: 7 天

[LV.3]偶尔看看II

发表于 2015-8-3 21:12:27 | 显示全部楼层
孤旅人 发表于 2015-5-30 17:02
楼主,我读回来的数据是1,0,-1.这些数据诶  怎么办

请问您的问题是如何解决的,我也出现了相同的问题,能分享经验吗
回复 支持 反对

使用道具 举报

签到天数: 7 天

[LV.3]偶尔看看II

发表于 2015-8-3 21:47:07 | 显示全部楼层
楼主,有两个问题,一,您的程序里有用到中断吗,没有发现;二,下面是我用库函数配置的定时器

        TIM_ICInitTypeDef  TIM_ICInitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

       
       
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       

        TIM_DeInit(TIM2);
        TIM_TimeBaseStructure.TIM_Period = 65535;      
  TIM_TimeBaseStructure.TIM_Prescaler = 0;            //不分频
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;        //0
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //Ï向上计数
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

        TIM_EncoderInterfaceConfig(TIM2,     TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge);
        TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;     //不分频
  TIM_ICInitStructure.TIM_ICFilter = 0x0;                  //不滤波
  TIM_ICInit(TIM2, &TIM_ICInitStructure);
  TIM2->CNT = 0;

   TIM_Cmd(TIM2, ENABLE);
哪里有问题,,还请诸位指点。  读出来的数据就只是0,1
回复 支持 反对

使用道具 举报

签到天数: 63 天

[LV.6]常住居民II

 楼主| 发表于 2015-8-4 08:08:02 | 显示全部楼层
chd121487941 发表于 2015-8-3 15:31
原来是这样 ,不过这样的话如果正转超过32768就会变成反转吧

是的,但这个可以通过设置检测周期来控制的,这就不再是问题了。
回复 支持 反对

使用道具 举报

签到天数: 63 天

[LV.6]常住居民II

 楼主| 发表于 2015-8-4 08:20:22 | 显示全部楼层
时文胜 发表于 2015-8-3 21:47
楼主,有两个问题,一,您的程序里有用到中断吗,没有发现;二,下面是我用库函数配置的定时器

        ...

在例程中我没有使用中断,您可以看一下文件speed_cap.c最后2个函数,我是通过延时来计数的。
我不太明白,您程序中,倒数第二个语句“TIM->CNT=0”是在哪个函数中,只有在将计数寄存器(TIM2->CNT)中的读出后,才可以将它写“0”。
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|联系我们|YFRobot ( 苏ICP备13017135  

GMT+8, 2018-8-17 02:39 , Processed in 0.096262 second(s), 19 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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