磁致伸缩位移传感器 SSI 帧结构:时钟、位宽与格雷码
SSI 一共就四根信号线:时钟一对、数据一对。很多人第一次接上就能读到数,于是以为这东西没内容——直到某天换了个行程、或者把线加长了二十米,读数开始乱,才发现"能读到数"和"读对了"是两件事。
SSI 的配置项只有三个:数据位数、编码格式、时钟频率。前几篇讲的是这三项怎么配、配错了怎么查;这篇往下走一层,讲清楚一个字:主站发出去的那串时钟,到底从传感器里读走了哪几位,每一位代表什么。搞明白这一层,位数为什么这么配、格雷码为什么不能当二进制解,就不是背参数了。
一帧四步,每一步都有一条硬规矩
SSI 是点对点的单向接口:时钟由主站给,数据由传感器回。没有地址、没有仲裁、没有协议栈,正因为它简单,所以每一步的边界条件都很死。
- 空闲。时钟线保持高电平。传感器内部一直在更新位置值,但此时数据线的内容不作数。
- 锁存。主站发出第一个时钟下降沿,传感器把当前位置值扣进移位寄存器,位置值从这一刻起被冻结。
- 移出。主站继续发时钟,传感器在每个时钟周期移出一位,最高位先出。时钟个数就是主站"买"的位数,多发几位就多读几位。
- 复位。时钟串停止后必须留出单稳态时间,接口才回到空闲、才认下一次读取。这个时间在 192 上是最小 48 μs。
第二条规矩最容易被忽略,也最有工程意义:读数对应的是"发起读取那一刻"的位置,不是时钟串结束那一刻。时钟发得越长,这个差别越大。在注塑机射胶、压机下死点这种高速段上,几十微秒就是零点几毫米——所以不是"位数配得越多越好",读得越长,读到的是越早的那个位置。
位宽只有两档:25 位,或者 24 位
SSI 是同步串行,主站发多少时钟,传感器就移多少位,听起来像可以随便配。实际产品只做两档:192 出厂按订单定成 25 位或 24 位,型号编码里对应的那一位是 1 就是 25 位、是 2 就是 24 位。主站必须按订的那一档配,多一位少一位都读错。
两档能装多少格,直接算得出来:
| 位宽 | 可表示的格数 | 适用场合 |
|---|---|---|
| 24 位 | 16,777,216(2²⁴) | 常用量程配常用分辨率,绝大多数场合够用 |
| 25 位 | 33,554,432(2²⁵) | 量程与分辨率的组合超过 16,777,216 格时 |
判断该订哪一档,看"量程 ÷ 分辨率"这个格数落在哪:
| 量程 | 分辨率 | 格数 | 24 位够不够 |
|---|---|---|---|
| 300 mm | 5 μm | 60,000 | 够 |
| 1000 mm | 10 μm | 100,000 | 够 |
| 2000 mm | 1 μm | 2,000,000 | 够 |
| 7600 mm | 1 μm | 7,600,000 | 够 |
表里能看出来:连 7600 mm 配 1 μm 也只占到 16,777,216 格里的一半不到,24 位仍有余量。所以常规订货选 24 位就够,25 位是给更长行程、更细分辨率的组合留的。这一项不该自己猜——把量程和分辨率报清楚,由厂家按这个算。
位数配错的表现,和"位宽不够装"是两回事:
- 主站按 24 位配、传感器是 25 位。少发一个时钟,最低位被丢掉,读数值只有实际的一半。这个"一半"很稳定,容易被误判成量程或分辨率订错。
- 主站按 25 位配、传感器是 24 位。多发一个时钟,多读到的是填充位,位置值整体变成实际的两倍(填充为 0 时),或者尾数出现无规律跳动。
这也是为什么调试顺序永远是"先位数、再编码格式、最后时钟频率":位数错了,后面两项怎么调都读不对。
型号编码里这几位决定主站怎么配
192 的订货码每一位对应一个可选项,主站要跟它对上的是其中三项:数据长度、代码类型、分辨率。另外两项(功能、比例方向)决定的是行为,不是通信参数。
| 编码项 | 取值 | 含义 |
|---|---|---|
| 数据长度 | 1 / 2 | 1 = 25 位,2 = 24 位 |
| 代码类型 | B / G | B = 二进制,G = 格雷码 |
| 分辨率 | 1 / 2 / 3 / 4 / 5 / 6 / 8 | 依次是 5 / 10 / 50 / 100 / 20 / 2 / 1 μm |
| 功能 | 1 | 标准 |
| 比例方向 | 00 / 01 | 00 = 正向,01 = 返回 |
分辨率那一串数字不是按顺序排的:1 是 5 μm、2 是 10 μm、3 是 50 μm、4 是 100 μm、5 是 20 μm、6 是 2 μm、8 是 1 μm,中间没有 7。对着表核型号,不要按"数字越大越细"去猜,抄错一位就是整段比例错。
比例方向这一项最容易被忽略。它决定读数往哪个方向增大:正向是磁环远离电子仓时数据变大,返回是磁环靠近电子仓时数据变大。这一项订货时就定死了,和控制器里有没有"方向取反"是两个层面的事——订的是 01,主站就得按反向理解;现场想换,只能在控制器侧再翻一次。
格雷码:相邻的两个值只翻一位
位置是连续变化的量,传感器内部按格计数,输出的却是二进制或格雷码两种格式之一。
二进制的问题出在跨位进位:从 127 走到 128,七位一起翻。这七位不是同时到达主站的,线与线之间的延迟差、边沿抖动,都能让主站在翻位的那一瞬读到 255 或者 0——一个只该变化 1 个最小格的时刻,读数跳出几百格。
格雷码把相邻两个值编码成只差一位的形式,跨越进位时也只有一位在动,所以最坏情况只差 1 个最小格。位置测量用它,就是为了这个。
代价是主站必须做转换,读到的不是直接的数值:
// 格雷码转二进制:把所有右移值异或起来
uint32_t gray_to_bin(uint32_t g) {
uint32_t b = 0;
for (; g; g >>= 1) b ^= g;
return b;
}
// 二进制转格雷码
uint32_t bin_to_gray(uint32_t b) { return b ^ (b >> 1); }
格式选错的特征很明显:曲线不单调,出现折返。因为在格雷码的位模式被当作二进制读时,相邻两个格对应的数值会大幅跳变,画成位置-时间曲线就是锯齿。与之对应的另一种形态是"读数看起来像被随机打乱",而不是整体偏移——整体偏移属于零点问题,不是格式问题。
192 出厂按订货指定的格式,两种都支持。主站侧的格式设置在换传感器时必须重新确认,这一项和位数一样,不会自己跟着变。
时钟频率、线长、更新频率,三个数一起看
时钟频率不是主站想给多少就给多少,它被两件事夹住:线有多长,传感器自己多久更新一次。
线长决定上限。信号在电缆上有传播延迟,边沿也会被电容磨钝,线越长,允许的最高时钟越低。192 与 162 用的是同一套数字:
| 电缆长度 | 最高数据速率 |
|---|---|
| < 3 m | 1000 kBd |
| < 50 m | 400 kBd |
| < 100 m | 300 kBd |
| < 200 m | 200 kBd |
| < 400 m | 100 kBd |
行程决定下限。传感器内部的测量是周期性的,行程越长,波导丝上传回来的时间越久,更新频率就越低。192 的更新频率随行程变化:300 mm 时 3.7 kHz,750 mm 时 3.0 kHz,1000 mm 时 2.3 kHz,2000 mm 时 1.2 kHz,5000 mm 时 0.5 kHz。
把两件事的账算一遍就很清楚,以 1000 kBd(一位约 1 μs)、17 位、1000 mm 行程为例:
- 一帧时钟串本身约 17 μs;
- 加上单稳态 48 μs,一次完整读取约 65 μs,理论最快约 15 kHz;
- 但传感器只以 2.3 kHz 在更新,所以真实上限是 2.3 kHz,约 430 μs 一次。
结论是反直觉的:在常用行程上,瓶颈几乎永远是传感器的更新频率,不是时钟频率。把时钟拉到 1000 kBd 却按 1 μs 的间隔去读,读到的会是同一帧重复值,或者干脆被单稳态挡住返回异常。主站的读取周期应当取"更新周期"与"单稳态加时钟串"两者中的较大值,再留一点余量。
线超过 200 米还要跑 500 kBd,就是这一类现场问题的起点——现象是偶发跳大数,而不是彻底不通。降频的做法与判据见 SSI 长线跳数:按时钟速率降频。
差分信号与七针接法
SSI 的时钟和数据都是差分对,这是它能跑几十米、上百米的前提。192 用 7 针 D70 公接头,针脚定义如下:
| 针脚 | 定义 | 线色 |
|---|---|---|
| 1 | 数据 − | 黑 |
| 2 | 数据 + | 白 |
| 3 | 时钟 + | 黄 |
| 4 | 时钟 − | 绿 |
| 5 | +24 V | 红 |
| 6 | 0 V | 蓝 |
| 7 | 不接 | — |
两条现场经验:时钟对与数据对各自双绞,不要拆成四根散线走;屏蔽层焊在插头外壳上,只在控制器一侧接地,两头都接就形成地环流,反而把干扰引进来。
差分对极性接反不会烧设备,但表现很典型:数据对反接,读到的位全翻转,位置值变成"满量程减去真实位置";时钟对反接,多数主站直接收不到帧。遇到"读数正好是反的"这种规律性错误,先查线序,不要去调位数。
它在接口谱系里的位置
SSI 的优势是读取时刻完全由主站决定,采样点确定、延迟确定,适合与其他动作严格对齐的场合;代价是每轴一根线,轴数一多线束成本就超过总线方案。与 4-20 mA、CANopen 的横向对照见 八种输出接口对照;想用自制板子直接做主站,见 CANopen 主站实现里的同类思路。
162 是 16 系列的 SSI 输出,位宽、速率、48 μs 单稳态这一套数字与 192 完全相同,差别在机械与耐压,不要订混,见 162 与 192 的区别。三项配置项怎么对齐,见 192 SSI 配置;SSI 输出地信号为什么不能随便转成模拟量,见 输出地信号与转接限制。192 系列是这类现场最常用的一款。
一句话
位数管"装得下",分辨率管"分得细",时钟管"来得及",格雷码管"翻位不出错"。四件事分工不同,混在一起调就会一直调不通。
常见问题
Q:SSI 的位宽可以随便配吗
不能。192 只做 25 位和 24 位两档,订货时按型号编码里那一位定(1 = 25 位,2 = 24 位)。判断依据是“量程 ÷ 分辨率”是否超过 16,777,216 格:不超过就选 24 位,超过才需要 25 位。
Q:位数配多了会怎样?
位置值本身不会错,多出来的时钟在尾部读到填充位或状态位。如果程序直接把整帧当数值换算,就会看到末几位忽高忽低的抖动。反过来位数配少,读数会在行程某一点之后再不变大,卡在 2 的整数次幂上限。
Q:格雷码和二进制,选哪个?
两者都能用,取决于主站愿不愿意做转换。格雷码在跨位进位时只有一位在动,最坏误差是 1 个最小格;二进制在进位时多位同时翻转,读错可能跳出几百格。振动大、位置值频繁经过进位点的场合,格雷码更稳。
Q:时钟频率给到最高是不是读数最快?
不是。常用行程上瓶颈是传感器的更新频率,不是时钟。192 在 1000 mm 行程时更新率只有 2.3 kHz,时钟拉到 1000 kBd 也读不出更多次。读取周期要取更新周期与单稳态加时钟串两者中的较大值。
这篇讲的问题,说到底都绕不开磁致伸缩位移传感器本身。磁致伸缩位移传感器产品中心按行程、安装方式与输出接口把全部系列排开,选型从这里进最省事。
← 返回行业动态



