打印
[其他ST产品]

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

[复制链接]
281|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
米多0036|  楼主 | 2023-1-12 10:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前已经排除硬件连接的问题,原因如下
(1)本人连接编码器的情况下转动轮子,mpu6050 stm32的电源指示灯都会亮!说明有脉冲信号!
(2)用万用表打过,确定了编码器中间的黄线跟绿线是与A0 A1 B6 B7四个角连通。
(3)如果是硬件问题则两个电机都坏了的概率太小。不过不是没可能。

使用特权

评论回复
沙发
米多0036|  楼主 | 2023-1-12 10:43 | 只看该作者
用C13指示灯,在程序中设置如果TIM2或TIM4进入中断,则灯亮,但是灯没亮!,说明无法进入定时器中断!

使用特权

评论回复
板凳
米多0036|  楼主 | 2023-1-12 10:44 | 只看该作者
OLED 显示两个轮子SPEED(速度)为0,且两定时器计数一直为0。
综上,本人怀疑是定时器初始化程序的问题 ,特附如下,诚邀各位大佬,帮帮小白,真的因为这个问题被折磨了好几天!
如果不是初始化的问题,请各位根据工程经验,提提想法。

使用特权

评论回复
地板
米多0036|  楼主 | 2023-1-12 10:45 | 只看该作者
#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;
        }
}

使用特权

评论回复
5
t60yz| | 2023-1-12 10:47 | 只看该作者
看看TIM_ICInitStruct结构体有没有设定捕获通道

使用特权

评论回复
6
米多0036|  楼主 | 2023-1-12 11:25 | 只看该作者
编码器模式下默认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);

使用特权

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

本版积分规则

96

主题

1333

帖子

0

粉丝