SimpleFOC01|基于STM32F103+CubeMX,移植核心的common代码
导言
如上图所示,进入SimpleFOC官网,点击Github下载源代码。
如上图所示,找到仓库。
comom代码的移植后,simpleFOC的移植算是完成一大半。simpleFOC源码分为如下5个部分,其中communication是跟simpleFOC上位机通讯,暂时不打算使用,忽略它:
- common(数学工具、关键类)
- communication(simpleFOC上位机):simpleFOC上位机通讯,暂时不打算使用,没必要移植。
- current_sensor(电流传感器)simpleFOC官方使用过的开发板,一般我们都要根据自己的开发板重新写,重新调。
- drivers(驱动器,三相逆变电路):simpleFOC官方使用过的开发板,一般我们都要根据自己的开发板重新写,重新调。
- sensors(位置编码器):simpleFOC官方使用过的编码器驱动程序,一般我们都要根据自己的项目重新写,重新调。
- BLDCMotor.cpp与BLDCMotor.h:核心的FOC算法(如帕克变换、SVPWM算法等)
项目源码:https://github.com/q164129345/MCU_Develop/tree/main/simplefoc01_stm32f103
一、移植
1.1、Arduino-FOC/src/common
如上所示,simpleFOC源码一共包含上述这些模块。
如上所示,将simplefoc源码的src/common的代码移植到stm32f103项目上。
1.2、SEGGER_RTT
参考博文:SEGGER | 基于STM32F405 + Keil - RTT组件01 - 移植SEGGER RTT
用于调试log打印,也可以用于替代Arduino库的print()。
1.3、DWT计时器
如上图所示,dwt_timer.c是我自己编写的DWT定时器驱动代码,目的:
- 提供us级的延时(替代Arduino提供的delayMicroseconds())
- 提供us级的时间戳(完成time_utils.cpp里的_micro())
1.4、C++环境
simpleFOC使用C++语言编写,然后,.c代码不能调用.cpp代码里的函数。创建user_main.cpp与user_main.h的目的是实现C++环境的跳转。
有空的小伙伴可以试试,在main.c里调用time_tuils.cpp的_micros()函数试试,会出现编译错误。其原因就是.c代码不能调用.cpp的代码。
二、Keil
三、代码
3.1、main.h
3.2、main.c
3.3、user_main.cpp
代替main.c的while(1)死循环。
3.4、user_main.h
3.5、foc_utils.h
3.6、foc_utils.cpp
3.7、FOCMotor.h
3.8、FOCMotor.cpp
3.9、BLDCDriver.h
3.10、Sensor.h
3.11、time_utils.cpp
四、调试代码
到目前为止,暂时只能调试time_utils.cpp的功能,time_utils.cpp为simpleFOC提供精确的时间戳与时间延时,非常重要。
4.1、编译
通过第三章节的处理,解决所有代码的报错,最终编译成功。
4.2、使用RTT Viwer调试