• 【二】编码器原理与电机转速、角度控制


    前言:由于写博客过程中出了点小插曲,再加上第二次积分赛的到来,导致第一次积分赛的总结一直鸽到现在。。。现在先水一篇。:-)

    我们的有刷电机带有一个霍尔编码器,用于获取速度、角度等信息,以完成云台要求的转速与角度控制。

    以下是该电机编码器的参数:

    一、编码器原理

    我们这里使用的是增量式编码器

    增量式编码器是将设备运动时的位移信息变成连续的脉冲信号,脉冲个数表示位移量的大小。其特点如下:

    • 只有当设备运动时才会输出信号。

    • 一般会输出通道A和通道B 两组信号,并且有90° 的相位差(1/4个周期),同时采集这两组信号就可以计算设备的运动速度和方向。

      如下图,通道A和通道B的信号的周期相同,且相位相差1/4个周期,结合两相的信号值:

      • 当B相和A相先是都读到高电平(1 1),再B读到高电平,A读到低电平(1 0),则为顺时针
      • 当B相和A相先是都读到低电平(0 0),再B读到高电平,A读到低电平(1 0),则为逆时针
    • 除通道A、通道B 以外,还会设置一个额外的通道Z 信号,表示编码器特定的参考位置

      如下图,传感器转一圈后Z 轴信号才会输出一个脉冲,在Z轴输出时,可以通过将AB通道的计数清零,实现对码盘绝对位置的计算。

    • 增量式编码器只输出设备的位置变化和运动方向,不会输出设备的绝对位置。

    分辨率:指编码器能够分辨的最小单位。

    • 对于增量式编码器,其分辨率表示为编码器转轴旋转一圈所产生的脉冲数,即脉冲数/转(Pulse Per Revolution 或PPR)。由第一张图可知,我们的电机PPR为11,即旋转一圈产生11个脉冲。

    如何采集编码器的脉冲数据呢?恰好我们的STM32单片机定时器模式中有一个定时器的编码器模式,我们通常用它来测量脉冲变化值。通过访问计数器cnt的值(编码器模式中使用上下计数)来检测接收到的脉冲数。

    之前文章的工程配置里有提到,我们设置TIM2为编码器模式。

    二、转速测量

    统计固定时间间隔内的编码器的脉冲数,来计算速度值。我们需要根据编码器的参数来得到转速的计算方式。我们打开一个定时器中断TIM4,每隔0.01s测量一次转速。

    速度计算方法:这里计算的是真实的电机的物理转速n(r/s)

    n=M0(CT0)

    • C:编码器单圈总脉冲数,也有一个公式:

    • C=ρ×PPR

      • ρ:电机减速比,即电机转轴转1圈,电机本身要转多少圈
      • PPR:编码器分辨率
    • T0:每次的统计时间(单位为秒)

    • M0:该时间内统计到的编码器脉冲数,通过读取这次和上次定时器计数器的值cnt得到

    我们这里减速比ρ经测试是20。PPR是11,因为定时器中断为100Hz,T0为0.01。

    三、角度测量

    具体原理同速度测量,直接上公式:

    Angle=N0C×360

    • C:编码器单圈总脉冲数,解释见上。
    • N0:该时间内统计到的编码器脉冲数,通过读取这次定时器计数器的值cnt得到

    四、代码部分

    基于上一篇文章添加以下代码。

    1、添加变量

    float speed;
    float angle;
    int32_t cnt;
    int32_t last_cnt;
    

    2、使能定时器中断和编码器模式

    /* USER CODE BEGIN 2 */
    HAL_TIM_Base_Start_IT(&htim4);
    HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
    /* USER CODE END 2 */
    

    3、添加中断回调函数

    /* USER CODE BEGIN 4 */
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
        if(htim == &htim4)
        {
            cnt = (short)TIM2->CNT;                               //tim2计数器的值   
            speed = (float)(cnt - last_cnt) / 22.0f / 20 * 100;
            angle = ((float)cnt) / 22.0f / 20 * 360;              //保存上一次计数器的值
            last_cnt = cnt;
        }
    }
    /* USER CODE END 4 */
    

    4、转速控制

    PWM占空比越大,提供给电机的平均电压越大,电机转速就高。反之PWM占空比越小,提供给电机的平均电压越小,电机转速就低。

    我们之前工程配置输出的PWM占空比为50%,这里加大转速,占空比设为70%。

    set_pwm(700);
    

    五、接线与数值监控

    见图一,和上一篇文章,编码器信号线黄线与绿线接单片机PA0与PA1引脚,得到AB相脉冲。其余和上一篇文章一致。

    在Debug模式下观测PWM占空比分别为50%与70%时speed与angle数据。当然在串口上也能看。


    __EOF__

  • 本文作者: Loafing日寄
  • 本文链接: https://www.cnblogs.com/qhwyx/p/16074100.html
  • 关于博主: I am a college student who is good at loafing.
  • 版权声明: 版权所有,侵权必究
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    .datastore@cyberfear.com.mkp勒索病毒的最新威胁:如何恢复您的数据?
    Springboot三层架构--DAO层、Service层、Colltroler层--这波我在外太空
    10.卷积神经网络CNN
    开放式激光振镜运动控制器(二):ZMC408SCAN激光接口与控制
    使用vim对比两个文件
    大数据测试入门介绍
    区间信息维护与查询【线段树 】 - 原理1 线段树的基本操作
    【web-避开客户端控件】(2.2.1)收集使用数据: 长度限制、资源副本、基于脚本的确认、禁用的元素
    论文阅读笔记(二)——Mask R-CNN
    Simulink导出FMU模型文件方法
  • 原文地址:https://www.cnblogs.com/qhwyx/p/16074100.html