0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用HAL库进行电机测速滤波

麦辣鸡腿堡 来源:CSDN博客 作者:骇客小狗 2023-11-10 15:48 次阅读

如果将测得的速度值用VOFA+上位机画出来,我们可能会看到这样的曲线

图片

从图中我们可以看到,速度值在目标速度附近来回小幅度震荡,始终不稳定。这是因为编码器测速得到的速度值是离散的,如果电机的速度值刚好卡在两个离散值中间,我们测得的速度值就会在这两个离散值中间来回震荡。如果我们想要解决这个问题,最好先对测速的精度进行分析。

对于M法测速来说,测速的公式如下,其中,k是将速度换算成rpm的比例系数

图片

由于除号后面的都是定值,所以我们只要分析每次采样的脉冲数对速度的影响即可。

我们假设现在测速频率是50Hz,减速比为30,编码器线数为13,那么脉冲数每变化1,速度的变化为

图片

所以我们测得的速度只能是1.923rpm的整数倍。如果想要提高精度,在电机不变的情况下,我们可以使用500线的GMR编码器或者降低测速频率。

在VOFA+中,我们可以测得震荡时波峰和波谷的差值为1.92左右,和我们的计算相符。

为了改善这一现象,我们可以对速度采样值使用平均滤波,即将最近几次的速度采样值存放到数组中,每测得一个新的速度,就将新速度存入数组,将最早测得的速度值从数组中删除,我们使用的速度值是数组中所有速度的平均值。实现代码如下

#define SPEED_RECORD_NUM 20 // 经测试,50Hz个采样值进行滤波的效果比较好


float speed_Record[SPEED_RECORD_NUM]={0};


/*
 * 进行速度的平均滤波
 * 输入新采样到的速度,存放速度的数组,
 * 返回滤波后的速度
 */
float Speed_Low_Filter(float new_Spe,float *speed_Record)
{
    float sum = 0.0f;
    test_Speed = new_Spe;
    for(uint8_t i=SPEED_RECORD_NUM-1;i >0;i--)//将现有数据后移一位
    {
        speed_Record[i] = speed_Record[i-1];
        sum += speed_Record[i-1];
    }
    speed_Record[0] = new_Spe;//第一位是新的数据
    sum += new_Spe;
    test_Speed = sum/SPEED_RECORD_NUM;
    return sum/SPEED_RECORD_NUM;//返回均值
}


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定时器回调函数,用于计算速度
{  
    if(htim- >Instance==GAP_TIM.Instance)//间隔定时器中断,是时候计算速度了
    {
        motor1.direct = __HAL_TIM_IS_TIM_COUNTING_DOWN(&ENCODER_TIM);//如果向上计数(正转),返回值为0,否则返回值为1
        motor1.totalCount = COUNTERNUM_1 + motor1.overflowNum * RELOADVALUE_1;//一个周期内的总计数值等于目前计数值加上溢出的计数值
        
        if(motor1.lastCount - motor1.totalCount > 19000) // 在计数值溢出时进行防溢出处理
        {
            motor1.overflowNum++;
            motor1.totalCount = COUNTERNUM_1 + motor1.overflowNum * RELOADVALUE_1;//一个周期内的总计数值等于目前计数值加上溢出的计数值
        }
        else if(motor1.totalCount - motor1.lastCount > 19000) // 在计数值溢出时进行防溢出处理
        {
            motor1.overflowNum--;
            motor1.totalCount = COUNTERNUM_1 + motor1.overflowNum * RELOADVALUE_1;//一个周期内的总计数值等于目前计数值加上溢出的计数值
        }
        
        motor1.speed = (float)(motor1.totalCount - motor1.lastCount) / (4 * MOTOR_SPEED_RERATIO * PULSE_PRE_ROUND) * 3000;//算得每秒多少转,除以4是因为4倍频
        /*******************在这里添加滤波函数************************/
        motor1.speed = Speed_Low_Filter(motor1.speed,speed_Record);
        /**********************************************************/
        motor1.lastCount = motor1.totalCount; //记录这一次的计数值
}

经过滤波后的速度曲线如下。

图片

绿线是原始速度,红线是目标速度,粉线是滤波后的速度。可以看到,滤波后的速度值明显要平滑很多,这对我们后期的PID调试是很有利的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编码器
    +关注

    关注

    45

    文章

    3597

    浏览量

    134171
  • 滤波
    +关注

    关注

    10

    文章

    663

    浏览量

    56596
  • 测速
    +关注

    关注

    0

    文章

    37

    浏览量

    14114
收藏 人收藏

    评论

    相关推荐

    使用STM32 HAL进行GPIO控制的实例

    在基于STM32微控制器的嵌入式系统开发中,GPIO(GeneralPurposeInput/Output)控制是其中最基本、最常见的操作之一。通过使用STM32的HAL,可以轻松地对GPIO进行配置和控制。本文将演示如何使用
    的头像 发表于 12-21 15:22 3172次阅读

    HAL每天一例】第113例:单轴25GA370直流电机编码测速(L298N驱动)

    的,我们还程序发布基于HAL的指导文档和视频教程,欢迎持续关注,并提出改进意见。参考文档见:硬石电机控制专题指导手册例程下载:资料包括程序、相关说明资料以及软件使用截图百度云盘:https
    发表于 09-05 08:45

    使用HAL和CubeMX进行代码示例

    本篇博文主要使用HAL和CubeMX进行代码示例,毕竟电赛时间那么紧张,写STP的时间都够CubeMX重开一局了直流电机控制根据
    发表于 09-07 07:49

    STM32标准改为HAL的程序实现

    标准占绝大多数,自己买的板子跟的资料也一般是标准HAL很少,不过要是使用STM32CubeMx配置,那么就是使用的HAL
    发表于 11-22 11:23 3.5w次阅读

    测速电机的使用范围 测速电机的特点

    元件 (3)用做解算元件 测速电机的特点: 1、 测速电机的输出电压信号,电压量程可在10几伏到几百伏之间; 2、 测速
    的头像 发表于 07-20 17:49 5438次阅读

    仿标准,对HAL的补充代码

    前言: ST官方从2017年下半年开始就不再维护升级标准,转而推广HAL。到2019年,HAL仍不够成熟,其原因有以下: 1.
    发表于 11-29 11:36 30次下载
    仿标准<b class='flag-5'>库</b>,对<b class='flag-5'>HAL</b><b class='flag-5'>库</b>的补充代码

    HAL结构

    HAL结构
    发表于 12-09 13:36 32次下载
    <b class='flag-5'>HAL</b><b class='flag-5'>库</b>结构

    HAL】串口通信

    HAL入门之串口通信学习经验分享
    发表于 12-16 16:58 5次下载
    【<b class='flag-5'>HAL</b><b class='flag-5'>库</b>】串口通信

    stm32F103 基于HAL的直流电机驱动(一)

    stm32F103 基于HAL的直流电机驱动目录stm32F103 基于HAL的直流电机驱动
    发表于 01-12 19:48 37次下载
    stm32F103 基于<b class='flag-5'>HAL</b><b class='flag-5'>库</b>的直流<b class='flag-5'>电机</b>驱动(一)

    【STM32】HAL PWM控制电机转速与编码器读取(超详解)

      大家好,我是小政。本篇文章我将针对PWM控制电机与编码器读取电机转速的STM32CubeMX配置过程进行详细的讲解,让准备学习HAL
    发表于 01-14 12:39 93次下载
    【STM32】<b class='flag-5'>HAL</b><b class='flag-5'>库</b> PWM控制<b class='flag-5'>电机</b>转速与编码器读取(超详解)

    stm32 hal资料分享

    stm32 hal资料分享
    发表于 11-03 16:17 119次下载

    测速电机是什么?

    测速电机是什么?测速电机是一种用于检测和控制电机运行速度的重要设备。它由能够感知和测量电机运行速
    的头像 发表于 06-14 09:14 1174次阅读
    <b class='flag-5'>测速</b><b class='flag-5'>电机</b>是什么?

    测速电机的分类与测速电机的应用

    测速电机的分类与测速电机的应用:测速电机是一种用于检测和控制
    的头像 发表于 07-19 16:45 885次阅读

    STM32 HAL的功能和使用方法 STM32 HAL和标准的区别

    HAL(Hardware Abstraction Layer)是指硬件抽象层,是一种封装底层硬件接口驱动的编程。在嵌入式系统中,HAL可以更加方便地实现硬件控制和设备访问,提高代码
    发表于 08-08 18:21 4159次阅读

    STM32 HAL串口收发是如何使用的?

    的一种,它提供了一种简单易用的方法来使用STM32的各种外设。 本文将详细介绍如何使用STM32 HAL进行串口通信,包括初始化、发送数据和接收数据等方面。 1. 初始化串口 首
    的头像 发表于 10-26 17:42 1170次阅读