arpan130781/grblHAL_CAN_Motor_Control

GitHub: arpan130781/grblHAL_CAN_Motor_Control

基于 grblHAL 扩展的 CAN 总线电机控制框架,通过自定义 M155 G-code 实现主从架构下的多电机实时管理。

Stars: 1 | Forks: 0

# grblHAL CAN 电机控制框架 本项目将运行 grblHAL 的 **Teensy 4.1** 主机与 **STM32F103 Blue Pill** 从机通过 **500 kbps** 的 CAN 总线集成在一起,通过结构化的自定义协议实现可靠的实时电机控制。 ## 目录 - [功能](#features) - [系统架构](#system-architecture) - [硬件设置](#hardware-setup) - [硬件](#hardware) - [软件栈](#software-stack) - [M155 G-code 参考](#m155-g-code-reference) - [CAN 协议](#can-protocol) - [仓库结构](#repository-structure) - [快速开始](#getting-started) - [安装说明](#installation) - [CAN 总线接线](#can-bus-wiring) - [测试与验证](#testing--validation) - [故障排除](#troubleshooting) - [通信流程](#communication-flow) - [相关资源](#resources) - [未来改进](#future-improvements) - [作者](#author) ## 功能 - 通过 grblHAL 插件架构实现用于电机控制的自定义 **M155** G-code - Teensy 4.1 (主机) 与 STM32F103 (从机) 之间 **500 kbps** 的 CAN 通信 - 实时电机**启动**、**停止**和**紧急停止**控制 - 基于 **RPM** 的速度控制和**方向**控制 - 支持从机的 **ping 和确认**,用于节点健康监测 - 模块化的 CAN 协议设计,易于扩展至多个从机节点 - 低于 10ms 的命令响应时间 - 支持最多 256 个电机节点(通过扩展寻址) ## 系统架构 ``` CNCjs / G-code Sender │ ▼ grblHAL (Teensy 4.1) │ M155 G-code Plugin │ CAN Packet Builder │ FlexCAN_T4 (500 kbps) │ CAN Bus │ STM32F103 Blue Pill │ Motor Control Application │ Motor Driver ``` ## 硬件设置 | 系统运行状态 | |:---:| | ![系统运行中](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/e0f16cbe1e221426.jpg) | ## 硬件 | 角色 | MCU | CAN 收发器 | |--------|----------------------|-----------------| | 主机 | Teensy 4.1 | MCP2551 | | 从机 | STM32F103 Blue Pill | MCP2551 | **CAN 总线速度:** 500 kbps ## 软件栈 | 层级 | 组件 | 详情 | |---------|-------------------|--------------------------------------| | 主机 | grblHAL | 支持插件的 CNC 固件 | | 主机 | PlatformIO | 构建和烧录工具链 | | 主机 | FlexCAN_T4 | iMXRT1062 的 CAN 外设驱动程序 | | 从机 | Arduino Framework | 通过 PlatformIO 支持 STM32 目标 | | 从机 | eXoCAN | STM32F103 的 CAN 库 | ## M155 G-code 参考 所有电机命令均使用自定义的 `M155` G-code 字发出。 | M155 命令 | C 代码 | 描述 | |----------------------|--------|--------------------------------| | 启动电机 | 10 | `M155 C10 M0 V300` — 以 300 RPM 启动电机 0 | | 停止电机 | 11 | `M155 C11 M0` — 停止电机 0 | | 设置速度 | 12 | `M155 C12 M0 V600` — 将电机 0 的速度设置为 600 RPM | | 设置方向 | 13 | `M155 C13 M0 V1` — 设置电机 0 正转 (V0 = 反转) | | 紧急停止 | 14 | `M155 C14` — 紧急停止所有电机 | | Ping 节点 | 15 | `M155 C15` — Ping 从机节点进行健康检查 | **参数说明:** - `C` — 命令代码 (10–15) - `M` — 电机索引 (从 0 开始, 0–255) - `V` — 数值 (RPM: 0–65535, 方向: 0=反转, 1=正转) ## CAN 协议 ### CAN ID | 方向 | CAN ID | 描述 | |--------------------|---------|-------------| | 主机 → 从机 | `0x100` | 来自主机的命令帧 | | 从机 → 主机 ACK | `0x200` | 来自从机的确认帧 | ### 命令集 | 命令 | 十六进制代码 | |-----------------|:--------:| | 启动电机 (START MOTOR) | `0x10` | | 停止电机 (STOP MOTOR) | `0x11` | | 设置速度 (SET SPEED) | `0x12` | | 设置方向 (SET DIRECTION) | `0x13` | | 紧急停止 (EMERGENCY STOP) | `0x14` | | PING | `0x15` | | ACK | `0x16` | ### 帧格式 ``` Byte 0: Command code (e.g., 0x10 = START MOTOR) Byte 1: Motor index Byte 2-3: Value (RPM / direction), little-endian Bytes 4-7: Reserved ``` ### CAN 帧示例 **以 300 RPM 启动电机 0:** ``` CAN ID: 0x100 Byte 0: 0x10 (START MOTOR) Byte 1: 0x00 (Motor 0) Byte 2-3: 0x2C 0x01 (300 in little-endian = 0x012C) Byte 4-7: 0x00 0x00 0x00 0x00 (Reserved) ``` ## 仓库结构 ``` . ├── grblHAL_Teensy4/ │ ├── src/ │ │ ├── my_plugin.cpp # M155 G-code handler │ │ ├── canbus.c # FlexCAN_T4 driver │ │ └── can_protocol.h # Shared command definitions │ └── platformio.ini │ ├── STM32F103_Slave/ │ ├── src/ │ │ ├── main.cpp # Motor control application │ │ └── can_protocol.h # Mirrored command definitions │ └── platformio.ini │ └── README.md ``` ## 快速开始 ### 前置条件 - [PlatformIO](https://platformio.org/) (推荐使用 VS Code 扩展) - Teensy 4.1 开发板 + MCP2551 CAN 收发器 - STM32F103 Blue Pill + MCP2551 CAN 收发器 - CAN 总线连接线 + 两端各一个 120 Ω 终端电阻 - 用于串口监控的 USB 数据线 - 支持 `--recurse-submodules` 的 Git ### 安装说明 #### 安装 PlatformIO CLI(可选) ``` pip install platformio ``` #### 使用子模块克隆仓库 ``` git clone --recurse-submodules https://github.com/arpan130781/grblHAL_CAN_Motor_Control.git cd grblHAL_CAN_Motor_Control ``` ### 构建与烧录 — Teensy 4.1 (主机) ``` cd grblHAL_Teensy4 # 构建并烧录 pio run --target upload # 监控串口输出 pio device monitor -e teensy41 ``` ### 构建与烧录 — STM32F103 (从机) ``` cd ../STM32F103_Slave # 构建并烧录 pio run --target upload # 监控串口输出 pio device monitor -e stm32slave ``` ### 同时监控两个设备 同时打开两个终端窗口: ``` # 终端 1 — Teensy 串口监控器 cd grblHAL_Teensy4 pio device monitor -e teensy41 # 终端 2 — STM32 串口监控器(在另一个终端中) cd STM32F103_Slave pio device monitor -e stm32slave ``` ## CAN 总线接线 ### 引脚参考 | 信号 | Teensy 4.1 引脚 | STM32F103 引脚 | MCP2551 引脚 | |--------|---|---|---| | CAN RX | 22 | PA11 | 4 (RXD) | | CAN TX | 23 | PA12 | 2 (TXD) | | GND | GND | GND | 5 (VSS) | | VCC | 5V | 3.3V | 8 (VCC) | ### 总线终端 - 在总线的**两端**的 CAN_H 和 CAN_L 之间各放置一个 **120 Ω 电阻** - 确保所有 GND 连接正确实现星型单点接地 - 对 CAN_H 和 CAN_L 信号使用双绞线以最大程度减少噪声 ## 测试与验证 ### 验证 CAN 通信 1. **给两个开发板上电**并打开串口监视器 2. 从主机**发送 ping 命令**: M155 C15 # Ping slave node 3. **预期输出:** [Master] Ping sent to slave [Slave] Ping received, sending ACK [Master] ACK received (response time: 4ms) ### 电机启动测试 ``` M155 C10 M0 V500 # Start Motor 0 at 500 RPM ``` 预期行为: - 电机开始旋转 - 从机回复 ACK - 串口监视器显示确认信息 ### 紧急停止测试 ``` M155 C14 # Emergency stop all motors ``` 预期行为: - 所有电机立即停止 - 从机板上的 LED 变为红色/警告状态 - 系统需要手动复位或通过 `M155 C15` ping 才能恢复 ## 故障排除 | 问题 | 原因 | 解决方案 | |-------|-------|----------| | **无 CAN 通信** | 缺少或不正确的终端电阻 | 验证总线两端连接了 120 Ω 电阻;用万用表检查连通性 | | **电机无响应** | CAN ID 不正确或波特率不匹配 | 确认主从通信的 CAN ID 为 `0x100`;检查两个设备是否均配置为 500 kbps | | **串口监视器卡死** | COM 端口或波特率错误 | 运行 `pio device list`;验证波特率与设备配置匹配(通常为 115200) | | **间歇性丢帧** | CAN 总线噪声大或接线不良 | 使用屏蔽双绞线;尽可能缩短总线长度;检查是否存在 EMI 干扰源 | | **从机未确认** | 从机未运行或 CAN 模块未初始化 | 确认从机固件已成功上传;检查从机串口输出是否有错误 | | **grblHAL 无法识别 M155** | 插件未编译或未加载 | 确保 `my_plugin.cpp` 包含在构建中;验证 grblHAL 配置中的插件注册情况 | ## 通信流程 ``` M155 Command Received │ ▼ Parameter Parsing (C / M / V words) │ ▼ CAN Frame Assembly │ ▼ FlexCAN_T4 TX (0x100) │ ▼ STM32 CAN RX (eXoCAN) │ ▼ Motor Command Execution │ ▼ ACK Response (0x200) │ ▼ grblHAL OK Response ``` ## 相关资源 - [grblHAL 官方仓库](https://github.com/terjeio/grblHAL) - [Teensy 4.1 引脚图与规格](https://www.pjrc.com/teensy/pinout.html) - [STM32F103 数据手册](https://www.st.com/resource/en/datasheet/stm32f103c8.pdf) - [MCP2551 CAN 收发器数据手册](https://www.microchip.com/en-us/product/MCP2551) - [CAN 总线基础与终端电阻指南](https://www.analog.com/en/technical-articles/can-bus-fundamentals.html) - [PlatformIO 文档](https://docs.platformio.org/) ## 未来改进 - [ ] 支持多个 CAN 从机节点(基于 ID 的寻址) - [ ] 带有编码器反馈的闭环速度控制 - [ ] 带有 step/direction 接口的位置控制模式 - [ ] CAN 诊断和错误帧报告 - [ ] 额外的自定义 G-code 命令(温度监控、电流检测) - [ ] 通过 EEPROM / flash 实现非易失性配置 - [ ] 基于 Web 的监控仪表板 - [ ] 降级低速 CAN 总线后备模式(125 kbps / 250 kbps) ## 作者 **Arpan Kailash Gupta** 电气工程本科生,VJTI 孟买 实习生 — Invariance Automation 私人有限公司
标签:CAN总线, G-code, grblHAL, STM32, UML, 客户端加密, 嵌入式系统, 物联网, 电机控制