首页 / 资讯中心 / 文章详情

XY2-100-E接口深度解析:20位帧、10MHz时钟与41条命令实战

XY2-100-E接口深度解析:20位帧、10MHz时钟与41条命令实战 ★ FEATURED ARTICLE
简介振镜协议XY2-100是激光加工设备中控制振镜的核心通信标准广泛应用于激光打标机、切割机等场景。这份资料面向激光设备研发、调试与维护工程师以及需要理解振镜接口时序的嵌入式开发者帮助解决针脚定义、时钟采样、命令集与状态指示等实际问题。资源包为1个PDF文档约466KB内容源自RAYLASE AG的SS-III XY2-100-E接口说明涵盖电气接口与针脚定义、与其他厂商的差异、数据帧结构独立帧与连贯帧时序、偏转单元与控制卡帧类型、16位与18位反馈通道、XY2-100-E命令集如SetMode等以及LED状态指示说明。文档配有精确时序图便于对照硬件调试与协议实现。目前已有513人学习下载适合作为激光振镜控制开发的案头参考。1. 拆开一份振镜 XY2-100-E 接口文档20 位帧、10 MHz 时钟和 41 条命令到底怎么落地激光打标机跑着跑着突然丢轴或者振镜回传的温度、位置数据全是乱码很多时候不是振镜坏了而是 XY2-100 这条链路没吃透。我手里这份 SS-III XY2-100-E 接口文档把物理层、数据帧、命令集和状态 LED 全串起来了它解决的就是「控制卡和振镜之间到底怎么对话」这件事。适合做激光控制卡、振镜驱动、运动控制固件的工程师也适合手里有振镜但只会调现成库、想自己写底层时序的人。文档里最值钱的部分不是命令列表而是 20 位帧结构、SYNC 锁存规则和回传通道那半拍延迟——这三处没对齐后面所有命令都是玄学。2. 电气接口与针脚25 针 DSUB 怎么接才不烧板子2.1 差分对、时钟极性与线驱动选型XY2-100-E 每个轴X、Y、Z都有一路去振镜的数据通道和一路回控制卡的数据通道加上共用的时钟线和同步线全部走差分、无隔离。文档里写得很直白最大时钟 10 MHz推荐 4 MHz。这个数字不是随便给的4 MHz 下 20 位帧周期 5 µs留给线驱动和线接收的建立保持余量比较舒服拉到 10 MHz 时线缆长度和终端匹配稍微不对回传通道就开始翻车。线驱动推荐 UA9638CD线接收推荐 MAX3096 或 UA9637备选 AM26LV32。这几颗都是差分收发里比较稳的型号选型时注意共模范围和供电别拿单端收发器硬顶。差分对必须走双绞负端和正端成对屏蔽层在连接器端接 GND。提示文档明确写了某些 DIG1 振镜头的部分针脚是内部电源保留脚绝对不能接到控制卡。上电前拿万用表把线缆逐针量一遍比烧一块控制卡便宜得多。2.2 针脚定义与 X/Y 轴互换的坑连接器是标准 25 针 DSUB 母头振镜端和控制卡端都用它线缆一对一。核心针脚如下信号振镜端针脚控制卡端针脚方向CLK-114控制卡输出CLK141控制卡输出SYNC-215控制卡输出SYNC152控制卡输出X- 位置与命令316控制卡输出X 位置与命令163控制卡输出Y- 位置与命令417控制卡输出Y 位置与命令174控制卡输出Z- 位置与命令518控制卡输出Z 位置与命令185控制卡输出Y_stat-619振镜回传Y_stat196振镜回传Z_stat-720振镜回传Z_stat207振镜回传X_stat-821振镜回传X_stat218振镜回传GND10、11、23、2410、11、23、24—这里有个血泪经验文档专门用一节讲「与其他厂商的差异」。这份文档定义的 X 轴是激光最先打到的轴所以 X 镜是小镜有些厂商把激光先打到的轴叫 Y 轴。结果就是两家的 X/Y 通道针脚是反的。好消息是正因为反着定义别家振镜可以直接换成这份文档对应的 SS-III 头不用改线序。但如果你拿这份文档去接别家控制卡X 和 Y 就会对调打出来的图形直接镜像。2.3 上电前的检查步骤接线不是插上就行我一般按这个顺序走断电状态下量线缆通断确认 1-14、2-15、3-16 这种交叉对应关系别做成直通。确认 9、12、13、22、25 这些针脚没有意外短接标准 SS-III 下它们不接。检查差分对是否双绞屏蔽层是否单端接地。先只上控制卡电用示波器看 CLK 和 SYNC 有没有输出再上振镜电。首次通信先用 4 MHz 时钟别一上来就 10 MHz。3. 20 位帧结构与时钟时序SYNC 锁存和半拍延迟3.1 一帧 20 位SYNC 下降沿锁存XY2-100-E 的一帧固定 20 位。SYNC 线对充当锁存信号一帧的最后一位用 SYNC 上的 0 表示。数据变化规则很关键CLK 上升沿时去振镜的 X、Y、Z 线对上数据变化。CLK 下降沿时从振镜回来的 X_stat、Y_stat、Z_stat 线对上数据变化。这意味着回传通道相对去程通道延迟了半个时钟周期。很多自己写时序的人只盯着上升沿采样忘了回传是下降沿更新结果读回来的状态字总是差一位查半天以为是振镜固件问题。# 用逻辑分析仪抓 XY2-100-E 时的典型触发设置以 sigrok 为例 sigrok-cli -d fx2lafw --config samplerate24m \ --channels CLK,SYNC,X,X_stat \ --trigger SYNCfall \ --samples 2000 -o capture.sr这段命令把采样率设到 24 MHz是 4 MHz 时钟的 6 倍足够看清 20 位帧的每一位。触发设在 SYNC 下降沿正好抓一帧的结束点。抓到的波形里数一下 SYNC 低电平之前 CLK 有几个完整周期正常应该是 20 个。如果只有 16 个说明控制卡还在发老式 16 位帧。3.2 三种去程帧类型怎么区分去振镜方向的帧有三种16 位目标位置帧兼容不带 -E 的 XY2-100。16 位目标位置帧来自 RAYLASE SuperScan 和 SS-II 振镜。命令帧8 位命令加 8 位参数。这三种帧靠结构静态区分。目标位置按无符号整数解释D0 是最低位D15 或 D17 是最高位。命令帧传一个命令字节 C7-C0 和一个参数字节 P7-P0参数含义随命令变。这里有个容易忽略的点18 位目标位置帧和命令帧靠奇偶校验区分。文档原话是「这可能导致振镜无法再识别奇偶校验错误」。也就是说如果你混发 18 位位置帧和命令帧校验位被借用了出错时振镜不一定报得出来。常见做法是固定帧类型序列别在高速扫描中间插命令帧。3.3 回传帧类型由控制卡定义回传通道 X_stat、Y_stat、Z_stat 上的帧彼此无法从数据本身区分因为控制卡定义了每个回传通道的数据类型所以格式对控制卡来说是已知的。文档列了三种回传帧16 位向下兼容回传帧16 位回传帧18 位回传帧这意味着你写控制卡固件时必须自己维护一张「当前回传通道配置表」知道每个轴现在回的是哪种帧。配置错了读出来的角度、电流、温度全是错的但帧本身看起来完全合法。4. XY2-100-E 命令集SetMode 和 41 条子命令怎么用4.1 命令帧结构与 SetMode 入口命令帧是 8 位命令加 8 位参数。文档里最核心的是 SetMode0x05它下面挂了 41 条子命令覆盖状态字、角度位置、电流、温度、序列号、固件版本、校准、孔径、波长等。SetMode 的参数字节就是子命令编号。import serial import struct def build_command_frame(cmd: int, param: int) - int: 构造 20 位 XY2-100-E 命令帧。 cmd: 8 位命令字节如 0x05 表示 SetMode param: 8 位参数字节SetMode 下为子命令编号 返回: 20 位整数bit19..bit0 对应帧的 20 位 frame 0 frame | (cmd 0xFF) 12 # C7-C0 放在 bit19..bit12 frame | (param 0xFF) 4 # P7-P0 放在 bit11..bit4 # bit3..bit0 为帧类型/校验相关位按具体控制卡定义填 return frame 0xFFFFF def send_setmode(ser, subcmd: int): 通过串口转 XY2-100 控制卡发送 SetMode 子命令 frame build_command_frame(0x05, subcmd) # 控制卡通常接收 3 字节大端 payload frame.to_bytes(3, byteorderbig) ser.write(payload)这段代码里命令字节放高 8 位参数字节放中间 8 位低 4 位留给帧类型和校验。实际控制卡的低位定义要看具体硬件有的用 bit0 区分命令帧和位置帧。send_setmode把 20 位帧塞进 3 字节大端发送这是很多控制卡 USB/串口转 XY2-100 的常见封装。4.2 常用子命令与参数含义SetMode 下几个高频子命令子命令编号含义数据宽度状态字0x00振镜当前状态16 位实际角度位置0x01当前角度16 位设定角度位置0x02目标角度16 位位置误差0x03跟随误差16 位实际电流0x04电机电流16 位相对振镜控制0x05相对运动16 位实际角速度0x06角速度16 位振镜温度0x14扫描头温度16 位伺服板温度0x15驱动板温度16 位AGC 电压0x16自动增益控制16 位DSP 核心电压0x17核心供电16 位模拟段电压0x18模拟供电16 位AD 转换供电0x1AADC 供电16 位AGC 电流0x1BAGC 电流16 位序列号低/高0x1E/0x1F设备序列号各 16 位货号低/高0x20/0x21产品货号各 16 位固件版本0x22固件版本号16 位校准0x23校准数据16 位孔径0x24振镜孔径16 位波长0x25适用波长16 位调谐号0x26调谐编号16 位数据类型选择0x27回传帧类型16 位运行状态低/高0x28/0x29运行状态各 16 位停止事件码0x2A停止原因16 位停止标志低/高0x2B/0x2C停止标志各 16 位运行时间秒/分/时/天0x2F-0x32累计运行时间各 16 位位置值缩放设置0x3F缩放系数16 位兼容状态字0x80老式状态字16 位18 位实际角度0x81高精度角度18 位18 位设定角度0x82高精度目标18 位18 位位置误差0x83高精度误差18 位插值配置0x90插值设置16 位Setpos 应答电平0x40应答阈值16 位除了 SetMode还有几条独立命令UpdatePermanentMemory0x0A把参数写永久存储SelectControlDefinition0x11选控制定义SetPositionScale0x12设位置缩放SetPosAcknowledgeLevel0x15设应答电平StoreRestoreTransmissionMode0x17存取传输模式SetEchoMode0x21设回显模式SetInterpolation0x90设插值。4.3 读温度、读位置、写永久存储的实操顺序我一般按这个顺序做首次联调发 SetMode(0x00) 读状态字确认振镜在线。发 SetMode(0x22) 读固件版本记录基线。发 SetMode(0x14) 和 SetMode(0x15) 读振镜温度和伺服板温度确认散热正常。发 SetMode(0x01) 读实际角度手动转一下镜片看数值变不变。发 SetMode(0x02) 写设定角度看镜片动不动。确认无误后发 UpdatePermanentMemory(0x0A) 把需要保留的参数写进去。注意UpdatePermanentMemory 不要频繁发。永久存储有擦写寿命调试阶段先用 RAM 参数跑通最后定型再写一次。5. 避坑与排查LED 状态、奇偶校验和回传错位5.1 现象通信完全没反应LED 不亮原因供电没到或者 25 针线缆做成了直通而不是交叉。文档里针脚表明确写了 1 对 14、2 对 15 这种交叉关系直通线缆插上去 CLK 和 SYNC 全反。解决断电量线缆确认交叉对应。再量振镜端供电针脚标准 SS-III 下 9、12 针不接别把 ±15 V 误接上去。5.2 现象位置数据偶尔跳变图形边缘毛刺原因时钟拉到 10 MHz线缆太长或终端没匹配好回传通道在下降沿采样时数据还没稳定。解决降到 4 MHz 先跑通再逐步往上试。检查差分对是否双绞、屏蔽层是否接好。用逻辑分析仪抓 X_stat 在 CLK 下降沿附近的数据眼图看建立保持时间够不够。5.3 现象读回来的状态字总是差一位原因忘了回传通道相对去程延迟半个时钟。去程在 CLK 上升沿变化回传在 CLK 下降沿变化采样点选错就整体错位。解决控制卡接收逻辑里回传数据用下降沿采样或者把采样点往后推半个周期。抓一帧完整波形数清楚 SYNC 低电平前有多少个 CLK 周期确认是 20 位帧。5.4 现象混发 18 位位置帧和命令帧后振镜不报错但行为异常原因文档明确说这两种帧靠奇偶校验区分混发时振镜可能无法再识别奇偶校验错误出错被吞掉。解决固定帧序列高速扫描段只发位置帧命令帧在扫描间隙发。如果必须混发在控制卡侧自己做超时和状态轮询别指望振镜报错。5.5 现象X 和 Y 打反图形镜像原因这份文档定义 X 轴是激光最先打到的轴X 镜是小镜有些厂商把先打到的轴叫 Y 轴针脚定义相反。解决换振镜时先确认轴定义。如果拿这份文档接别家控制卡X/Y 通道对调要么改线序要么在软件里交换 X/Y 输出。6. 进阶技巧用回传通道做闭环监控和寿命预警把命令集跑通只是第一步真正省事的是用回传通道做在线监控。我习惯在控制卡固件里开一个低频轮询任务每 100 ms 读一次 SetMode(0x14) 振镜温度、SetMode(0x15) 伺服板温度、SetMode(0x04) 实际电流和 SetMode(0x03) 位置误差。这四个量放一起看能提前发现很多问题。温度缓慢爬升但没超限可能是散热风道堵了位置误差在同样扫描速度下逐渐变大可能是轴承磨损或调谐漂移实际电流异常升高可能是电机阻力变大。这些趋势比单次报警有用得多。import time def monitor_loop(ser, interval0.1): 低频轮询振镜关键状态做趋势监控 history [] while True: temp_galvo read_setmode(ser, 0x14) # 振镜温度 temp_servo read_setmode(ser, 0x15) # 伺服板温度 current read_setmode(ser, 0x04) # 实际电流 pos_err read_setmode(ser, 0x03) # 位置误差 history.append((time.time(), temp_galvo, temp_servo, current, pos_err)) # 只保留最近 5 分钟数据 cutoff time.time() - 300 history [h for h in history if h[0] cutoff] # 简单阈值预警 if temp_galvo 45 or temp_servo 55: print(温度预警, temp_galvo, temp_servo) if pos_err 200: print(位置误差偏大, pos_err) time.sleep(interval)这段监控循环每 100 ms 读四个量保留最近 5 分钟历史。阈值 45°C 和 55°C 是经验值具体看振镜型号和散热条件。位置误差阈值 200 也是经验值16 位角度下这个数对应多少微弧度要看缩放设置建议先跑基线再定。还有一个技巧是用 SetMode(0x2F) 到 SetMode(0x32) 读运行时间秒、分、时、天。这四个寄存器拼起来就是累计运行时长做维护提醒很方便。比如每 2000 小时提醒换散热滤网每 5000 小时提醒检查轴承。SetMode(0x2A) 停止事件码和 SetMode(0x2B)/0x2C 停止标志也值得读。振镜一旦触发停止这两个寄存器会记录原因。我遇到过位置误差超限触发停止读出来事件码才定位到是扫描速度设太高。最后说个习惯每次改完参数先读一遍 SetMode(0x27) 数据类型选择确认回传帧类型和你固件里配置的一致。这个寄存器被意外改掉后面所有回传数据都是错的但帧本身完全合法查起来非常费劲。从那以后我每次上电初始化都强制走一遍「读状态字 → 读固件版本 → 读数据类型选择 → 读温度」这四步确认基线正常再开始跑扫描。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站