使用 ALS31300 霍尔效应 IC 进行 3D 线性或 2D 角度感应
作者: Wade Bussing 和 Robert Bate
Allegro MicroSystems, LLC
摘要
本应用注释介绍了将 Allegro MicroSystems 的 ALS31300 3D 线性霍尔效应传感器集成电路 (IC) 用于 3D 线性感应和 2D 角度感应应用。详细的示例包括将寄存器内容转换为高斯度量以进行线性感测,并组合来自两个轴的数据以计算旋转角度感测的角度。其他章节通过 I2C 接口、应用程序示意图,以及关联的 Arduino 示例代码说明读取和写入 ALS31300 寄存器的流程。请见附件 A 了解所有源代码,包括 Arduino .ino 草图文件。Arduino .ino 草图文件还在 Allegro 软件门户上提供。
简介
ALS31300 3D 线性霍尔效应传感器 IC 为用户提供针对非接触式线性和角度位置传感的准确、低成本的解决方案。通过 I2C 接口,ALS31300 在单一总线上提供来自多个传感器的角度和线性信息(见图 1)。
本应用说明中列出的例子利用 “Teensy” 3.2 微控制器 (https://www.pjrc.com/teensy/teensy31.html) 和 Arduino (https://www.arduino.cc/) 软件环境。虽然本文件侧重于利用 Teensy 3.2 的实施,但操作方法和示例代码可直接用于其他 Arduino 开发板。
I2C 概览
I2C 总线是同步的双线串行通信协议,提供两到多个设备之间的全双工接口。总线指定两种逻辑信号:
- 主设备的串行时钟线 (SCL) 输出。
- 主设备或从设备的串行数据线 (SDA) 输出。
图 1 中显示的区块图展示了 I2C 总线拓扑结构。
数据传输
数据在 I2C 上的传输包含以下步骤。
- 开始条件:由 SDA 线的下降沿定义,在 SCL 较高时由主设备发起。
- 地址循环:7 位从地址,加一个说明写 (0) 或读 (1) 的位,然后是一个应答位。
- 数据循环:读取或写入 8 位数据,然后是一个应答位。这个循环可以针对多字节数据传输而重复。写的第一个数据字节可能是寄存器地址。请见以下部分了解更多信息。
- 停止条件:由 SDA 线的上升沿定义,在 SCL 高电平时发起。
除了指示开始或停止条件之外,SDA 必须在时钟信号高电平时保持稳定。SDA 只能在 SCL 低电平时改变状态。开始或停止条件可以在数据传输的任何时候发生。ALS31300 将始终通过重设数据传输序列响应读或写请求。
时钟信号 SCL 由主设备生成,而 SDA 线起到输入或开漏输出的作用,具体视数据传输的方向而定。图 2 所示的时序图说明了 I2C 总线的时序。ALS31300 数据表提供这些名称的信号参考和定义。
I2C 总线速度
常见的 I2C 总线速度是标准模式 100 kbps,低速模式 10 kbps,但也允许使用其他较低的时钟频率。I2C 协议的近期修订版本可以装载
更多节点,以更高速度运转,包括快速模式 400 kbps 和超快模式 (Fm+) 1 Mbps,而这些速度都受到 ALS31300 支持。请注意,规格说明书还列出了 ALS31300 不支持的高速模式 3.4 Mbps。
使用 ALS31300 实施 I2C
ALS31300 仅作为 I2C 从设备运行,因此不能在 I2C 总线上发起任何事务。
ALS31300 将始终通过重设数据传输序列响应读或写请求。读/写位状态设为低 (0) 则表示写循环,高 (1) 则表示读循环。主设备监测应答位,以确认从设备 (ALS31300) 响应主设备发送的地址字节。ALS31300 将 7 位从地址解读为有效时,将通过在第九个时钟循环拉低 SDA 来应答。主设备请求数据写入时,ALS31300 在时钟循环期间拉低 SDA,然后通过一个数据字节表示数据已经成功接收。发送地址字节或数据字节后,主设备必须在第九次时钟循环之前释放 SDA 线,允许握手过程发生。
ALS31300 的默认从地址是 110xxxx,四个 LSB 位通过对地址引脚 ADR0 和 ADR1 应用不同电压而设置。在本演示中,两个地址引脚都设为接地,如图 11 所示。如需了解选择其他 I2C 从地址的信息,请参阅 ALS31300 数据表。两个地址引脚都接地时,默认 I2C 从地址为 96。
写循环概览
ALS31300 上访问寄存器的写循环如下文所示。
- 主设备发起开始条件
- 主设备发送 7 位从地址和写位 (0)
- 主设备等待 ALS31300 的 ACK
- 主设备发送 8 位寄存器地址
- 主设备等待 ALS31300 的 ACK
- 主设备发送 31:24 位数据
- 主设备等待 ALS31300 的 ACK
- 主设备发送 23:16 位数据
- 主设备等待 ALS31300 的 ACK
- 主设备发送 15:8 位数据
- 主设备等待 ALS31300 的 ACK
- 主设备发送 7:0 位数据
- 主设备等待 ALS31300 的 ACK
- 主设备发起停止条件
I2C 写序列在下文图 3 的时序图中进一步说明。
客户写入权限
在 ALS31300 中写入任何易失性寄存器或 EEPROM 之前,必须向设备发送存取代码。如果未启用客户存取模式,则不允许对设备写入。这一规则的唯一例外是 SLEEP 位,其可以随意写入,无视存取模式。此外,任何寄存器或 EEPROM 位置都可以随时读取,无视存取模式。
如需进入客户存取模式,必须通过 I2C 接口发送存取命令。该命令包含连续的写入操作,以及地址和数据值,如表 1 所示。代码输入的时间无限制。进入客户存取模式后,必须反复开关设备电源才能更改存取模式。
表 1:客户存取代码
存取模式 | 地址 | 数据 |
客户存取 | 0x24 | 0x2C413534 |
读循环概览
ALS31300 上访问寄存器的读取循环如下文所示。
- 主设备发起开始条件
- 主设备发送 7 位从地址和写位 (0)
- 主设备等待 ALS31300 的 ACK
- 主设备发送 8 位寄存器地址
- 主设备等待 ALS31300 的 ACK
- 发起开始条件。这次称为重启条件
- 主设备发送 7 位从地址和读位 (1)
- 主设备等待 ALS31300 的 ACK
- 主设备接收 31:24 位数据
- 主设备发送 ACK 到 ALS31300
- 主设备接收 23:16 位数据
- 主设备发送 ACK 到 ALS31300
- 主设备接收 15:8 位数据
- 主设备发送 ACK 到 ALS31300
- 主设备接收 7:0 位数据
- 主设备发送 NACK 到 ALS31300
- 主设备发起停止条件
I2C 读序列在下文图 4 的时序图中进一步说明。
图 4 中的时序图显示传输单个寄存器位置的整个内容(位 31:0)。另外,I2C 主设备还可以选择用 ACK 替换 NACK,这将允许读序列继续。这种情况将导致从以下寄存器(地址 + 1)传输内容(位 31:24)。然后,主设备可以继续应答或发布非应答(NACK)或在任何字节之后停止,以停止接收数据。
请注意,读取仅需要初始寄存器位置,因此可更快进行数据检索。然而,在使用单个读取命令时,这回将数据检索限制于序列寄存器。主设备提供非应答位和停止位时,ALS31300 停止发送数据。如果要读取非序列寄存器,则必须发送单独的读取命令。
针对 X、Y、Z 和温度数据的 I2C 回读模式
ALS31300 I2C 控制器有若干模式,可方便地反复轮询 X、Y、Z 和温度数据。这些选项包括单一模式、快速循环模式和完整循环模式。
单一模式
向寄存器发出的单个写或读命令——这是默认模式,最适合设置字段和读取静态寄存器。如有需要,这个模式可以被用于以典型的串行方式读取 X、Y、Z 和温度数据,但如需快速检索数据,建议使用快速循环模式或完整循环模式。
快速循环模式
快速循环可持续读取 X、Y、Z 和温度数据,但限于 X、Y、Z 的前 8 位和温度的前 6 位。这个模式是牺牲截断分辨率而从 IC 高效读取数据的模式。图 5 的流程图说明了快速循环模式。
完整循环模式
完整循环模式可持续读取 12 位全分辨率 X、Y、Z 和温度数据。如用户需要以更快的速度读取全分辨率的 X、Y、Z 和温度数据,则建议使用这个模式。图 6 的流程图说明了完整循环模式。
表 2 进一步说明了循环模式。
表 2:ALS31300 循环读取模式
代码(二进制) | 模式 | 描述 |
00 | 单 | 无循环。与默认 I2C 类似。 |
01 | 快速循环 | 循环读取 X、Y、Z 和温度字段。 循环读取 X、Y、Z 的 8 MSB,和温度的 6 MSB。 |
10 | 完整循环 | 循环读取 X、Y、Z 和温度字段。 循环读取 12 位全分辨率字段 。 |
11 | 单 | 与代码 0 相同。 |
如需设置读取循环模式,按照表 2 将地址 0x27 的 3:2 位设为所需代码。
磁场强度寄存器
磁场强度寄存器包含与 ALS31300 读取的三个轴测得的磁场成比例的数据。X、Y 和 Z 磁力数据的寄存器地址和位字段如表 3 所描述。X、Y 和 Z 轴的方向在图 7 中定义。
每个轴的 MSB 和 LSB 必须连接,以得出完整的 12 位磁场数据。参考附录 A,了解用于轮询并从 ALS31300 关联磁数据的各种技术的示例代码。
表 3:磁场强度寄存器
地址 | 位 | 名称 | 描述 | R/W |
0x28 | 31:24 | X 轴 MSB | 8 位信号与前 8 位 X 方向磁场强度成比例。 | R |
23:16 | Y 轴 MSB | 8 位信号与前 8 位 Y 方向磁场强度成比例。 | R | |
15:8 | Z 轴 MSB | 8 位信号与前 8 位 Z 方向磁场强度成比例。 | R | |
0x29 | 19:16 | X 轴 LSB | 4 位信号与后 4 位 X 方向磁场强度成比例。 | R |
15:12 | Y 轴 LSB | 4 位信号与后 4 位 Y 方向磁场强度成比例。 | R | |
11:8 | Z 轴 LSB | 4 位信号与后 4 位 Z 方向磁场强度成比例。 | R |
温度传感器寄存器
表 5 说明了 ALS31300 的温度寄存器。
表 4:温度寄存器
地址 | 位 | 名称 | 描述 | R/W |
0x28 | 5:0 | 温度 MSB |
6 位信号与前 6 位温度成比例 。 |
R |
0x29 | 5:0 | 温度 LSB |
6 位信号与后 6 位温度成比例 。 |
R |
计算测得字段
在这个例子中,ALS31300 的全量程为 500 高斯,灵敏度为 4 LSB/高斯。
首先对 MSB 和 LSB 寄存器进行完整的 8 字节读取,构成 12 位的符号二进制补码值。结合寄存器时,所有数据必须在一次 8 字节读取中读取,否则结果将为两个独立样本的组合。12 位数据按照表 5 合并。
表 5:MSB 和 LSB 合并数据
BIT | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
数据 | MSB 数据 | LSB 数据 |
假设完整的 8 字节读取对单个轴返回以下二进制数据:
MSB = 1100_0000
LSB = 0110.
合并数据 {MSB; LSB} = 1100_0000_0110。等价十进制数 = 1018,除以设备敏感性(4 LSB/高斯)即可转换为高斯值。
高斯 = –1018 LSB ÷ 4 LSB⁄G = –254 高斯
使用两个轴计算角度
外加磁场的角度可以使用 ALS31300 两个轴的磁性数据和四象限反正切函数计算。在这个例子中,一个盘式磁铁经过径向磁化。图 8 中的图纸说明冰球形磁铁及其磁极相对于 ALS31300 的 X、Y 和 Z 轴的参考方向。在左边的方向中,磁铁围绕 Z 轴旋转,如黑色箭头所示,同时通过 X 和 Y 感测磁力。在右边的方向中,磁铁围绕 Y 轴旋转,同时利用 X 和 Z 信道感测。第三个方向可以用于围绕 X 轴旋转、利用 Y 和 Z 感测的磁铁。
标准反正切函数,即 tan()-1,返回从 –90° 到 90° 的角度值。对于这个应用,需要使用四象限反正切函数返回 –180° 到 180° 的角度。此函数还可避免除以 0 的问题。表 6 列出了四象限反正切函数。
表 6:四象限反正切函数调用
程序 | 函数 | 描述 |
MATLAB | atan2(Y,X) | 四象限正切 -1。得出弧度。 |
atan2d(Y,X) | 四象限正切 -1。得出角度。 | |
ARDUINO | atan2(Y,X) | 四象限正切 -1。返回双重 |
atan2f(Y,X) | 四象限正切 -1。返回浮动。 | |
C# | Atan2(Y,X) | 四象限正切 -1。返回双重 |
请参阅附件 A 了解计算 XY、XZ 和 YZ 轴组合角度的所有 Arduino 源代码。
转换过程可以概括为 3 个主要步骤,如下所列。图 9 的范围图亦有指明。为简化例子,使用“单一模式“(表2)。
- 主设备发起读请求。
- 从设备传输 8 字节数据。
- 磁矢量数据转换为角度值。
读请求(方框 1)包含一次写入,说明将被读取的寄存器。设备返回(方框 2)8 字节数据,(X、Y、Z 的 8 MSB,温度的 6 MBS,然后是 X、Y、Z 的 4 LSB 和温度的 6 MSB)。
角度计算时间
使用 ALS31300 完成角度计算的总时间将视具体应用而变化,但主要由用户的微控制器的处理能力和速度决定。其他因素包括 ALS31300 的循环模式(表 2)和 I2C 接口的通信频率。这个文件中的定时例子假设 Teensy 3.2 微控制器以 72 MHz 的频率运行,且 I2C 通信频率配置为 1 MHz(快速模式 +)。请注意,Teensy 3.2 快速模式 + I2C 模式的运行频率约为 720 kHz。
图 9 的例子简单地说明了从 ALS31300 读取数据的情况,但不是最快的情况。通过在 ALS31300 上使用循环模式,在第一次请求后,即可消除发起读取(图 9 中的方框 1)的内部整理自检。
图 10 中的范围图显示 ALS31300 设置为完整循环模式时的角度转换流。方框 1、2 和 3 仍然与图 9 的相同步骤对应。
请注意,方框 1 仅出现了一次,但略长于图 9 中的无循环模式。在完整循环模式中,读请求包含一次写入,说明将被读取的寄存器,然后包含一次读/写,设置完整循环模式。请参阅附件 A 的完整源代码,了解如何实施无循环、快速循环和完整循环读取模式。
方框 3 中的重复暂停显示 Teensy 3.2 微控制器运行 atan2f(x,y) 函数所花费的时间。频率为 72 MHz 的 Teensy 3.2 上运行 atan2f(x,y) 函数的平均时长是 30 μs,而 8 数据字节的传输时间是 120 μs。使用 Teensy 3.2 和 ALS31300 的完整循环模式,每 150 μs 就可以计算一个新的角度值。
应用示意图
指图 11 中展示为 ALS31300 使用的应用示意图的图片。
Teensy 3.2 微控制器的支持电路如图 12 中的示意图所示。
指图 11 和图 12 中标记为 “SDA” 和 “SCL” 的网,说明两个示意图之间的连接。请注意,Teensy 微控制器上的 SDA 和 SCL 管脚位置由用户选择,但必须在软件中声明。指附件 A 中声明 SDA 和 SCL 管脚的源代码。
结论
ALS31300 是高度通用的微功率 3D 霍尔效应传感器 IC。该 IC 可用于多轴线性位置、或角度位置感测应用用,可配置为在高分辨率(12 位)或中等分辨率(8 位)模式下运转。I2C 总线可配置性高,可以在 1 Mbps 到 < 10 kbps 的总线速度下运转,上拉电压范围为 1.8 到 3.3 V。该 IC 还包含可以通过 I2C 接口读取的温度传感器。
与本应用说明一起使用的 Arduino .ino 草图文件在 Allegro 软件门户上提供。注册“ALS31300”设备以查看源代码。
附件 A:ALS31300 和 Teensy 3.2 的完整 Arduino 源代码
下面的片段显示与本应用一同使用的完整 Arduino 源代码。示例函数包括 I2C 初始化,在单一、快速和完整循环模式下从 ALS31300 读取,使用 I2C 写入数据到 ALS31300,以及使用 ALS31300 的磁力数据计算角度和高斯值。
完整的 Arduino 草图文件在 Allegro Microsystem 的软件门户 ALS31300 设备选项卡下提供。如需注册 Allegro 的软件门户,查看 ALS31300 源代码,请访问 https://registration.allegromicro.com/login。
附件 B:TEENSY 管脚说明书
下面的管脚说明书与 Teensy 3.2 一起发货。PJRS 还在以下链接提供:https://www.pjrc.com/teensy/card7a_rev1.pdf。
本文中所含的信息不构成 Allegro 就本文主题而对客户做出的任何表示、担保、确保、保证或诱导。本文所提供的信息并不保证基于此信息的流程的可靠性,亦不保证 Allegro 已探究了所有可能出现的故障模式。客户负责对最终产品进行充分的验证测试,以确保该产品是可靠的,并且符合所有设计要求。