在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

STM32實現編碼器M法測速接線

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

接線

編碼器電機、電機驅動(這里用的L298n)、STM32電源(可以是12V電池)的接線如下

圖片

3.3 代碼編寫

encoder.h中的內容

#ifndef _ENCODER_H_
#define _ENCODER_H_


#include "stm32f1xx.h"


//電機1的編碼器輸入引腳
#define MOTO1_ENCODER1_PORT GPIOA
#define MOTO1_ENCODER1_PIN  GPIO_PIN_0
#define MOTO1_ENCODER2_PORT GPIOA
#define MOTO1_ENCODER2_PIN  GPIO_PIN_1


//定時器
#define ENCODER_TIM htim2
#define PWM_TIM     htim3
#define GAP_TIM     htim4


#define MOTOR_SPEED_RERATIO 45u    //電機減速比
#define PULSE_PRE_ROUND 11 //一圈多少個脈沖
#define RADIUS_OF_TYRE 34 //輪胎半徑,單位毫米
#define LINE_SPEED_C RADIUS_OF_TYRE * 2 * 3.14
#define RELOADVALUE __HAL_TIM_GetAutoreload(&ENCODER_TIM)    //獲取自動裝載值,本例中為20000
#define COUNTERNUM __HAL_TIM_GetCounter(&ENCODER_TIM)        //獲取編碼器定時器中的計數值


typedef struct _Motor
{
    int32_t lastCount;   //上一次計數值
    int32_t totalCount;  //總計數值
    int16_t overflowNum; //溢出次數
    float speed;         //電機轉速
    uint8_t direct;      //旋轉方向
}Motor;


#endif

encoder.c中的內容

#include "encoder.h"


Motor motor1;


void Motor_Init(void)
{
    HAL_TIM_Encoder_Start(&ENCODER_TIM, TIM_CHANNEL_ALL);      //開啟編碼器定時器
    __HAL_TIM_ENABLE_IT(&ENCODER_TIM,TIM_IT_UPDATE);           //開啟編碼器定時器更新中斷,防溢出處理
    HAL_TIM_Base_Start_IT(&GAP_TIM);                       //開啟100ms定時器中斷
    HAL_TIM_PWM_Start(&PWM_TIM, TIM_CHANNEL_2);            //開啟PWM
    HAL_TIM_PWM_Start(&PWM_TIM, TIM_CHANNEL_1);            //開啟PWM
    __HAL_TIM_SET_COUNTER(&ENCODER_TIM, 10000);                //編碼器定時器初始值設定為10000
    motor1.lastCount = 0;                                   //結構體內容初始化
    motor1.totalCount = 0;
    motor1.overflowNum = 0;                                  
    motor1.speed = 0;
    motor1.direct = 0;
}


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定時器回調函數,用于計算速度
{
    if(htim- >Instance==ENCODER_TIM.Instance)//編碼器輸入定時器溢出中斷,用于防溢出                   
    {      
        if(COUNTERNUM < 10000) motor1.overflowNum++;       //如果是向上溢出
        else if(COUNTERNUM >= 10000) motor1.overflowNum--; //如果是向下溢出
        __HAL_TIM_SetCounter(&ENCODER_TIM, 10000);             //重新設定初始值
    }
    else if(htim- >Instance==GAP_TIM.Instance)//間隔定時器中斷,是時候計算速度了
    {
        motor1.direct = __HAL_TIM_IS_TIM_COUNTING_DOWN(&ENCODER_TIM);//如果向上計數(正轉),返回值為0,否則返回值為1
        motor1.totalCount = COUNTERNUM + motor1.overflowNum * RELOADVALUE;//一個周期內的總計數值等于目前計數值加上溢出的計數值
        motor1.speed = (float)(motor1.totalCount - motor1.totalCount) / (4 * MOTOR_SPEED_RERATIO * PULSE_PRE_ROUND) * 10;//算得每秒多少轉
        //motor1.speed = (float)(motor1.totalCount - motor1.totalCount) / (4 * MOTOR_SPEED_RERATIO * PULSE_PRE_ROUND) * 10 * LINE_SPEED_C//算得車輪線速度每秒多少毫米
        motor1.lastCount = motor1.totalCount; //記錄這一次的計數值
    }
}

使用時需要在main.c的循環之前調用Motor_Init函數進行初始化。

如果發現無法進入編碼器中斷導致totalCount經常溢出歸零,可以嘗試換一種防溢出的方法,代碼如下

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.lastCount = motor1.totalCount; //記錄這一次的計數值
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編碼器
    +關注

    關注

    45

    文章

    3646

    瀏覽量

    134674
  • 驅動
    +關注

    關注

    12

    文章

    1843

    瀏覽量

    85334
  • 電機
    +關注

    關注

    142

    文章

    9028

    瀏覽量

    145664
  • STM32
    +關注

    關注

    2270

    文章

    10904

    瀏覽量

    356397
收藏 人收藏

    評論

    相關推薦

    AB相編碼器-變M/T測速,10ms定時,測6000轉伺服電機!

    本帖最后由 SXST_T 于 2017-9-13 12:11 編輯 適用所有線數編碼器,此方法主要解決M測低速分辨率不足,T測高速分辨率高,
    發表于 09-13 12:07

    編碼器測速的大致原理是什么?

    編碼器是什么?編碼器主要分為哪幾種?編碼器測速的大致原理是什么?
    發表于 06-30 07:48

    編碼器測速原理及STM32編碼器模式

    本問講解了編碼器測速原理及STM32編碼器模式,文末有STM32編碼器模式例程。
    發表于 08-11 06:06

    MT測速單片機程序設計

    MT測速單片機程序設計M、T
    發表于 09-02 06:01

    增量式編碼器倍頻技術的M究竟是怎樣測速

    增量式編碼器輸出的脈沖波形信號形式常見的有哪幾種?增量式編碼器倍頻技術的M究竟是怎樣測速的?
    發表于 11-09 07:08

    STM32正交編碼器怎么進行測速

    正交編碼解碼的原理是什么?STM32正交編碼器怎么進行測速
    發表于 11-16 08:04

    增量式編碼器如何使用外部中斷實現測速

    增量式編碼器如何使用外部中斷實現測速
    發表于 11-16 08:25

    如何實現STM32F103C8T6編碼器測速

    如何實現STM32F103C8T6編碼器測速
    發表于 12-13 07:21

    絕對式編碼器測速方法

    本文檔詳細介紹了絕對式編碼器測速度的方法
    發表于 08-29 14:22 ?41次下載

    編碼器測速方法的研究

    編碼器測速方法的研究
    發表于 03-17 09:06 ?24次下載

    測速編碼器工作原理

     測速編碼器一般與軸相聯,測速編碼器的脈沖量是固定的,在軸旋轉的時候,測速編碼器就會輸出脈沖,P
    的頭像 發表于 11-07 09:36 ?2.1w次閱讀

    平衡小車—編碼器使用教程與測速原理

    文章目錄1.編碼器概述2.編碼器原理3.編碼器接線說明4.編碼器軟件四倍頻技術5.單片機如何采集編碼器
    發表于 11-22 19:51 ?57次下載
    平衡小車—<b class='flag-5'>編碼器</b>使用教程與<b class='flag-5'>測速</b>原理

    STM32——編碼器測速原理及STM32編碼器模式

    本問講解了編碼器測速原理及STM32編碼器模式,文末有STM32編碼器模式例程。
    發表于 11-26 11:36 ?271次下載
    <b class='flag-5'>STM32</b>——<b class='flag-5'>編碼器</b><b class='flag-5'>測速</b>原理及<b class='flag-5'>STM32</b><b class='flag-5'>編碼器</b>模式

    編碼器常用測速方法

    2.1 倍頻技術 編碼器會輸出兩路方波信號,如果只在通道A的上升沿計數,那就是1倍頻;通道A的上升、下降沿計數,那就是2倍頻;如果在通道A、B的上升、下降沿計數,那就是4倍頻。 使用倍頻可以最大程度
    的頭像 發表于 11-10 15:28 ?6084次閱讀
    <b class='flag-5'>編碼器</b>常用<b class='flag-5'>測速</b>方法

    編碼器M測速CubeMax配置

    為了進行測速,我們一共需要3個定時,作用分別是:①輸出PWM;②編碼器模式進行脈沖計數;③計時,確定每次測速的時間間隔。 其中,用于定時的定時
    的頭像 發表于 11-10 15:31 ?1217次閱讀
    <b class='flag-5'>編碼器</b><b class='flag-5'>M</b><b class='flag-5'>法</b><b class='flag-5'>測速</b>CubeMax配置
    主站蜘蛛池模板: 五月婷婷久| 玖玖在线| 国产高清在线精品一区| 色操网| 一级片 在线播放| 一级毛片子| 特级黄毛片| 精品国产柚木在线观看| 嫩草网| 国产成人乱码一区二区三区 | 天堂bt资源www在线| 谁有毛片网站| 免费黄色| 第四色播日韩第一页| 午夜免费影视| 好硬好大好爽女房东在线观看| 黄色a级免费| 97av在线| 理论视频在线观看| 天天摸日日干| 久久天天干| 国产精品欧美激情在线播放| h免费视频| 酒色成人网| 色噜噜亚洲男人的天堂| 69日本xxxxxxxxx30| 视频在线观看免费网站| 4455亚洲| 亚洲欧洲色天使日韩精品| 色你懂的| 国产网站在线播放| 天天天天做夜夜夜夜| 午夜久久久| 干成人| 亚欧乱色束缚一区二区三区| 亚洲综合春色另类久久| 欧美视频精品一区二区三区| 欧美一区二区三区不卡片 | 国产成人午夜片在线观看| 91在线操| 天堂电影免费在线观看|