Skip to content
 
 

Repository files navigation

FOC 无刷电机驱动器 ⚡

基于 STM32G474 + FreeRTOS 的高性能 FOC 伺服驱动器,支持 EtherCAT 总线通信,三环串级 PID 控制,USB/串口双调试通道。

MCU RTOS Bus License


📖 项目简介

基于 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 虚拟串口,参数配置/调试

🎛️ 控制架构

FOC 矢量控制

Clarke 变换 → Park 变换 → PID 电流环 → 反 Park 变换 → SVPWM
                             ↑
                       编码器角度反馈

三环串级 PID

位置环(外环)→ 速度环 → 电流环(内环)→ SVPWM → 电机

控制模式

模式 ID PID 环路 适用场景
力矩模式 1 电流环 力控 / 拖动示教
速度模式 2 速度-电流环 传送带 / 主轴
位置梯形 3 角度-电流环 点到点定位
位置 S 曲线 4 角度-速度-电流环 精密定位 / 平滑轨迹

关键参数

  • PWM 频率:20kHz
  • 电流环带宽:可配置(2~60000 rad/s)
  • 编码器分辨率:14 bit(16384 脉冲/圈)
  • 最大电流:可配置(0~45A)

📡 通信

EtherCAT(主通信)

  • 协议栈:Beckhoff SSC(Slave Stack Code)
  • 拓扑:CoE(CANopen over EtherCAT)
  • 功能:实时位置/速度/力矩控制 + 状态反馈
  • 同步模式:DC(Distributed Clocks)同步

USB CDC(调试/配置)

  • 虚拟串口,即插即用
  • 参数读写(电机参数、PID 增益、保护阈值)
  • 实时数据监控(角度、速度、电流波形)

UART Shell

  • 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 代码编辑

🚀 快速开始

  1. 用 STM32CubeMX 打开 Template.ioc 确认外设配置
  2. 用 Keil MDK-ARM 打开 MDK-ARM/Template.uvprojx
  3. my_foc/inc/usr_config.h 中配置电机参数(极对数、相电阻、相电感、电流限幅等)
  4. 编译下载到 STM32G474 驱动板
  5. 上电后自动校准编码器零位,进入待机状态
  6. 通过 USB CDC 或 UART Shell 发送控制指令
  7. (可选)连接 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

About

FOC无刷电机驱动器 — 基于STM32G474+FreeRTOS,三环串级PID,EtherCAT总线,支持力矩/速度/位置四模式控制

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages