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

[复制链接]
2053|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 的作用了。好像无法实现我的要求。
稳稳の幸福 发表于 2016-5-17 21:11 | 显示全部楼层
没做过这种,来MARK一下,学习学习。
airwill 发表于 2016-5-18 08:58 | 显示全部楼层
2.png
从这个功能图上看, 是完全可以实现的, 一大堆的寄存器直接操作, 可能存在寄存器设置的顺序问题, 你可以先采样库函数来完成, 或者借助调试器看看定时器最终的设置是否正确
gbbfbaa 发表于 2016-5-18 10:07 | 显示全部楼层
pic16f883和pic16f886居然还有异域兄弟,送分送分啊
https://bbs.21ic.com/forum.php?mo ... &fromuid=877646
(出处: 21ic电子技术论坛)
 楼主| alanvi 发表于 2016-5-18 16:25 | 显示全部楼层
airwill 发表于 2016-5-18 08:58
从这个功能图上看, 是完全可以实现的, 一大堆的寄存器直接操作, 可能存在寄存器设置的顺序问题, 你可以先 ...

。我看这图反而觉得无法实现、在对应电平信号固定的情况下 一个脉冲的上升沿+1 下降沿-1.回到原始状态。
如果能对TI1FP1的边沿进行选择的话 应该可以 但是没找到对应的配置寄存器。CCER应该不能再这个模式下这样用才对。 先试试
 楼主| 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 没变化。。。好奇怪  哪位能告诉我 这个模式真的能实现我的要求吗?如果能 希望能给我一个配置范例。
不行的话 我只能外部时钟+外部中断的方式实现了。
airwill 发表于 2016-5-18 18:42 | 显示全部楼层
alanvi 发表于 2016-5-18 16:25
。我看这图反而觉得无法实现、在对应电平信号固定的情况下 一个脉冲的上升沿+1 下降沿-1.回到原始状态。
...

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

照这情况, 中间方向控制得加个异或门, 控制异或门的输入来实现计数方向了
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;
}
sjw1716094642 发表于 2016-5-19 01:54 | 显示全部楼层
我是 F303k8
sjw1716094642 发表于 2016-5-19 01:56 | 显示全部楼层
TIM2->SMCR=(uint32_t)0x3;
0x1,,,,,,,0x2,,,,,,,,,,,0x3,,,,,对应模式123
 楼主| alanvi 发表于 2016-5-19 09:16 | 显示全部楼层
sjw1716094642 发表于 2016-5-19 01:56
TIM2->SMCR=(uint32_t)0x3;
0x1,,,,,,,0x2,,,,,,,,,,,0x3,,,,,对应模式123

感谢例程 稍微迟点我再实验下
 楼主| alanvi 发表于 2016-5-19 09:55 | 显示全部楼层
sjw1716094642 发表于 2016-5-19 01:56
TIM2->SMCR=(uint32_t)0x3;
0x1,,,,,,,0x2,,,,,,,,,,,0x3,,,,,对应模式123

失败了。。CNT没变化 倒是CR1里面的DIR在变。。
sjw1716094642 发表于 2016-5-20 13:47 | 显示全部楼层
那就不造了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

28

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部