绝对值编码器协议还挺多的,比如常用德国公司的一些协议SSI,BISS,ENDAT,HIPERFACE协议等等,还有日系的多摩川。当然还有一些基于modbus的,can的,模拟量的。
绝对值编码器的好处就在于,编码器掉电能保存编码器的位置信息,重新上电后不会丢失。不像光编编码器,上电无法知道绝对位置,需要找到z信号。不过绝编使用起来会相对麻烦点,需要通信协议,其成本也会贵一点。
它内部的实现方式也有很多种。感兴趣的可以网上查一查。
SSI协议介绍
SSI通讯协议为缩写,其全称为同步串行接口( Synchronous Serial interface ),是一种广泛使用的位置传感器之间的串行接口和一个控制器。
SSI是RS-422上的单向串行协议。单向时钟由主频产生,并从80khz指定到2mhz。接收数据也是单向的,SSI不支持传播延迟补偿。
不活动时时钟为高电平。 为了启动数据传输,时钟变低并存储位置。在时钟信号的第一个上升沿,MSB 在 SSI 编码器处移出。 在第二个上升沿,MSB-1 被移出,依此类推,直到最后一位 (LSB) 被移出。 另一个时钟周期后,时钟保持高电平,直到下一个数据传输开始。 根据超时,当前锁存位置或新位置值将在下一次传输中传输。
硬件接口
采用的是422的差分接口与绝对值编码器连接,一般SSI编码器必须有6根线,一般的编码器可能是8根线(方向和置零)。
- 时钟CLK+
- 时钟CLK+
- 数据DATA+
- 数据DATA-
- GND
- VCC(5V-30V)
通信时序
随便拿了个SSI编码器的datasheet:
数据手册上对时间的描述:
- t1>0.45us
- t2<0.40us
- t3=12us~30us
- T=1us~11us
协议特性
- 时钟在80khz-2mhz
- 协议是单向的
- 空闲态时钟为高
- 时钟个数等于数据个数+1:第一个时钟是触发编码器,数据是从第二个时钟开始。
- 时钟上升沿触发编码器,下降沿锁存数据
- SSI没有传播延迟检测补偿
- 一帧通信结束后,需要空闲10-30us。
驱动器与编码器通信
额外提一下,好一点的驱动器架构,都是双核的,一般都使用DSP+FPGA,或者是MCU+FPGA的方式.
为什么要使用FPGA?
- 一部分原因就是因为处理编码器的信号,通用驱动器需要支持的编码器协议有很多种,单个dsp或者mcu,并不能都支持。
MCU如何与SSI通信
IO模拟
如果自己想熟悉一下协议,做做测试,可以用MCU的IO口模拟一下SSI协议,读取编码器的信息。
SPI
一般使用MCU的SPI接口。MCU作为Master主机,编码器作为Slave从机。 SPI的CLK经过差分电路后连接到编码器的时钟信号线上。 SPI的MISO经过差分电路后连接大编码器的DATA信号线上。
SPI有四种模式
SPI的相位(CPHA)和极性(CPOL)分别可以为0或1,组合构成了SPI的4种模式(mode)。
时钟极性CPOL: SPI空闲时钟信号CLK的电平
- 1:高电平
- 0:低电平
时钟相位CPHA: SPI在CLK哪个边沿开始采样
- 0:第一个边沿
- 1:第二个边沿
模式 | 时钟极性 | 相位 |
---|---|---|
模式0 | CPOL=0(低电平) | CPHA=0(第一个边沿:上升沿) |
模式1 | CPOL=0(低电平) | CPHA=1(第一个边沿:下降沿) |
模式2 | CPOL=1(高电平) | CPHA=0(第一个边沿:下升沿) |
模式3 | CPOL=1(高电平) | CPHA=1(第一个边沿:上升沿) |
根据SSI的协议是时钟空闲是高电平,在下降沿采样。所以我们需要把SPI配置成模式2,CPOL=1,CPHA=0的模式。
根据编码器位数,设置SPI的通信长度,通信后得到的数据,掐头掐尾,丢掉第一个bit,丢掉尾巴的多余的bit。就得到了SSI的数据。
时序要求,最后也要给编码器一个空闲超时时间,让编码器准备下一次传输数据。 假设400k时钟,一个时钟2.5us, 14位编码器则需要15个时钟*2.5us = 37.5us + 20us = 57.5us。通信一次。
编码器的多圈值和单圈值
什么是单圈编码器? 编码器记录的信息只记录一圈内的绝对位置。
什么是多圈编码器? 编码器除了记录一圈内的位置信息,还会记录圈数。
SSI的数据格式
- 一般有二进制格式,以及格雷码格式。
- 二进制,即是通信data。
- 格雷码,是一种错误最小化的编码方式。需要解码,将格雷码转换成二进制。