OpenEdv-开源电子网

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

编码器模式就读取正反转当按键用怎么读取正反转会方便点?

[复制链接]

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-1-6
在线时间
10 小时
发表于 2016-4-30 13:41:11 | 显示全部楼层 |阅读模式
1金钱
void TIM3_Mode_Config(void)
{
        //u16 CCR1_Val = 2500;
        //u16 CCR2_Val = 1000;
        GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_ICInitTypeDef TIM_ICInitStructure;
        //TIM_OCInitTypeDef  TIM_OCInitStructure;
       
/*----------------------------------------------------------------*/
       
        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);
       
/*----------------------------------------------------------------*/       

       
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3
        TIM_DeInit(TIM3);
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
       
  TIM_TimeBaseStructure.TIM_Period =0xffff;       //
  TIM_TimeBaseStructure.TIM_Prescaler =0;            //设置预分频:
  TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ;        //设置时钟分频系数:不分频
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
  //TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
        /*初始化TIM2定时器 */
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
       
        /*-----------------------------------------------------------------*/
        //编码配置                        编码模式
        TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,
                             TIM_ICPolarity_Rising, TIM_ICPolarity_Rising );  //TIM_ICPolarity_Rising上升沿捕获
  TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_ICFilter = 6;         //比较滤波器
  TIM_ICInit(TIM3, &TIM_ICInitStructure);

        //TIM_ARRPreloadConfig(TIM3, ENABLE);
// Clear all pending interrupts
  TIM_ClearFlag(TIM3, TIM_FLAG_Update);
  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);   //使能中断
  //Reset counter
  TIM3->CNT =2000;
       
       
        TIM_Cmd(TIM3, ENABLE);   //使能定时器3
}
void TIM_Init(void)
{
  TIM3_Mode_Config();
}


TIM_GetCounter(TIM3)可以正确读取TIM3的计数值,若想单纯把左转右转当成两个按键用 有没有寄存器直接读取正反转方向?或者有啥好点的方法??

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-4-30 21:26:42 | 显示全部楼层
寄存器CR1第4位就是方向位
回复

使用道具 举报

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-1-6
在线时间
10 小时
 楼主| 发表于 2016-4-30 21:38:13 | 显示全部楼层
八度空间 发表于 2016-4-30 21:26
寄存器CR1第4位就是方向位

TIM3->CR1 ?
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-4-30 22:43:35 | 显示全部楼层

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

使用道具 举报

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-1-6
在线时间
10 小时
 楼主| 发表于 2016-4-30 23:18:19 | 显示全部楼层

正转的时候DIR = 0,反转DIR = 16,不动的时候也是保持上一状态。若当按键不通过判断TIM计数前后值变大变小来计算转过的格数,能否用别的思路解决?
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-5-1 00:58:20 | 显示全部楼层
zc_dl 发表于 2016-4-30 23:18
正转的时候DIR = 0,反转DIR = 16,不动的时候也是保持上一状态。若当按键不通过判断TIM计数前后值变大变 ...

记录上一次的状态没关系啊,延后一下再判断这个方向标志就是了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-10 01:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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