玩轉X-CTR100 l STM32F4 l 電機正交編碼器

我造輪子,你造車,創客一塊兒造起來!塔克創新資訊【塔克社區 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/ 函數

本文介紹X-CTR100控制器的電機正交編碼器,X-CTR100具備2路32位AB項正交編碼器和3路16位正交編碼器,共5路。 測試

可用於電機轉速和角度測量,用於智能車、機械臂、機器人制做。 ui

原理

什麼是正交?若是兩個信號相位相差90度,則這兩個信號稱爲正交。因爲兩個信號相差90度,所以能夠根據兩個信號哪一個先哪一個後來判斷方向。 編碼

正交編碼器(Quadrature Encoder)是一種用於測量旋轉速度和方向的傳感器,經過積分(累加)運算後,還能夠用來測算距離。最多見的正交編碼器有兩個輸出信號:A相 和 B相,有些編碼器會有 Z相 的校準功能(用於消除累計偏差)。「正交」一詞來源於 AB 兩個信號的特徵,通常狀況下 A相 和 B相 的輸出信號老是有 π/2 的相位差。 spa

上圖中 A 和 B 分別鏈接到兩個傳感器單元上,黑白相間的圓環稱之爲「柵格」。傳感器和柵格的實現方式有不少種:反射式傳感器+不一樣反光率的柵格;對射式傳感器+鏤空光柵;霍爾傳感器+磁極圓環;觸點+導電軌道;等等。 code

例程

初始化編碼器,每隔500ms採樣一次編碼器數值並串口輸出顯示。 blog

硬件說明

硬件資源: 接口

  • 串口UART1
  • RA、RB擴展接口(TIM2 32AB正交編碼器接口)
  • 具備正交編碼器電機(需自備)

硬件鏈接: 資源

軟件生態

X-SOFT軟件生態,X-API擴展文件以下。 get

ax_encoder.c——X-CTR100 電機正交編碼器源文件

ax_encoder.h——X-CTR100 電機正交編碼器頭文件

接口函數

void AX_ENCODER_TIM2_AB_Init(uint32_t cycle); //編碼器AB初始化(32位)

uint32_t AX_ENCODER_TIM2_AB_GetCounter(void); //編碼器AB獲取計數器數值

void AX_ENCODER_TIM2_AB_SetCounter(uint32_t count); //編碼器AB設置計數器數值

 

void AX_ENCODER_TIM5_CD_Init(uint32_t cycle); //編碼器CD初始化(32位)

uint32_t AX_ENCODER_TIM5_CD_GetCounter(void); //編碼器CD獲取計數器數值

void AX_ENCODER_TIM5_CD_SetCounter(uint32_t count); //編碼器CD設置計數器數值

 

void AX_ENCODER_TIM3_GH_Init(uint16_t cycle); //編碼器GH初始化

uint16_t AX_ENCODER_TIM3_GH_GetCounter(void); //編碼器GH獲取計數器數值

void AX_ENCODER_TIM3_GH_SetCounter(uint16_t count); //編碼器GH設置計數器數值

 

void AX_ENCODER_TIM4_KL_Init(uint16_t cycle); //編碼器KL初始化

uint16_t AX_ENCODER_TIM4_KL_GetCounter(void); //編碼器KL獲取計數器數值

void AX_ENCODER_TIM4_KL_SetCounter(uint16_t count); //編碼器KL設置計數器數值

 

void AX_ENCODER_TIM1_OP_Init(uint16_t cycle); //編碼器OP初始化

uint16_t AX_ENCODER_TIM1_OP_GetCounter(void); //編碼器OP獲取計數器數值

void AX_ENCODER_TIM1_OP_SetCounter(uint16_t count); //編碼器OP設置計數器數值

軟件說明

函數初始化編碼器,設定編碼器計數週期爲60000,設置當前值爲30000,while循環每隔500ms採樣編碼器一次,主程序代碼以下。

int main(void)

{

    //X-CTR100初始化

    AX_Init(115200);

    printf("***電機正交編碼器例程***\r\n\r\n");

 

    //模塊初始化及配置

    AX_ENCODER_TIM2_AB_Init(60000); //32位正交編碼器初始化,計數週期60000

    AX_ENCODER_TIM5_CD_Init(60000); //32位正交編碼器初始化,計數週期60000

    AX_ENCODER_TIM3_GH_Init(60000); //16位正交編碼器初始化,計數週期60000

    AX_ENCODER_TIM4_KL_Init(60000); //16位正交編碼器初始化,計數週期60000

    AX_ENCODER_TIM1_OP_Init(60000); //16位正交編碼器初始化,計數週期60000

 

                                     //設置編碼器當前計數值爲30000

    AX_ENCODER_TIM2_AB_SetCounter(30000);

    AX_ENCODER_TIM5_CD_SetCounter(30000);

    AX_ENCODER_TIM3_GH_SetCounter(30000);

    AX_ENCODER_TIM4_KL_SetCounter(30000);

    AX_ENCODER_TIM1_OP_SetCounter(30000);

 

    //X-API測試:5路正交編碼器測試    

    printf("*5路正交編碼器測試\r\n");

 

    while (1)

    {

        printf("*AB:%5d CD:%5d GH:%5d KL:%5d OP:%5d\r\n",

            AX_ENCODER_TIM2_AB_GetCounter(), AX_ENCODER_TIM5_CD_GetCounter(),

            AX_ENCODER_TIM3_GH_GetCounter(), AX_ENCODER_TIM4_KL_GetCounter(),

            AX_ENCODER_TIM1_OP_GetCounter());

        AX_Delayms(500);

    }

}

實現效果

X-CTR100按照編碼器接口定義鏈接編碼器,編碼器A、B接口線序可更換。手動轉動編碼器可觀察編碼器數值變化,一個方向轉動編碼器數值增長,另外一個方向轉動編碼器數值減少。

參考

https://zhuanlan.zhihu.com/p/20268680

相關文章
相關標籤/搜索