【STM32 HAL库】编码器测速

【STM32 HAL库】编码器测速

  • 理论
  • 图解编码器结构
  • 基本原理
  • 电机与编码器参数
  • 车轮一圈对应的脉冲数
  • 应用
  • CubeMX配置
  • Keil5代码
  • 常见错误
  • 计数器值恒为0
  • 计数器值异常
  • 理论

    图解编码器结构

    编码器本质上还是TIM输入捕获的应用

    基本原理

    电机转动一圈,通过霍尔编码器的A、B两项输出一定数量的脉冲
    我们可以根据一定时间内捕获到的脉冲数,计算出这段时间的平均速度

    电机与编码器参数

    减速比
    齿轮比
    也即电机输出轴(主轴 车轮轴)转1圈时,电机的原始驱动轴转10圈
    有助于增加输出扭矩,提高车轮驱动力

    编码器脉冲数
    电机转一圈产生的脉冲数

    车轮一圈对应的脉冲数

    电机驱动轴转动一圈产生的脉冲数 = 分频数 * 编码器线数(电机一圈产生脉冲数)
    车轮转动一圈产生的脉冲数 = 分频数 * 编码器线数* 电机减速比
    故,驱动轴转1圈 脉冲数 = 11 * 4 = 44
    故,车轮转1圈 脉冲数 = 11 * 10 * 4 = 440

    PS:
    编码器脉冲数,也即编码器线数,也即电机转一圈会产生的脉冲数
    电机减速比,也即齿轮比
    分频数,当编码器模式配置为TI1 and TI2时,为"4分频"

    应用

    CubeMX配置

    Keil5代码

    编码器初始化代码
    由CubeMX自动生成

    开启编码器

    	//开启编码器
    	HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_1);
    	HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_2);
    

    注意,根据你具体配置情况传入参数,两个通道都要开启
    PS:这个代码可以直接放到TIM的Encoder初始化函数中,在初始化的最后,直接开启编码器

    读取计数器的值

    //读取计数器的值
    int Read_Encoder(void)
    {
    	int Encoder_Cnt;
    	//读取计数器的值((short)做截断,使得正转为正数,反转为负数
    	Encoder_Cnt = (short)__HAL_TIM_GET_COUNTER(&htim2);
    	
    	//清除计数器的值
    	__HAL_TIM_SET_COUNTER(&htim2,0);
    
    	return Encoder_Cnt;
    }
    

    中断 读取并打印脉冲数

    //每0.5s进一次中断,打印这0.5s内捕获到的脉冲数
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
      if(htim == &htim3)
      {	
    		printf("%d",Read_Encoder());
      }
    }
    

    常见错误

    计数器值恒为0

  • 接线错误,注意编码器电源的正负极之分,编码器电源指示灯需要亮起,否则编码器不工作
  • 未调用开启编码器函数,编码器不工作
  • 计数器值异常

  • 读取计数器值的函数,最后需置0,否则读取的是”路程“,而非”速度“
  • 作者:Abaaba+

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【STM32 HAL库】编码器测速

    发表回复