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.

[参考译文] CC1352R:TIRTOS usSleep 精度

Guru**** 2483615 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1196379/cc1352r-tirtos-usleep-precision

器件型号:CC1352R

大家好、

时间精度存在问题。 我从 SDK6.20下载了 TI 驱动程序 GPIO 待机示例并做了一些更改、因此在 GPIO_0上有一个波形、265us 开启、938us 关闭。  

void *mainThread(void *arg0)
{
    GPIO_setConfig(CONFIG_GPIO_0, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);

    while (1)
    {
        GPIO_write(CONFIG_GPIO_0,1);
        usleep(265); //265us ON
        GPIO_write(CONFIG_GPIO_0,0);
        usleep(938); //938us OFF
    }
}

我已经更改了 USSleep 功能的睡眠功能、以获得微秒精度。 但是、根据使用逻辑分析仪对 GPIO 的分析、GPIO 的这种计时精度似乎很差。

 

在这里、我应该有265us 的接通时间、我有384us、而不是938us 的接通时间、我有1052us。 这是114到119us 的差异!  为什么这些内容与插入到 usSleep 函数中的内容有如此大的不同?  

接下来、我尝试调整函数中的输入值以匹配预期的实际值、因此我得出的值是 usleep (175)值(on)和 usleep (840)值(off)。 现在实际的信号更接近所需的值:

   

不过、从一个脉冲到另一个脉冲、计时似乎略有变化。 例如、我可以看到的导通脉冲的值从284到299us、变化幅度为16us。 关断期间也会发生同样的情况。

为什么会发生这种情况? 如何提高精度?   

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

    您好!

    通常、建议睡眠时间大于2ms (这与唤醒开销有关)。

    如果您不一定需要"待机",那么考虑使用 CPUDelay (相关文章: CC1310 : usleep 不精确-低于1 GHz 论坛-低于1 GHz - TI E2E 支持论坛 )。

    对于您的用例、似乎 PWM 很适合您-请参考我们在此处提供的 PWM 示例:  https://dev.ti.com/tirex/explore/node?node=A__AJfRc6bTwdnXsenmEjSIVg__com.ti.SIMPLELINK_CC13XX_CC26XX_SDK__BSEc4rl__LATEST

    我已经通知了低于1GHz 团队、以征求进一步的意见。

    谢谢。
    待机

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

    嗨、托比:

    感谢您的回复。

    1-好的、"睡眠"的最小值为2ms、但"睡眠"怎么样? 我认为它可能也有开销、尽管小了吗?

    开销是否适用于 Task_sleep 和 Semaphore_pend 等函数? 因为除了使用睡眠功能之外、我同时尝试了两种方法、并且它们都有相同的延迟问题。  

    3-我将检查 CPUDelay、谢谢。

    4 -是的、PWM 对于本例是理想的、但这只是我创建的一个示例、用于解释情况/问题。  

    谢谢你

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

    JD、您好!

     根据 usleep 函数的定义,我看到它使用 Task_sleep()。  这将调用调度程序、将任务置于阻止状态、然后在发生超时时时时恢复到就绪状态。 此行为可能取决于优先级。 另一方面、CPUdelay 会阻止任务调度、您获得更一致的延迟。  

    您是否尝试过 CPUdelay、它是否适合您?

    此致、

    SID  

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

    尊敬的 Sid 和 Toby:

    是的、我能够借助 CPUDelay 帮助我们实现高精度。 谢谢。