0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用HAL庫進行電機測速濾波

麥辣雞腿堡 ? 來源:CSDN博客 ? 作者:駭客小狗 ? 2023-11-10 15:48 ? 次閱讀

如果將測得的速度值用VOFA+上位機畫出來,我們可能會看到這樣的曲線

圖片

從圖中我們可以看到,速度值在目標速度附近來回小幅度震蕩,始終不穩(wěn)定。這是因為編碼器測速得到的速度值是離散的,如果電機的速度值剛好卡在兩個離散值中間,我們測得的速度值就會在這兩個離散值中間來回震蕩。如果我們想要解決這個問題,最好先對測速的精度進行分析。

對于M法測速來說,測速的公式如下,其中,k是將速度換算成rpm的比例系數(shù)

圖片

由于除號后面的都是定值,所以我們只要分析每次采樣的脈沖數(shù)對速度的影響即可。

我們假設現(xiàn)在測速頻率是50Hz,減速比為30,編碼器線數(shù)為13,那么脈沖數(shù)每變化1,速度的變化為

圖片

所以我們測得的速度只能是1.923rpm的整數(shù)倍。如果想要提高精度,在電機不變的情況下,我們可以使用500線的GMR編碼器或者降低測速頻率。

在VOFA+中,我們可以測得震蕩時波峰和波谷的差值為1.92左右,和我們的計算相符。

為了改善這一現(xiàn)象,我們可以對速度采樣值使用平均濾波,即將最近幾次的速度采樣值存放到數(shù)組中,每測得一個新的速度,就將新速度存入數(shù)組,將最早測得的速度值從數(shù)組中刪除,我們使用的速度值是數(shù)組中所有速度的平均值。實現(xiàn)代碼如下

#define SPEED_RECORD_NUM 20 // 經(jīng)測試,50Hz個采樣值進行濾波的效果比較好


float speed_Record[SPEED_RECORD_NUM]={0};


/*
 * 進行速度的平均濾波
 * 輸入新采樣到的速度,存放速度的數(shù)組,
 * 返回濾波后的速度
 */
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--)//將現(xiàn)有數(shù)據(jù)后移一位
    {
        speed_Record[i] = speed_Record[i-1];
        sum += speed_Record[i-1];
    }
    speed_Record[0] = new_Spe;//第一位是新的數(shù)據(jù)
    sum += new_Spe;
    test_Speed = sum/SPEED_RECORD_NUM;
    return sum/SPEED_RECORD_NUM;//返回均值
}


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定時器回調(diào)函數(shù),用于計算速度
{  
    if(htim- >Instance==GAP_TIM.Instance)//間隔定時器中斷,是時候計算速度了
    {
        motor1.direct = __HAL_TIM_IS_TIM_COUNTING_DOWN(&ENCODER_TIM);//如果向上計數(shù)(正轉(zhuǎn)),返回值為0,否則返回值為1
        motor1.totalCount = COUNTERNUM_1 + motor1.overflowNum * RELOADVALUE_1;//一個周期內(nèi)的總計數(shù)值等于目前計數(shù)值加上溢出的計數(shù)值
        
        if(motor1.lastCount - motor1.totalCount > 19000) // 在計數(shù)值溢出時進行防溢出處理
        {
            motor1.overflowNum++;
            motor1.totalCount = COUNTERNUM_1 + motor1.overflowNum * RELOADVALUE_1;//一個周期內(nèi)的總計數(shù)值等于目前計數(shù)值加上溢出的計數(shù)值
        }
        else if(motor1.totalCount - motor1.lastCount > 19000) // 在計數(shù)值溢出時進行防溢出處理
        {
            motor1.overflowNum--;
            motor1.totalCount = COUNTERNUM_1 + motor1.overflowNum * RELOADVALUE_1;//一個周期內(nèi)的總計數(shù)值等于目前計數(shù)值加上溢出的計數(shù)值
        }
        
        motor1.speed = (float)(motor1.totalCount - motor1.lastCount) / (4 * MOTOR_SPEED_RERATIO * PULSE_PRE_ROUND) * 3000;//算得每秒多少轉(zhuǎn),除以4是因為4倍頻
        /*******************在這里添加濾波函數(shù)************************/
        motor1.speed = Speed_Low_Filter(motor1.speed,speed_Record);
        /**********************************************************/
        motor1.lastCount = motor1.totalCount; //記錄這一次的計數(shù)值
}

經(jīng)過濾波后的速度曲線如下。

圖片

綠線是原始速度,紅線是目標速度,粉線是濾波后的速度??梢钥吹?,濾波后的速度值明顯要平滑很多,這對我們后期的PID調(diào)試是很有利的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編碼器
    +關(guān)注

    關(guān)注

    44

    文章

    3529

    瀏覽量

    133295
  • 濾波
    +關(guān)注

    關(guān)注

    10

    文章

    652

    瀏覽量

    56462
  • 測速
    +關(guān)注

    關(guān)注

    0

    文章

    37

    瀏覽量

    14040
收藏 人收藏

    評論

    相關(guān)推薦

    STM32標準、HAL和LL介紹

    我們在進行STM32開發(fā)的時候,使用寄存器進行開發(fā)的終究是少數(shù),大多數(shù)人還是習慣用庫函數(shù)進行開發(fā)。到目前為止,有標準外設、HAL
    發(fā)表于 06-21 15:13 ?1.2w次閱讀
    STM32標準<b class='flag-5'>庫</b>、<b class='flag-5'>HAL</b><b class='flag-5'>庫</b>和LL<b class='flag-5'>庫</b>介紹

    使用STM32 HAL進行GPIO控制的實例

    在基于STM32微控制器的嵌入式系統(tǒng)開發(fā)中,GPIO(GeneralPurposeInput/Output)控制是其中最基本、最常見的操作之一。通過使用STM32的HAL,可以輕松地對GPIO進行配置和控制。本文將演示如何使用
    的頭像 發(fā)表于 12-21 15:22 ?2356次閱讀

    HAL每天一例】第113例:單軸25GA370直流電機編碼測速(L298N驅(qū)動)

    的,我們還程序發(fā)布基于HAL的指導文檔和視頻教程,歡迎持續(xù)關(guān)注,并提出改進意見。參考文檔見:硬石電機控制專題指導手冊例程下載:資料包括程序、相關(guān)說明資料以及軟件使用截圖百度云盤:https
    發(fā)表于 09-05 08:45

    STM32標準改為HAL的程序?qū)崿F(xiàn)

    標準占絕大多數(shù),自己買的板子跟的資料也一般是標準,HAL很少,不過要是使用STM32CubeMx配置,那么就是使用的HAL
    發(fā)表于 11-22 11:23 ?3.4w次閱讀

    測速發(fā)電機的使用范圍 測速電機的特點

    元件 (3)用做解算元件 測速電機的特點: 1、 測速發(fā)電機的輸出電壓信號,電壓量程可在10幾伏到幾百伏之間; 2、 測速
    的頭像 發(fā)表于 07-20 17:49 ?5258次閱讀

    仿標準,對HAL的補充代碼

    前言: ST官方從2017年下半年開始就不再維護升級標準,轉(zhuǎn)而推廣HAL。到2019年,HAL仍不夠成熟,其原因有以下: 1.
    發(fā)表于 11-29 11:36 ?30次下載
    仿標準<b class='flag-5'>庫</b>,對<b class='flag-5'>HAL</b><b class='flag-5'>庫</b>的補充代碼

    HAL結(jié)構(gòu)

    HAL結(jié)構(gòu)
    發(fā)表于 12-09 13:36 ?32次下載
    <b class='flag-5'>HAL</b><b class='flag-5'>庫</b>結(jié)構(gòu)

    HAL】串口通信

    HAL入門之串口通信學習經(jīng)驗分享
    發(fā)表于 12-16 16:58 ?5次下載
    【<b class='flag-5'>HAL</b><b class='flag-5'>庫</b>】串口通信

    stm32F103 基于HAL的直流電機驅(qū)動(一)

    stm32F103 基于HAL的直流電機驅(qū)動目錄stm32F103 基于HAL的直流電機驅(qū)動
    發(fā)表于 01-12 19:48 ?35次下載
    stm32F103 基于<b class='flag-5'>HAL</b><b class='flag-5'>庫</b>的直流<b class='flag-5'>電機</b>驅(qū)動(一)

    【STM32】HAL PWM控制電機轉(zhuǎn)速與編碼器讀?。ǔ斀猓?/a>

    ??大家好,我是小政。本篇文章我將針對PWM控制電機與編碼器讀取電機轉(zhuǎn)速的STM32CubeMX配置過程進行詳細的講解,讓準備學習HAL
    發(fā)表于 01-14 12:39 ?91次下載
    【STM32】<b class='flag-5'>HAL</b><b class='flag-5'>庫</b> PWM控制<b class='flag-5'>電機</b>轉(zhuǎn)速與編碼器讀取(超詳解)

    stm32 hal資料分享

    stm32 hal資料分享
    發(fā)表于 11-03 16:17 ?110次下載

    測速電機是什么?

    測速電機是什么?測速電機是一種用于檢測和控制電機運行速度的重要設備。它由能夠感知和測量電機運行速
    的頭像 發(fā)表于 06-14 09:14 ?1083次閱讀
    <b class='flag-5'>測速</b><b class='flag-5'>電機</b>是什么?

    測速電機的分類與測速電機的應用

    測速電機的分類與測速電機的應用:測速電機是一種用于檢測和控制
    的頭像 發(fā)表于 07-19 16:45 ?782次閱讀

    STM32 HAL的功能和使用方法 STM32 HAL和標準的區(qū)別

    HAL(Hardware Abstraction Layer)是指硬件抽象層,是一種封裝底層硬件接口驅(qū)動的編程。在嵌入式系統(tǒng)中,HAL可以更加方便地實現(xiàn)硬件控制和設備訪問,提高代碼
    發(fā)表于 08-08 18:21 ?3676次閱讀

    STM32 HAL串口收發(fā)是如何使用的?

    的一種,它提供了一種簡單易用的方法來使用STM32的各種外設。 本文將詳細介紹如何使用STM32 HAL進行串口通信,包括初始化、發(fā)送數(shù)據(jù)和接收數(shù)據(jù)等方面。 1. 初始化串口 首
    的頭像 發(fā)表于 10-26 17:42 ?1079次閱讀