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调试是很有利的。

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

    关注

    41

    文章

    3360

    浏览量

    131539
  • 滤波
    +关注

    关注

    10

    文章

    624

    浏览量

    56247
  • 测速
    +关注

    关注

    0

    文章

    35

    浏览量

    14008
收藏 人收藏

    评论

    相关推荐

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

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

    如何对电机进行测速 相关资料推荐

    问题提出提问:那么,对于动力过剩的B车,是否可以通过测量反电动势的方法,不用编码器获得电机的转速呢?提问:卓大大,三轮车可以用编码器测速吗?还是只能用光电编码盘??提问:亲爱的卓大大,给你问声好
    发表于 06-29 07:16

    HAL和标准的原理区别

    HAL的学习HAL和标准的原理区别串口通信实验包含的文件区别具体代码区别总结HAL
    发表于 07-29 08:48

    使用外部时钟模式进行电机测速

    使用外部时钟模式进行电机测速。定时器配置我使用的是TIM3的外部时钟模式1。使用外部时钟源模式,由于CubeMX的配置并不起作用,所以我自己对照参考手册自己配置寄存器。如下图(外部时钟模式1)(外部
    发表于 08-09 08:48

    HAL和lib的区别和联系

    1. HAL简介:HAL是ST公司为使用户高效率开发产品而开发出的一套API,这个HAL
    发表于 08-12 06:41

    使用HAL和CubeMX进行代码示例

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

    如何对STM32 HAL的FLASH进行读写呢

    如何对STM32 HAL的FLASH进行读写呢?其程序是怎样的?
    发表于 10-21 09:23

    如何对基于HAL的GPIO进行配置呢

    GPIO是什么?GPIO有哪几种工作模式?如何对基于HAL的GPIO进行配置呢?
    发表于 01-19 06:47

    测速电机

    测速电机 测速电机是一种测量转速的微型发电机,他把输入的机械转速变换为电压信号输出,并要求输出的电压信号与转速成正
    发表于 11-19 23:18 3857次阅读
    <b class='flag-5'>测速</b>发<b class='flag-5'>电机</b>

    电机测速实习讲解

    电机测速数字系统,模拟电路数码管显示电机的实际转速。设计制作的讲解。
    发表于 12-31 14:50 0次下载

    基于FPGA的电机测速的设计与实现

    基于FPGA的电机测速的设计与实现介绍说明。
    发表于 06-01 09:39 11次下载

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

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

    测速电机是什么?

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

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

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

    测速电机选型时6大注意事项

    测速电机选型时6大注意事项:一 确定测速电机测速范围和精度。不同的应用场景对测速范围和精度有不同
    的头像 发表于 03-06 14:22 360次阅读
    <b class='flag-5'>测速</b><b class='flag-5'>电机</b>选型时6大注意事项