YFROBOT创客社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: aosini
打印 上一主题 下一主题

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

  [复制链接]

签到天数: 7 天

[LV.3]偶尔看看II

41#
发表于 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

42#
 楼主| 发表于 2015-8-4 08:08:02 | 只看该作者
chd121487941 发表于 2015-8-3 15:31
原来是这样 ,不过这样的话如果正转超过32768就会变成反转吧

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

使用道具 举报

签到天数: 63 天

[LV.6]常住居民II

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

        ...

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

使用道具 举报

该用户从未签到

44#
发表于 2015-8-8 16:36:22 | 只看该作者
时文胜 发表于 2015-8-3 21:47
楼主,有两个问题,一,您的程序里有用到中断吗,没有发现;二,下面是我用库函数配置的定时器

        ...

编码器的AB相都接入了吗?只接一项好像是只有0 1,因为计数方向是有硬件决定的
回复 支持 反对

使用道具 举报

签到天数: 63 天

[LV.6]常住居民II

45#
 楼主| 发表于 2015-8-31 08:12:55 | 只看该作者
wodezpy 发表于 2015-8-30 11:27
void Motor_Speed_Control(s16 motorSpeed)         
{
    s16 speed = 0 ;        

您好,是的 ,谢谢您我修改一下
回复 支持 反对

使用道具 举报

签到天数: 63 天

[LV.6]常住居民II

46#
 楼主| 发表于 2015-9-3 19:06:23 | 只看该作者
wodezpy 发表于 2015-9-2 11:48
你好我想请问一下:
这里最后一句return (int)((s16)(TIM2->CNT));该如何理解,因为当计数器清零后,在10m ...

return (int)((s16)(TIM2->CNT));里面有个类型转换,强制转换返回有符型数据。数值都是以补码表示的,正整数补码是源码,负整数补码是绝对值取反加1。向下计数时减1,为0时,就需要向高位借位减“1”,可以这样理解,一个8位数00000000B-00000001B,但0不够减1的,就向不存在的第9位借1,100000000B-00000001B=11111111B,数是以补码形式表示的,这样11111111B就为-1了
回复 支持 反对

使用道具 举报

签到天数: 63 天

[LV.6]常住居民II

47#
 楼主| 发表于 2015-9-7 08:36:48 | 只看该作者
wodezpy 发表于 2015-9-4 17:59
还有个问题,当计数器为0时,如果减1后CNT内的值就为减1后的补码形式存在?
但是手册里不是说CNT只能在0 ...

是的。具体可以看STM32中文参考手册,第273页,14.3.12编码器接口模式。里面有较详细的说明,如果没有这个手册,请到http://www.yfrobot.com/forum.php ... 360&highlight=stm32下载,或留个邮箱我给您发一下。在主函数中,初始化,TIM2_Encoder_Init(0xffff, 0); //计数器自动重装值为最大
回复 支持 反对

使用道具 举报

签到天数: 63 天

[LV.6]常住居民II

48#
 楼主| 发表于 2015-9-16 13:52:43 | 只看该作者
wodezpy 发表于 2015-9-16 10:14
手册有,不过还有个问题就是CNT重装值设置为0XFFFF,那它表示的数值是0-65535,还是32768~32767,因为-1的 ...

请仔细看25楼哟
回复 支持 反对

使用道具 举报

签到天数: 63 天

[LV.6]常住居民II

49#
 楼主| 发表于 2015-9-25 07:55:05 | 只看该作者
wodezpy 发表于 2015-9-24 11:19
还是不太懂,我就是搞不懂如何判断补码为1111到底表示的为-1还是15?既然是补码我可以认为1111为正数的补 ...

((s16)(TIM2->CNT))强制类型转换,转换成有符型的,那么最高位就是符号位。
回复 支持 反对

使用道具 举报

签到天数: 63 天

[LV.6]常住居民II

50#
 楼主| 发表于 2015-10-7 13:47:49 | 只看该作者
wodezpy 发表于 2015-10-7 11:29
请问如果是普通的码盘测速,就是只有一个输出信号的不带方向检测的可以使用编码器接口模式吗?配置上和这个 ...

不可以使用的。那个只要用外部中断计数就可以了
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|联系我们|YFROBOT ( 苏ICP备20009901号-2  

GMT+8, 2024-5-7 22:57 , Processed in 0.048106 second(s), 20 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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