EtherCAT 伺服电机简易控制 —— 基于 Controller SDK 从零上手
最近把自己做的一个工业机器人控制器 SDK 整理开源了,基于 **IgH EtherCAT Master + CiA402 协议**,支持从总线通信到上层运动控制的完整栈。这段时间先分享一下怎么用它简单控制一个伺服电机。
仓库地址:GitHub - twx-web/EtherCAT_Controller: 一个专用于工业上实时控制器,对ethercat伺服电机控制更加简便 · GitHub
## 核心思路
控制一个伺服电机,本质上就是三件事:
1. **建立 EtherCAT 通信**(主站初始化、Domain、PDO 映射)
2. **驱动 CiA402 状态机**(使能 → 就绪 → 运行)
3. **发运动指令**(位置/速度/点动)
SDK 把这套流程封装得比较简单,接口带 SI 单位(弧度),不用自己算脉冲。
## 最小示例(单轴控制)
#include "EthercatMaster.h"
#include "CiA402Motor.h"
#include "axis.h"
#include "joint_unit_converter.h"
#include "RealtimeLoop.h"
#include "MotionCycle.h"
```
初始化与配置:
```cpp
EthercatMaster master;
master.init(0);
master.createDomain();
// 配置从站 PDO(CSP 模式,5 出口 + 5 入口)
CiA402Motor::Offsets offsets;
ec_pdo_entry_reg_t regs[] = {
{0, 0, VID, PID, 0x6040, 0, &offsets.ctrl_word},
{0, 0, VID, PID, 0x607A, 0, &offsets.target_position},
{0, 0, VID, PID, 0x6041, 0, &offsets.status_word},
{0, 0, VID, PID, 0x6064, 0, &offsets.position_actual},
// ... 更多映射
{}
};
// 注册 PDO、添加从站、激活...
master.activate();
```
创建轴并启动实时循环:
```cpp
auto motor = std::make_unique<CiA402Motor>(sc, master.domainData(), offsets);
auto axis = std::make_unique<Axis>("joint1", std::move(motor), converter);
RealtimeLoop rtLoop;
rtLoop.addTask([&]() { axis->realtimeCycle(); });
rtLoop.start();
```
运动控制(NRT 线程投递命令):
```cpp
axis->enable(); // 使能
axis->moveAbsolute(1.0); // 转到 1 rad
axis->moveVelocity(2.0); // 以 2 rad/s 速度运行
axis->jogPositive(1.5); // 正向点动
axis->disable(); // 禁能
## SDK 特点
- **分层清晰**:`EthercatMaster → CiA402Motor → Axis → AxisGroup`
- **RT/NRT 分离**:实时路径无堆分配、无锁、无日志
- **即用型运动学**:已内置 Delta、SCARA、六轴(ABB/通用)正逆解
- **轨迹规划**:S 曲线、前瞻、PVT 插补、电子齿轮/凸轮
- **全部中文注释**,Doxygen 文档可直接生成
## 为什么开源
做工业控制的门槛其实不低——要搞 IgH、要搞 PDO 映射、要搞实时内核、要搞 CiA402 状态机。我希望把这块做好之后分享出来,让想做运动控制的同学能更快上手,也欢迎各位提 issue 或 PR。
**欢迎 Star、Fork、指正!**
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)