【问题标题】:Accurate Time Keeping in C with High Resolution精确的时间保持在 C 中,具有高分辨率
【发布时间】:2015-09-03 23:56:26
【问题描述】:

首先,我知道有很多类似的问题,并且我已经做了很多挖掘,请不要立即产生敌意(根据我的经验,如果本网站上的人认为问题已经被回答,他们会非常敌对)直到你听我说完。如果答案在那里,我还没有找到它,我不想劫持另一个人的问题。

话虽如此,我正在基于 linux 的微型计算机上使用 C 语言工作。我一直在用它来跟踪和控制电机转速,这显然需要保持良好的时间。我最初使用处理器时钟的计算来跟踪毫秒级的时间,但由于各种原因,这可能是很明显的,这是有问题的。然后我切换到使用 time.h,特别是 difftime() 函数。这是一个很好的解决方案,它使我能够准确地跟踪和控制电机转速,几乎没有问题。但是我现在想绘制该数据。这又不是太成问题,只是情节看起来很糟糕,因为我的时间尺度不能低于秒。

我能找到的最佳解决方案是使用 sys/time.h 和 gettimeofday() ,这可以提供更高分辨率的纪元以来的时间。然而,据我所知,问题是,没有 difftime() 类型的函数可以保持更高的时间分辨率。为什么这是一个问题?因为 difftime() 返回一个双精度值,可以很容易地用于从旋转编码器旋转计数 (rotations/(sec/60)) 计算 RPM,而似乎没有办法使用 gettimeofday() 作为一个使用 time_t 结构,另一个使用 timeval 结构。

那么有没有办法以比秒更好的分辨率准确地返回两次之间的时间差(由自纪元以来经过的实时时间确定)?或者,有没有人知道一种更好的方法来准确测量经过时间来计算 RPM?谢谢你。

【问题讨论】:

  • 如何将 time_t 转换为 timeval 结构? stackoverflow.com/questions/9252849/convert-timeval-to-time-t
  • 如果没有硬实时扩展,我非常严肃的建议是不要这样做。根据您正在做什么以及这是哪种电机,它不会工作,损坏您的电机或(如果那是高压/大电流电机)危及生命。
  • @Olaf 是否冒风险很大程度上取决于他使用的接口语义和硬件。在不知道他实际做什么的情况下,理论化是毫无意义的。他使用 difftime 的事实向我表明,他可能会运行一个无限循环而不会阻塞。这将是一个可解决的问题。 epoll 来救援?
  • @Olaf 它是一个很小的电机,与另一个很小的电机耦合,仅用于学习目的。 PID反馈控制系统。有用。我唯一的问题是我想绘制数据以显示 RPM 与时间的关系,并让它看起来很流畅。这似乎是不可能的,因为 RPM 计算使用秒并且时间限制为秒。
  • @J.Hamman 我仍然需要弄清楚绘图是如何进入这一切的。您可以创建一个队列并将 (x,y) 值添加到队列中,然后在另一个线程中进行绘图,不是吗?

标签: c time real-time


【解决方案1】:

将gettimeofday 的结果转换为双精度:

gettimeofday(&now, NULL);
double dsecs = now.tv_sec + (now.tv_usec / 1000000.0);

那么您的difftime 只是其中两个dsecs 的减法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多