色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

基于 RT-Thread 的 RoboMaster 電控框架(一)

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

背景

Robomaster 機器人比賽包含多個兵種,為了提高研發效率,模塊化尤為重要,使用 RT-Thread 有助于面對對象思想開發;通過配備的 Kconfig,Scons 等工具可以實現工程的靈活配置;軟件定時器可用作各電機等模塊監控,RingBuffer 可以實現傳感器信息的高效處理 …….使用的開發板為大疆的 RoboMaster-C 型開發板,基礎工程為 rt-thread>bsp>stm32f407-robomaster-c

電機模塊開發

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

構建對象

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

 1/**
 2*@briefDJIintelligentmotortypedef
 3*/
 4typedefstructdji_motor_object
 5{
 6rt_device_tcan_dev;//電機CAN實例
 7dji_motor_measure_tmeasure;//電機測量值
 8uint32_ttx_id;//發送id(主發)
 9uint32_trx_id;//接收id(主收)
10/*分組發送設置*/
11uint8_tsend_group;//同一幀報文分組
12uint8_tmessage_num;//一幀報文中位置
13motor_type_emotor_type;//電機類型
14motor_working_type_estop_flag;//啟停標志
15/*監控線程相關*/
16rt_timer_ttimer;//電機監控定時器
17/*電機控制相關*/
18void*controller;//電機控制器
19int16_t(*control)(dji_motor_measure_tmeasure);//控制電機的接口用戶可以自定義,返回值為16位的電壓或電流
20}dji_motor_object_t;

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

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

 1/**
 2*@briefDJImotorfeedback
 3*/
 4typedefstruct
 5{
 6/*以下是處理得出的數據*/
 7floatangle_single_round;//單圈角度
 8floatspeed_aps;//角速度,單位為:度/秒
 9floattotal_angle;//總角度,注意方向
10int32_ttotal_round;//總圈數,注意方向
11floattarget;//目標值(輸出軸扭矩矩/速度/角度(單位度))
12/*以下是電調直接回傳的數據*/
13uint16_tecd;//0-8191
14uint16_tlast_ecd;//上一次讀取的編碼器
15int16_tspeed_rpm;//電機的轉速值
16int16_treal_current;//實際轉矩電流
17uint8_ttemperature;//Celsius
18}dji_motor_measure_t;

注冊實例

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

 1/**
 2*@brief電機初始化,返回一個電機實例
 3*@paramconfig電機配置
 4*@returndji_motor_object_t*電機實例指針
 5*/
 6dji_motor_object_t*dji_motor_register(motor_config_t*config,void*controller)
 7{
 8dji_motor_object_t*object=(dji_motor_object_t*)rt_malloc(sizeof(dji_motor_object_t));
 9rt_memset(object,0,sizeof(dji_motor_object_t));
10//對接用戶配置的motor_config
11object->motor_type=config->motor_type;//6020or2006or3508
12object->rx_id=config->rx_id;//電機接收報文的ID
13object->control=controller;//電機控制器
14/*查找CAN設備*/
15object->can_dev=rt_device_find(config->can_name);
16//電機分組,因為至多4個電機可以共用一幀CAN控制報文
17motor_send_grouping(object,config);
18//電機離線檢測定時器相關
19object->timer=rt_timer_create("motor1",
20motor_lost_callback,
21object,20,
22RT_TIMER_FLAG_PERIODIC);
23rt_timer_start(object->timer);
24dji_motor_enable(object);
25dji_motor_obj[idx++]=object;
26returnobject;
27}
28/*電機配置結構體*/
29typedefstruct
30{
31motor_type_emotor_type;
32constchar*can_name;
33uint32_ttx_id;//發送id(主發)
34uint32_trx_id;//接收id(主收)
35void*controller;//電機控制器
36}motor_config_t;
motor_config_t 結構體中的 void *controller 為電機所使用到的控制器集合,是一個控制器類型為其成員的結構體變量,如下:
1staticstructchassis_controller_t{
2pid_object_t*speed_pid;
3}chassis_controller;
4staticstructgimbal_controller_t{
5pid_object_t*speed_pid;
6pid_object_t*angle_pid;
7}gimbal_controlelr;

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

1rt_int16_tchassis_control(dji_motor_measure_tmeasure){
2staticrt_int16_tset=0;
3set=pid_calculate(chassis_controller.speed_pid,measure.speed_rpm,1000);
4returnset;
5}

數據處理

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

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

 1#ifdefBSP_USING_CAN
 2rt_err_tcan_rx_call(rt_device_tdev,rt_size_tsize)
 3{
 4structrt_can_msgrxmsg={0};
 5uint8_t*rxbuff=rxmsg.data;
 6/*從CAN讀取一幀數據*/
 7rt_device_read(dev,0,&rxmsg,sizeof(rxmsg));
 8/*CAN接收到數據后產生中斷,調用此回調函數,然后發送接收信號量*/
 9#ifdefBSP_USING_DJI_MOTOR
10dji_motot_rx_callback(rxmsg.id,rxbuff);
11#endif/*BSP_USING_DJI_MOTOR*/
12returnRT_EOK;
13}
14#endif/*BSP_USING_CAN*/
但是這其中也有一點問題,rt_err_t can_rx_call(rt_device_t dev, rt_size_t size) 傳入的參數無法判斷具體的 CAN 設備來源,因此所有使用到的 CAN 外設數據處理函數都會被調用,但目前問題不大,因為同一條總線上不會掛載相同 ID 的設備,這也是一開始就應該避免的錯誤。接下來是 CAN 報文的發送,調用 rt_device_write 發送填充好的 CAN 報文幀即可。離線檢測這里使用 RT-Thread 的軟件定時器對電機進行離線檢測,當超過定時間沒有接收到對應電機反饋報文,則進入超時回調,并輸出警告日志:
 1/**
 2*@brief電機定時器超時回調函數
 3*@parammotor_ptr
 4*/
 5staticvoidmotor_lost_callback(void*motor_ptr)
 6{
 7dji_motor_object_t*motor=(dji_motor_object_t*)motor_ptr;
 8//dji_motor_stop(motor);
 9LOG_W("[dji_motor]Motorlost,canbus[%s],id0x[%x]",motor->can_dev->parent.name,motor->rx_id);
10}

使用實例

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

 1staticstructchassis_controller_t{
 2pid_object_t*speed_pid;
 3}chassis_controller;
 4staticstructgimbal_controller_t{
 5pid_object_t*speed_pid;
 6pid_object_t*angle_pid;
 7}gimbal_controlelr;
 8staticdji_motor_object_t*chassis_motor;
 9staticdji_motor_object_t*gimbal_motor;
10rt_int16_tchassis_control(dji_motor_measure_tmeasure){
11staticrt_int16_tset=0;
12set=pid_calculate(chassis_controller.speed_pid,measure.speed_rpm,1000);
13returnset;
14}
15rt_int16_tgimbal_control(dji_motor_measure_tmeasure){
16staticrt_int16_tset=0;
17set=pid_calculate(gimbal_controlelr.speed_pid,measure.speed_rpm,0);
18returnset;
19}
20staticvoidexample_init()
21{
22pid_config_tchassis_speed_config={
23.Kp=10,//4.5
24.Ki=0,//0
25.Kd=0,//0
26.IntegralLimit=3000,
27.Improve=PID_Trapezoid_Intergral|PID_Integral_Limit|PID_Derivative_On_Measurement,
28.MaxOut=12000,
29};
30pid_config_tgimbal_speed_config={
31.Kp=50,//50
32.Ki=200,//200
33.Kd=0,
34.Improve=PID_Trapezoid_Intergral|PID_Integral_Limit|PID_Derivative_On_Measurement,
35.IntegralLimit=3000,
36.MaxOut=20000,
37};
38chassis_controller.speed_pid=pid_register(&chassis_speed_config);
39gimbal_controlelr.speed_pid=pid_register(&gimbal_speed_config);
40motor_config_tchassis_motor_config={
41.motor_type=M3508,
42.can_name=CAN_CHASSIS,
43.rx_id=0x201,
44.controller=&chassis_controller,
45};
46motor_config_tgimbal_motor_config={
47.motor_type=GM6020,
48.can_name=CAN_GIMBAL,
49.rx_id=0x206,
50.controller=&gimbal_controlelr,
51};
52chassis_motor=dji_motor_register(&chassis_motor_config,chassis_control);
53gimbal_motor=dji_motor_register(&gimbal_motor_config,gimbal_control);
54}

到此就可以方便且靈活的配置和使用電機模塊啦

倉庫地址放這里了 HNU_RM_SHARK_C ,覺得不錯可以點個 Star !

存在問題及優化方向

  1. 目前 rt-thread 下 stm32 can驅動似乎僅支持 FIFO0 ,但 stm32f4 系列 can 具備兩個 FIFO,如能同時使能所有 FIFO,應該能有效提高性能和穩定性。

  2. 電機的離線回調可以增加相應的聲光報警。

  3. 后續考慮能不能也優化為,read,write,control 等形式。

————————————————

版權聲明:本文為RT-Thread論壇用戶「螺絲松掉的人」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:https://club.rt-thread.org/ask/article/0a655bcf83494c87.html

———————End——————

點擊閱讀原文進入官網


原文標題:基于 RT-Thread 的 RoboMaster 電控框架(一)

文章出處:【微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • RT-Thread
    +關注

    關注

    31

    文章

    1294

    瀏覽量

    40231

原文標題:基于 RT-Thread 的 RoboMaster 電控框架(一)

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    RT-Thread上CAN實踐

    開箱測試RT-Thread官方已完成了對英飛凌XMC7200EVK的移植,通過shell可以看到做好了uart3的console。本文將介紹如何進行RT-ThreadCan移植。接下來我們要完成CAN_FD的驅動移植,并正常啟動RT-T
    的頭像 發表于 11-13 01:03 ?1260次閱讀
    <b class='flag-5'>RT-Thread</b>上CAN實踐

    開源共生 商業共贏 | RT-Thread 2024開發者大會報名啟動!

    親愛的RT-Thread開發者我們很高興地宣布,一年一度的RDC(RT-ThreadDeveloperConference,RT-Thread開發者大會)正式啟動報名!2024
    的頭像 發表于 10-29 08:06 ?443次閱讀
    開源共生 商業共贏 | <b class='flag-5'>RT-Thread</b> 2024開發者大會報名啟動!

    2024 RT-Thread全球巡回 線下培訓火熱來襲!

    親愛的RT-Thread社區成員們:我們非常高興地宣布,2024年RT-Thread全球開發者線下培訓即將拉開帷幕!24年全球巡回培訓將覆蓋超10座城市及國家,為開發者提供個深入學習RT-T
    的頭像 發表于 08-07 08:35 ?1323次閱讀
    2024 <b class='flag-5'>RT-Thread</b>全球巡回 線下培訓火熱來襲!

    【好書推薦】RT-Thread設備驅動開發指南

    強烈,他們迫切地希望有本可以指導他們在RT-Thread上開發驅動的指南。為了解決開發者的燃眉之急,《RT-Thread設備驅動開發指南》來了!希望幫助RT-Thre
    的頭像 發表于 08-01 08:35 ?668次閱讀
    【好書推薦】<b class='flag-5'>RT-Thread</b>設備驅動開發指南

    RT-Thread 新里程碑達成——GitHub Star 破萬!

    RT-Thread實時操作系統開源項目在GitHub上的star數量突破一萬!截止發文,RT-Thread作為實時操作系統在業界Star數量排名第!倉庫地址:https://github.com
    的頭像 發表于 07-04 08:35 ?491次閱讀
    <b class='flag-5'>RT-Thread</b> 新里程碑達成——GitHub Star 破萬!

    基于 RT-Thread專業版的EtherCAT主站方案

    )方案介紹本方案基于RT-Thread專業版,在RT-Thread端集成EtherCAT主站協議,通過EtherCAT對伺服電機或遠程IO進行實時控制,具備傳輸速度快,實時性高,擴展設備靈活等
    的頭像 發表于 06-19 08:35 ?982次閱讀
    基于 <b class='flag-5'>RT-Thread</b>專業版的EtherCAT主站方案

    6月6日杭州站RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    6月6日下午我們將在杭州舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發表于 05-28 08:35 ?458次閱讀
    6月6日杭州站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    2024 RT-Thread 全球技術大會演講議程發布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技術大會)致力于圍繞RT-Thread基礎軟件技術發展、實踐創新、開發者能力
    的頭像 發表于 05-16 08:34 ?568次閱讀
    2024 <b class='flag-5'>RT-Thread</b> 全球技術大會演講議程發布!

    5月16日南京站RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    5月16日下午我們將在南京舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發表于 05-01 08:35 ?387次閱讀
    5月16日南京站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    RT-Thread混合部署Workshop北京站來啦!

    4月25日,下午我們將在北京舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發表于 04-19 08:34 ?454次閱讀
    <b class='flag-5'>RT-Thread</b>混合部署Workshop北京站來啦!

    4月25日北京站RT-Thread線下workshop,探索RT-Thread混合部署新模式

    4月25日,下午我們將在北京舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發表于 04-16 08:35 ?435次閱讀
    4月25日北京站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

    4月10日深圳場RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    4月10日我們將在深圳福田舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深嵌入式軟件工程師農曉明老師為您講
    的頭像 發表于 03-27 11:36 ?842次閱讀
    4月10日深圳場<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    4月10日深圳場RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    4月10日我們將在深圳福田舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發表于 03-27 08:34 ?544次閱讀
    4月10日深圳場<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    恩智浦半導體正式加入RT-Thread全球合作伙伴計劃!

    前不久,恩智浦半導體正式加入RT-Thread全球合作伙伴計劃,成為RT-Thread高級會員合作伙伴。同時,RT-Thread現已成為恩智浦注冊合作伙伴(RT-Thread| 簡介合
    的頭像 發表于 03-14 10:40 ?634次閱讀
    恩智浦半導體正式加入<b class='flag-5'>RT-Thread</b>全球合作伙伴計劃!

    RT-Thread設備驅動開發指南》基礎篇--以先楫bsp的hwtimer設備為例

    、概述(RT-Thread設備驅動《RT-Thread設備驅動開發指南》書籍是RT-thread官方出品撰寫,系統講解
    的頭像 發表于 02-24 08:16 ?1714次閱讀
    《<b class='flag-5'>RT-Thread</b>設備驅動開發指南》基礎篇--以先楫bsp的hwtimer設備為例
    主站蜘蛛池模板: 国内极度色诱视频网站| 中国人泡妞xxxxxxxx19| 国产午夜在线观看视频播放| 中文字幕在线观看网址| 四虎国产一区| 欧美v1deossexo高清| 国内精品国内自产视频| 成人网18免费韩国| 2020最新国产自产精品| 亚洲AV中文字幕无码久久 | 皮皮色狼网| 精选国产AV精选一区二区三区| 国产超嫩一线天在线播放 | 国产69精品久久久久妇女| 24小时日本高清免费看| 亚洲视频在线观看视频| 无码人妻少妇色欲AV一区二区 | 精品国产原创在线观看视频| 福利社的阿姨| 超碰视频在线| av在线观看地址| 52色擼99热99| 18禁在线无遮挡羞羞漫画| 亚洲欧洲日本天天堂在线观看| 挺进老师的紧窄小肉六电影完整版 | 亚洲 欧美 国产 视频二区| 日本午夜精品一区二区三区电影 | 脔到她哭H粗话HWWW男男动漫| 好大好爽好深舒服死了| 国产美女一区二区| 国产精品视频一区二区猎奇| 福利一区福利二区| 嘟嘟嘟在线视频免费观看高清中文| 99久久亚洲综合精品| 97成人免费视频| 97视频视频人人碰视频| 最近更新2019中文字幕国语| 中文字幕精品在线观看| 伊人久久大香线蕉观看| 一本道的mv中文字幕| 一区二区三区福利视频|