平衡车定时器测编码

2019-08-19 18:14发布

各位大神,最近在学习STM32顺便找点东西做,在网上搜到一些开源程序,用TIM2和TIM4测量小车的霍尔元件输出的脉冲数(编码值),实际测量时,两侧编码输出不同,TIM2测量值比TIM4大,本来怀疑是硬件原因,但最后排除(先用TIM2测左侧,TIM4测右侧,左侧大于右侧,然后用TIM2测右侧,TIM4测左侧结果右侧大于左侧),请问是不是需要中断优先级的问题?
代码:void Encoder_Init_TIM2(void)
{
        RCC->APB1ENR|=1<<0;     //TIM2时钟使能
        RCC->APB2ENR|=1<<2;    //使能PORTA时钟
        GPIOA->CRL&=0XFFFFFF00;//PA0 PA1
        GPIOA->CRL|=0X00000044;//浮空输入
        /* 把定时器初始化为编码器模式 */
        TIM2->PSC = 0x0;//预分频器
        TIM2->ARR = ENCODER_TIM_PERIOD-1;//设定计数器自动重装值
  TIM2->CCMR1 |= 1<<0;          //输入模式,IC1FP1映射到TI1上
  TIM2->CCMR1 |= 1<<8;          //输入模式,IC2FP2映射到TI2上
  TIM2->CCER |= 0<<1;           //IC1不反向
  TIM2->CCER |= 0<<5;           //IC2不反向
        TIM2->SMCR |= 3<<0;                  //SMS='011' 所有的输入均在上升沿和下降沿有效
        TIM2->CR1 |= 0x01;            //CEN=1,使能定时器
}
/**************************************************************************
函数功能:把TIM4初始化为编码器接口模式
入口参数:无
返回  值:无
**************************************************************************/
void Encoder_Init_TIM3(void)
{
        RCC->APB1ENR|=1<<1;     //TIM4时钟使能
        RCC->APB2ENR|=1<<2;     //使能PORTB时钟
        GPIOA->CRL&=0X00FFFFFF; //PB6 PB7
        GPIOA->CRL|=0X44000000; //浮空输入
        /* 把定时器初始化为编码器模式 */
        TIM3->PSC = 0x0;//预分频器
        TIM3->ARR = ENCODER_TIM_PERIOD-1;//设定计数器自动重装值
  TIM3->CCMR1 |= 1<<0;          //输入模式,IC1FP1映射到TI1上
  TIM3->CCMR1 |= 1<<8;          //输入模式,IC2FP2映射到TI2上
  TIM3->CCER |= 0<<1;           //IC1不反向
  TIM3->CCER |= 0<<5;           //IC2不反向
        TIM3->SMCR |= 3<<0;                  //SMS='011' 所有的输入均在上升沿和下降沿有效
        TIM3->CR1 |= 0x01;            //CEN=1,使能定时器
}
/**************************************************************************
函数功能:单位时间读取编码器计数
入口参数:定时器
返回  值:速度值
**************************************************************************/
int Read_Encoder(u8 TIMX)
{
    int Encoder_TIM;   
   switch(TIMX)
         {
           case 2:  Encoder_TIM= (short)TIM2 -> CNT;  TIM2 -> CNT=0;break;
                 case 3:  Encoder_TIM= (short)TIM3 -> CNT;  TIM3 -> CNT=0;break;       
                 case 4:  Encoder_TIM= (short)TIM4 -> CNT;  TIM4 -> CNT=0;break;       
                 default: Encoder_TIM=0;
         }
                return Encoder_TIM;
}

0条回答

一周热门 更多>