STM32 HAL库实现光电编码器和M/T法测量电机转速

目录

一 编码器

二 电机测试的三种方法

三 STM32CubeMx配置

四 程序编写

五 实验结果

一 编码器

常见的用于电机测速的编码器有霍尔编码器和光电编码器两种。两者测速的基本原理不同,但都是输出两路相位差90°的脉冲信号。这里以光电编码器为例介绍一下测速原理。

光电编码器是由光源、光码盘和光敏元件组成。 光栅盘是在一定直径的圆板上等分地开通若干个长方形孔。由于光电码盘与电动机同轴,电动机旋转时,光栅盘与电动机同速旋转,经发光二极管等电子元件组成的检测装置检测输出若干脉冲信号,通过计算每秒光电编码器输出脉冲的个数就能反映当前电动机的转速。

输出波形:

  • 方向:A、B相脉冲波形相差90°,A相位在前表示顺时针旋转,B相在前表示逆时针旋转。
  • 计数:在STM32编码器模式(EncoderMode)中,A相和B相每产生一个上升沿或者下降沿,我们就让计数器加1。故产生一个脉冲时,计数值为4(A相1个上升沿和1个下降沿,B相1个上升沿和1个下降沿)
  • 二 电机测试的三种方法

  • M法:在规定时间内检测脉冲个数来获得被测速度,适合测量高速速度。
  • T法:测量相邻两个脉冲间的时间,再来反算速度,适合测量低速速。
  • M/T法:同时测量检测时间和在此时间内脉冲发生器发出的脉冲个数来测量速度。
  • 相关方法的具体实现可以看这篇博客文章:M法、T法以及M/T法测速原理概述 – 知乎 (zhihu.com)

    下面例程使用M法测量电机的转速。

    具体的实现方法是:定时器2定时时间设置为10ms,定时器3开启输入捕获通道。定时器定时时间到了后,获取当前的脉冲计数值,这样便可计算出当前的电机转速。然后将计数值清0,方便下一次计数。

    三 STM32CubeMx配置

    ——

    设置定时器2,定时时间10ms,并开启定时器中断

    这里补充一下定时器计数时间的计算公式:Tout=(arr+1)*(psc+1)/Tclk,本例程中APB1外设时钟频率为72MHZ,故Tclk=1/72000000 所以Tout=(200*3600)/72us =10ms

    开启定时器3,并且配置为编码器模式。

    四 程序编写

      /* USER CODE BEGIN 2 */
    HAL_TIM_Base_Start_IT(&htim2);
    HAL_TIM_Encoder_Start(&htim3,TIM_CHANNEL_1 | TIM_CHANNEL_2);
      /* USER CODE END 2 */

    在mian()函数中开启定时器中断和编码器计数模式

    /* USER CODE BEGIN 4 */
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
        if(htim==&htim2)
        {
            uint32_t CaptureNumber;   
            int Direction;
            Direction=__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3);
            CaptureNumber =    __HAL_TIM_GET_COUNTER(&htim3);
            if(Direction)  //如果向下计数,真实的脉冲计数值=65535-CaptureNumber
                CaptureNumber=65535-CaptureNumber;
            Speed_Motor=CaptureNumber*60/0.01/4/13/30;
            // 脉冲数量/4倍频/单圈脉冲数/减速比例/定时时间(s)×60    单位 r/min        
            __HAL_TIM_GET_COUNTER(&htim3) = 0;//计数值清0;
         }
    }
    /* USER CODE END 4 */

    在定时器中断回调函数中计算电机的转速;这里需要注意一点,如果向下计数,真实的脉冲计数值=65535-CaptureNumber。具体可参考文章:STM32(HAL)–使用定时器TIM的Encoder Mode来读取旋钮编码器的脉冲数_Joseph Wen的博客-CSDN博客

    电机转速=脉冲数量/4倍频/单圈脉冲数/减速比例/定时时间(s)×60 单位 r/min,我这里选用的电机编码器,电机旋转一圈,产生13个脉冲,电机的减速比是30。

    五 实验结果

    进入Debug模式中,将变量Speed_Motor添加到watch窗口,可以看到电机的转速为每分钟65转。

    ______

    ______

    源码github仓库地址:GitHub – HaoJosephWen/Code-of-blog

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 HAL库实现光电编码器和M/T法测量电机转速

    发表评论