Pmod CMPS2参考手册

Digilent Pmod CMPS2(修订A)是一个三轴各向异性磁阻传感器。与美新的MMC34160PJ,局部磁场强度在±16高斯范围内,定向精度为1°,分辨率高达0.5 mG。

下载本参考手册

特性

  • 低噪音三轴数字罗盘
  • 0.5 mG场分辨率±16高斯场
  • I²C Slave, FAST(≤400千赫)模式
  • SCL和SDA引脚可选的上拉电阻
  • ±1°航向精度
  • 小型PCB尺寸,适用于柔性设计0.8 " × 1.25 " (2.0 cm × 3.2 cm)
  • 6针Pmod连接器,I²C串行接口
  • 直通Pmod主机端口菊花链
  • 遵循DigilentPmod接口规范1.1.0
  • Pmod CMPS2中的库和示例代码资源中心

规范

参数 最小值 典型的 马克斯 单位
电源电压 1.62 1.8 3.6 V
输出分辨率 12 14 16
安装误差 -3 ±1 +3
参数 条件 价值 单位
总均方根噪声 16位,7.92 ms/S 1.5 毫克
总均方根噪声 16位,4.08 ms/S 2.0 毫克
总均方根噪声 14位在2.16 ms/S 4.0 毫克
总均方根噪声 12位,1.20 ms/S 6.0 毫克
最大输出数据速率 16位,7.92 ms/S 125 赫兹
最大输出数据速率 16位,4.08/S 250 赫兹
最大输出数据速率 14位在2.16 ms/S 450 赫兹
最大输出数据速率 12位,1.20 ms/S 800 赫兹
参数 价值 单位
每个轴的字段范围 ±16 G

引脚分配表图

头j - 1 头J2 跳投JP1
信号 描述 信号 描述 状态 描述
1 N / C 没有连接 1 N / C 没有连接 sci 加载 4.7 kΩ上拉到Vcc
2 N / C 没有连接 2 N / C 没有连接 sci 卸载 不上Vcc
3. sci 串行时钟 3. sci 串行时钟 SDA 加载 4.7 kΩ上拉到Vcc
4 SDA 串行数据 4 SDA 串行数据 SDA 卸载 不上Vcc
5 接地 地面电源 5 接地 地面电源
6 VCC 电源(3.3 v) 6 VCC 电源(3.3 v)

物理维度

销头上的销间隔为100密。PCB是1.25英寸长在平行于引脚头的引脚和0.8英寸长在垂直于引脚头的侧面。


功能描述

Pmod CMPS2利用MMC34160PJ来收集磁场数据。当与主机板通过我²C协议使用I²C地址0x0110000/用户可以测量设备周围的±16g场。

串行通信

Pmod CMPS2通过我²C协议.首先发送7位I²C设备地址0110000,然后发送一个读/写位(分别是高/低逻辑电平),然后发送最大时钟频率为400的感兴趣的寄存器地址千赫用户可以配置和读取Pmod CMPS2。在头J2上提供了一套额外的引脚,以便用户可以雏菊链Pmod CMPS2与其他I²C设备。

注册详细信息

数据寄存器

每个笛卡尔轴有两个寄存器来存储每个测量的高数据字节和低数据字节。所述数据寄存器按低字节、高字节排列。

数据寄存器地址0x00到0x05
地址 注册的名字
0 x00 X LSB
0 x01 X MSB
0 x02 Y出LSB
0 x03 Y出最高有效位
0 x04 Z出LSB
0 x05 Z从最高有效位

状态寄存器

位名称 一些数量 一些描述 位的值 功能描述
RSV [7] 保留 保留一点
RSV [6] 保留 保留一点
RSV [5] 保留 保留一点
RSV [4] 保留 保留一点
ST_XYZ_OK [3] ST_XYZ_OK 表示当该位为“1”时,selftest是OK的。
Rd_Done [2] Rd_Done 表示芯片能够成功读取内存。
泵在 [1] 泵在 这个位指示电荷泵的状态。
RSV [0] 量做的 测量事件结束。

内部控制寄存器

内部控制0 内部控制1
位名称 一些数量 一些描述 位的值 功能描述 位名称 一些数量 一些描述 位的值 功能描述
续杯帽 [7] 续杯帽 设置此位将充电
电容在CAP引脚,它是
请求在SET/RESET命令之前发出
RST [7] 软件重置一下 正常操作,该位自清除
RST [6] 重置传感器 设置此位将复位传感器 TEMP-tst [6] 临时测试 工厂用寄存器
[5] 设置传感器 设置此位将设置传感器 ST_XYZ [5] 自我测试检查 将该位设置为execute TM命令,结果可读取为ST-XYZ_OK位
没有提高 [4] 没有提高 关闭充电泵 Z-inhibit [4] Z-inhibit 工厂用寄存器
CM Freq1² [3] 连续测量位1 控制连续
芯片的测量速率
Y-inhibit [3] Y-inhibit 工厂用寄存器
CM Freq0² [2] 连续测量位0 控制连续
芯片的测量速率
X-inhibit [2] X-inhibit 工厂用寄存器
连续模式 [1] 连续测量模式 设置此位使能连续测量模式 BW1³ [1] 带宽一点 控制输出分辨率和测量时间
TM [0] 需要测量 设置此位将启动一个读数 BW0³ [0] 带宽一点 控制输出分辨率和测量时间

注:
¹—上电和复位时的值
²-有关详细信息,请参见连续测量模式部分
³-详细信息请参见输出分辨率和测量时间部分

连续测量模式

连续测量模式设置
CM Freq1 CM Freq0 频率
0 0 1.5赫兹
0 1 13赫兹
1 0 25赫兹
1 1 50赫兹

输出分辨率和测量时间

带宽输出分辨率和测量时间
BW1 BW0 输出分辨率 测量时间
0 0 16位 7.92毫秒
0 1 16位 4.08毫秒
1 0 14位 2.16毫秒
1 1 12位 1.20毫秒

快速启动

下面是通过伪I²C代码从Pmod CMPS2获取一组磁力计数据的一系列命令。

  1. 将Pmod CMPS2上电,等待10ms后再进行操作。
  2. 提供一个START条件,用一个写位调用设备ID
    I2CBegin (0 xa0);//设备ID 0x30,写(0)位
  3. 等待收到来自Pmod CMPS2的ACK。
  4. 发送内部控制寄存器0(地址0x07)作为要通信的寄存器
    I2CWrite (0 x07);//地址0x07对应控制寄存器0
  5. 等待收到来自Pmod CMPS2的ACK。
  6. 通过设置高位0和停止位来写入测量的命令。
    I2CWrite (0 x01);//0x01启动数据采集
  7. 默认情况下,延迟至少7.92 mS,以允许Pmod CMPS2完成数据收集。
  8. 提供一个START条件,用一个写位调用设备ID
    I2CBegin (0 xa0);//设备ID 0x30,写(0)位
  9. 等待收到来自Pmod CMPS2的ACK。
  10. 发送状态寄存器(0x03)作为要读取的寄存器
    I2CWrite (0 x03);//表示您希望与地址0x03交互
  11. 提供一个START条件,用一个读取位调用设备ID
    I2CBegin (0 xa1);//设备ID 0x30,读取(1)位
  12. 等待收到来自Pmod CMPS2的ACK。
  13. 循环SCL线路以接收SDA线路上的状态寄存器数据。通过重复步骤8到13,直到第0位设置为“1”,表示所有3个轴上的数据都可以被读取。
  14. 提供一个START条件,用一个写位调用设备ID
    I2CBegin (0 xa0);//设备ID 0x30,写(0)位
  15. 等待收到来自Pmod CMPS2的ACK。
  16. 发送Xout LSB (0x00)对应的第一个寄存器地址作为要读取的寄存器。
    I2CWrite (0 x00);//地址0x00作为第一个要读取的寄存器
  17. 提供一个START条件,用一个读取位调用设备ID
    I2CBegin (0 xa1);//设备ID 0x30,读取(1)位
  18. 等待收到来自Pmod CMPS2的ACK。
  19. 循环SCL行,从SDA行中的X、Y和Z寄存器接收数据位,在每个数据字节之间提供一个ACK。Pmod CMPS2地址指针自动移动到每个连续的字节。通过发送一个NACK和一个STOP命令来结束通信。
    I2CReadMultiple (6);//读取6个字节,在接收到的每个字节和最后一个字节之后的NACK之间向从设备发送一个ACK
  20. 把读数转换成可用的数据。更多详细信息请参见数据转换部分。
  21. 等待1/3的采集时间(默认为2.64 ms),再执行另一个测量。

应用程序信息

Pmod CMPS2是一个理想的Pmod,可以用作指南针。像所有的指南针一样,建议Pmod CMPS2在使用模块之前进行校准。

校准

为了校准磁强计,需要计算与磁传感器和环境相关的偏移量,并将其从未来的测量中去除。

内部偏移量的计算方法如下:

揭示了方法
  1. 将Pmod CMPS2上电,等待10ms后再进行操作。
  2. 提供一个START条件,用一个写位调用设备ID
    I2CBegin (0 xa0);//设备ID 0x30,写(0)位
  3. 等待收到来自Pmod CMPS2的ACK。
  4. 发送内部控制寄存器0(地址0x07)作为要通信的寄存器
    I2CWrite (0 x07);//地址0x07对应控制寄存器0
  5. 等待收到来自Pmod CMPS2的ACK。
  6. 编写对电容充电的命令,为SET动作做准备。
    I2CWrite (0 x80);//0x80填充电容
  7. 等待收到来自Pmod CMPS2的ACK。
  8. 延迟至少50毫秒,让Pmod CMPS2完成准备工作。
  9. 提供一个START条件,用一个写位调用设备ID
    I2CBegin (0 xa0);//设备ID 0x30,写(0)位
  10. 等待收到来自Pmod CMPS2的ACK。
  11. 发送内部控制寄存器0(地址0x07)作为要通信的寄存器
    I2CWrite (0 x07);//地址0x07对应控制寄存器0
  12. 等待收到来自Pmod CMPS2的ACK。
  13. 编写启动SET操作的命令。
    I2CWrite (0 x20);//0x20启动SET动作
  14. 等待收到来自Pmod CMPS2的ACK。
  15. 延迟至少1毫秒,以允许Pmod CMPS2完成SET操作。
  16. 提供一个START条件,用一个写位调用设备ID
    I2CBegin (0 xa0);//设备ID 0x30,写(0)位
  17. 等待收到来自Pmod CMPS2的ACK。
  18. 发送内部控制寄存器0(地址0x07)作为要通信的寄存器
    I2CWrite (0 x07);//地址0x07对应控制寄存器0
  19. 等待收到来自Pmod CMPS2的ACK。
  20. 通过设置高位0和停止位来写入测量的命令。
    I2CWrite (0 x01);//0x01启动数据采集
  21. 默认情况下,延迟至少7.92 mS,以允许Pmod CMPS2完成数据收集。
  22. 提供一个START条件,用一个写位调用设备ID
    I2CBegin (0 xa0);//设备ID 0x30,写(0)位
  23. 等待收到来自Pmod CMPS2的ACK。
  24. 发送状态寄存器(0x03)作为要读取的寄存器
    I2CWrite (0 x03);//表示您希望与地址0x03交互
  25. 提供一个START条件,用一个读取位调用设备ID
    I2CBegin (0 xa1);//设备ID 0x30,读取(1)位
  26. 等待收到来自Pmod CMPS2的ACK。
  27. 循环SCL线路以接收SDA线路上的状态寄存器数据。通过重复步骤8到13,直到第0位设置为“1”,表示所有3个轴上的数据都可以被读取。
  28. 提供一个START条件,用一个写位调用设备ID
    I2CBegin (0 xa0);//设备ID 0x30,写(0)位
  29. 等待收到来自Pmod CMPS2的ACK。
  30. 发送Xout LSB (0x00)对应的第一个寄存器地址作为要读取的寄存器。
    I2CWrite (0 x00);//地址0x00作为第一个要读取的寄存器
  31. 提供一个START条件,用一个读取位调用设备ID
    I2CBegin (0 xa1);//设备ID 0x30,读取(1)位
  32. 等待收到来自Pmod CMPS2的ACK。
  33. 循环SCL行,从SDA行中的X、Y和Z寄存器接收数据位,在每个数据字节之间提供一个ACK。Pmod CMPS2地址指针自动移动到每个连续的字节。通过发送一个NACK和一个STOP命令来结束通信。
    I2CReadMultiple (6);//读取6个字节,在接收到的每个字节和最后一个字节之后的NACK之间向从设备发送一个ACK
  34. 每个读数都包含外部磁场H此外,偏移与通过SET动作的线圈的电流有关。
    $Output1 = +H + Offset$
  35. 现在将执行一个RESET动作来反转感应电阻的磁化,从而得到反向偏移值。
  36. 提供一个START条件,用一个写位调用设备ID
    I2CBegin (0 xa0);//设备ID 0x30,写(0)位
  37. 等待收到来自Pmod CMPS2的ACK。
  38. 发送内部控制寄存器0(地址0x07)作为要通信的寄存器
    I2CWrite (0 x07);//地址0x07对应控制寄存器0
  39. 等待收到来自Pmod CMPS2的ACK。
  40. 写命令给电容充电,准备RESET动作。
    I2CWrite (0 x80);//0x80填充电容
  41. 等待收到来自Pmod CMPS2的ACK。
  42. 延迟至少50毫秒,让Pmod CMPS2完成准备工作。
  43. 提供一个START条件,用一个写位调用设备ID
    I2CBegin (0 xa0);//设备ID 0x30,写(0)位
  44. 等待收到来自Pmod CMPS2的ACK。
  45. 发送内部控制寄存器0(地址0x07)作为要通信的寄存器
    I2CWrite (0 x07);//地址0x07对应控制寄存器0
  46. 等待收到来自Pmod CMPS2的ACK。
  47. 编写启动RESET操作的命令。
    I2CWrite (0 x40);//0x40启动RESET动作
  48. 等待收到来自Pmod CMPS2的ACK。
  49. 延迟至少1毫秒,以允许Pmod CMPS2完成SET操作。
  50. 提供一个START条件,用一个写位调用设备ID
    I2CBegin (0 xa0);//设备ID 0x30,写(0)位
  51. 等待收到来自Pmod CMPS2的ACK。
  52. 发送内部控制寄存器0(地址0x07)作为要通信的寄存器
    I2CWrite (0 x07);//地址0x07对应控制寄存器0
  53. 等待收到来自Pmod CMPS2的ACK。
  54. 通过设置高位0和停止位来写入测量的命令。
    I2CWrite (0 x01);//0x01启动数据采集
  55. 默认情况下,延迟至少7.92 mS,以允许Pmod CMPS2完成数据收集。
  56. 提供一个START条件,用一个写位调用设备ID
    I2CBegin (0 xa0);//设备ID 0x30,写(0)位
  57. 等待收到来自Pmod CMPS2的ACK。
  58. 发送状态寄存器(0x03)作为要读取的寄存器
    I2CWrite (0 x03);//表示您希望与地址0x03交互
  59. 提供一个START条件,用一个读取位调用设备ID
    I2CBegin (0 xa1);//设备ID 0x30,读取(1)位
  60. 等待收到来自Pmod CMPS2的ACK。
  61. 循环SCL线路以接收SDA线路上的状态寄存器数据。通过重复步骤8到13,直到第0位设置为“1”,表示所有3个轴上的数据都可以被读取。
  62. 提供一个START条件,用一个写位调用设备ID
    I2CBegin (0 xa0);//设备ID 0x30,写(0)位
  63. 等待收到来自Pmod CMPS2的ACK。
  64. 发送Xout LSB (0x00)对应的第一个寄存器地址作为要读取的寄存器。
    I2CWrite (0 x00);//地址0x00作为第一个要读取的寄存器
  65. 提供一个START条件,用一个读取位调用设备ID
    I2CBegin (0 xa1);//设备ID 0x30,读取(1)位
  66. 等待收到来自Pmod CMPS2的ACK。
  67. 循环SCL行,从SDA行中的X、Y和Z寄存器接收数据位,在每个数据字节之间提供一个ACK。Pmod CMPS2地址指针自动移动到每个连续的字节。通过发送一个NACK和一个STOP命令来结束通信。
    I2CReadMultiple (6);//读取6个字节,在接收到的每个字节和最后一个字节之后的NACK之间向从设备发送一个ACK
  68. 每个读数都包含外部磁场H此外,与通过RESET动作的线圈的电流相关联的偏移。
    $Output2 = -H +偏移量$
  69. 与该设备相关的偏移量可以计算出来,然后从未来的测量中减去,从而获得实际的磁场。
    $Offset = \dfrac{Output1 + Output2}{2}$

校准的其他方法是努力消除铁偏差引入磁强计的周边环境通过测量(连续或一组时间)所有可能的磁强计读数笛卡尔球体和跟踪每个轴的最高及最低的读数。然后可以按照上面描述的SET和RESET动作的相同方式计算偏移量。这种方法的优点是当Pmod CMPS2不断改变位置或当其他外部磁场可能被引入到测试环境时。

数据转换

Memsic MMC34160PJ提供了以高斯为单位的每个轴的数据,但当显示为罗盘航向时,信息通常更清晰。将高斯单位转换为罗经航向的方法如下所示。

揭示了方法
  1. 根据返回的LSB数量计算X轴和Y轴的真实高斯值,其中LSB值默认为0.48828125 mG,结果是每高斯2048个LSB。
    $xGaussData = xDataLSB * 0.48828125\ mG$
    $yGaussData = yDataLSB * 0.48828125\ mG$
  2. 计算出方向D首先检查X高斯数据是否等于0,以防止在未来的计算中除以0 0错误。如果X高斯数据是0,检查Y高斯数据是否小于0。如果Y小于0高斯,方向D为90度;如果Y大于等于0高斯,方向D是0度。
  3. 如果X高斯数据不为零,计算Y高斯和X高斯数据的反正切,并将极坐标转换为度数。
    $ D =反正切\离开({\ dfrac {yGaussData} {xGaussData}} \右)* \ dfrac{180}{\π}$
  4. 如果方向D大于360度,就用这个值减去360度。
  5. 如果方向D小于0度,则在这个值上加360度。
  6. 然后由方向值D确定罗经航向:
    • 如果D大于337.25度或小于22.5度-北纬
    • 如果D在292.5度和337.25度之间-西北
    • 如果D在247.5度和292.5度之间-西经
    • 如果D在202.5度到247.5度之间,则向西南方向
    • 如果D在157.5度到202.5度之间,则是南向
    • 如果D在112.5度和157.5度之间-东南
    • 如果D在67.5度和112.5度之间,向东
    • 如果D在0度到67.5度之间-东北角

←-

时序图

下面是一个读取和写入Pmod CMPS2的时序图示例,取自Memsic数据表:

Pmod CMPS2时序图

当使用外部电源运行Pmod时,请确保在提供的参数范围内规范


额外的信息

Pmod CMPS2的原理图是可用的在这里.湿度传感器的附加信息,包括通信模式和芯片的具体时间可以通过查看其数据表找到在这里

演示如何从Pmod CMPS2获取信息的示例代码可以在其资源中心找到在这里

如果您对Pmod CMPS2有任何问题或意见,请随时将它们发布在适当的部分(“附加板”)Digilent论坛