传感器TLE5012B使用

目录

  • 前言
  • 一、通信协议
    • 1.1 SSC 协议
    • 1.2 IIF协议
    • 1.3 其他协议
  • 二、SSC寄存器
    • 2.1 SSC寄存器位型
    • 2.2 配置寄存器校验和
    • 2.3 寄存器说明
      • 2.3.1 状态寄存器
      • 2.3.2 激活状态寄存器
      • 2.3.3 角度值寄存器
      • 2.3.4 角速度寄存器
      • 2.3.5 角度转数寄存器
      • 2.3.6 帧同步寄存器
      • 2.3.7 接口模式1 寄存器
      • 2.3.8 SIL 寄存器
      • 2.3.9 接口模式2 寄存器
      • 2.3.10 接口模式3 寄存器
      • 2.3.11 X偏移寄存器
      • 2.3.12 Y偏移寄存器
      • 2.3.13 同步性寄存器
      • 2.3.14 IFAB寄存器(多功能)
      • 2.3.15 接口模式 4 寄存器(多功能)
      • 2.3.16 温度系数寄存器
      • 2.3.17 X原始值寄存器
      • 2.3.18 Y原始值寄存器
      • 2.3.19 增量式计数寄存器
    • 2.4 通信示例(SSC 命令)
      • 2.4.1 读角度值
      • 2.4.2 读角速度和角转数
      • 2.4.3修改接口模式2 寄存器
    • 2.5 引信值
  • 三、代码示例

前言

  TLE5012B 角度传感器基于 iGMR 技术,可检测平行于封装表面磁场 360°变 化。可应用于汽车和工业领域里转角位置检测如方向盘转角,电机位置等。
  TLE5012B 内部集成角度计算模块,可以将原始值(sine 和 cosine)进行数字处理后输出绝对角度。集成自动标定和温度补偿功能,在温度范围和寿命周期里可以达到 1°精度。汽车级认证,可工作在-40℃至 150℃范围。
  TLE5012B 具备极其精确的角度分辨率(15bit)以及快速的信号处理能力和较短的延时/更新率,极其适合精确测定高动态应用中的转子位置。同时TLE5012B 具有先进的诊断功能及安全特性,确保了产品高可靠性。


一、通信协议

  TLE5012B支持多种通讯协议,即SSC(Synchronous Serial Communication)协议, PWM( Pulse-Width-Modulation)协议,SPC(Short-PWM-Code ,兼容SENT协议)协议,HSM(Hall Switch Mode)模式以及IIF(Incremental Interface)协议。本文主要介绍SSC和IIF协议。
  TTLE5012B出厂时预标定了寄存器配置,用户可以在不作修改或者很少修改寄存器配置情况下使用。TLE5012B主要有四种版本,即:TLE5012B E1000 SSC+IIF;TLE5012B E3005 SSC+HSM;TLE5012B E5000 SSC+PWM;TLE5012B E9000 SSC+SPC。用户可以根据需要选择合适版本,限于篇幅,本文主要介绍SSC和IIF协议。

1.1 SSC 协议

  TLE5012B SSC 为三线制协议,允许双向通讯,兼容 SPI 协议。可以通过 SSC协议读取 TLE5012B 内部寄存器数据(如角速度、角度原始数值、温度等)以及配置寄存器(如解析度、自动标定,工作模式等)。SSC 允许高速数据传输,波特率为 8Mbit/s。一个总线上最多允许 4 个 TLE5012B 进行通讯。SSC 通讯距离较短,建议在 30cm 以内,所以适合板间通讯。
  TLE5012B SSC数据传输方式为半双工,因此当和四线制SPI接口通讯时, MCU SPI接口数据发送和数据接收脚需要同时连接到TLE5012B data脚上。当TLE5012B向MCU传输数据时,MCU的数据发送脚需要拉高。反之,当MCU向TLE5012B发送命令时,MCU的数据接收脚需要拉高。
  SSC传输信息包含命令,数据以及安全信息。信号传输时CSQ需要拉低,并提供SCK信号。可以通过SSC协议读取以及配置TLE5012B内部寄存器数据。如图3所示为MCU通过SSC读取TLE5012B内部寄存器角度信息。MCU向TLE5012B发送8021H,经过twr_delay延迟后,TLE5012B会返回角度信息及状态信息。
  MCU通过SSC配置TLE5012B内部寄存器MOD_2。MCU发送命令5081H,修改MOD_2寄存器内容为809H。 经过twr_delay延迟后,TLE5012B会返回状态信息。当安全信息传输完毕后,下一个数据传输前片选信号CSQ需要退出然后再拉低。

1.2 IIF协议

  IIF协议可用于模拟光电编码通讯,包含IFA,IFB以及IFC三条单向通讯信号。可以取代光电编码器,用于高速电机位置检测。IIF增量编码信号为输出占空比50%的矩形波,每一个波形代表最小角度解析度,可以通过SSC接口配置成9 bit(每一圈512个脉冲信号)到12 bit(每一圈4096个脉冲信号)解析度,MCU通过计算IIF 信号脉冲数可以知道电机位置信息。
  TLE5012B E1000有两种IIF工作模式,即A/B Mode以及Step/Direction Mode。
  当为 A/B Mode时,其中 IFA 和 IFB 输出脉冲代表角度信息,两个信号相位相差 90°。根据 A 相位是否超前 B 相位判定电机转动方向。IFC 代表零点位置
  TLE5012B E1000 默认 IIF 协议为 A/B Mode,可以通过 SSC 配置为Step/Direction Mode。当为 Step/Direction Mode,其中 IFA 输出增量信号代表角度信息,IFB 代表方向信息,而 IFC 代表零点位置。
  TLE5012B 内部 14 位计数器(IIF_CNT)可用于增量编码计数,能够记录一整圈从 0 到 16383 个脉冲, 可用于 MCU 和传感器之间数据同步。取决于内部寄存器设置(IIF 解析度 9bit~12bit),同步时 IIF_CNT 需减掉 2 至 5 个 LSB 数据。
  当 TLE5012B E1000 上电后,电机还没有开始转动,TLE5012B IIF 脚会输出一定脉冲数,此为 TLE5012B E1000 启动特性,MCU 通过计算脉冲数可获得TLE5012B 起始位置绝对角度信息。
即:起始位置绝对角度=脉冲数*180°/2H
  起始位置脉冲最大数目在 180°位置,此时有 2048 个脉冲。如果 IFA 相位在 IFB 相位之前,则该角度在 0°和 180°之间。如果 IFB 相位在 IFA 相位之前,则角度在 180°和 360°之间。起始位置脉冲结束后,TLE5012B 进入正常工作模式。

1.3 其他协议

  PWM通讯协议为单向通讯方式,解析度为12bit,有四种工作频率,即:0.2KHz,0.5KHz,1KHz以及2KHz,可通过SSC接口配置工作频率。占空比代表角度信息,其中占空比在0-6.25%以及93.75-100%区间用于诊断。占空比在6.25%-93.75%区间代表角度。PWM通讯距离可到5m。
  SPC 协议兼容 SENT 协议,连续的两个下降沿之间的时间长度代表着 4bit 数据。不同的是 SPC 允许双向通讯,且通讯时 MCU 需要给 TLE5012B 发送一个触发信号以唤醒其传输角度信息。除角度信息外,还可传输温度信息。可通过 SSC接口配置解析度为 12bit 或者 16bit。一个总线上最多允许 4 个 TLE5012B 进行通讯。SPC 通讯距离可到 5m。
  HSM模式可模拟三个霍尔开关,用于电机块换向。HSM包含三个单向通讯接口,默认极对数为5,可通过SSC接口配置极对数等参数。

二、SSC寄存器

2.1 SSC寄存器位型

传感器TLE5012B使用_第1张图片

2.2 配置寄存器校验和

  为监控传感器配置的完整性,TLE5012B 对 08H 至 0FH 地址范围内的配置寄存器进行循环冗余检查。8 位 CRC 存储在寄存器 CRC_PAR(地址 0FH)中。对这些寄存器中的一个或多个寄存器进行修改时,利用 TLE5012B 数据手册提供的生成器多项式计算寄存器 08H 至 0FH 的新校验和,然后将其写入 CRC_PAR 寄存器。否则会发生 CRC 失 败错误(状态位 S_FUSE = 1)。 将寄存器 AS_FUSE 设为 0 就可以禁用 CRC 检查。启用自动校准后,CRC 检查自 动禁用,因为自动校准会对数个配置寄存器进行周期性调节。

2.3 寄存器说明

2.3.1 状态寄存器

  1. 读出后复位为“0”
  2. 复位后比特位为“1”,直至状态寄存器被读取。

传感器TLE5012B使用_第2张图片
传感器TLE5012B使用_第3张图片
传感器TLE5012B使用_第4张图片

2.3.2 激活状态寄存器

传感器TLE5012B使用_第5张图片
传感器TLE5012B使用_第6张图片

2.3.3 角度值寄存器

传感器TLE5012B使用_第7张图片

2.3.4 角速度寄存器

传感器TLE5012B使用_第8张图片

2.3.5 角度转数寄存器

传感器TLE5012B使用_第9张图片

2.3.6 帧同步寄存器

传感器TLE5012B使用_第10张图片

2.3.7 接口模式1 寄存器

传感器TLE5012B使用_第11张图片
传感器TLE5012B使用_第12张图片

2.3.8 SIL 寄存器

传感器TLE5012B使用_第13张图片
传感器TLE5012B使用_第14张图片

2.3.9 接口模式2 寄存器

自动校准只对 ANG_RANGE = 080H 有效

传感器TLE5012B使用_第15张图片
传感器TLE5012B使用_第16张图片

2.3.10 接口模式3 寄存器

  1. 工厂校准,令 0° 方向与芯片边缘平行。
  2. 手动设置 0° 位置,将磁体旋转到想要的位置,然后读取 AVAL 寄存器,减少3 个 LSB 以获取一个 12 位角度值;然后从
    ANG_BASE 寄存器中减去这个值。

传感器TLE5012B使用_第17张图片
传感器TLE5012B使用_第18张图片

2.3.11 X偏移寄存器

传感器TLE5012B使用_第19张图片

2.3.12 Y偏移寄存器

传感器TLE5012B使用_第20张图片

2.3.13 同步性寄存器

传感器TLE5012B使用_第21张图片

2.3.14 IFAB寄存器(多功能)

传感器TLE5012B使用_第22张图片
传感器TLE5012B使用_第23张图片

2.3.15 接口模式 4 寄存器(多功能)

  1. 若启用自动校准,TCO_X_T 会被自动设定为 0。一旦禁用自复位:基于导数信校准值被加载到 TCO_X_T 中。
  2. 在 SPC 接口配置中,传感器只会在 IFA 引脚收到 SPC 触发脉冲后更新 AVAL 寄存器。

传感器TLE5012B使用_第24张图片
传感器TLE5012B使用_第25张图片
传感器TLE5012B使用_第26张图片

2.3.16 温度系数寄存器

若启用自动校准,TCO_Y_T 会被自动设定为 0。一旦禁用自动校准,激光引信校准值被加载到 TCO_Y_T 中。

传感器TLE5012B使用_第27张图片

2.3.17 X原始值寄存器

传感器TLE5012B使用_第28张图片

2.3.18 Y原始值寄存器

传感器TLE5012B使用_第29张图片

2.3.19 增量式计数寄存器

传感器TLE5012B使用_第30张图片

2.4 通信示例(SSC 命令)

2.4.1 读角度值

传感器TLE5012B使用_第31张图片

2.4.2 读角速度和角转数

传感器TLE5012B使用_第32张图片

2.4.3修改接口模式2 寄存器

传感器TLE5012B使用_第33张图片

2.5 引信值

关于配置寄存器基于导数的复位(存储在传感器的激光引信中)
传感器TLE5012B使用_第34张图片

三、代码示例

SPI读写函数

uint SPI_ReadWriteByte(uint temp_data)
{
	uint u16Data1 = 0,u16Data2 = 0;
	
	my_Timer.U16_Timer_Out_SPI = 10;//2;
	SPDAT = ((temp_data >> 8) & 0xFF);      //发送测试数据
	while ((!(SPSTAT & 0x80)) && my_Timer.U16_Timer_Out_SPI );               //查询完成标志
	SPSTAT = 0xc0;                          //清中断标志
	u16Data1 = SPDAT;
	
	SPDAT = (temp_data & 0xFF);             //发送测试数据
	while ((!(SPSTAT & 0x80)) && my_Timer.U16_Timer_Out_SPI );               //查询完成标志
	SPSTAT = 0xc0;                          //清中断标志
	u16Data2 = SPDAT;
	
	if(my_Timer.U16_Timer_Out_SPI == 0)		//SPI通讯超时
	{
		spi.err.Bit.timeOut = 1;
		u16Data1 = 0;
		u16Data2 = 0;
	}
	else
	{
		spi.err.Bit.timeOut = 0;
		spi.errCount = 0;
	}
	
	return ((u16Data1 << 8) + u16Data2);
	
}

读取TLE5012信息

uint ReadValue(uint u16RegValue)
{
	//static uint u16Data1,u16Data2,u16Data;
	uint u16Data = 0;
	uint crcValue = 0;
	
	do
	{
		SPCTL |= 0x40;
		NSS_SPI_CS_L;
		SPI_ReadWriteByte(u16RegValue);		//发送读命令
		SPI_MOSI_OFF;
		u16Data=SPI_ReadWriteByte(0xffff);	//读SPI返回数值
		SPI_MOSI_OFF;
		spi.crcVal = SPI_ReadWriteByte(0xffff) & 0xFF;		//读TLE5012返回安全字
		NSS_SPI_CS_H;
		SPI_MOSI_ON;
		SPCTL &= (~0x40);
		
		spi.crcData[0] = (uint8)(u16RegValue >> 8);
		spi.crcData[1] = (uint8)(u16RegValue & 0xFF);
		spi.crcData[2] = (uint8)(u16Data >> 8);
		spi.crcData[3] = (uint8)(u16Data & 0xFF);
		
		crcValue = SPI_CRC8((unsigned char *)spi.crcData , 4);
		
		if(spi.crcVal != crcValue)
		{
			spi.err.Bit.checkFail = 1;
			u16Data = 0x0000;
			spi.errCount++;
		}
		else
		{
			spi.err.Bit.checkFail = 0;
			spi.errCount = 0;
		}
		
		if(spi.errCount >= 3)
		{
			spi.err.Bit.comErr = 1;
			break;
		}
	}while(spi.err.Bit.checkFail !=  0);
	
	return (u16Data);
}

配置TLE5012寄存器

uint WriteValue(uint u16RegValue,uint u16DataValue)
{
	static uint u16Safe = 0;
	uint16 crcValue = 0;
	
	do
	{
		SPCTL |= 0x40;
		NSS_SPI_CS_L;
		SPI_ReadWriteByte(u16RegValue);		//发送命令字
		SPI_ReadWriteByte(u16DataValue);	//发送数据字
		SPI_MOSI_OFF;
		u16Safe=SPI_ReadWriteByte(0xffff);	//读TLE5012返回安全字
		NSS_SPI_CS_H;
		SPI_MOSI_ON;
		SPCTL &= (~0x40);
		
		spi.crcData[0] = (uint8)(u16RegValue >> 8);
		spi.crcData[1] = (uint8)(u16RegValue & 0xFF);
		spi.crcData[2] = (uint8)(u16DataValue >> 8);
		spi.crcData[3] = (uint8)(u16DataValue & 0xFF);
		
		crcValue = SPI_CRC8((unsigned char *)spi.crcData , 4);
		spi.crcVal = u16Safe & 0xFF;
		if(spi.crcVal != crcValue)
		{
			spi.err.Bit.checkFail = 1;
			//u16Data = 0x0000;
			spi.errCount++;
		}
		else
		{
			spi.err.Bit.checkFail = 0;
			spi.errCount = 0;
		}
		
		if(spi.errCount > 3)
		{
			spi.err.Bit.comErr = 1;
			break;
		}
	}while(spi.err.Bit.checkFail !=  0);
	
	
	return (u16Safe);
}

TLE5012的CRC校验

//CRC对照表
const unsigned char SPI_TableCRC[256] = 
{
	//The ¡°crc¡± of the position [1] (result from operation [crc ^*(message+Byteidx)])
	//is 0x00 -> 0x00 XOR 0x11D = 0x00 (1 byte).
	0x00,
	//The ¡°crc¡± of the position [2] is 0x1D -> 0x01 XOR 0x11D = 0x1D (1 byte).
	0x1D,
	//The ¡°crc¡± of the position [3] is 0x3A -> 0x02 XOR 0x11D = 0x3A (1 byte).
	0x3A,
	//For all the rest of the cases.
	0x27, 0x74, 0x69, 0x4E, 0x53, 0xE8, 0xF5, 0xD2, 0xCF, 0x9C, 0x81, 0xA6, 0xBB, 0xCD,
	0xD0, 0xF7, 0xEA, 0xB9, 0xA4, 0x83, 0x9E, 0x25, 0x38, 0x1F, 0x02, 0x51, 0x4C, 0x6B,
	0x76, 0x87, 0x9A, 0xBD, 0xA0, 0xF3, 0xEE, 0xC9, 0xD4, 0x6F, 0x72, 0x55, 0x48, 0x1B,
	0x06, 0x21, 0x3C, 0x4A, 0x57, 0x70, 0x6D, 0x3E, 0x23, 0x04, 0x19, 0xA2, 0xBF, 0x98,
	0x85, 0xD6, 0xCB, 0xEC, 0xF1, 0x13, 0x0E, 0x29, 0x34, 0x67, 0x7A, 0x5D, 0x40, 0xFB,
	0xE6, 0xC1, 0xDC, 0x8F, 0x92, 0xB5, 0xA8, 0xDE, 0xC3, 0xE4, 0xF9, 0xAA, 0xB7, 0x90,
	0x8D, 0x36, 0x2B, 0x0C, 0x11, 0x42, 0x5F, 0x78, 0x65, 0x94, 0x89, 0xAE, 0xB3, 0xE0,
	0xFD, 0xDA, 0xC7, 0x7C, 0x61, 0x46, 0x5B, 0x08, 0x15, 0x32, 0x2F, 0x59, 0x44, 0x63,
	0x7E, 0x2D, 0x30, 0x17, 0x0A, 0xB1, 0xAC, 0x8B, 0x96, 0xC5, 0xD8, 0xFF, 0xE2, 0x26,
	0x3B, 0x1C, 0x01, 0x52, 0x4F, 0x68, 0x75, 0xCE, 0xD3, 0xF4, 0xE9, 0xBA, 0xA7, 0x80,
	0x9D, 0xEB, 0xF6, 0xD1, 0xCC, 0x9F, 0x82, 0xA5, 0xB8, 0x03, 0x1E, 0x39, 0x24, 0x77,
	0x6A, 0x4D, 0x50, 0xA1, 0xBC, 0x9B, 0x86, 0xD5, 0xC8, 0xEF, 0xF2, 0x49, 0x54, 0x73,
	0x6E, 0x3D, 0x20, 0x07, 0x1A, 0x6C, 0x71, 0x56, 0x4B, 0x18, 0x05, 0x22, 0x3F, 0x84,
	0x99, 0xBE, 0xA3, 0xF0, 0xED, 0xCA, 0xD7, 0x35, 0x28, 0x0F, 0x12, 0x41, 0x5C, 0x7B,
	0x66, 0xDD, 0xC0, 0xE7, 0xFA, 0xA9, 0xB4, 0x93, 0x8E, 0xF8, 0xE5, 0xC2, 0xDF, 0x8C,
	0x91, 0xB6, 0xAB, 0x10, 0x0D, 0x2A, 0x37, 0x64, 0x79, 0x5E, 0x43, 0xB2, 0xAF, 0x88,
	0x95, 0xC6, 0xDB, 0xFC, 0xE1, 0x5A, 0x47, 0x60, 0x7D, 0x2E, 0x33, 0x14, 0x09, 0x7F,
	0x62, 0x45, 0x58, 0x0B, 0x16, 0x31, 0x2C, 0x97, 0x8A, 0xAD, 0xB0, 0xE3, 0xFe,
	//The ¡°crc¡± of the position [255] is 0xD9 -> 0xFE XOR 0x11D = 0xD9 (1 byte).
	0xD9,
	//The ¡°crc¡± of the position [256] is 0xC4 -> 0xFF XOR 0x11D = 0xC4 (1 byte).
	0xC4
};

//配置
unsigned char SPI_CRC8(unsigned char *message, unsigned char Bytelength )
{
	//¡°crc¡± defined as the 8-bits that will be generated through the message till the
	//final crc is generated. In the example above this are the blue lines out of the
	//XOR operation.
	unsigned char crc;
	//¡°Byteidx¡± is a counter to compare the bytes used for the CRC calculation and
	//¡°Bytelength¡±.
	unsigned char Byteidx;
	//Initially the CRC remainder has to be set with the original seed (0xFF for the TLE5012B).
	crc = 0xFF;
	//For all the bytes of the message.
	for(Byteidx=0; Byteidx<Bytelength; Byteidx++)
	{
		//¡°crc¡± is the value in the look-up table TableCRC[x] at the position ¡°x¡±.
		//The position ¡°x¡± is determined as the XOR operation between the previous ¡°crc¡± and
		//the next byte of the ¡°message¡±.
		//¡°^¡± is the XOR operator.
		crc = SPI_TableCRC[crc ^ *(message+Byteidx)];
	}
	//Return the inverted ¡°crc¡± remainder(¡°~¡± is the invertion operator). An alternative
	//to the ¡°~¡± operator would be a XOR operation between ¡°crc¡± and a 0xFF polynomial.
	return(~crc);
}

你可能感兴趣的:(单片机,单片机)