0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

无刷电机小车开发记录01——制作RTT内GD32E503器件的BSP

RTThread物联网操作系统 来源:未知 2023-08-31 13:05 次阅读

前情提要


最近计划开始做一个无刷电机的小车玩玩,不用网上的现有方案,一切从零开始自己做方案。硬件方案打算用GD32E503和EG2134栅极驱动IC等一系列国产器件去做,这样就面临一个问题,不太好用ArduinoSimpleFOC快速出原型。所以软件方案想基于RTT开发,这样只需移植一些硬件驱动和FOC以及卡尔曼滤波等算法,其它的很多功能还是可以用RThread组件实现的,总不能所有轮子都自己造,毕竟玩这个小车的目的也只是想深入玩玩这些控制算法。这个小车的整个开发周期可能会很长,至少是以年为度量单位的,第一是因为工作比较忙,只能用一些零散时间搞,第二是因为计划用到什么学什么,有意思的地方都深入的研究研究,不以速成为目的。整个开发过程也都记录一下,图文形式的记录可能会在RTThread论坛进行记录,视频形式的记录就发布在B站上,希望有兴趣的小伙伴也可以一起玩一玩哈。

前期工作


前段时间,大概花了一周的时间已经把第一版测试用的硬件电路和机械结构设计完毕,如下是硬件电路的3D视图。

wKgaomTwIKyAfCxfAAFHGubt_uc763.jpg

如下是三轮小车形态的车底盘3D渲染图:

wKgaomTwIKyAAQr7AABGuAqIHUQ123.jpg

下图是平衡车形态的车底盘3D渲染图:

wKgaomTwIKyANoVzAABsQh8r7F0279.jpg

下图为二阶平衡车形态的车底盘3D渲染图:

wKgaomTwIKyAHzLvAABGH0Sflxo910.jpg

目前第一版的硬件测试电路已焊接完毕,第一版测试小车也完成了组装,下图是刚组装起来的平衡车形态的无刷电机小车,就计划先拿它开刀了,其它形态后面再慢慢玩。小车还算小巧,等测试通过后计划再做一版集成度更高更小巧的玩玩。

wKgaomTwIK2APNs-AAFHCjPe8UY907.jpg

千里之行始于创建BSP


一切就绪,准备开始撸程序了,那遇到的第一个问题就是目前RTThread的BSP内并没有我想用的这款GD32E503的处理器(用这款处理器是想玩一玩它的三角函数加速器,有硬件计算电路,就不用查询法去计算三角函数了,感觉跑FOC会舒服很多)。所以第一步就是要学习一下添加自己的BSP了。

下载GD32E503固件库和RTT源码包


做BSP的第一步,自然是下载RTThread源码和GD32E503的固件库了。目前RTThread的稳定发行版应该是4.1.0,但我这里只是玩玩,对稳定度要求不高,果断去码云上下载了最新的master版本,目前的版本是5.0.1:

wKgaomTwIK2Ab5WwAACq6_kHrlU554.jpg


		1/*RT-Threadversioninformation*/ 2#defineRT_VERSION_MAJOR5/**< Major version number (X.x.x) */ 3#defineRT_VERSION_MINOR0/**< Minor version number (x.X.x) */ 4#defineRT_VERSION_PATCH1/**< Patch version number (x.x.X) */

GD32E503的固件库包含在开发板Demo资料里,最新版本是V1.2.2:

wKgaomTwIK2AP9jpAAD9v8qn-Bo499.jpg

添加GD32E503器件到MDK


GD32E50x的AddOn资源包,目前最新版本是1.3.3,如果还没有安装MDK需要先安装一下MDK,这里不做过多表述,然后再安装AddOn资源包内的两个”.pack”文件(也可以只安装E50x版本的):

wKgaomTwIK2APIKNAAESzxGcyTQ614.jpg

如下图所示,MDK内的DeviceDatabase内能找到GD32E50x系列的器件列表,证明资源包安装成功。

wKgaomTwIK2AUPCjAABjJq9d2KE394.png

添加libraries


拷贝固件库到BSP的libraries目录内

解压RTT源码包和固件库压缩包,先拷贝固件库的”GD32E50x_Firmware_Library”文件夹到RTT源码包的”bsp/gd32/arm/libraries/“路径下:

wKgaomTwIK2AcCLiAAEPcS4AO0I987.jpg

修改libraries目录内的配置文件

这里可以看到libraries目录下还有两个配置文件“Kconfig”和“.ignore_format.yml”,Kconfig文件后面用menuconfig或RTthreadStudio IDE去配置肯定会用到,另外一个文件暂时不知道什么用途,但不妨一起修改了,Kconfig文件修改如下(文档末尾添加GD32E5的配置信息):


		

1configSOC_FAMILY_GD32 2bool 3configSOC_SERIES_GD32F1 4bool 5selectARCH_ARM_CORTEX_M3 6selectSOC_FAMILY_GD32 7configSOC_SERIES_GD32F2 8bool 9selectARCH_ARM_CORTEX_M3 10selectSOC_FAMILY_GD32 11configSOC_SERIES_GD32F3 12bool 13selectARCH_ARM_CORTEX_M4 14selectSOC_FAMILY_GD32 15configSOC_SERIES_GD32F4 16bool 17selectARCH_ARM_CORTEX_M4 18selectSOC_FAMILY_GD32 19configSOC_SERIES_GD32E5#addbycjl 20bool 21selectARCH_ARM_CORTEX_M33 22selectSOC_FAMILY_GD32

“.yml”文件把GD32E50x的固件库路径名添加到数组末尾:


		

1dir_path: 2-GD32F10x_Firmware_Library 3-GD32F20x_Firmware_Library 4-GD32F30x_Firmware_Library 5-GD32F4xx_Firmware_Library 6-GD32E50x_Firmware_Library

给固件库添加SConscript构建配置文件

从其它固件库文件内(我用的F4xx)拷贝一份”SConscript”文件到新加入的固件库路径内:

wKgaomTwIK6AUpADAAA40YDyVo4124.png


		

1importrtconfig 2frombuildingimport* 3#getcurrentdirectory 4cwd=GetCurrentDir() 5#ThesetofsourcefilesassociatedwiththisSConscriptfile. 6src=Split(''' 7CMSIS/GD/GD32E50x/Source/system_gd32e50x.c 8GD32E50x_standard_peripheral/Source/gd32e50x_gpio.c 9GD32E50x_standard_peripheral/Source/gd32e50x_rcu.c 10GD32E50x_standard_peripheral/Source/gd32e50x_exti.c 11GD32E50x_standard_peripheral/Source/gd32e50x_misc.c 12''') 13#remove:GD32E50x_standard_peripheral/Source/gd32e50x_syscfg.c 14ifGetDepend(['RT_USING_SERIAL']): 15src+=['GD32E50x_standard_peripheral/Source/gd32e50x_usart.c'] 16ifGetDepend(['RT_USING_I2C']): 17src+=['GD32E50x_standard_peripheral/Source/gd32e50x_i2c.c'] 18ifGetDepend(['RT_USING_SPI']): 19src+=['GD32E50x_standard_peripheral/Source/gd32e50x_spi.c'] 20ifGetDepend(['RT_USING_CAN']): 21src+=['GD32E50x_standard_peripheral/Source/gd32e50x_can.c'] 22ifGetDepend(['BSP_USING_ETH']): 23src+=['GD32E50x_standard_peripheral/Source/gd32e50x_enet.c'] 24ifGetDepend(['RT_USING_ADC']): 25src+=['GD32E50x_standard_peripheral/Source/gd32e50x_adc.c'] 26ifGetDepend(['RT_USING_DAC']): 27src+=['GD32E50x_standard_peripheral/Source/gd32e50x_dac.c'] 28ifGetDepend(['RT_USING_RTC']): 29src+=['GD32E50x_standard_peripheral/Source/gd32e50x_rtc.c'] 30src+=['GD32E50x_standard_peripheral/Source/gd32e50x_pmu.c'] 31ifGetDepend(['RT_USING_WDT']): 32src+=['GD32E50x_standard_peripheral/Source/gd32e50x_wwdgt.c'] 33src+=['GD32E50x_standard_peripheral/Source/gd32e50x_fwdgt.c'] 34ifGetDepend(['RT_USING_SDIO']): 35src+=['GD32E50x_standard_peripheral/Source/gd32e50x_sdio.c'] 36src+=['GD32E50x_standard_peripheral/Source/gd32e50x_dma.c'] 37path=[ 38cwd+'/CMSIS/GD/GD32E50x/Include', 39cwd+'/CMSIS', 40cwd+'/GD32E50x_standard_peripheral/Include',] 41CPPDEFINES=['USE_STDPERIPH_DRIVER'] 42group=DefineGroup('Libraries',src,depend=[''],CPPPATH=path,CPPDEFINES=CPPDEFINES) 43Return('group')

创建BSP


拷贝BSP模板

任意拷贝一份BSP文件夹(我同样也是用的407)重命名为E503:

wKgaomTwIK6AUW_0AAEH11BbmTY785.jpg

修改board.h头文件

其中主要需要修改的内容都在board路径下。先看board.h文件,我这里没有做外部SDRAM,所以注释掉相关定义,我板子实际焊的是GD32E503RCT6,所以SRAM大小改为96KB,再把相关头文件名修改一下:


		

1#ifndef__BOARD_H__ 2#define__BOARD_H__ 3#include"gd32e50x.h" 4#include"drv_usart.h" 5#include"drv_gpio.h" 6#include"gd32e50x_exti.h" 7//#defineEXT_SDRAM_BEGIN(0xC0000000U)/*thebeginingaddressofexternalSDRAM*/ 8//#defineEXT_SDRAM_END(EXT_SDRAM_BEGIN+(32U*1024*1024))/*theendaddressofexternalSDRAM*/ 9//InternalSRAMmemorysize[Kbytes]<8-64> 10//Default:64 11#ifdef__ICCARM__ 12//Use*.icframsymbal,toavoidhardcode. 13externchar__ICFEDIT_region_RAM_end__; 14#defineGD32_SRAM_END&__ICFEDIT_region_RAM_end__ 15#else 16#defineGD32_SRAM_SIZE96//96forGD32E503xC128forGD32E503xE... 17#defineGD32_SRAM_END(0x20000000+GD32_SRAM_SIZE*1024) 18#endif 19#ifdef__ARMCC_VERSION 20externintImage$$RW_IRAM1$$ZI$$Limit; 21#defineHEAP_BEGIN(&Image$$RW_IRAM1$$ZI$$Limit) 22#elif__ICCARM__ 23#pragmasection="HEAP" 24#defineHEAP_BEGIN(__segment_end("HEAP")) 25#else 26externint__bss_end; 27#defineHEAP_BEGIN(&__bss_end) 28#endif 29#defineHEAP_ENDGD32_SRAM_END 30#endif

添加gd32e50x_libopt.h

在固件库内的随便一个例程路径内拷贝一份”gd32e50x_libopt.h”到当前bsp的board路径内,替换掉原有的“gd32f4xx_libopt.h”

wKgaomTwIK6ANqY9AACmplBaY7k771.png

修改board目录下的Kconfig和SConscript配置文件

而对于board目录下的“Kconfig”和“SConscript”配置文件也要稍作修改,基本都是把F4xx的字符串改成E50x的。稍需注意的是“SConscript”文件内对于启动文件相关的配置,E50x有高密度(hd)和互联(cl)两个版本。我这里用的E503RC或者是RE都是高密度版本,所以选择hd的汇编启动文件。而且还需要说明的是,虽然我这里没有注释掉gcc编译器下的启动文件,但其实E503的固件库内并没有提供gcc版本的启动文件,也就是说后面不能用RTT的IDE去开发了。等什么时候有了再加进来吧。或者后面看需要,不行就自己改一版gcc编译器的启动文件。目前这两个文件就暂且修改这么多,后面再看情况,如有问题再进行修改。

“SConscript”文件修改如下:


		

1importos 2importrtconfig 3frombuildingimport* 4Import('SDK_LIB') 5cwd=GetCurrentDir() 6#addgeneraldrivers 7src=Split(''' 8board.c 9''') 10path=[cwd] 11startup_path_prefix=SDK_LIB 12ifrtconfig.PLATFORMin['gcc']: 13src+=[startup_path_prefix+'/GD32E50x_Firmware_Library/CMSIS/GD/GD32E50x/Source/GCC/startup_gd32e50x_hd.s'] 14elifrtconfig.PLATFORMin['armcc','armclang']: 15src+=[startup_path_prefix+'/GD32E50x_Firmware_Library/CMSIS/GD/GD32E50x/Source/ARM/startup_gd32e50x_hd.s'] 16elifrtconfig.PLATFORMin['iccarm']: 17src+=[startup_path_prefix+'/GD32E50x_Firmware_Library/CMSIS/GD/GD32E50x/Source/IAR/startup_gd32e50x_hd.s'] 18CPPDEFINES=['GD32E50X','GD32E50X_HD'] 19group=DefineGroup('Drivers',src,depend=[''],CPPPATH=path,CPPDEFINES=CPPDEFINES) 20Return('group')

修改三种编译器用的链接脚本

修改”board/linker_scripts”目录下的连接文件,如无特殊要求可不对连接脚本做太多修改,只需要修改RAM和ROM地址和大小即可,以“link.sct”为例:


		

1LR_IROM10x080000000x00040000{;loadregionsize_region256KB 2ER_IROM10x080000000x00040000{;loadaddress=executionaddress 3*.o(RESET,+First) 4*(InRoot$$Sections) 5.ANY(+RO) 6} 7RW_IRAM10x200000000x00018000{;RWdata96KB 8.ANY(+RW+ZI) 9} 10}

修改BSP顶层SConstruct和rtconfig.py文件

修改新建bsp目录下的SConstruct文件和rtconfig.py文件:

wKgaomTwIK6AYNZLAAAxBvhKST4830.png

SConstruct文件只需要修改“gd32_library”的值:


		

1gd32_library='GD32E50x_Firmware_Library'

wKgaomTwIK6AdAGiAACD1LInp1k542.png

修改工程模板

接下来修改工程模板文件,我这边只修改MDK5版本的工程模板:

wKgaomTwIK6AMyA3AABSXqwBh4I583.png

修改Device为实际使用的GD32E503RC:

wKgaomTwIK-ABqPqAACtfcDdxCA575.png

调试工具改成DAP:

wKgaomTwIK-AeK8OAABtU9EJxYc709.png

利用env工具配置RTthread并生成MDK工程

在新键的bsp目录下运行env工具(env工具的安装与使用请参考RTT官方文档),对RTT做初步配置:

wKgaomTwIK-ARhzGAABtngr3seI198.png

最后根据提示,输入命令生成mdk5的工程,(如果想要提交自己制作的BSP,请参照官方BSP制作规范):

wKgaomTwIK-AYgJmAAAoGuQrzUI408.png

下载验证


最后打开工程,稍微修改一下main.c内的内容,加一条调试语句,修改对应的LED引脚。编译一下,如果能编译通过说明上面修改的内容没问题,如果有错误请仔细检查上面格配置文件修改的内容是否正确或者自行根据错误提示进行修改。烧录程序就可以看到运行效果了。


		

1#include 2#include 3#include 4#include 5/*definedtheLED2pin:PC6*/ 6#defineLED_PINGET_PIN(B,11) 7#defineBUZZER_PINGET_PIN(B,12) 8intmain(void) 9{ 10intcount=1; 11/*setLED2pinmodetooutput*/ 12rt_pin_mode(LED_PIN,PIN_MODE_OUTPUT); 13rt_pin_write(BUZZER_PIN,PIN_LOW); 14rt_pin_mode(BUZZER_PIN,PIN_MODE_OUTPUT); 15rt_kprintf("无刷电机小车测试程序! "); 16while(count++) 17{ 18rt_pin_write(LED_PIN,PIN_HIGH); 19rt_thread_mdelay(500); 20rt_pin_write(LED_PIN,PIN_LOW); 21rt_thread_mdelay(500); 22} 23returnRT_EOK; 24}

wKgaomTwIK-AQSVuAADwKUgIUAc456.jpg

今天就先玩到这里,后面再使用一段时间这个BSP,需要优化的地方优化一下,然后再往码云上提交一份。

其它链接


视频方面目前只有一个前期的开题视频,简单讲了一下想做一些什么,过了一遍硬件电路的设计方案,想了解详情的可以观看下面的视频哦!更多的阶段性功能展示以及调试视频后续再慢慢更新。

【无刷电机小车——搞起来!-哔哩哔哩】 https://b23.tv/ZmvhBS7

无刷电机小车开发记录02——BSP导入RTThreadStudio:https://club.rt-thread.org/ask/article/4c90d45831ce0722.html

无刷电机小车开发记录03——PWM信号输入捕获驱动:https://club.rt-thread.org/ask/article/dc39eb608f1eba75.html

无刷电机小车开发记录04——互补PWM驱动移植:https://club.rt-thread.org/ask/article/004229252f06d18d.html

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


点击阅读原文进入官网


原文标题:无刷电机小车开发记录01——制作RTT内GD32E503器件的BSP

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RT-Thread
    +关注

    关注

    31

    文章

    1148

    浏览量

    38875

原文标题:无刷电机小车开发记录01——制作RTT内GD32E503器件的BSP

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    无刷电机是什么意思 无刷电机是交流还是直流

    无刷电机(Brushless Motor)是一种将电能转换为机械能的驱动装置,也被称为无刷直流电机(BLDC Motor)。与传统的有刷电机相比,无刷电机的构造更加简单、耐用,效率更高
    的头像 发表于 02-01 13:57 2852次阅读

    无刷电机和有刷电机的优缺点 无刷电机工作原理

    无刷电机和有刷电机是目前最常见的两种电动机类型,它们在不同的应用场景中有着各自的优点和局限性。下面将详细介绍无刷电机和有刷电机的优缺点以及无刷电机
    的头像 发表于 01-31 11:05 1017次阅读

    GD32A503系列器件的限制及解决方案介绍

    电子发烧友网站提供《GD32A503系列器件的限制及解决方案介绍.pdf》资料免费下载
    发表于 01-26 10:21 0次下载
    <b class='flag-5'>GD32A503</b>系列<b class='flag-5'>器件</b>的限制及解决方案介绍

    无刷电机谐波怎么调 无刷电机为什么要电调

    无刷电机谐波怎么调 无刷电机为什么要电调  无刷电机谐波调节原理详解 无刷电机是一种通过电子调速器来控制电机转速的
    的头像 发表于 12-20 16:00 1197次阅读

    无刷电机应用

    无刷电机在某些领域也称直流变频电机(BLDC),它采用电子换向(霍尔传感器),线圈不动磁极动,此时永磁铁可以在线圈外部也可以在线圈内部,于是有了外转子无刷电机和内转子无刷电机之分。
    的头像 发表于 12-05 14:52 339次阅读
    <b class='flag-5'>无刷电机</b>应用

    基于GD32A503的UWB汽车数字钥匙解决方案

    基于GD32A503的UWB汽车数字钥匙解决方案
    的头像 发表于 11-06 16:45 560次阅读
    基于<b class='flag-5'>GD32A503</b>的UWB汽车数字钥匙解决方案

    基于GD32E503的直流数控电源

    基于GD32E503的直流数控电源
    的头像 发表于 10-30 17:35 550次阅读
    基于<b class='flag-5'>GD32E503</b>的直流数控电源

    无刷电机小车开发记录04——互补PWM驱动移植

    前言   上篇文章记录了为GD32的BSP添加了PWM信号输入捕获的驱动,并实现了对SC60228DC磁编码器数据的读取(PWM接口),最后还做了一点简单的测试。今天过来继续修轮子,适配一下PWM
    的头像 发表于 09-19 11:20 1360次阅读
    <b class='flag-5'>无刷电机</b><b class='flag-5'>小车</b><b class='flag-5'>开发</b><b class='flag-5'>记录</b>04——互补PWM驱动移植

    无刷电机小车开发记录—移植SimpleFOC流程

    今天过来继续撸我的无刷电机小车。驱动无刷电机底层需要实现三大部分:功率驱动,位置反馈以及电流反馈。前面我已经适配了功率驱动(6线互补PWM),和位置反馈(PWM接口)的底层驱动代码。
    发表于 09-18 14:52 517次阅读
    <b class='flag-5'>无刷电机</b><b class='flag-5'>小车</b><b class='flag-5'>开发</b><b class='flag-5'>记录</b>—移植SimpleFOC流程

    无刷电机小车开发记录—PWM信号输入捕获驱动

    之前是完成了BSP的移植和导入,接下来就要尝试移植FOC算法了,开源的FOC算法也比较多,我这里打算利用SimpleFOC进行移植。
    发表于 09-13 16:23 610次阅读
    <b class='flag-5'>无刷电机</b><b class='flag-5'>小车</b><b class='flag-5'>开发</b><b class='flag-5'>记录</b>—PWM信号输入捕获驱动

    无刷电机小车开发记录02——BSP导入RT-Thread Studio

    前情提要 上一篇文章记录了一下如何创建GD32E503BSP。但由于时间关系只实现了MDK版本的工程模板,后面如果需要提交BSP时再去补全IAR版本的。但对于我个人而言,IAR只在读
    的头像 发表于 09-05 19:40 595次阅读
    <b class='flag-5'>无刷电机</b><b class='flag-5'>小车</b><b class='flag-5'>开发</b><b class='flag-5'>记录</b>02——<b class='flag-5'>BSP</b>导入RT-Thread Studio

    基于RT-Thread+RA6M4的无刷电机伺服控制器设计

    本项目制作了一个基于RT-Thread+RA6M4的无刷电机控制器,可以实现是无刷电机的伺服控制。可以应用在小型CNC、人机交互等场景。
    发表于 08-02 17:51 473次阅读
    基于RT-Thread+RA6M4的<b class='flag-5'>无刷电机</b>伺服控制器设计

    梁山派开发板-21年电赛F题-送药小车-赛题分析

    全国产开源开发板,基于GD32F4系列,21电赛F题-送药小车赛题分析
    的头像 发表于 07-31 10:13 590次阅读
    梁山派<b class='flag-5'>开发</b>板-21年电赛F题-送药<b class='flag-5'>小车</b>-赛题分析

    有刷电机无刷电机的区别

    直流电机分为有刷电机无刷电机,这里所说的“刷”是指碳刷。那碳刷长什么样呢?
    发表于 06-26 17:10 966次阅读
    有刷<b class='flag-5'>电机</b>与<b class='flag-5'>无刷电机</b>的区别

    RTT黑科技: 添加手动打包和编译特定bsp功能

    如何手动打包RTT 上的bsp PART  0 1 简介 有很多小伙伴喜欢用  scons --dist  功能下载包,但是又有时候不想下载RT-THREAD的所有的包,这个时候,可以考虑看下
    的头像 发表于 06-12 19:40 542次阅读
    <b class='flag-5'>RTT</b>黑科技: 添加手动打包和编译特定<b class='flag-5'>bsp</b>功能