如何定期将NTP时间与本地基于计时器的时间同步

时间:2016-09-10 17:55:18

标签: time arduino clock esp8266 ntp

我有一个带WiFi的嵌入式系统(基于80MHz ESP8266,使用Arduino IDE开发),我希望它能够保持合理准确的时钟时间(一秒钟),使用它可以使用的两个工具:互联网,以及它自己的内部计时器。

挑战:

  • 处理器时钟可能会随着时间的推移而漂移,表面上是一个 可预测的方式。
  • NTP使用UDP,因此无法保证返回数据包的时间 按顺序返回,或在任何设定的间隔内返回,或返回 完全没有。
  • 返回的延迟NTP数据包随着时间的推移而变化很大 100毫秒到(可能)几秒钟。
  • DNS的延迟随着时间的推移而变化很大,从100毫秒到100毫秒不等 几秒钟(我无法控制超时)。需要DNS来查看 up NTP服务器池的IP地址。
  • 系统根据特定时间采取各种行动 间隔,所以我不想过度控制时间,设置它 不断前进和后退,导致行动不必要 错过或重复(或者,使程序复杂化) 逻辑处理所有这些条件 - 偶尔错过或 复制不是关键任务)。
  • 有时NTP服务器会返回错误的时间(例如, pool.ntp.org自1900年以来偶尔会返回0秒,这很容易 检测)
  • 有时会出现带有旧时间的杂散返回数据包 在当前请求的返回数据包之前。

当前方法:

  • 使用每0.1触发的ISR保持本地设备时间递增 第二。
  • 定期投票(目前每6分钟一次,但实际上没有 经常这是一个NTP服务器(池)。
  • 如果在短暂的间隔内没有响应,请再试一次(目前为1 第二,这比典型的短,但大多数请求返回 不到150ms)。
  • 每次尝试改变NTP服务器(池),以分散负载 平均响应时间和任何服务错误。
  • 将时间提取到最接近的0.1秒(并调整为典型值 接收延迟)。
  • 如果NTP时间偏离本地设备时间超过a 第二,更新本地设备时间(在关键部分)。
  • 超时,重试并重新初始化(如果适用),失败 网络元素的过程。最希望之后抛弃请求 迷路了,下次再试一次。

是否有更好的,规范的或最佳的实践方法来进行此时间同步?我还缺少其他因素或方法吗?

1 个答案:

答案 0 :(得分:0)

对于来自互联网或GPS系统的自动更新时间将过度杀害廉价的arduino项目,因为您可能需要以太网屏蔽并编写TSR程序,该程序将定期向arduino发送更新时间。相反,您可以购买更精确的RTC时钟(有些时候会更准确),并使用与arduino结合的键盘和LED显示屏不时手动更新时钟。如果你的项目对时间非常关键,那么最好给你一些廉价的基于水晶的解决方案。