OpenEdv-开源电子网

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

STM32定时器编码器模式怎么使用?

[复制链接]

7

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2016-2-28
在线时间
48 小时
发表于 2016-5-29 16:35:29 | 显示全部楼层 |阅读模式
1金钱
最近在边学32边做平衡车,不知道定时器编码器模式怎么使用,问下各位STM32定时器编码器模式具体怎么使用啊?

最佳答案

查看完整内容[请看2#楼]

供你参考。 [mw_shl_code=c,true]// --------------------------------------------------------- // // 函数名称:MotorEncoderInit // 函数说明: 电机编码器初始化 // 输入参数: 无 // 输出参数: 无 // 返回值: 无 // 历史记录: // // lp 2015-06-29 创建该函数 // --------------------------------------------------------- // static void MotorBEncoderInit(void) { TIM_ ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

184

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1050
金钱
1050
注册时间
2016-5-13
在线时间
111 小时
发表于 2016-5-29 16:35:30 | 显示全部楼层
供你参考。
[mw_shl_code=c,true]// --------------------------------------------------------- //
// 函数名称:MotorEncoderInit
// 函数说明: 电机编码器初始化
// 输入参数: 无
// 输出参数: 无
// 返回值:   无
// 历史记录:     
//     <作者>    <时间>      <修改记录>
//      lp    2015-06-29    创建该函数  
// --------------------------------------------------------- //
static void MotorBEncoderInit(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_ICInitTypeDef TIM_ICInitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;

        /*开定时器时钟*/
        RCC_APB1PeriphClockCmd(MOTORB_ENCODER_TIM_CLK, ENABLE);
        /*开对应GPIO时钟*/
        RCC_APB2PeriphClockCmd(MOTORB_ENCODER_CLK, ENABLE);

        /*配置对应的GPIO*/
        GPIO_StructInit(&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = MOTORB_ENCODER_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(MOTORB_ENCODER_PORT, &GPIO_InitStructure);
  

        /*配置定时器*/
        TIM_DeInit(MOTORB_ENCODER_TIM);
        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
        TIM_TimeBaseStructure.TIM_Prescaler = 0x0;
        TIM_TimeBaseStructure.TIM_Period = 65535;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
        TIM_TimeBaseInit(MOTORB_ENCODER_TIM, &TIM_TimeBaseStructure);

        /*配置定时器正交计数功能*/
        TIM_EncoderInterfaceConfig(MOTORB_ENCODER_TIM, TIM_EncoderMode_TI12,
                                 TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
        TIM_ICStructInit(&TIM_ICInitStructure);
        TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;
        TIM_ICInit(MOTORB_ENCODER_TIM, &TIM_ICInitStructure);
  
        /*清除定时器溢出中断*/
        TIM_ClearFlag(MOTORB_ENCODER_TIM, TIM_FLAG_Update);
        /*预先清除所有中断位*/
        TIM_ClearITPendingBit(MOTORB_ENCODER_TIM, TIM_IT_Update);
    /*由于16位的计数器会溢出,所以开定时器溢出中断,在中断里面加溢出值或着减溢出值*/
        TIM_ITConfig(MOTORB_ENCODER_TIM, TIM_IT_Update, ENABLE);
        TIM_Cmd(MOTORB_ENCODER_TIM, ENABLE);

        /*清零编码器值*/
        ClearEncodeBValue();
}


// --------------------------------------------------------- //
// 函数名称:TIM8_UP_IRQHandler
// 函数说明: TM8溢出中断函数,通过中断来累计脉冲数超出16定时器最大计数值的次数
// 输入参数: 无
// 输出参数: 无
// 返回值:   无
// 历史记录:     
//     <作者>    <时间>      <修改记录>
//      lp    2015-06-30      创建该函数  
// --------------------------------------------------------- //
void TIM4_IRQHandler(void)
{
        int8 lCurDir = INVAL;
        if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
                lCurDir = GetMotorBDirection();
                s_lTIM4UpOverCnt -= lCurDir;        //lCurDir来确定是加一,还是减一
        }   
}

// --------------------------------------------------------- //
// 函数名称:GetMotor1EncoderValue
// 函数说明: 获取电机编码器计数值
// 输入参数: 无
// 输出参数: 无
// 返回值:   返回电机编码器脉冲个数,有符号,可以表示电机正反转记录的脉冲值
// 历史记录:     
//     <作者>    <时间>      <修改记录>
//      lp    2015-06-30    创建该函数  
// --------------------------------------------------------- //
int32 GetMotorBEncoderValue(void)
{
        int32 lEncoderValue = 0;
        lEncoderValue = MOTORB_ENCODER_TIM->CNT + s_lTIM4UpOverCnt*65536 - ENCODER_VALUE_OFFSET;
        return lEncoderValue;
}

// --------------------------------------------------------- //
// 函数名称:ClearEncodeBValue
// 函数说明: 电机编码器计数值清零
// 输入参数: 无
// 输出参数: 无
// 返回值:   无
// 历史记录:     
//     <作者>    <时间>      <修改记录>
//      lp    2015-06-30    创建该函数  
// --------------------------------------------------------- //
void ClearEncodeBValue(void)
{
        MOTORB_ENCODER_TIM->CNT = ENCODER_VALUE_OFFSET;
        s_lTIM4UpOverCnt = 0;
}[/mw_shl_code]
回复

使用道具 举报

8

主题

570

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2908
金钱
2908
注册时间
2016-5-13
在线时间
184 小时
发表于 2016-5-30 09:50:21 | 显示全部楼层
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

7

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2016-2-28
在线时间
48 小时
 楼主| 发表于 2016-5-30 16:07:24 | 显示全部楼层
zhuifeng8911 发表于 2016-5-30 09:16
供你参考。
[mw_shl_code=c,true]// --------------------------------------------------------- //
//  ...

谢谢
回复

使用道具 举报

7

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2016-2-28
在线时间
48 小时
 楼主| 发表于 2016-5-30 16:07:35 | 显示全部楼层
电脑小白 发表于 2016-5-30 09:50
http://www.openedv.com/forum.php?mod=viewthread&tid=44775&highlight=%B1%E0%C2%EB%C6%F7

谢谢
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2016-2-10
在线时间
18 小时
发表于 2017-4-15 17:08:22 | 显示全部楼层
zhuifeng8911 发表于 2016-5-29 16:35
供你参考。
[mw_shl_code=c,true]// --------------------------------------------------------- //
//  ...

s_lTIM4UpOverCnt,INVAL,s_lTIM4UpOverCnt,ENCODER_VALUE_OFFSET
这些值是什么意思啊,是多少啊?有没有参考啊?
回复

使用道具 举报

5

主题

184

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1050
金钱
1050
注册时间
2016-5-13
在线时间
111 小时
发表于 2017-5-2 14:24:00 | 显示全部楼层
wadzhe 发表于 2017-4-15 17:08
s_lTIM4UpOverCnt,INVAL,s_lTIM4UpOverCnt,ENCODER_VALUE_OFFSET
这些值是什么意思啊,是多少啊?有 ...

INVAL:因为电机有正反转,所以这个值是1 和-1
s_lTIM4UpOverCnt:通过中断来累计脉冲数超出16定时器最大计数值的次数
ENCODER_VALUE_OFFSET:这个值是一个宏定义,是偏移量
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2016-2-10
在线时间
18 小时
发表于 2017-5-2 17:44:08 | 显示全部楼层
谢谢啦
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2017-4-27
在线时间
9 小时
发表于 2017-5-3 22:18:31 | 显示全部楼层
电脑小白 发表于 2016-5-30 09:50
http://www.openedv.com/forum.php?mod=viewthread&tid=44775&highlight=%B1%E0%C2%EB%C6%F7

这个网址里面的两个文件下载了编译都不行的呀。。
回复

使用道具 举报

8

主题

570

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2908
金钱
2908
注册时间
2016-5-13
在线时间
184 小时
发表于 2017-5-8 11:08:20 | 显示全部楼层
lzbandcwt 发表于 2017-5-3 22:18
这个网址里面的两个文件下载了编译都不行的呀。。

看66楼的帖子。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-9-1
在线时间
7 小时
发表于 2017-6-21 10:46:31 | 显示全部楼层
我竟然今天才看到这个帖子
回复

使用道具 举报

5

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2014-8-7
在线时间
59 小时
发表于 2017-12-21 09:32:55 | 显示全部楼层
zhuifeng8911 发表于 2016-5-29 16:35
供你参考。
[mw_shl_code=c,true]// --------------------------------------------------------- //
//  ...

是否可以上传完整代码?谢谢
回复

使用道具 举报

14

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2019-3-31
在线时间
31 小时
发表于 2019-4-14 19:24:01 | 显示全部楼层
zhuifeng8911 发表于 2017-5-2 14:24
INVAL:因为电机有正反转,所以这个值是1 和-1
s_lTIM4UpOverCnt:通过中断来累计脉冲数超出16定时器最 ...

那偏移量是多少啊,或者说怎么定
回复

使用道具 举报

14

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2019-3-31
在线时间
31 小时
发表于 2019-4-15 00:18:15 | 显示全部楼层
zhuifeng8911 发表于 2016-5-29 16:35
供你参考。
[mw_shl_code=c,true]// --------------------------------------------------------- //
//  ...

    TIM_EncoderInterfaceConfig(MOTORB_ENCODER_TIM, TIM_EncoderMode_TI12,
                             TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);

请问这个函数的具体作用什么啊,是T1,T2都是上边沿计数是吗?,T1,T2是通道1,2的意思吗
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2019-10-7
在线时间
7 小时
发表于 2021-4-21 15:25:33 | 显示全部楼层
本帖最后由 A13659804096 于 2021-4-21 15:29 编辑
theking 发表于 2019-4-15 00:18
TIM_EncoderInterfaceConfig(MOTORB_ENCODER_TIM, TIM_EncoderMode_TI12,
                        ...


分别是TIM_EncoderInterfaceConfig(开启编码器接口的定时器TIMx,编码器接口模式,TI1极性,TI2极性)

选择编码器接口模式的方法是:如果计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的
SMS=001;如果只在TI1边沿计数,则置SMS=010;如果计数器同时在TI1和TI2边沿计数,则
置SMS=011。

通过设置TIMx_CCER寄存器中的CC1P和CC2P位,可以选择TI1和TI2极性。CC1P该位选择是IC1还是IC1的反相信号作为触发或捕获信号,CC2P同理。
111.png
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 03:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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