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
```
## 硬件设置
| 系统运行状态 |
|:---:|
|  |
## 硬件
| 角色 | 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, 客户端加密, 嵌入式系统, 物联网, 电机控制