打印
[STM32F3]

请教 关于定时器 编码器接口模式 1/2的使用

[复制链接]
1671|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alanvi|  楼主 | 2016-5-17 11:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 alanvi 于 2016-5-17 14:32 编辑

诸位  我遇到个问题 想请教下。我想通过配置定时器TIM4 使用编码器接口模式1实现,用TIM4_CH1作为计数方向控制  上升/下降,TIM4_CH2作为计数信号。
但是实际运行后发现,CH1的方向控制没问题 DIR 位会更随改变。但是CH2的计数始终没反应,请帮忙看下我的TIM4的编码器接口模式1是否配置错误。
或者请给予我一份寄存器操作的实例 谢谢。查了很多地方 几乎没看到模式1/2的实例。

同一个芯片上的TIM2 配置编码器模式3 配置且运行成功 和下面程序的差异主要就一个SMS = 3.
我开始怀疑。我是不是理解错这个模式的功能了。。。。  哪位能帮我说明下

   //时钟使能
    RCC->APB1RSTR |= RCC_APB1RSTR_TIM4RST;        //复位TIM4时钟
    RCC->APB1RSTR &= ~RCC_APB1RSTR_TIM4RST;
    RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;     //使能TIM4时钟  
    RCC->AHBENR |= RCC_AHBENR_GPIOAEN;      //使能PA时钟
    WAITE_RCC();                                                //等待时钟稳定

    //PA11 CH1 PA12 CH2 配置      
    GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_12);
    GPIOA->OTYPER |= (0UL << 11)|       //PA11 推挽输出
                                    (0UL << 12);       //PA12 推挽输出
    GPIOA->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR12);
    GPIOA->OSPEEDR |= (1UL << 22)|      //PA11 中等速度输出
                                      (1UL << 24);      //PA12 中等速度输出
    GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR11 | GPIO_PUPDR_PUPDR12);
    GPIOA->PUPDR |= (1UL << 22)|        //PA11 上拉输入
                                  (1UL << 24);        //PA12 上拉输入
    GPIOA->MODER &= ~(GPIO_MODER_MODER11 | GPIO_MODER_MODER12);
    GPIOA->MODER |= (2UL << 22)|        //PA11 AF模式
                                  (2UL << 24);        //PA12 AF模式

    GPIOA->AFR[1] &= ~(GPIO_AFRH_AFRH3 |GPIO_AFRH_AFRH4);
    GPIOA->AFR[1] |=  (10UL<<12) |      //PA11 -> TIM4_CH1
                                   (10UL<<16);       //PA12 -> TIM4_CH2

    //计数模式配置
    TIM4->PSC = 0;
    TIM4->ARR = 2000;

    TIM4->CR1 &= ~TIM_CR1_CKD;
    TIM4->CR1 |= 0 << 8;  //未分频

    TIM4->CR1 &= ~TIM_CR1_CMS;//边沿对齐模式

    //编码器接口模式配置
    TIM4->CCMR1 &= ~(TIM_CCMR1_CC1S | TIM_CCMR1_CC2S);
    TIM4->CCMR1 |= (1UL << 0)| //IC1 mapped ON TI1
                                (1UL << 8); //IC2 mapped ON TI2

    TIM4->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P); // IC1FP1 = TI1 IC2FP2 = TI2

    TIM4->SMCR &= ~TIM_SMCR_SMS;
    TIM4->SMCR |= 1;    //sms = 0001 TI1FP1做方向 TI2FP2做计数来源
        
    TIM4->CR1 |= TIM_CR1_CEN; //启动定时器



请问 问题出在哪里
沙发
alanvi|  楼主 | 2016-5-17 12:48 | 只看该作者
。或者 谁能告诉我下 用编码器接口模式1 或者 模式2 是否能实现我的设想 CH1做方向控制 CH2做计数信号

使用特权

评论回复
板凳
xmshao| | 2016-5-17 15:22 | 只看该作者
你使用的F3系列吧。TIM2/3/4/5的结构一模一样,只是TIM2是32位计数器而已。

至于例子,MODE3跟mode1/2 配置都一样,只是SMS的差别。

具体是哪个型号? 你也确认下管脚配置。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
alanvi + 1
地板
alanvi|  楼主 | 2016-5-17 15:34 | 只看该作者
xmshao 发表于 2016-5-17 15:22
你使用的F3系列吧。TIM2/3/4/5的结构一模一样,只是TIM2是32位计数器而已。

至于例子,MODE3跟mode1/2 配 ...

我 确认过 管脚是一样的 只是 我可能理解错 模式1 2 的作用了。好像无法实现我的要求。

使用特权

评论回复
5
稳稳の幸福| | 2016-5-17 21:11 | 只看该作者
没做过这种,来MARK一下,学习学习。

使用特权

评论回复
6
airwill| | 2016-5-18 08:58 | 只看该作者

从这个功能图上看, 是完全可以实现的, 一大堆的寄存器直接操作, 可能存在寄存器设置的顺序问题, 你可以先采样库函数来完成, 或者借助调试器看看定时器最终的设置是否正确

使用特权

评论回复
7
gbbfbaa| | 2016-5-18 10:07 | 只看该作者
pic16f883和pic16f886居然还有异域兄弟,送分送分啊
https://bbs.21ic.com/forum.php?mo ... &fromuid=877646
(出处: 21ic电子技术论坛)

使用特权

评论回复
8
alanvi|  楼主 | 2016-5-18 16:25 | 只看该作者
airwill 发表于 2016-5-18 08:58
从这个功能图上看, 是完全可以实现的, 一大堆的寄存器直接操作, 可能存在寄存器设置的顺序问题, 你可以先 ...

。我看这图反而觉得无法实现、在对应电平信号固定的情况下 一个脉冲的上升沿+1 下降沿-1.回到原始状态。
如果能对TI1FP1的边沿进行选择的话 应该可以 但是没找到对应的配置寄存器。CCER应该不能再这个模式下这样用才对。 先试试

使用特权

评论回复
9
alanvi|  楼主 | 2016-5-18 17:02 | 只看该作者
。。还是没成功 配置成编码器模式1 Counter counts up/down on TI2FP2 edge depending on TI1FP1 level.
TI1FP1  连 TIM4_CH1
TI2FP2  连 TIM4_CH2

给TI2FP2  一个脉冲 CNT 没变化。。。好奇怪  哪位能告诉我 这个模式真的能实现我的要求吗?如果能 希望能给我一个配置范例。
不行的话 我只能外部时钟+外部中断的方式实现了。

使用特权

评论回复
10
airwill| | 2016-5-18 18:42 | 只看该作者
alanvi 发表于 2016-5-18 16:25
。我看这图反而觉得无法实现、在对应电平信号固定的情况下 一个脉冲的上升沿+1 下降沿-1.回到原始状态。
...

呵呵, 没有细看, 确实有问题, 为此我查了一下其它的手册, 都是这样写的.


照这情况, 中间方向控制得加个异或门, 控制异或门的输入来实现计数方向了

使用特权

评论回复
11
sjw1716094642| | 2016-5-19 01:54 | 只看该作者
static void Tim2_Encoder(void)
{
  RCC->APB1ENR|=(uint32_t)0x01;
  GPIOA->AFR[0]&=(uint32_t)0xffffff00;
  GPIOA->AFR[0]|=(uint32_t)0x00000011;
  IOset(GPIOA,0X5,0x3,2,0,0,0,1);//自己的配置函数,,,,,,
  TIM2->SMCR=(uint32_t)0x3;
  TIM2->CCMR1=(uint32_t)0x0101;
  TIM2->ARR=0xffff;
  TIM2->CNT=0;
  TIM2->CCER=0x11;
  TIM2->CR1=0x01;
}

使用特权

评论回复
12
sjw1716094642| | 2016-5-19 01:54 | 只看该作者
我是 F303k8

使用特权

评论回复
13
sjw1716094642| | 2016-5-19 01:56 | 只看该作者
TIM2->SMCR=(uint32_t)0x3;
0x1,,,,,,,0x2,,,,,,,,,,,0x3,,,,,对应模式123

使用特权

评论回复
14
alanvi|  楼主 | 2016-5-19 09:16 | 只看该作者
sjw1716094642 发表于 2016-5-19 01:56
TIM2->SMCR=(uint32_t)0x3;
0x1,,,,,,,0x2,,,,,,,,,,,0x3,,,,,对应模式123

感谢例程 稍微迟点我再实验下

使用特权

评论回复
15
alanvi|  楼主 | 2016-5-19 09:55 | 只看该作者
sjw1716094642 发表于 2016-5-19 01:56
TIM2->SMCR=(uint32_t)0x3;
0x1,,,,,,,0x2,,,,,,,,,,,0x3,,,,,对应模式123

失败了。。CNT没变化 倒是CR1里面的DIR在变。。

使用特权

评论回复
16
sjw1716094642| | 2016-5-20 13:47 | 只看该作者
那就不造了

使用特权

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

本版积分规则

7

主题

28

帖子

0

粉丝