光电编码器、M/T法测量电机转速

文章介绍了使用STM32进行电机转速测量的方法,包括霍尔编码器和光电编码器的工作原理,重点讲述了基于STM32CubeMx配置的定时器和编码器模式,以及利用M/T法通过定时器中断计算电机转速的程序编写步骤。实验结果显示电机转速为每分钟65转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0 前言

本文介绍了如何通过光电编码器,采用M法测量电机转速;源码程序使用STM32 HAL库。

1 编码器

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

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

输出波形:

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

2 电机测试的三种方法

  • M法:在规定时间内检测脉冲个数来获得被测速度,适合测量高速速度。
  • T法:测量相邻两个脉冲间的时间,再来反算速度,适合测量低速速。
  • M/T法:同时测量检测时间和在此时间内脉冲发生器发出的脉冲个数来测量速度。

相关方法的具体实现可以看这篇博客文章:M法、T法以及M/T法测速原理概述 - 知乎 (zhihu.com)

3 实例

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

3.1 STM32CubeMx配置

步骤1:设置定时器2,定时时间10ms,并开启定时器中断


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

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

3.2 程序编写

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

  /* 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 */

步骤2:在定时器中断回调函数中计算电机的转速。

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

/* 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。具体可参考文章:定时器TIM的Encoder Mode读取旋钮编码器的脉冲数

4 实验结果

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

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

### 光电编码器的工作原理 光电编码器是一种通过光电转换技术将机械几何位移量转化为电信号输出的传感器设备。其核心功能是测量旋转角度并将其转换为数字信号或脉冲形式,用于精确控制电机或其他机械设备的位置和速度[^2]。 #### 绝对式光电编码器 绝对式光电编码器采用特定的编码方式(如自然二进制码、格雷码等),通过对光栅盘上的独特图案进行读取,直接获取当前位置的信息。这种类型的编码器无需初始化即可提供唯一的绝对位置数据[^3]。 - **结构特点**:光栅盘上刻有不同的透光区域,这些区域按照一定的编码规律排列。 - **工作过程**:当光源照射到光栅盘时,接收器会根据接收到的光线模式解码出对应的角度信息。 #### 增量式光电编码器 增量式光电编码器则通过记录相对运动的变化来计算位置变化。它通常会产生A相、B相两路正交信号以及零位标记(Z相),从而实现方向判断和高分辨率定位[^1]。 --- ### 应用领域 由于光电编码器能够精准地反馈位置和速度信息,在工业自动化、机器人技术和精密仪器等领域得到了广泛应用: 1. **工业自动化** - 在数控机床(CNC)中作为伺服控制系统的一部分,确保刀具路径的高度准确性。 2. **机器人技术** - 提供关节转动角度的数据支持,帮助完成复杂的动作规划任务。 3. **印刷行业** - 控制纸张输送的速度同步性和套印精度。 4. **电梯系统** - 实现楼层间平稳过渡的同时监测轿厢所在高度。 5. **风力发电机组** - 跟踪叶片桨距角调整情况以优化能量捕获效率。 此外,某些特殊设计还允许反射板型光电传感器应用于透明物体检测场景下,比如饮料瓶灌装生产线中的液面监控环节[^4]。 ```python # 示例代码展示如何解析简单的ABZ三通道增量编码器信号 def decode_encoder_signal(a_phase, b_phase, z_phase): position = 0 previous_a = a_phase[0] for i in range(1, len(a_phase)): current_a = a_phase[i] current_b = b_phase[i] if (current_a != previous_a): # Edge detected on A phase if ((previous_a and not current_b) or (not previous_a and current_b)): position += 1 # Clockwise rotation else: position -= 1 # Counterclockwise rotation previous_a = current_a return position + int(z_phase[-1]) * max(position, key=abs) a_channel = [False, True, False, ... ] # Simulated signal from encoder's A channel b_channel = [... ] # Corresponding B channel values z_channel = [...] # Zero pulse indicator at each revolution start/end point final_position = decode_encoder_signal(a_channel, b_channel, z_channel) print(f"Final Position: {final_position}") ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值