OpenEdv-开源电子网

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

stm32平衡车TIM2 TIM4定时器在编码器模式下无法计数的问题

[复制链接]

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2021-3-14
在线时间
20 小时
发表于 2023-1-10 20:22:20 | 显示全部楼层 |阅读模式
10金钱
目前已经排除硬件连接的问题,原因如下
(1)本人连接编码器的情况下转动轮子,mpu6050 stm32的电源指示灯都会亮!说明有脉冲信号!
(2)用万用表打过,确定了编码器中间的黄线跟绿线是与A0 A1 B6 B7四个角连通。
(3)如果是硬件问题则两个电机都坏了的概率太小。
(4)用C13指示灯,在程序中设置如果TIM2或TIM4进入中断,则灯亮,但是灯没亮!,说明无法进入定时器中断!
(5)OLED 显示两个轮子SPEED(速度)为0,且两定时器计数一直为0。
综上,本人怀疑是定时器初始化程序的问题 ,特附如下,诚邀各位大佬,帮帮小白,真的因为这个问题被折磨了好几天!
如果不是初始化的问题,请各位根据工程经验,提提想法。

#include "encoder.h"
#include "led.h"

void Encoder_TIM2_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        TIM_ICInitTypeDef TIM_ICInitStruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//¿aÆôê±Öó
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
       
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//3õê¼»ˉGPIO--PA0¡¢PA1
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 |GPIO_Pin_1;
        GPIO_Init(GPIOA,&GPIO_InitStruct);
       
        TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);//3õê¼»ˉ¶¨ê±Æ÷
        TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//2»·ÖÆμ
        TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//ÏòéϼÆêy
        TIM_TimeBaseInitStruct.TIM_Period=65535;//ÖØ×°3õÖμ
        TIM_TimeBaseInitStruct.TIM_Prescaler=0;//·ÖÆμÏμêy
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct); //ÅäÖö¨ê±Æ÷
       
        TIM_EncoderInterfaceConfig(TIM2,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);//ÅäÖñàÂëÆ÷ģ꽣¨¶¨ê±Æ÷2£¬Ä£ê½3£¬éÏéyÑØ£¬éÏéyÑØ£©
       
        TIM_ICStructInit(&TIM_ICInitStruct);//3õê¼»ˉêäèë2¶»ñ
        TIM_ICInitStruct.TIM_ICFilter=10;//ÂË2¨Æ÷
        TIM_ICInit(TIM2,&TIM_ICInitStruct);//êäèë2¶»ñÅäÖÃ
       
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//ÅäÖÃòç3ö¸üDÂÖD¶Ï±ê־λ
       
        TIM_SetCounter(TIM2,0);//Çåá㶨ê±Æ÷¼ÆêyÖμ
       
        TIM_Cmd(TIM2,ENABLE);//¿aÆô¶¨ê±Æ÷
}


void Encoder_TIM4_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        TIM_ICInitTypeDef TIM_ICInitStruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
       
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6 |GPIO_Pin_7;
        GPIO_Init(GPIOB,&GPIO_InitStruct);
       
        TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
        TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitStruct.TIM_Period=65535;
        TIM_TimeBaseInitStruct.TIM_Prescaler=0;
        TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);
       
        TIM_EncoderInterfaceConfig(TIM4,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
       
        TIM_ICStructInit(&TIM_ICInitStruct);
        TIM_ICInitStruct.TIM_ICFilter=10;
        TIM_ICInit(TIM4,&TIM_ICInitStruct);
       
        TIM_ClearFlag(TIM4,TIM_FLAG_Update);
        TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
       
        TIM_SetCounter(TIM4,0);

        TIM_Cmd(TIM4,ENABLE);
}

/**********************
±àÂëÆ÷Ëù¶è¶áè¡oˉêy
èë¿ú2Îêy£o¶¨ê±Æ÷
**********************/
int Read_Speed(int TIMx)
{
        int value_1;
        switch(TIMx)
        {
                case 2:value_1=(short)TIM_GetCounter(TIM2);TIM_SetCounter(TIM2,0);break;//IFêǶ¨ê±Æ÷2£¬1.2é¼ˉ±àÂëÆ÷μļÆêyÖμ2¢±£′æ¡£2.½«¶¨ê±Æ÷μļÆêyÖμÇåáã¡£
                case 4:value_1=(short)TIM_GetCounter(TIM4);TIM_SetCounter(TIM4,0);break;
                default:value_1=0;
        }
        return value_1;
}


void TIM2_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=0)//èç1ûÖD¶Ï±ê־λÎa1£¬Ôò½«′ËλÇåáã
        {
                TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
//                LED0=0;
        }
}
       
void TIM4_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=0)
        {
                TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
                LED0=0;
        }
}


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

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2023-1-11 08:51:53 | 显示全部楼层
TIM_ICInitStruct结构体没有设定捕获通道
回复

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2021-3-14
在线时间
20 小时
 楼主| 发表于 2023-1-11 15:51:53 | 显示全部楼层
阿侑kevin 发表于 2023-1-11 08:51
TIM_ICInitStruct结构体没有设定捕获通道

编码器模式下一般不是默认ch1 ch2 两通道吗? 难道也要像输入捕获模式下,在定时器初始化中加入这些代码吗?
    TIM3_ICInitStructure.TIM_Channel = TIM_Channel_1;
    TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM3_ICInitStructure.TIM_ICFilter = 0x00;
    TIM_ICInit(TIM3, &TIM3_ICInitStructure);

    //ÅäÖÃ2¶»ñí¨μà2
    TIM3_ICInitStructure.TIM_Channel = TIM_Channel_2;
    TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInit(TIM3, &TIM3_ICInitStructure);
回复

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2021-3-14
在线时间
20 小时
 楼主| 发表于 2023-1-11 15:52:44 | 显示全部楼层
阿侑kevin 发表于 2023-1-11 08:51
TIM_ICInitStruct结构体没有设定捕获通道

而且我看网上很多初始化的代码跟我的一模一样,求大哥指点下
回复

使用道具 举报

7

主题

46

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1740
金钱
1740
注册时间
2013-3-27
在线时间
176 小时
发表于 2023-1-11 16:52:06 | 显示全部楼层
帮顶帮顶
回复

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2021-3-14
在线时间
20 小时
 楼主| 发表于 2023-1-17 13:47:49 | 显示全部楼层
阿侑kevin 发表于 2023-1-11 08:51
TIM_ICInitStruct结构体没有设定捕获通道

大佬,麻烦把话说明白点
回复

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
发表于 2023-1-17 23:50:24 | 显示全部楼层
爱扣篮的KD 发表于 2023-1-17 13:47
大佬,麻烦把话说明白点

        NVIC_InitStructure.NVIC_IRQChannel                   = TIM2_IRQn;                                 
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   
        NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;                  
        NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;                              
        NVIC_Init(&NVIC_InitStructure);

中断没配置
回复

使用道具 举报

21

主题

217

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2124
金钱
2124
注册时间
2017-12-11
在线时间
460 小时
发表于 2023-1-18 09:52:44 | 显示全部楼层
论坛里有编码器的例子,可以参考下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 17:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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