12位单圈绝对值编码器

 
 
 
 
 
 
 

12 位单圈绝对值编码器

使用说明书
 

 
 

 
常州西曼顿电器有限公司

 
12 位单圈绝对值编码器采用智能磁敏感元件,通过三轴霍尔技术,将机械转动或角位移转化为电信号,非接触测量。其产品具有分辨率高,温度稳定性好, 广泛应用于工业自动化测量和监控系统,尤其适用于机械变化频繁,环境恶劣, 要求传感器使用寿命长,可靠性高的场合。
一、产品特点:
1、无触点,无噪音,高灵敏度,高重复性,接近无限转动寿命。
2、防尘防潮性好,环境试用性强。
3、体积小重量轻,性能稳定可靠。
4、360°绝对位置测量,是替代光学编码器,导电塑料电位器的理想产品。
二、应用范围:
本产品广泛应用于航天航空、军工设备、纺织机械、灌溉机械、造纸印刷、水利闸门、机器人及机械手臂、港口起重机械、钢铁冶金设备、重型机械设备、精密测量设备、机床、食品机械等行业。

三、参数说明

 
工作电压 DC5V±10%
工作电流 12mA
工作温度 -30℃~80℃
分 辨 率 12 位
 
四、外形尺寸图

 
 

 

 
 
 
五、接口定义

 
 

 
红色胶壳
引脚序号 引脚符号 描述
1 GND 电源负
2 DO 数据
3 SCLK 时钟
4 CS 片选
5 VCC 电源正
 
 
白色胶壳
引脚序号 引脚符号 描述
1 CS 片选
2 SCLK 时钟
3 DO 数据
4 GND 电源负
5 VCC 电源正

六、读取数据
采用三线制 SPI 总线进行数据通信。

6.1

 
 

SPI 总线时序图 

  1. 器件指令机制
在每一帧数据传输之前,主器件将发送字节 AAh 以使能帧传输。角度测量值的锁存点位于第一个数据帧字节前的最后一个时钟沿。
说明:
/SS:片选信号,低电平有效。SCLK:时钟信号。

 
 

MOSI/MISO:为复用数据口,用来输入或输出数据。

6.3数据帧结构

一个数据帧包含了 10 个字节:
  • 2 个启动字节(AAh 和 FFh)
  • 2 个数据字节(DATA16 – 高位先入)
  • 2 个反向的数据字节(/DATA16 -高位先入)
  • 4 个全高字节

6.4数据结构


 
 

DATA16 可以是一个实际的角度或者一个错误信号。这两种信号由 LSB 来区分。DATA16: 角度信号 A[13:0]。DATA16: 错误信号E[15:0].

 
 

 
 
 
附 AVR 单片机读取数据程序
#define DIO_OUT() DDRC |= (1<<0) //DIO 设置成输出
#define DIO_IN() DDRC &= ~(1<<0) //DIO 设置成输入
#define DIO_SET() PORTC |= (1<<0) //DIO(输出),置 1
#define DIO_CLR() PORTC &= ~(1<<0) //DIO(输出),清 0
#define READ_DIO() PINC&(1<<0) //读 DIO 电平
#define SCLK_OUT() DDRC |= (1<<1) //SCLK 设置成输出
#define SCLK_IN() DDRC &= ~(1<<1) //SCKL 设置成输入
#define SCLK_SET() PORTC |= (1<<1) //SCKL(输出),置 1
#define SCLK_CLR() PORTC &= ~(1<<1) //SCKL(输出),清 0
#define CS_OUT() DDRC |= (1<<2) //CS 设置成输出
#define CS_IN() DDRC &= ~(1<<2) //CS 设置成输入
#define CS_SET() PORTC |= (1<<2) //CS(输出),置 1
#define CS_CLR() PORTC &= ~(1<<2) //CS(输出),清 0
void  PORT_Init(void)       //端口初始化
{
CS_OUT();
SCLK_OUT();
DIO_OUT();
}
void  Delay_us(INT8U  Time)  //1us 延时函数
{
INT8U  i = 0;
for ( i=0; i<Time; i++) NOP();
}

void  WriteByte(INT8U  Write_Value) //写一个字节
{
INT8U  i = 0; DIO_OUT();
for ( i=0; i<8; i++)
{
SCLK_SET();
if (Write_Value&0x80) DIO_SET();
else
DIO_CLR();
SCLK_CLR();
Write_Value <<= 1; Delay_us(1);
}
}
INT8U  ReadByte(void) //读一个字节
{
NT8U i = 0;
INT8U Read_Value = 0; DIO_IN();
for ( i=0; i<8; i++)
{
SCLK_SET();
Read_Value  <<=  1; SCLK_CLR();
Delay_us(1);
if (READ_DIO())
Read_Value |= (1<<0); else
Read_Value  & = ~(1<<0);
}
return  Read_Value;
}
INT16U  ReadAngle(void)                //读取角度数据
{
INT16U  Angle_Value = 0;           //正常数据INT16U Reverse_Angle_Value = 0; //反向数据INT16U Check_Angle_Value = 0;
CS_CLR();
Delay_us(10);                      //至少延时 10us
WriteByte(0xaa);                   //1
WriteByte(0xff);                   //2
Delay_us(10);                      //至少延时 10us

Angle_Value = ReadByte();                                 //3 Angle_Value <<= 8;
Delay_us(10);//至少延时 10us
Angle_Value += ReadByte();         //4 字节 3.4 为数据字节Check_Angle_Value = Angle_Value; //保存当前的有效值Delay_us(10);//至少延时 10us
Reverse_Angle_Value = ReadByte();                                 //5 Reverse_Angle_Value <<= 8; Delay_us(5);
Reverse_Angle_Value += ReadByte(); //6 字节 5.6 为反向的数据字节Delay_us(10);//至少延时 10us
CS_SET();
if ((Angle_Value == (~Reverse_Angle_Value)))
{
if ((Check_Angle_Value&0x0001) == 0x0001)     //角度信号
{
Angle_Value = ((Angle_Value&0xfff0) >> 4); return   (Angle_Value);
}
else                 //错误信号
return  0xffff;
}
else                 //错误信号
return  0xffff;
}