跳转至

STM32-FOC-Ctrl

功能

实现电机的FOC控制,基本按照FOC参考文章开发,旨在实现更好的电机控制效果并便于后续电机、编码器等组件的升级迭代。

系统架构

两个中断:

时钟中断,每2ms触发,读取编码器信息等,进行计算并实现电机控制

i2c通信中断,由树莓派触发,传递速度指令,约13ms(期望能够返回编码器信息)

电机控制架构

BLDCMotor存储电机相关信息,其成员包括 Encoder, Current Sense, PWM Control, FOC Calculator

执行函数包括 对外接口(使能、速度设置等)

Encoder调用SPI获取编码器信息并且承担角度、电角度、速度信息计算与维护

Current Sense调用ADC获取电流信息

FOC Calculator计算SVPWM输出

PWM Control设置输出的PWM

详细信息

C语言中没有类的概念,使用结构体分别实现上述功能

主要的功能结构体都还有与其相关的参数结构体便于参数传递与管理,并且每个结构体均需要使用对应的Init函数,然后使用时调用其相应的功能函数。

函数名与结构体名大多使用大驼峰命名,变量使用蛇形命名法(小写字母+下划线)

举例: FocCalculator结构体,用于进行Foc计算

FocCalculatorParam为FocCalculator对应的参数结构体

FocCalculator_Init为FocCalculator的初始化函数

FocCalc为Foc计算函数

为保证代码可读性,每个类均有相应的参数类便于传递参数

C++开发

C++开发需要128KB FLASH,后续如果有需要可以升级STM32后再使用C++开发

STM32开发注意事项

1.MX_DMA_Init要在MX_ADC1_Init前执行,否则无法使用DMA读取到正确的数值,这里每次cubemx重新生成后都可能需要改一下

2.printf重定向函数不能使用zhihui中的,这个原因是什么还没弄清楚,但有替代方案

3.SysTick_Handler中要有HAL_SYSTICK_IRQHandler才能执行中断回调函数,自动生成时可能没有该函数

4.使用PWM时需要调用HAL_TIM_PWM_Start来激活PWM输出,在Init之后调用一次即可

5.cubemx重新生成后cmake中要添加相应文件夹,按如下方式: file(GLOB_RECURSE SOURCES "startup/." "Drivers/." "Core/." "Utils/." "Ctrl/.")

6.定义指针时确保分配了空间或后续会分配空间