搜索
bottom↓
回复: 15

STM32F407定时器作为编码器使用时,用哪些引脚

[复制链接]

出0入0汤圆

发表于 2019-2-27 15:57:11 | 显示全部楼层 |阅读模式
如题,请教各路大神,STM32F407定时器作为编码器使用时,用哪些引脚。比如定时器2、3、4、5,作为编码器使用时,定时器2的通道1、2、3、4,哪些可以作为编码器输入,哪些不能。也没见什么资料上有说明。

出0入0汤圆

发表于 2019-2-27 17:15:42 | 显示全部楼层
本帖最后由 xld826 于 2019-2-27 17:21 编辑


A、B接到TIM两个通道即可。比如TIM4:CH1 CH2。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2019-2-27 17:34:27 | 显示全部楼层
xld826 发表于 2019-2-27 17:15
A、B接到TIM两个通道即可。比如TIM4:CH1 CH2。

谢谢!是任意两个通道吗?还是只能通道1、2

出0入0汤圆

发表于 2019-2-27 17:47:30 | 显示全部楼层
应该只能1,2

出0入0汤圆

发表于 2019-2-27 18:06:50 | 显示全部楼层
CubeMX 管脚功能完全可视化

出0入0汤圆

发表于 2019-2-27 18:08:17 | 显示全部楼层
1,2,3,4,5,8,9都可以,并且只能接通道1,2
其实看一眼编码器库函数的可选参数就可以了
另外,只有2和5是32位计数,其他的是16位计数,这个要注意下

出0入0汤圆

发表于 2019-2-27 20:08:16 | 显示全部楼层
go2deathward 发表于 2019-2-27 18:08
1,2,3,4,5,8,9都可以,并且只能接通道1,2
其实看一眼编码器库函数的可选参数就可以了
另外,只有2和5是 ...

手册上没写tim9可以编码器模式。只有tim1,tim2-5,tim8的ch1, ch2可以配置成编码器模式。

出0入0汤圆

发表于 2019-2-27 20:10:45 | 显示全部楼层
reference manual上都清楚了。另外用cubemx可以很简单地配置tim1-5, 8的编码器模式,顺便引脚也给你选好了。

出0入0汤圆

 楼主| 发表于 2019-2-27 20:26:33 | 显示全部楼层
gallop020142 发表于 2019-2-27 20:10
reference manual上都清楚了。另外用cubemx可以很简单地配置tim1-5, 8的编码器模式,顺便引脚也给你选好了 ...

谢谢,我手上只有STM32F407的datasheet.现在就去找那个reference manual,再次感谢

出0入0汤圆

发表于 2019-2-27 20:47:24 | 显示全部楼层
heyangfengyue 发表于 2019-2-27 20:26
谢谢,我手上只有STM32F407的datasheet.现在就去找那个reference manual,再次感谢

宏定义:
#if TIM1_ENC_EN
    #define TIM1_ENC_GPIO_PORT_CHA  GPIOE
    #define TIM1_ENC_GPIO_PORT_CHB  GPIOE
    #define TIM1_ENC_GPIO_CLK_ALL   RCC_AHB1Periph_GPIOE
    #define TIM1_ENC_CHA_PIN        GPIO_Pin_9
    #define TIM1_ENC_CHB_PIN        GPIO_Pin_11
    #define TIM1_ENC_CHA_SOURCE     GPIO_PinSource9
    #define TIM1_ENC_CHB_SOURCE     GPIO_PinSource11
    #define TIM1_ENC_CHA_AF         GPIO_AF_TIM1
    #define TIM1_ENC_CHB_AF         GPIO_AF_TIM1
    #define TIM1_ENC_TIMER          TIM1
    #define TIM1_ENC_TIMER_CLK      RCC_APB2Periph_TIM1
   
    #define TIM1_ENC_TIMER_IRQCh    TIM1_IRQn   
    #define TIM1_ENC_PPR              2500   //500 number of pulses per revolution
    #define MAX_COUNT1_IN_1MS         1000  //encoder1在10ms内可能出现的计数最大值
    EncoderData encoder1;   //实时记录编码器的总读数
    vs32 encoder1_old = 0;
#endif

初始化:
#if TIM1_ENC_EN   
    //step1 初始化timer & gpio时钟
    RCC_APB2PeriphClockCmd(TIM1_ENC_TIMER_CLK, ENABLE); //注意确定是RCC_APB1PeriphClockCmd还是RCC_APB2PeriphClockCmd
    RCC_AHB1PeriphClockCmd(TIM1_ENC_GPIO_CLK_ALL,  ENABLE);
    //step2 设置引脚为浮空输入
    GPIO_StructInit( & GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;

    GPIO_InitStructure.GPIO_Pin = TIM1_ENC_CHA_PIN;
    GPIO_Init(TIM1_ENC_GPIO_PORT_CHA, & GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = TIM1_ENC_CHB_PIN;
    GPIO_Init(TIM1_ENC_GPIO_PORT_CHB, & GPIO_InitStructure);
    //connect the pins to their Alternate Functions
    GPIO_PinAFConfig(TIM1_ENC_GPIO_PORT_CHA, TIM1_ENC_CHA_SOURCE, TIM1_ENC_CHA_AF);
    GPIO_PinAFConfig(TIM1_ENC_GPIO_PORT_CHB, TIM1_ENC_CHB_SOURCE, TIM1_ENC_CHB_AF);
   
    //step4 设置成编码器模式 Timer configuration in Encoder mode
    TIM_DeInit(TIM1_ENC_TIMER);                                     //ENCODER_TIMER复位
    TIM_TimeBaseStructInit( & TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Prescaler     = 0x0;                  // 无分频
    TIM_TimeBaseStructure.TIM_Period        = (4 * TIM1_ENC_PPR) - 1;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;   //向上计数模式
    TIM_TimeBaseInit(TIM1_ENC_TIMER, & TIM_TimeBaseStructure);
    TIM_EncoderInterfaceConfig(TIM1_ENC_TIMER, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); //编码器接口初始化
    TIM_ICStructInit( & TIM_ICInitStructure);
    TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;
    TIM_ICInit(TIM1_ENC_TIMER, & TIM_ICInitStructure);
    // Clear all pending interrupts
    TIM_ClearFlag(TIM1_ENC_TIMER, TIM_FLAG_Update);
    TIM_ITConfig(TIM1_ENC_TIMER, TIM_IT_Update, ENABLE);
   
    TIM_Cmd(TIM1_ENC_TIMER, ENABLE);
    encoder1.value = 0;   
#endif


/*
* ****************************************************************************************************
* 函数名 : Encoder1_SysTick_ISR
* 描  述 : 该函数算出在单位定时周期内编码器的读数变化
* 输  入 : 无
* 输  出 : 读数变化值
* 调  用 : 需要外部定时调用!比如systick
* ****************************************************************************************************
*/
#if TIM1_ENC_EN
    s16 TIM1_ENC_SysTick_ISR(void)
    {
        static u16 lastCount1 = 0;
        u16 currentCount = TIM1_ENC_TIMER->CNT;
        s32 tmp = currentCount - lastCount1;
        if (tmp >= MAX_COUNT1_IN_1MS) {
            tmp -= (4 * TIM1_ENC_PPR) - 1;
        } else if (tmp <= -MAX_COUNT1_IN_1MS) {
            tmp += (4 * TIM1_ENC_PPR) - 1;
        }
        lastCount1 = currentCount;
        return (s16)tmp;
}
#endif

出0入0汤圆

 楼主| 发表于 2019-2-27 20:58:36 | 显示全部楼层
gallop020142 发表于 2019-2-27 20:47
宏定义:
#if TIM1_ENC_EN
    #define TIM1_ENC_GPIO_PORT_CHA  GPIOE

谢谢,您看是不是附件里的这个东西。
留个链接:http://read.pudn.com/downloads62 ... %8B%E5%86%8C%20.pdf

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-2-27 21:01:07 | 显示全部楼层
使用STM32cubeMX配置生成,一分钟就可以例程上手测试了

出0入0汤圆

 楼主| 发表于 2019-2-27 21:04:05 | 显示全部楼层
mii 发表于 2019-2-27 21:01
使用STM32cubeMX配置生成,一分钟就可以例程上手测试了

谢谢,以前用过那个玩意儿,感觉写出来的代码风格难以接受,就没用过了

出0入0汤圆

发表于 2019-2-27 21:26:08 | 显示全部楼层
heyangfengyue 发表于 2019-2-27 21:04
谢谢,以前用过那个玩意儿,感觉写出来的代码风格难以接受,就没用过了 ...

你可以看怎么实现的

出0入0汤圆

 楼主| 发表于 2019-2-27 21:31:32 | 显示全部楼层
mii 发表于 2019-2-27 21:26
你可以看怎么实现的

是的,可以作为参考,至少配置没错

出0入0汤圆

发表于 2019-2-27 22:46:53 来自手机 | 显示全部楼层
只能通道1和通道2
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 11:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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