EtherCAT和CANOPEN stm32f4主控,keil工程。 带EtherCAT和CANOPEN总线通信。
功能说明书(V1.0)
一、整体定位
IS620N 是一台“EtherCAT + CANopen 双总线”伺服驱动器。本文档聚焦其通信协议栈软件——在 STM32F407 + FPGA 异构平台上,如何用一套代码同时支撑两种工业以太网/现场总线,并保证 16 kHz 电流环、1 kHz 主循环的硬实时性。阅读后,您可了解:
- 协议栈的分层架构与任务划分
- EtherCAT/CANopen 的并行调度模型(中断级、主循环级)
- 数据链路层时间同步与抖动抑制机制
- 故障隔离、在线升级、安全停机等高可靠特性的实现思路
注:为遵守保密要求,文中仅给出**功能流程、状态机、关键算法**与**寄存器/接口定义**的抽象描述,**不暴露完整源码**。
二、硬件与软件总体框图
┌──────────────┐ AHB1 168 MHz ┌──────────────┐ │ STM32F407 │◄──────并行总线 16 bit──────►│ FPGA │ │ Cortex-M4 │ │ EtherCAT │ │ │ SPI2 10 MHz │ MAC+PHY │ └──────┬───────┘ └──────┬───────┘ │ │ │ RMII 50 MHz │ MII ▼ ▼ ┌──────────────┐ ┌──────────────┐ │ KSZ8041NL │ │ ET1100/ESC │ │ 10/100 PHY │ │ 从站控制器 │ └──────────────┘ └──────────────┘- FPGA 负责:
- 16 kHz 电流环、编码器采样、PWM 发波
- EtherCAT 数据链路层(ESC 寄存器、分布式时钟 DC)
- 与 MCU 通过 50 ns 级并行总线交换 64 byte 寄存器区
- MCU 负责:
- EtherCAT 应用层(CoE 字典、PDO 映射)
- CANopen 协议栈(NMT、PDO、SDO、心跳)
- 双栈状态机、故障管理、在线升级
三、软件架构
3.1 分层模型
| 层级 | EtherCAT 侧 | CANopen 侧 | 说明 |
|---|---|---|---|
| 应用层 | CoE 0x6000-0x9FFF 字典 | DS301/DS402 行规 | 共用“伺服参数池” |
| 通信层 | EtherCAT 从站栈 | CANopen 从站栈 | 双栈独立,共享底层驱动 |
| 数据链路层 | ESC 寄存器 + DC | CAN 控制器 | 由 FPGA 硬件完成 |
| 物理层 | 100 BASE-TX | ISO-11898 | 独立端口,互不干扰 |
3.2 任务划分
| 优先级 | 周期 | 载体 | 任务 |
|---|---|---|---|
| 0 (最高) | 62.5 µs | EXTI0 | FPGA 电流环中断 → 读取编码器/电流,写 PWM |
| 1 | 125 µs | EXTI2 | EtherCAT SYNC0 → 更新过程数据 |
| 2 | 250 µs | EXTI1 | 位置环软中断 → 插补、过零、摩擦补偿 |
| 3 | 1 ms | TIM2 | 主循环 → CANopen 调度、温度采样、故障检测 |
中断嵌套策略:
- 电流环不可被任何中断抢占
- SYNC0 可打断位置环,但不可打断电流环
- 主循环仅被以上中断抢占,自身不禁止全局中断
四、EtherCAT 协议栈实现要点
4.1 状态机映射
| ESC 状态 | 本地状态 | 动作 |
|---|---|---|
| INIT → PRE-OP | 通信参数下载 | 关闭 PDO,仅支持 SDO |
| PRE-OP → SAFE-OP | 过程数据映射验证 | 校验 0x1C00-0x1C6F 映射表 |
| SAFE-OP → OP | 伺服就绪 | 打开 PWM,清除故障 |
状态迁移由**双栈仲裁器**统一控制:
- 若 CANopen 处于 NMT Pre-Operational,则禁止 EtherCAT 进入 OP
- 任意一侧出现“总线关闭”错误,立即回退到 Safe-Op,并关闭 PWM
4.2 分布式时钟 (DC)
- 支持同步于 SYNC0模式
- 驱动器本地时钟与主站参考时钟差值 < 1 µs
- 关键算法:
cycle_extension = (DCnext – LocalNext) × Kp + Ki ∫error
其中 Kp=0.25,Ki=0.015,积分限幅 ±200 ns
4.3 PDO 与伺服行规
| 索引 | 子索引 | 含义 | 刷新率 |
|---|---|---|---|
| 0x6040 | 0x00 | Controlword | 每 SYNC0 |
| 0x6041 | 0x00 | Statusword | 每 SYNC0 |
| 0x6064 | 0x00 | Position actual | 每 SYNC0 |
| 0x607A | 0x00 | Target position | 每 SYNC0 |
| 0x60FF | 0x00 | Target velocity | 每 SYNC0 |
所有过程数据**零拷贝**:
MCU 在 125 µs 中断内直接通过 `*(uint16 *)(FPGA_BASE+offset)` 读写 ESC 寄存器,**无需 RAM 缓存**
五、CANopen 协议栈实现要点
5.1 多实例设计
- 使用单芯片双端口方案:
- CAN1 → 驱动器本地调试口(125 kbit/s)
- CAN2 → 机器背板总线(1 Mbit/s)
- 协议栈实例化两次,对象字典指针复用,仅节点 ID 与波特率不同
5.2 实时性优化
| 机制 | 说明 |
|---|---|
| 硬件 FIFO | CAN 控制器 28 级 FIFO,中断阈值 6 帧 |
| 延迟队列 | PDO 发送采用“双缓冲 + 立即发送”策略,最大抖动 < 200 µs |
| SDO 隧道 | 大块参数(如增益表)通过块传输协议,后台 DMA 搬运,不占用主循环时间 |
5.3 与 EtherCAT 的互锁
- 共享同一份“伺服参数池”——临界区保护使用优先级屏蔽而非关中断:
uint32t primask =getPRIMASK();
setPRIMASK(1); // 仅屏蔽可屏蔽中断
parameterpoolupdate();
setPRIMASK(primask);
保证电流环从不被关闭
六、时间同步与抖动抑制
6.1 电流环抖动预算
| 来源 | 最大抖动 | 补偿方式 |
|---|---|---|
| SYNC0 中断延迟 | 0.8 µs | 提高 EXTI2 优先级 |
| 并行总线仲裁 | 0.3 µs | FPGA 侧固定 3 等待周期 |
| DC 漂移 | 0.2 µs | 周期校正算法 |
总抖动 < 1.5 µs,满足 62.5 µs 周期内**< 2.5 %** 的要求
6.2 主站丢失检测
- 若 3 个连续 SYNC0 未到达 → 本地切换到自由运行模式
- 同时置位 Statusword 的 Bit7(Warning)
- 当 SYNC0 恢复后,渐进式回同步(每周期修正 20 %,避免阶跃)
七、故障隔离与在线升级
7.1 双栈故障表
| 故障码 | 来源 | 动作 |
|---|---|---|
| 0x7500 | EtherCAT 看门狗超时 | 回 Safe-Op,关闭 PWM |
| 0x8611 | CANopen 心跳超时 | NMT 进入 Stopped,通知 EtherCAT |
| 0x3110 | 编码器断线 | 双栈同时置位“内部错误”位,禁止任何运动命令 |
7.2 在线固件升级(Bootloader)
- 支持FoE (File over EtherCAT)与CANopen SDO两条通道
- 升级流程:
1. 进入 Boot 模式(0x1F51=1)
2. 擦除 BANK2(双镜像冗余)
3. 分段写入,每段 1 kB,CRC32 校验
4. 切换启动映射(SYSCFG->MEMRMP)
5. 双栈自动重启并上报版本号
整个升级过程**不关闭电机使能**,若失败可回滚至旧镜像
八、性能指标汇总
| 指标 | 实测值 |
|---|---|
| 电流环周期 | 62.5 µs(16 kHz) |
| 速度环周期 | 125 µs(8 kHz) |
| 位置环周期 | 250 µs(4 kHz) |
| EtherCAT 同步抖动 | < 1 µs RMS |
| CANopen PDO 抖动 | < 200 µs |
| 双栈切换延迟 | < 1 ms |
| 升级时间(2 MB 固件) | 18 s @ 100 Mbit/s |
九、开发与调试接口
| 工具 | 连接方式 | 说明 |
|---|---|---|
| TwinCAT 3 | EtherCAT | 支持在线示波器、CSV 导出 |
| CANopen Test Tool | CAN2 | 支持 NMT、PDO 录波 |
| 串口 CLI | UART1(RS232) | 打印实时日志,级别 0-4 |
| J-Link SWD | Cortex-M4 | 断点调试,Trace 时钟 60 MHz |
十、结语
IS620N 通过“FPGA 硬件时间基准 + MCU 双协议栈仲裁”的架构,在单芯片内实现了 EtherCAT 与 CANopen 的并行、零冲突、高实时运行。本文档从任务调度、时间同步、故障隔离、在线升级四个维度,阐述了其通信协议栈的核心设计思想与验证结果,可作为后续移植、扩展(如 OPC UA、TSN)的参考基线。
EtherCAT和CANOPEN stm32f4主控,keil工程。 带EtherCAT和CANOPEN总线通信。