1. 程式人生 > >玩轉X-CTR100 l STM32F4 l 舵機控制

玩轉X-CTR100 l STM32F4 l 舵機控制

主程 控制 borde 接口 set span 效果 uart lac

技術分享圖片

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

技術分享圖片

本文介紹X-CTR100控制器的舵機控制,X-CTR100具有16路舵機控制接口,通過定時器產生PWM控制信號,可用於航模、機械臂、機器人等制作。

原理

技術分享圖片

舵機是一種位置(角度)伺服的驅動器,適用於那些需要角度不斷變化並可以保持的控制系統。目前,在高檔遙控玩具,如飛機、潛艇模型,遙控機器人中已經得到了普遍應用。

舵機的形狀和大小多到讓人眼花繚亂,但大致可以如圖C所示分類。最右邊身材不錯的是常見的標準舵機,中間兩個小不點是體積最小的微型舵機,左邊的魁梧的那個是體積最大的大扭力舵機。它們都是同樣的三線控制,因此你可以根據需求換個大個的或小個的。

除了大小和重量,舵機還有兩個主要的性能指標:扭力和轉速,這兩個指標由齒輪組和電機所決定。扭力,通俗講就是舵機有多大的勁兒。在5V的電壓下,標準舵機的扭力是5.5千克/厘米(75盎司/英寸),轉速很容易理解,就是指從一個位置轉到另一個位置要多長時間。在5V電壓下,舵機標準轉度是0.2秒移動60度。總之,和我們人一樣,舵機的個子越大,轉的就越慢但也越有勁兒。

技術分享圖片

舵機有一個三線的接口。黑色(或棕色)的線是接地線,紅線接+5V電壓,黃線(或是白色或橙色)接控制信號端。

技術分享圖片

舵機的控制信號周期為20ms的脈寬調制(PWM)信號,其中脈沖寬度從0.5-2.5ms,相對應的舵盤位置為0-180度,呈線性變化。即提供一定的脈寬,它的輸出軸就會保持一定對應角度上,無論外界轉矩怎麽改變,直到給它提供一個另外寬度的脈沖信號,它才會改變輸出角度到新的對應位置。舵機控制脈沖寬度與轉角關系如下圖。

技術分享圖片

例程

控制16路舵機30度、90度、150度間隔運動。。

硬件說明

硬件資源:

  • 串口UART1
  • R擴展接口(16個擴展接口都可以接舵機)
  • 舵機若幹(需自備)

硬件連接:

技術分享圖片

軟件生態

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

ax_servo.c——X-CTR100 舵機控制源文件

ax_servo.h——X-CTR100 舵機控制頭文件

接口函數

void AX_SERVO_TIM2_AB_Init(void); //舵機AB接口初始化

void AX_SERVO_TIM2_A_SetAngle(uint16_t angle); //舵機A控制

void AX_SERVO_TIM2_B_SetAngle(uint16_t angle); //舵機B控制

void AX_SERVO_TIM5_CD_Init(void); //舵機CD接口初始化

void AX_SERVO_TIM5_C_SetAngle(uint16_t angle); //舵機C控制

void AX_SERVO_TIM5_D_SetAngle(uint16_t angle); //舵機D控制

void AX_SERVO_TIM3_EFGH_Init(void); //舵機EFGH接口初始化

void AX_SERVO_TIM3_E_SetAngle(uint16_t angle); //舵機E控制

void AX_SERVO_TIM3_F_SetAngle(uint16_t angle); //舵機F控制

void AX_SERVO_TIM3_G_SetAngle(uint16_t angle); //舵機G控制

void AX_SERVO_TIM3_H_SetAngle(uint16_t angle); //舵機H控制

void AX_SERVO_TIM4_IJKL_Init(void); //舵機IJKL接口初始化

void AX_SERVO_TIM4_I_SetAngle(uint16_t angle); //舵機I控制

void AX_SERVO_TIM4_J_SetAngle(uint16_t angle); //舵機J控制

void AX_SERVO_TIM4_K_SetAngle(uint16_t angle); //舵機K控制

void AX_SERVO_TIM4_L_SetAngle(uint16_t angle); //舵機L控制

void AX_SERVO_TIM1_MNOP_Init(void); //舵機MNOP接口初始化

void AX_SERVO_TIM1_M_SetAngle(uint16_t angle); //舵機M控制

void AX_SERVO_TIM1_N_SetAngle(uint16_t angle); //舵機N控制

void AX_SERVO_TIM1_O_SetAngle(uint16_t angle); //舵機O控制

void AX_SERVO_TIM1_P_SetAngle(uint16_t angle); //舵機P控制

軟件說明

函數AX_SERVO_TIMX_XX_Init()完成舵機控制定時器和IO的初始化,TIMX為對應的定時器,XX為初始化所包含的舵機接口,例如AX_SERVO_TIM3_EFGH_Init()初始化定時器TIM3,包含的接口為EFGH。while循環中通過AX_SERVO_TIMX_X_SetAngle()設置舵機的旋轉角度,實現16路舵機30°、90°、150°間隔運動。主程序代碼如下。

int main(void)

{

//X-CTR100初始化

AX_Init(115200);

printf("***X-CTR100 舵機控制例程***\r\n\r\n");

//模塊初始化及配置

AX_SERVO_TIM2_AB_Init();

AX_SERVO_TIM5_CD_Init();

AX_SERVO_TIM3_EFGH_Init();

AX_SERVO_TIM4_IJKL_Init();

AX_SERVO_TIM1_MNOP_Init();

//X-API測試:16路舵機控制測試

printf("*16路舵機控制測試\r\n");

while (1)

{

printf("*30度...... \r\n");

AX_SERVO_TIM2_A_SetAngle(300);

AX_SERVO_TIM2_B_SetAngle(300);

AX_SERVO_TIM5_C_SetAngle(300);

AX_SERVO_TIM5_D_SetAngle(300);

AX_SERVO_TIM3_E_SetAngle(300);

AX_SERVO_TIM3_F_SetAngle(300);

AX_SERVO_TIM3_G_SetAngle(300);

AX_SERVO_TIM3_H_SetAngle(300);

AX_SERVO_TIM4_I_SetAngle(300);

AX_SERVO_TIM4_J_SetAngle(300);

AX_SERVO_TIM4_K_SetAngle(300);

AX_SERVO_TIM4_L_SetAngle(300);

AX_SERVO_TIM1_M_SetAngle(300);

AX_SERVO_TIM1_N_SetAngle(300);

AX_SERVO_TIM1_O_SetAngle(300);

AX_SERVO_TIM1_P_SetAngle(300);

AX_Delayms(1000);

printf("*90度...... \r\n");

AX_SERVO_TIM2_A_SetAngle(900);

AX_SERVO_TIM2_B_SetAngle(900);

AX_SERVO_TIM5_C_SetAngle(900);

AX_SERVO_TIM5_D_SetAngle(900);

AX_SERVO_TIM3_E_SetAngle(900);

AX_SERVO_TIM3_F_SetAngle(900);

AX_SERVO_TIM3_G_SetAngle(900);

AX_SERVO_TIM3_H_SetAngle(900);

AX_SERVO_TIM4_I_SetAngle(900);

AX_SERVO_TIM4_J_SetAngle(900);

AX_SERVO_TIM4_K_SetAngle(900);

AX_SERVO_TIM4_L_SetAngle(900);

AX_SERVO_TIM1_M_SetAngle(900);

AX_SERVO_TIM1_N_SetAngle(900);

AX_SERVO_TIM1_O_SetAngle(900);

AX_SERVO_TIM1_P_SetAngle(900);

AX_Delayms(1000);

printf("*150度...... \r\n");

AX_SERVO_TIM2_A_SetAngle(1500);

AX_SERVO_TIM2_B_SetAngle(1500);

AX_SERVO_TIM5_C_SetAngle(1500);

AX_SERVO_TIM5_D_SetAngle(1500);

AX_SERVO_TIM3_E_SetAngle(1500);

AX_SERVO_TIM3_F_SetAngle(1500);

AX_SERVO_TIM3_G_SetAngle(1500);

AX_SERVO_TIM3_H_SetAngle(1500);

AX_SERVO_TIM4_I_SetAngle(1500);

AX_SERVO_TIM4_J_SetAngle(1500);

AX_SERVO_TIM4_K_SetAngle(1500);

AX_SERVO_TIM4_L_SetAngle(1500);

AX_SERVO_TIM1_M_SetAngle(1500);

AX_SERVO_TIM1_N_SetAngle(1500);

AX_SERVO_TIM1_O_SetAngle(1500);

AX_SERVO_TIM1_P_SetAngle(1500);

AX_Delayms(1000);

}

}

實現效果

可在16路舵機接口中任意一路插入舵機,舵機即可循環30°、90°、150°運動,接口順序如下圖,使用時註意電源供電能力及舵機的功率,一般電腦USB供電(500mA)可為1路GS90舵機提供電源,如果插入多路舵機,或舵機負載扭矩大,也可通過VIN-5V接口供電。

技術分享圖片

參考

https://m.guokr.com/article/5292/#weixin.qq.com

玩轉X-CTR100 l STM32F4 l 舵機控制