TLE5012B磁编码器 - 用户手册摘要&解析

TLE5012B磁编码器 - 用户手册摘要&解析

官网:

TLE5012B E1000 - Infineon Technologies

用户手册:

https://www.infineon.com/dgdl/Infineon-Angle_Sensor_TLE5012B-UM-v01_02-en-UM-v01_02-EN.pdf?fileId=5546d46146d18cb40146ec2eeae4633b

MGE - 角度位置和范围

image-20240201173105282

image-20240201173116865

MGE - 校准

image-20240201175648123

image-20240201175730507

image-20240201175742407

自动校准使在线参数计算,因此减少角度误差由于温度和TLE5012B是一种预校准传感器;

在启动时,存储在激光引信中的参数被加载到触发器中。在工作过程中,TLE5012B需要1.5转才能产生新的自动校准参数。参数根据通过AUTocAL位(模式2寄存器)选择的模式更新新的自动校准参数。参数以平滑的方式更新,以避免输出上的角度跳跃;在选择的范围或时间内,只会改变一个LSB (Least-Significant Bit)。一旦参数更新,新的自动校准参数生成开始,因为自动校准是连续进行的。

AUTOCAL模式:

00:无自动校准

01:自动校准模式参数在每次更新时间(取决于FIR_MD设置)由一个LSB更新,直到达到新的自动校准参数值。

10:自动校准模式参数仅由一个LSB更新。更新后,自动校准将再次计算新参数。

11:自动校准模式在11.25°的每个角度范围内更新一个LSB参数,直到达到新的自动校准参数值。


图4-3 自动校正参数自动校准模式1是校正参数最快的模式。模式2是最慢的方法,但由于参数仅以一位数字更新,因此它提供了对损坏的最大值-最小值对的鲁棒性(例如,在尖峰的情况下)。

Autocalibration可用性条件:

自动校准算法依赖于传感元件的原始X和y信号的最大值和最小值的收集,因此它适用于转子连续转动(完整360°旋转)的应用。为了避免温度漂移引起的误差,只有在温度变化不超过5开尔文的情况下,才从这些最小值和最大值计算偏移和幅度同步误差的补偿参数。为了使传感器在自动校准模式下准确,必须确保在应用中经常更新校准参数。因此,自动校准只应用于在温度恒定在5开尔文内的情况下,磁铁定期旋转至少一个完整匝(内部TLE5012B检查完整匝需要最大1.5转)。

启用/禁用自动校准:

当开启或关闭自校准开关时,TLE5012B可能会在状态寄存器中错误触发S_FUSE错误位,这是一个配置CRC错误,并且在SSC通信的安全字中永久显示。当自动校准是ON并且必须禁用时:在禁用自动校准之前,为自动校准写正确的CRC。这样,当第一次运行时CRC检查再次完成时,传感器将看到一致的状态,并且不会发生CRC错误。正确的CRC必须在微控制器端计算。当自动校准为OFF并且必须启用或刚刚重新启动时:在切换自动校准模式ON后,应该在三个更新周期后通过SSC读取状态寄存器,并且应该忽略发生的S_FUSE错误。

image-20240201181249743

image-20240201181411104

image-20240201181424539

MGE - 修改默认参数

如果启用了自动校准,则更改TLE5012B的默认配置在启用自动校准时更改某些TLE5012B默认配置可能导致自动校准参数损坏

因此,在改变角度方向(MOD_2寄存器上的ANG_DIR位),预测(MOD_2寄存器上的PREDICT位)或角度基(MOD_3寄存器上的ANG_BASE位)之前禁用自动校准。一旦这些参数被改变,再次启用自动校准。

改变角度方向的初始化顺序如表4-1所示。该序列也适用于预测和角基。在角基的情况下,为了重新配置新的角基值,需要在第一次写入之后进行额外的写入。

image-20240201180927519

image-20240201181125069

MGE - 角度超前预测

TLE5012B带有角度超前预测,使用角度超前预测可以一定程度上弥补控制延时,控制延时可能有采样率,MCU的处理控制时间

在控制系统中角度的采样到处理输出有一段时间,这一段时间电机也会移动,等到输出时,电机已经不是之前的位置,进而影响系统性能

使用超前预测可以进一步提升系统的响应性能

PS:需要注意预测模式在过零情况时的处理

页面提取自-Infineon-Angle_Sensor_TLE5012B-UM-v01_02-en-UM-v01_02-EN.pdf

MGE - SPI 通信

	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // SPI1--双线全双工!!
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;				   // 16位数据
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;						   // CPOL=0
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;					   // CPHA=1
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;						   // NSS 信号由软件管理
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; // 8--9MHz
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
	SPI_InitStructure.SPI_CRCPolynomial = 7; // CRC 值计算的多项式
	SPI_Init(SPI1, &SPI_InitStructure);
	SPI_Cmd(SPI1, ENABLE);

时序 - 物理

时序要求:TLE5012B

image-20231229143424408

数据 - 通信

image-20240201184622106

命令字段

TLE5012B与微控制器之间的通信通常由命令字发起。的命令字的结构如表5-4所示,其中Update (UPD)位允许访问当前值或更新值。如果发出更新命令并设置了UPD位,则立即值将同时存储在更新缓冲区中。这样可以同时对所有必要的系统参数进行快照。具有更新缓冲区的位在寄存器描述的Type列中用“u”标记。第35页描述了这种更新的初始化。

image-20240201184738070

image-20240201184745754

安全字段

image-20240201184831332

BIT类型

image-20240201184932269

MGE - 寄存器表

有22个记录在案的寄存器,但只有少数与读取数据或配置TLE5012B相关。许多额外的特性也被记录下来,可能只在非常特殊的情况下使用。在下面的位图中,可以识别出相关的位。

最重要的部分是用绿色、橙色和灰色标出的部分。

  • 绿色位包含计算数据;亮绿色的部分是额外的数据,可能只与某些特定的应用程序相关。
  • 橙色位是配置参数,如果默认值不符合要求,可以修改配置参数。
  • 如果将几个设备(传感器)连接到同一个主机(微控制器),则暗橙色位是相关的。
  • 灰色部分与诊断有关,以满足功能安全的要求。
  • 黄色位用于自动校准和校准值。
  • 最后,如果需要,紫色位标记可以配置的额外功能。

image-20240201182232940

image-20240201182505556

image-20240201182555979

image-20240201182704951

image-20240201182712946

AVAL 角度数据 寄存器

image-20240815150934999

如何正确计算角度数据

默认情况下,角度范围(ANG_RANGE)被设置位0x080,也就是正负180度

直接将原始角度数据 0 ~ 32767 映射到 0° ~ 360° 上可能会出问题

数据类型是 有符号的15位数据(补码),不能够直接放入计算机进行计算,因此需要将15位数据转化成16位数据进行计算

转换思路:将带有15位角度数据的 uint16_t 数据进行移位使其变成 16位数据,此时由于是 uint16_t 无符号类型,所有编译器会进行逻辑移位(数据不会改变),然后将其强制转换为 int16_t ,再进行右移。由于此时数据已经强制转化为有符号的16位数据,进行右移就是算术右移,也就是除以2。最终得到的就是扩充到16位的角度数据

转换程序:(转换程序描述了 15位角度数据所有可能的情况,并将其转化为角度,输出到txt文件中)

#include <stdio.h>
#include <stdint.h>

FILE *fpout = NULL;

//存入原始角度数据
uint16_t angleVel = 0x0;
int16_t angleVel_16 = 0;
int main(){
    fpout = fopen("TLE5012B_AngleTest.txt", "w+");
    float angle ;
    for(angleVel=0;angleVel<0x7FFF;angleVel++){
       	//核心部分
        angleVel_16 = ((int16_t)(angleVel << 1)) >> 1;
        angle = 360.0f/(1<<15) * angleVel_16;
        fprintf(fpout, "%f\n", angle);
        // printf("%f\n",angle);
    }
    fclose(fpout);
}
posted @ 2025-05-07 14:46  c17VV  阅读(946)  评论(0)    收藏  举报