This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMAG3001:关于使用 WOC (变化时唤醒)角度功能实现低功耗运行

Guru**** 2431380 points
Other Parts Discussed in Thread: TMAG3001

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1517937/tmag3001-about-low-power-operation-using-woc-wake-on-change-angle-function

器件型号:TMAG3001

工具/软件:

你好
我参考 Exmaple_Code 此链接中提供的 TMAG3001制作一款产品。 :www.ti.com/.../TMAG3001

我有兴趣认识到磁体的角度变化、  

我提到了 WOC_ANGLE_Example 区域。

  
  Float prevAngle = 0.0
  Float currAngle = 0.0
  uint8_t ANGLE_hyst = ANGLE_HYST_8DEG

  //配置设备设置
  TMAG3001enableMagChannels (MAG_CH_EN_XYZ);         //启用磁通道
  TMAG3001enableAngleMeasurement (ANGLE_EN_X1st Y-2nd);   //配置器件以启用角度测量
  TMAG3001setRanges (RANGE_80mTor240mT、RANGE_80mTor240mT);//配置器件的范围
  TMAG3001interruptthroughINT (0x00);            //将器件配置为在 INT 引脚上启用中断
  TMAG3001intPinLatchedPulse (INT_STATE_Pulse);       //配置设备的中断状态
  TMAG3001enableWakeOnAngleChange (ANGLE_hyst);       //为角度启用 WOC

  //触发数据转换并读取初始角度测量值
  //注意:该初始角度测量将用于检查中断是否由于而发生
  //   角度变化由 ANGLE_hyst 指定、或由于角度从359->0或0->359变化
  TMAG3001readSingleRegisterWithTrigger (CONV_STATUS_ADDRESS);//读取 CONV_STATUS 寄存器和触发器转换
  DELAY_ms (1);                         //延迟以允许转换完成的时间
  prevAngle = TMAG3001getMeasurementANGLE ();          //读取初始角度测量值

  TMAG3001 enterContinuousMeasureMode (); //启用连续测量模式以持续对数据进行采样
在该示例中、我看到 TMAG3001在初始化代码的最后一行中被设置为连续模式。
当我这样做时、每次角度发生变化时、都会出现中断、结果符合我的预期。

但是、我的产品是基于电池的、因此我必须在磁体不旋转时以低功耗等待。

因此、我尝试更改该器件以进入 WakeAndSleep 模式。

但执行此操作时、我会以大约2~5ms 的周期获得无限中断。

这与我直觉上的想法完全相反。

是否缺少一些其他设置? 或者我不能同时使用低功耗性能和 WOC_ANGLE 特性?  

请提供建议。

此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dong:

    感谢您发布到传感器论坛!

    发生中断时、您是否从器件读取数据? 如果是、在重新进入 W&S 模式之前、您需要触发转换以保存新的基准值。

    此致、

    ~Alicia

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,感谢您的答复。

    是的、我每次发生中断时都会读取角度数据、然后向 WakeOnsleep 发送命令。

    INT -> S 68 19 RS 69 XX XX XX XX P -> S 68 01 03 P 授予示波器测量。

    正如我观察到的那样、如果您将 Mode 设置为 WakeOnSleep、应以连续方式完成的工作将以低功耗完成。

    如果将"模式"设置为"连续"、则应在 WakeOnSleep 中完成的工作将以正常功率(2.1mA)完成。

    这是我的严重奥秘。

    请再次检查。

    T.T.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dong:

    我们的团队今天就在外面。  我们应该能够看看你的问题,当我们回到办公室从明天开始.

    此致、

    Mekre

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dong:

    是的、我每次发生中断时都会读取角度数据、然后向 WakeOnsleep 发送命令。

    在 W&S 模式下、一旦发生中断并且您读取角度数据、您必须触发转换。 触发转换后、您需要等待转换完成、然后才能重新进入 W&S 模式。

    此致、

    ~Alicia  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Alicia。

    感谢您的建议。

    因此、我尝试在中断发生后读取角度数据、然后在设置了触发位的情况下读取寄存器地址0x18处的 CONV_STATUS。

    我的中断服务例程如下:

    S 68 19 SR 69 XX XX XX P -> S 68 98 SR 69 31 P ->等待1ms -> S 68 01 03 P

    读取角度数据->触发转换->等待->重新进入 W&S 模式

    但这项工作对我没有影响。

    即使我不转动磁体、中断仍会反复发生。

    以防万一、我看到 CONV_STATUS 读取结果的 RESULT_STATUS 位为1、因此我尝试删除1ms 的等待。

    然而、没有显著的差异。

    代码的初始化过程与 WOC_ANGLE_Example 之间的唯一区别是我使用的是 TMAG3001enterWakeUpAndSleepMode ()而不是 TMAG3001enterContinuousMeasureMode ()。

    在 W&S 模式下使用 WOC 角度还有其他需要考虑的事项吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dong:

    作为一个快速测试、您可以尝试以下操作:查看问题是否与参考角度未更新有关、或者是否有其他问题、而不是触发转换:

    1. 禁用 WOC
    2. 启用 Re WOC
    3. 等待几 μs μ s
    4. 进入 W&S 模式  

    此致、

    ~Alicia

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的快速和善良的答复。

    但不幸的是、它也不起作用。

    回到开始、您能根据您提供的 wOC_ANGLE_example 代码为我提供一种低功耗方法吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dong:

    只是为了确保器件本身没有问题、使用示例中提到的相同配置(如下所示)、在最初将器件置于 W&S 模式后、您能否取消任何进一步的 I2C 通信?

    TMAG3001enableMagChannels (MAG_CH_EN_XYZ);                 //启用磁通道
    TMAG3001enableAngleMeasurement (ANGLE_EN_X1st Y);          //配置器件以启用角度测量
    TMAG3001setRanges (RANGE_80mTor240mT、RANGE_80mTor240mT); //配置器件的范围
    TMAG3001interruptthroughINT (0x00);                              //将器件配置为在 INT 引脚上启用中断
    TMAG3001intPinLatchedPulse (INT_STATE_Pulse);                  //配置设备的中断状态
    TMAG3001enableWakeOnAngleChange (ANGLE_hyst);                  //为角度启用 WOC
    TMAG3001setWakeUpAndSleepMode (0x03);//进入睡眠时间为15ms 的 W&S 模式(注意:根据应用需要调整睡眠时间)

    进入 W&S 模式后、只需监控 INT 引脚、并删除中断后将发生的任何进一步 I2C 通信。 使用上述设置时、W&S 中角度的 WOC 应按预期工作。 如果上述方法有效、那么我们可以将问题隔离为与在中断后发生的 I2C 通信相关、并进行进一步调试。 如果不起作用、则问题可能与固件/硬件、甚至与该特定设备有关、因为上述设置对我来说是正常的。

    此致、

    ~Alicia   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗯、  

    我使初始化过程与您提到的一样、没有尝试在中断服务例程中进行任何 I2C 通信。
    然后、正如您提到的、正如我想要的、角度变化中断运行良好。
    我现在喜欢这个。

    但是,我在中断服务例程中尝试了 TMAG3001getMeasurementANGLE ()。
    然后、就像前一个问题一样、再次发生无限次中断。

    然后、我是否应该将其视为根据中断次数来推断角度变化的正确方法、而不是测量 ISR 中磁体角度的变化量?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dong:

    对于 ISR、您可以在发生中断时尝试以下序列:

    1. 通过在 Device_Config_ 2中将 Operating_Mode 设置为0h、将器件配置为待机模式
      1. TMAG3001writeToSingleRegister (DEVICE_CONFIG_2_ADDRESS、0x00);
        1. 如果在发送上述通信时发生 NAK、请执行以下操作:
          1. 延迟 tstart_sleep (50us)
          2. TMAG3001writeToSingleRegister (DEVICE_CONFIG_2_ADDRESS、0x00);
    2. 触发转换
      1. TMAG3001readSingleRegisterWithTrigger (DEVICE_CONFIG_2_ADDRESS);
    3. 等待转换完成
    4. 通过执行 a 或 b 从角度结果寄存器读取角度测量值:
      1. TMAG3001readMultipleRegisters (ANGLE_RESULT_MSB_ADDRESS、2、0、DATA_RESULT);
      2. TMAG3001getMeasurementANGLE();
    5. 将器件置于 W&S 模式
      1. TMAG3001setWakeUpAndSleepMode (0x03);

    通过上述顺序、我能够使 WOC 角度在 W&S 模式下工作、并仍从器件读取角度数据。

    此致、

    ~Alicia

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Alicia:

    感谢您发送编修。
    这解决了我几周来一直在苦苦挣扎的问题。

    我想关键是从 ISR 进入待机模式、然后执行必要的工作。

    需要注意的一点是、当我第一次尝试从 ISR 进入待机模式时、通常会看到 NACK。

    此外、一旦发生 NACK、15ms 内的所有重试都将具有 NACK。

    只有在下一个 ISR 中才会发生 ACK、并且生成触发器、读取角度和进入 W&S 模式的过程按照您的建议顺利进行。

    目前,我们产品的整体运行没有问题,所以我认为第一个原型设计是可能的。

    再次感谢。