基于RT-Thread的RoboMaster電控框架設計_第1頁
基于RT-Thread的RoboMaster電控框架設計_第2頁
基于RT-Thread的RoboMaster電控框架設計_第3頁
基于RT-Thread的RoboMaster電控框架設計_第4頁
基于RT-Thread的RoboMaster電控框架設計_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第第頁基于RT-Thread的RoboMaster電控框架設計

由于(RT-Thread)穩(wěn)定高效的內核,豐富的文檔(教程),積極活躍的社區(qū)氛圍,以及設備驅動框架、Kconfig、Scons、日志系統、海量的軟件包……很難不選擇RT-Thread進行項目開發(fā)。但也正是因為這些優(yōu)點的覆蓋面較廣,很多初學者會覺得無從下手,但只要步入RT-Thread的大門,你就發(fā)現她的美好。這系列文檔將作為本人基于RT-Thread開發(fā)(RoboMaster)電控框架的記錄與分享,希望能幫助到更多初識RT-Thread的小伙伴,也歡迎大家交流分享,指正不足,共同進步。

背景

Robomaster(機器人)比賽包含多個兵種,為了提高研發(fā)效率,模塊化尤為重要,使用RT-Thread有助于面對對象思想開發(fā);通過配備的Kconfig,Scons等工具可以實現工程的靈活配置;軟件(定時器)可用作各(電機)等模塊監(jiān)控,RingBuffer可以實現(傳感器)信息的高效處理…….

使用的開發(fā)板為(大疆)的RoboMaster-C型開發(fā)板,基礎工程為rt-thread>bsp>(stm32)f407-robomaster-c

電機模塊開發(fā)

使用電機和電調均為大疆官方出品,如2023,3508,6020等,采用(CAN)通訊方式。

構建對象

首先我們根據使用的電機特性,構建一個通用的電機對象

/**

@briefDJI(intel)ligentmotortypedef

/

typedefstructdji_motor_object

{

rt_device_tcan_dev;//電機CAN實例

dji_motor_measure_tmeasure;//電機測量值

uint32_ttx_id;//發(fā)送id(主發(fā))

uint32_trx_id;//接收id(主收)

/分組發(fā)送設置/

uint8_tsend_group;//同一幀報文分組

uint8_tmessage_num;//一幀報文中位置

motor_type_emotor_type;//電機類型

mot(or)_working_type_estop_flag;//啟停標志

/監(jiān)控線程相關/

rt_(ti)mer_ttimer;//電機監(jiān)控定時器

/(電機控制)相關*/

void*controller;//電機控制器

int16_t(*control)(dji_motor_measure_tmeasure);//控制電機的(接口)用戶可以自定義,返回值為16位的電壓或(電流)值

}dji_motor_object_t;

因為這些電機我們均使用CAN方式進行驅動,是CAN設備的延申,于是將rt_device_tcan_dev父類結構體對象內嵌。

dji_motor_measure_t結構體中為,電機控制時需要用到的一些反饋值,包括電調直接反饋的數據以及進一步解算的得出的:

/**

@briefDJImotorfeedb(ac)k

/

typedefstruct

{

/以下是處理得出的數據/

floatangle_single_round;//單圈角度

floatspeed_aps;//角速度,單位為:度/秒

floattotal_angle;//總角度,注意方向

int32_ttotal_round;//總圈數,注意方向

floattarget;//目標值(輸出軸扭矩矩/速度/角度(單位度))

/以下是電調直接回傳的數據*/

uint16_tecd;//0-8191

uint16_tlast_ecd;//上一次讀取的(編碼器)值

int16_tspeed_rpm;//電機的轉速值

int16_treal_current;//實際轉矩電流

uint8_t(te)mperature;//Celsius

}dji_motor_measure_t;

注冊實例

通過dji_motor_object_t*dji_motor_register(motor_config_t*config,void*controller)注冊對應的電機實例,用戶通過motor_config_t*config對實例進行靈活配置:

/**

@brief電機初始化,返回一個電機實例

@pa(ram)config電機配置

@returndji_motor_object_t*電機實例指針

*/

dji_motor_object_t*dji_motor_register(motor_config_t*config,void*controller)

{

dji_motor_object_t*object=(dji_motor_object_t)rt_malloc(sizeof(dji_motor_object_t));

rt_(mems)et(object,0,sizeof(dji_motor_object_t));

//對接用戶配置的motor_config

object->motor_type=config->motor_type;//6020or2023or3508

object->rx_id=config->rx_id;//電機接收報文的ID

object->control=controller;//電機控制器

/查找CAN設備/

object->can_dev=rt_device_find(config->can_name);

//電機分組,因為至多4個電機可以共用一幀CAN控制報文

motor_send_grou(pi)ng(object,config);

//電機離線檢測定時器相關

object->timer=rt_timer_create("motor1",

motor_lost_callback,

object,20,

RT_TIMER_FLAG_PERIODIC);

rt_timer_start(object->timer);

dji_motor_enable(object);

dji_motor_obj[idx++]=object;

returnobject;

}

/電機配置結構體*/

typedefstruct

{

motor_type_emotor_type;

constchar*can_name;

uint32_ttx_id;//發(fā)送id(主發(fā))

uint32_trx_id;//接收id(主收)

void*controller;//電機控制器

}motor_config_t;

motor_config_t結構體中的void*controller為電機所使用到的(控制器)集合,是一個控制器類型為其成員的結構體變量,如下:

stat(ic)structchassis_controller_t{

pid_object_t*speed_pid;

}chassis_controller;

staticstructgimbal_controller_t{

pid_object_t*speed_pid;

pid_object_t*angle_pid;

}gimbal_controlelr;

調用dji_motor_object_t*dji_motor_register時傳入的void*controller為電機對應的控制器具體實現,如進行pid計算,濾波等,會賦值給電機對象對應的函數指針,在進行電機控制計算時被執(zhí)行,如下:

rt_int16_tchassis_control(dji_motor_measure_tmeasure){

staticrt_int16_tset=0;

set=pid_calculate(chassis_controller.speed_pid,measure.speed_rpm,1000);

returnset;

}

數據處理

電機對象離不開對數據穩(wěn)定快速的收發(fā)和解析計算,接下來展開討論使用RT-Thread的CAN設備驅動收發(fā)數據的思路。

首先是數據的接收,stm32f4擁有2個CAN外設,所有電機和使用CAN總線的設備都掛載在這兩條總線上,但RT-Thread的每個CAN總線只能通過rt_device_set_rx_indicate(can_dev,can_rx_call);注冊一個對應的接收回調函數。但不同類型電機,不同CAN設備的數據解析處理都是不一樣的,我這里的解決思路是:首先創(chuàng)建了一個usr_callback文件,用于統一管理CAN、串口等設備可能用到的用戶接收對調函數;將一個大的設備類型回調函數注冊到對應CAN設備,其中再細分各掛載設備的數據解析,實現如下:

#ifdefBSP_USING_CAN

rt_err_tcan_rx_call(rt_device_tdev,rt_size_tsize)

{

structrt_can_msgrxmsg={0};

uint8_trxbuff=rxmsg.data;

/從CAN讀取一幀數據/

rt_device_re(ad)(dev,0,

/CAN接收到數據后產生中斷,調用此回調函數,然后發(fā)送接收(信號)量/

#ifdefBSP_USING_DJI_MOTOR

dji_motot_rx_callback(rxmsg.id,rxbuff);

#endif/BSP_USING_DJI_MOTOR/

returnRT_EOK;

}

#endif/BSP_USING_CAN*/

但是這其中也有一點問題,rt_err_tcan_rx_call(rt_device_tdev,rt_size_tsize)傳入的參數無法判斷具體的CAN設備來源,因此所有使用到的CAN外設數據處理函數都會被調用,但目前問題不大,因為同一條總線上不會掛載相同ID的設備,這也是一開始就應該避免的錯誤。

接下來是CAN報文的發(fā)送,調用rt_device_write發(fā)送填充好的CAN報文幀即可。

離線檢測

這里使用RT-Thread的軟件定時器對電機進行離線檢測,當超過定時間沒有接收到對應電機反饋報文,則進入超時回調,并輸出警告日志:

/**

@brief電機定時器超時回調函數

@parammotor_ptr

*/

staticvoidmotor_lost_callback(void*motor_ptr)

{

dji_motor_object_t*motor=(dji_motor_object_t*)motor_ptr;

//dji_motor_stop(motor);

LOG_W("[dji_motor]Motorlost,canbus[%s],id0x[%x]",motor->can_dev->,motor->rx_id);

}

使用實例

封裝完成的電機模塊使用示例如下:

staticstructchassis_controller_t{

pid_object_t*speed_pid;

}chassis_controller;

staticstructgimbal_controller_t{

pid_object_t*speed_pid;

pid_object_t*angle_pid;

}gimbal_controlelr;

staticdji_motor_object_t*chassis_motor;

staticdji_motor_object_t*gimbal_motor;

rt_int16_tchassis_control(dji_motor_measure_tmeasure){

staticrt_int16_tset=0;

set=pid_calculate(chassis_controller.speed_pid,measure.speed_rpm,1000);

returnset;

}

rt_int16_tgimbal_control(dji_motor_measure_tmeasure){

staticrt_int16_tset=0;

set=pid_calculate(gimbal_controlelr.speed_pid,measure.speed_rpm,0);

returnset;

}

staticvoidexample_init()

{

pid_config_tchassis_speed_config={

.Kp=10,//4.5

.Ki=0,//0

.Kd=0,//0

.IntegralLimit=3000,

.Improve=PID_Trapezoid_Intergral|PID_Integral_Limit|PID_Derivative_On_Measurement,

.MaxOut=12000,

};

pid_config_tgimbal_speed_config={

.Kp=50,//50

.Ki=200,//200

.Kd=0,

.Improve=PID_Trapezoid_Intergral|PID_Integral_Limit|PID_Derivative_On_Measurement,

.IntegralLimit=3000,

.MaxOut=20000,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論