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


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

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

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

原理

什么是正交?如果兩個信號相位相差90度,則這兩個信號稱為正交。由於兩個信號相差90度,因此可以根據兩個信號哪個先哪個后來判斷方向。

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

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

例程

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

硬件說明

硬件資源:

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

硬件連接:

軟件生態

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM