基于 STM32G474 + FreeRTOS 的高性能 FOC 伺服驱动器,支持 EtherCAT 总线通信,三环串级 PID 控制,USB/串口双调试通道。
基于 SimpleFOC 架构的永磁同步电机(PMSM)FOC 驱动器,运行于 STM32G474(Cortex-M4F + FPU + DSP),支持:
- 四模式控制:力矩 / 速度 / 位置梯形 / 位置 S 曲线
- 三环串级 PID(电流环 → 速度环 → 位置环)
- EtherCAT 工业以太网(Beckhoff SSC 协议栈)
- USB CDC 虚拟串口 + UART Shell 双调试通道
- 在线参数配置(电机参数、PID、保护阈值)
| 模块 | 型号 | 说明 |
|---|---|---|
| 主控 | STM32G474RETx | Cortex-M4F,170MHz,FPU + DSP 指令集 |
| 栅极驱动 | DRV8313 | 三相半桥驱动 |
| 编码器 | MT6816 | 14 位磁编码器,SPI 接口 |
| 电流采样 | ADC1 + ADC2 | 双电阻采样,注入组同步触发 |
| 显示 | ST7789 | 240×240 SPI LCD |
| 通信 | LAN9252 | EtherCAT 从站控制器(ESC) |
| USB | USB-CDC | 虚拟串口,参数配置/调试 |
Clarke 变换 → Park 变换 → PID 电流环 → 反 Park 变换 → SVPWM
↑
编码器角度反馈
位置环(外环)→ 速度环 → 电流环(内环)→ SVPWM → 电机
| 模式 | ID | PID 环路 | 适用场景 |
|---|---|---|---|
| 力矩模式 | 1 | 电流环 | 力控 / 拖动示教 |
| 速度模式 | 2 | 速度-电流环 | 传送带 / 主轴 |
| 位置梯形 | 3 | 角度-电流环 | 点到点定位 |
| 位置 S 曲线 | 4 | 角度-速度-电流环 | 精密定位 / 平滑轨迹 |
- PWM 频率:20kHz
- 电流环带宽:可配置(2~60000 rad/s)
- 编码器分辨率:14 bit(16384 脉冲/圈)
- 最大电流:可配置(0~45A)
- 协议栈:Beckhoff SSC(Slave Stack Code)
- 拓扑:CoE(CANopen over EtherCAT)
- 功能:实时位置/速度/力矩控制 + 状态反馈
- 同步模式:DC(Distributed Clocks)同步
- 虚拟串口,即插即用
- 参数读写(电机参数、PID 增益、保护阈值)
- 实时数据监控(角度、速度、电流波形)
- letter-shell 命令行交互
- 在线调试指令(启停、参数修改、状态查询)
- 支持自定义命令扩展
FOC无刷电机驱动器/
├── README.md
├── .gitignore
├── Template.ioc # STM32CubeMX 工程配置
│
├── Core/ # CubeMX 生成的应用层
│ ├── Inc/ # 头文件(adc/dma/spi/tim/usart/FreeRTOSConfig)
│ └── Src/ # 源文件(main.c + HAL MSP + 中断 + FreeRTOS 入口)
│
├── my_foc/ # ⭐ FOC 核心算法
│ ├── my_foc.c/h # FOC 顶层接口
│ ├── inc/
│ │ ├── foc.h # Clark/Park/SVPWM 算法
│ │ ├── pid.h # 串级 PID 控制器
│ │ ├── encoder.h # MT6816 编码器驱动
│ │ ├── calibration.h # 电机参数自动辨识
│ │ ├── mc_fsm.h # 有限状态机(FSM)
│ │ ├── pwm_curr.h # PWM + 电流采样
│ │ ├── usr_config.h # 用户参数配置(电机/控制/保护)
│ │ └── utils.h # 工具函数(滤波/数学)
│ └── src/ # 各模块实现
│
├── bsp/ # 板级支持包
│ ├── bsp.c/h # BSP 初始化
│ ├── inc/ # 头文件
│ │ ├── bsp_dwt.h # DWT 延时
│ │ ├── bsp_key.h # 按键驱动
│ │ ├── bsp_led.h # LED 驱动
│ │ ├── bsp_spi3_manager.h # SPI3 多设备管理
│ │ ├── bsp_spi_mt6816.h # MT6816 编码器 SPI
│ │ ├── bsp_spi_st7789.h # ST7789 LCD SPI
│ │ └── bsp_usart.h # 串口驱动
│ └── src/ # 各模块实现
│
├── EcatPort/ # EtherCAT 硬件适配层
│ ├── aw_ecat_ssc.c/h # SSC 协议栈封装
│ ├── beckhoff_drv.c/h # Beckhoff LAN9252 驱动
│ ├── esc_port.c/h # ESC 端口操作
│ └── timer_port.c/h # DC 同步定时器
│
├── SSC/ # EtherCAT SSC 源码
│ ├── Src/ # coeappl/ecatappl/ecatcoe/ecatslv/sdoserv/objdef/mailbox
│ └── DPort-ECT.xml # ESI 设备描述文件
│
├── LCD/ # ST7789 显示屏驱动
│ └── lcd.c/h + lcdfont.h # 字符/图形显示
│
├── USB_Device/ # USB CDC 虚拟串口
│ ├── App/ # usb_device / usbd_cdc_if / usbd_desc
│ └── Target/ # usbd_conf 配置
│
├── Comm/ # 串口 Shell
│ └── uartShell.c/h # Shell 接口封装
│
├── CherryRB-1.0.0/ # 环形缓冲区库(kfifo 原理)
├── letter-shell-3.1.2/ # 命令行 Shell 框架
│
├── Drivers/ # STM32G4xx HAL + CMSIS
├── Middlewares/ # FreeRTOS / USB Device / ARM DSP
│
├── MDK-ARM/ # Keil 工程
│ ├── Template.uvprojx # Keil MDK 工程文件
│ ├── startup_stm32g474xx.s # 启动文件
│ └── RTE/ + .vscode/ # 运行环境 + VSCode 配置
│
└── TwinCAT Project1/ # Beckhoff TwinCAT 测试工程
└── TwinCAT Project1/
└── PLC_Template/ # PLC 程序(EtherCAT 主站测试)
| 工具 | 用途 |
|---|---|
| Keil MDK-ARM | 编译 / 下载 / 调试 |
| STM32CubeMX | 外设初始化代码生成 |
| STM32G4xx HAL | 底层驱动库 |
| ARM DSP Library | 数学加速(三角函数、SVPWM) |
| TwinCAT 3 | EtherCAT 主站测试 |
| VSCode | 代码编辑 |
- 用 STM32CubeMX 打开
Template.ioc确认外设配置 - 用 Keil MDK-ARM 打开
MDK-ARM/Template.uvprojx - 在
my_foc/inc/usr_config.h中配置电机参数(极对数、相电阻、相电感、电流限幅等) - 编译下载到 STM32G474 驱动板
- 上电后自动校准编码器零位,进入待机状态
- 通过 USB CDC 或 UART Shell 发送控制指令
- (可选)连接 TwinCAT 通过 EtherCAT 总线控制
- FOC 矢量控制(Clarke / Park / SVPWM)
- 四模式:力矩 / 速度 / 位置梯形 / 位置 S 曲线
- 三环串级 PID(电流环 → 速度环 → 位置环)
- MT6816 磁编码器(14 bit,SPI)
- 双电阻电流采样(ADC 注入组同步触发)
- EtherCAT CoE 工业以太网(Beckhoff SSC)
- 电机参数自动辨识(相电阻 / 相电感 / 零电角)
- USB CDC 虚拟串口在线调参
- UART letter-shell 命令行交互
- ST7789 SPI LCD 实时状态显示
- 欠压 / 过压 / 过流 / 堵转多重保护
- TwinCAT 主站测试工程
本项目基于 PocketServo 开源方案,FOC 算法参考 SimpleFOC 架构。 作者:astronG | 2025