使用 ALS31300 霍尔效应 IC 进行 3D 线性或 2D 角度感应

下载 PDF 版

作者: 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 总线是同步的双线串行通信协议,提供两到多个设备之间的全双工接口。总线指定两种逻辑信号:

  1. 主设备的串行时钟线 (SCL) 输出。
  2. 主设备或从设备的串行数据线 (SDA) 输出。

 图 1 中显示的区块图展示了 I2C 总线拓扑结构。

 

图 1:I2C 总线线图,包含主设备和从设备
图 1:I2C 总线线图,包含主设备和从设备

 

数据传输

数据在 I2C 上的传输包含以下步骤。

  1. 开始条件:由 SDA 线的下降沿定义,在 SCL 较高时由主设备发起。
  2. 地址循环:7 位从地址,加一个说明写 (0) 或读 (1) 的位,然后是一个应答位。
  3. 数据循环:读取或写入 8 位数据,然后是一个应答位。这个循环可以针对多字节数据传输而重复。写的第一个数据字节可能是寄存器地址。请见以下部分了解更多信息。
  4. 停止条件:由 SDA 线的上升沿定义,在 SCL 高电平时发起。

除了指示开始或停止条件之外,SDA 必须在时钟信号高电平时保持稳定。SDA 只能在 SCL 低电平时改变状态。开始或停止条件可以在数据传输的任何时候发生。ALS31300 将始终通过重设数据传输序列响应读或写请求。

时钟信号 SCL 由主设备生成,而 SDA 线起到输入或开漏输出的作用,具体视数据传输的方向而定。图 2 所示的时序图说明了 I2C 总线的时序。ALS31300 数据表提供这些名称的信号参考和定义。

图 2:I2C 输入和输出时序图
图 2:I2C 输入和输出时序图

 

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 上访问寄存器的写循环如下文所示。

  1. 主设备发起开始条件
  2. 主设备发送 7 位从地址和写位 (0)
  3. 主设备等待 ALS31300 的 ACK
  4. 主设备发送 8 位寄存器地址
  5. 主设备等待 ALS31300 的 ACK
  6. 主设备发送 31:24 位数据
  7. 主设备等待 ALS31300 的 ACK
  8. 主设备发送 23:16 位数据
  9. 主设备等待 ALS31300 的 ACK
  10. 主设备发送 15:8 位数据
  11. 主设备等待 ALS31300 的 ACK
  12. 主设备发送 7:0 位数据
  13. 主设备等待 ALS31300 的 ACK
  14. 主设备发起停止条件

I2C 写序列在下文图 3 的时序图中进一步说明。

图 3:I2C 写入时序图
图 3:I2C 写入时序图

 

 

客户写入权限

在 ALS31300 中写入任何易失性寄存器或 EEPROM 之前,必须向设备发送存取代码。如果未启用客户存取模式,则不允许对设备写入。这一规则的唯一例外是 SLEEP 位,其可以随意写入,无视存取模式。此外,任何寄存器或 EEPROM 位置都可以随时读取,无视存取模式。

如需进入客户存取模式,必须通过 I2C 接口发送存取命令。该命令包含连续的写入操作,以及地址和数据值,如表 1 所示。代码输入的时间无限制。进入客户存取模式后,必须反复开关设备电源才能更改存取模式。

表 1:客户存取代码

存取模式 地址 数据
 客户存取   0x24  0x2C413534

 

读循环概览

ALS31300 上访问寄存器的读取循环如下文所示。

  1. 主设备发起开始条件
  2. 主设备发送 7 位从地址和写位 (0)
  3. 主设备等待 ALS31300 的 ACK
  4. 主设备发送 8 位寄存器地址
  5. 主设备等待 ALS31300 的 ACK
  6. 发起开始条件。这次称为重启条件
  7. 主设备发送 7 位从地址和读位 (1)
  8. 主设备等待 ALS31300 的 ACK
  9. 主设备接收 31:24 位数据
  10. 主设备发送 ACK 到 ALS31300
  11. 主设备接收 23:16 位数据
  12. 主设备发送 ACK 到 ALS31300
  13.  主设备接收 15:8 位数据
  14. 主设备发送 ACK 到 ALS31300
  15. 主设备接收 7:0 位数据
  16. 主设备发送 NACK 到 ALS31300
  17.  主设备发起停止条件

I2C 读序列在下文图 4 的时序图中进一步说明。

图 4:I2C 读取时序图
图 4:I2C 读取时序图

 

 

图 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 的流程图说明了快速循环模式。

图 5:快速循环模式
图 5:快速循环模式

 

 

完整循环模式

完整循环模式可持续读取 12 位全分辨率 X、Y、Z 和温度数据。如用户需要以更快的速度读取全分辨率的 X、Y、Z 和温度数据,则建议使用这个模式。图 6 的流程图说明了完整循环模式。

图 6:完整循环模式
图 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 位设为所需代码。

 

磁场强度寄存器

图 7:DFN 封装的磁轴(未按比例绘制)
图 7:DFN 封装的磁轴(未按比例绘制)

磁场强度寄存器包含与 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   6  5  1
 数据   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 感测的磁铁。

图 8:ALS31300 的径向磁铁和信号轴
图 8:ALS31300 的径向磁铁和信号轴

 

标准反正切函数,即 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)。

  1. 主设备发起读请求。
  2.  从设备传输 8 字节数据。
  3. 磁矢量数据转换为角度值。

读请求(方框 1)包含一次写入,说明将被读取的寄存器。设备返回(方框 2)8 字节数据,(X、Y、Z 的 8 MSB,温度的 6 MBS,然后是 X、Y、Z 的 4 LSB 和温度的 6 MSB)。

图 9:非循环模式下的 8 数据字节 I2C 读数。寄存器 0x28 和 0x29。
图 9:非循环模式下的 8 数据字节 I2C 读数。
寄存器 0x28 和 0x29。

 

 

角度计算时间

使用 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 的相同步骤对应。

图 10:完整循环模式下的 8 数据字节 I2C 读数。寄存器 0x28 和 0x29。
图 10:完整循环模式下的 8 数据字节 I2C 读数。
寄存器 0x28 和 0x29。

 

请注意,方框 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 使用的应用示意图的图片。

图 11:ALS31300 应用示意图
图 11:ALS31300 应用示意图

 

Teensy 3.2 微控制器的支持电路如图 12 中的示意图所示。

图 12:Teensy 3.2 应用示意图
图 12:Teensy 3.2 应用示意图

 

指图 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。

图 13:TEENSY 3.2 管脚说明书
图 13:TEENSY 3.2 管脚说明书

 

 

本文中所含的信息不构成 Allegro 就本文主题而对客户做出的任何表示、担保、确保、保证或诱导。本文所提供的信息并不保证基于此信息的流程的可靠性,亦不保证 Allegro 已探究了所有可能出现的故障模式。客户负责对最终产品进行充分的验证测试,以确保该产品是可靠的,并且符合所有设计要求。