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.

[参考译文] CC3220SF-LAUNCHXL:捕获始终返回相同(和错误)的时间段

Guru**** 2589300 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/914157/cc3220sf-launchxl-capture-always-returns-the-same-and-wrong-time-period

器件型号:CC3220SF-LAUNCHXL

我正在使用捕获驱动程序、但似乎无法获得正确的结果。 我有一个设置为脉冲1ms 的引脚、我已将其连接到我的捕获引脚。 我已经验证了示波器上的脉冲。 但是、下面的代码测量上升沿(将其设置为1)和下降沿(将其设置为0)之间的时间为~ 160900us。 我预期、因为存在1ms 的延迟、而这是~ 160ms。 有什么想法、我在这里做了什么错? 随附相关代码和配置。 显然、我对该距离感兴趣:

引脚设置为0

开始测量

引脚设置为1 //调用此 T1

延迟1ms

引脚设置为2 //调用此 T2

我希望 T2-T1 =~ 1ms、表示引脚处于高电平。

long lastPulseLength _us = 0;

void measureEchoPulse (Capture_Handle handle、uint32_t interval、int_fast16_t status)
{

lastPulseLength _us = interval;
}

void 范围(void *arg0)
{

CAPTURE_Handle 句柄;
CAPTURE_PARAMS 参数;
caption_Params_init (&params);
params.mode = Capture_Any_edge;
params.callbackFxn = measureEchoPulse;
Params.periodUnit = Capture_Period_US;
句柄= Capture_open (CONFIG_CAPTURE_0、&params);

if (handle == NULL){
while (1);
}




GPIO_WRITE (CONFIG_GPIO_TRIGGER、0);

if (Capture_start (handle)=Capture_STATUS_ERROR){
while (1);
}

while (1){


GPIO_WRITE (CONFIG_GPIO_TRIGGER、1);
//设置名为 lastPulseLength _us 的回调
vTaskDelay (PDM_TO_TICKs (1000));
GPIO_WRITE (CONFIG_GPIO_TRIGGER、0);
//调用回调,lastPulseLength _us 设置为~ 160000us。
vTaskDelay (PDM_TO_TICKs (1000));
log_info1 ("time =%dus"、lastPulseLength _us);
}
} 

#include 
#include 

#define CONFIG_CAPTURE_COUNT 1

/*
=== CaptureCC32XX 对象====
*/
CaptureCC32XX_Object CaptureCC32XX Objects[CONFIG_CAPTURE_COUNT];

/*
=== CaptureCC32XXHWAttrs ====
*/
const CaptureCC32XX_HWAttrs CaptureCC32XXHWAttrs[CONFIG_CAPTURE_COUNT]={
/* CONFIG_CAPTURE_0 */
{
.CapturePin = CaptureCC32XX_PIN_03、
.intPriority =(~0)
}、
};

/*
=== CAPTURE_CONFIG ===
*/
const Capture_Config Capture_config[CONFIG_CAPTURE_COUNT]={
/* CONFIG_CAPTURE_0 */
{
.fxnTablePtr =&CaptureCC32XX_fxnTable、
.object =捕捉 CC32XX 对象[CONFIG_CAPTURE_0]、
hwAttrs =&captureCC32XXXHWAttrs[CONFIG_CAPTURE_0]
}、
};

const uint_least8_t CONFIG_CAPTURE_0_CONST = CONFIG_CAPTURE_0;
const uint_least8_t Capture_count = CONFIG_CAPTURE_COUNT;

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

    尊敬的 John:

    以确保我了解这里的所有变量... 1ms 内脉冲到底是什么意思? 我们是否刚刚讨论过周期为0.5ms 的方波?  

    此外、您是否使用与 GPIO 相同的引脚进行输入捕捉以触发回调? 我不明白 GPIO_WRITE 的作用是什么。

    Jesu

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

    您好、Jesu、

    我是指一个高1秒(而不是 ms)(pdMS_TO_TICKS(1000)= 1s)的方波。

    我确定这些引脚是正确的。 我切换到了基于计时器的实现方案、测量工作非常顺利、但我更喜欢捕获接口。

    为了测试我对驱动器的理解、我将在触发引脚上生成一个我知道的信号、我已跳转到回声引脚进行测量(然后该引脚连接到捕获驱动器)。

    我观察到以下情况:

     GPIO_write(CONFIG_GPIO_TRIGGER, 1);  // when this goes high, callback is called.

     vTaskDelay(pdMS_TO_TICKS(1000));

     GPIO_write(CONFIG_GPIO_TRIGGER, 0); // callback called, lastPulseLength_us is set to ~ 160000us.

     vTaskDelay(pdMS_TO_TICKS(1000));

     Log_info1("Time = %dus", lastPulseLength_us );
    但是、我不知道周期是如何设置为160000uS 的。 如果从上升沿测量、则其周期为2。
    如果有任何帮助,将不胜感激。 我一定会错过一些东西。
    最棒的
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您的外设配置看起来正常。 如果您将其更改为上升沿并将周期减半、您会得到不同的结果吗?  

    Jesu

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

    这里有一些有趣的东西。 此代码会生成关于我所期望的内容的信息:


          GPIO_WRITE (CONFIG_GPIO_TRIGGER、1);
          vTaskDelay (PDM_TO_TICKs (100));
          GPIO_WRITE (CONFIG_GPIO_TRIGGER、0);
          vTaskDelay (PDM_TO_TICKs (100));
          log_info1 ("time =%dus"、lastPulseLength _us);

    这将生成一个输出、表示边沿到边沿的周期为200、000uS 或200ms、这是预期的。

      GPIO_WRITE (CONFIG_GPIO_TRIGGER、1);
      vTaskDelay (PDM_TO_TICKs (200));
      GPIO_WRITE (CONFIG_GPIO_TRIGGER、0);
      vTaskDelay (PDM_TO_TICKs (200));
      log_info1 ("time =%dus"、lastPulseLength _us);

    这会产生195、000 μ S、不知道如何工作。

      GPIO_WRITE (CONFIG_GPIO_TRIGGER、1);
      vTaskDelay (PDM_TO_TICKs (2000));
      GPIO_WRITE (CONFIG_GPIO_TRIGGER、0);
      vTaskDelay (PDM_TO_TICKs (2000));
      log_info1 ("time =%dus"、lastPulseLength _us);

    即使是陌生人,这也会产生:20,000 us。

    我显然不理解这是如何工作的。 我希望随着边沿之间的延迟增加、周期会更大。

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

    我也有点困惑。 您使用的是 TI-RTOS 还是 FreeRTOS? 此外、您正在使用哪些 SDK 示例和 SDK 版本? 还请为该示例指定 RTOS 版本。  

    Jesu

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

    我正在开发 simplelink_cc32xx_sdk_4_10_00_07 --我从 azure iothub_client_sample_mqTT (SDK 版本 azure_cc32xx_4_10_01_01)示例启动它,但在我的示例中没有激活该代码--所有示例代码都已注释掉。 我一直专注于使外设正常工作。

    我正在使用 FreeRTOS 10.3.1。 我应该注意的是、使用计时器 API 执行相同类型的检测确实有效。 监视输出时、vTaskDelay 函数正在等待正确的时间长度。 我再次验证了示波器上的信号。 FreeRTOS 上启用了时间分片、但我认为这一点无关紧要。

    我完全被骗了。 如果有任何帮助,将不胜感激。 我唯一的想法可能是计时器正在滚动或出现其他问题、但我对实现方案的了解不够。

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

    尊敬的 John:  

    在这个阶段、我可能需要自己测试这个、然后再返回给您。 我将在明天回来。

    Jesu

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

    尊敬的 John:

    我刚刚完成了一些测试、没有发现任何问题。 我在 SDK 中使用了与您的用例非常相似的 capturepwmdisplay 示例。 变量的声明方式以及应用程序的结构方式略有不同、这可能会导致不同的行为。 我建议您尝试利用该示例、看看您是否获得了期望的结果。

    Jesu

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

    感谢您尝试调试这个。 我现在已经开始工作了——我改变了引脚,并且能够定时很短的波,这看起来工作正常。

    对於我原来所面对的问题,仍然不能完全确定测量结果不稳定的原因。