ARM+FPGA 伺服驱动:高速双向数据流通信内容

发布于:2025-07-18 ⋅ 阅读:(17) ⋅ 点赞:(0)

ARM+FPGA 伺服驱动:高速双向数据流清单

引言

在“ARM 做高层算法,FPGA 做纳秒级硬实时”的伺服驱动里,两颗芯片之间到底来回跑什么数据?很多人只说一句“FPGA 把编码器值给 ARM,ARM 把 PWM 占空比给 FPGA”就带过。下面把全部输入/输出信息拆成文字清单,并给出物理接口、帧格式、实时性分级和可直接落地的实现细节。


一、数据方向与时序分级

下行方向,也就是 ARM 写给 FPGA 的数据,可分为两类:

  • 周期型:像电流指令、速度环输出,更新周期在 1 微秒到 100 毫秒之间,由 DMA 循环搬运;
  • 事件型:像伺服使能、急停、在线调参触发,发生时间随机,靠 GPIO 或 IRQ 立即通知。

上行方向,也就是 FPGA 写给 ARM 的数据,同样分两类:

  • 周期型:实际电流、实际位置、实际速度,每 1 微秒或 1 毫秒一次,走 AXI-Stream;
  • 事件型:过流、过压、编码器断线等故障位图,发生即通过 GPIO/IRQ 上报。

二、下行——ARM 发给 FPGA 的数据

  1. 目标电流:两路 32 位 Q31 定点值,对应 d-q 轴电流指令,每 0.52 毫秒随速度环刷新一次,经由 AXI-Stream 下发。
  2. 位置或速度指令:64 位定点,来自轨迹规划,每 110 毫秒更新一次,体量较大,放在 DDR 共享区,启动一次 DMA 即可。
  3. 调试用 PWM 占空比:三路 16 位值,每 10 微秒一次,可旁路电流环直接驱动桥臂。
  4. 控制字:16 位寄存器,包含伺服 ON/OFF、急停、复位等命令,事件到来时由 AXI4-Lite 单拍写入。
  5. PID 增益:三组 32 位浮点,对应电流环的 Kp、Ki,在线自整定完成后约 100 毫秒刷新一次,同样走 AXI4-Lite。
  6. 补偿表:256×32 位的齿隙或摩擦查找表,仅在启动时一次性通过 DDR 共享 DMA 灌入 FPGA BRAM。

三、上行——FPGA 回给 ARM 的数据

  1. 实际电流:三路 16 位 ADC 原始值,每 1 微秒一次,经 AXI-Stream 连续打包。
  2. 实际位置:64 位增量或绝对值,由编码器解码逻辑产生,同样 1 微秒一次。
  3. 实际速度:32 位定点,FPGA 内部用 Δθ/Δt 硬件计算,更新频率 1 微秒。
  4. 故障标志:32 位位图,包含过流、过压、编码器断线等,任何位被置 1 立即通过 GPIO/IRQ 上报,延迟百纳秒级。
  5. PWM 状态:三路 16 位,分别给出当前占空比、死区时间和温度传感器码值,每 1 毫秒通过 AXI4-Lite 寄存器读取。
  6. 时间戳:64 位计数器,分辨率 64 纳秒,对应每个编码器脉冲边沿,随 AXI-Stream 帧一起上传。

四、物理接口与带宽

AXI4-Lite 寄存器接口跑 100 MB/s,延迟不到 1 微秒,用于控制字和 PID 增益;

AXI4-Stream 数据流接口 64 字节帧每 1 微秒,理论 512 Mb/s,实测可到 1 GB/s,负责电流、位置、速度实时流;

GPIO/IRQ 走独立引脚,故障中断延迟低于 100 纳秒,直接触发 ARM NVIC;

DDR 共享区通过 AXI HP 端口,峰值 10 GB/s,延迟低于 1 微秒,用来加载补偿表或批量日志;

老平台若仍用 EXMC/FSMC 16 位并口,带宽约 200 MB/s,仅作寄存器备份通道;

额外独立 GPIO 可与 AXI-Stream 并行,用于硬实时触发信号。


五、典型 AXI-Stream 帧格式

每 64 字节构成一帧,1 微秒发一次:

  • 字节 0–1:Ia_ADC
  • 字节 2–3:Ib_ADC
  • 字节 4–5:Ic_ADC(可选)
  • 字节 6–7:保留
  • 字节 8–15:θ_ENC,64 位实际位置
  • 字节 16–19:ω_EST,32 位实际速度
  • 字节 20–23:FaultFlags,32 位故障位图
  • 字节 24–31:TimeStamp,64 位时间戳
  • 字节 32–63:保留或 CRC 校验

FPGA 端把上述数据顺序打包,经 DMA 写入 DDR 环形缓冲;ARM 用户态 mmap 后直接按结构体指针读取,零拷贝。


六、Linux 用户态取流示例

在设备树里预留 0x2000_0000 起的 16 MB 连续内存。用户态程序 mmap 后得到一个环形缓冲。定义结构体:

struct frame {
    uint16_t ia, ib, ic;
    uint64_t pos;
    uint32_t vel;
    uint32_t fault;
    uint64_t ts;
} __attribute__((packed));

主循环按 64 字节步进读取即可,idx 用位掩模回绕,保证实时无锁。


七、调试小贴士

  • 用 Xilinx ILA 在线抓取 AXI-Stream,确认每 1 微秒无掉帧;
  • 在 ARM 侧打开 CONFIG_DMABUF_DEBUG,跟踪缓存一致性;
  • 故障中断使用 irqsoff tracer 抓取最坏中断延迟,确保硬实时边界。

结语

ARM 与 FPGA 之间交换的不是零散寄存器,而是一张周期级与事件级混合、双向且确定的高速数据网。按本文文字清单逐项落地,就能在 1 微秒内完成“采样→计算→输出”全闭环,真正把异构架构的实时威力发挥到极致。


网站公告

今日签到

点亮在社区的每一天
去签到