精密计时器。

7新职位/ 0
最后发表
ciano
离线
最后看到:2个月2周前
加入:2014-10-03 08:13
精密计时器。

你好,

我需要一个精密超时功能。像几个月。

我用一个app_easy_timer()和最长延迟可能(5 * 6000 - 1),5分钟-10 ms。如果我错了,请纠正我。
在我重启定时器回调我增加自己的计数器和计时器与app_easy_timer ()。
我使用的最高精度
#定义CFG_LP_CLK LP_CLK_XTAL32
XTAL32睡眠。
然而,在我看来计时跑快了5%。

我的问题:
我应该做些什么来得到最好的定时精度,当我超时是几个月?

提前谢谢你
Ciano霜
丹麦

设备:
MT_dialog
离线
最后看到:1年4个月前
工作人员
加入:2015-06-08 34
嗨ciano,

嗨ciano,

app_easy_timers()没有足够的presision RTC和运行来计算准确的个月,原因是由于基地计时器,内核计时器的依赖,它被补偿设备每次醒来,在时间测量中引入了一个错误,我不确定如果改变当前XTAL32更精确的时钟你将能够减少错误,很可能你不会。你可以尝试为了测量时间,而不是一个内核计时器,可以通过内核定时器唤醒和轮询的时间通过lld_evt_time_get BLE_BASETIMECNT_REG()函数,这也许会给你更准确的时间测量,因为它删除任何开销ke计时器,但即使是这样,我不知道你会得到你想要的准确率,清债信托公司。

由于MT_dialog

ciano
离线
最后看到:2个月2周前
加入:2014-10-03 08:13
嗨,对话框中,

嗨,对话框中,

谢谢你的提示。我将调查BLE_BASETIMECNT_REG和测试它。

最好的问候,
Ciano霜
丹麦

ciano
离线
最后看到:2个月2周前
加入:2014-10-03 08:13
嗨,对话框中,

嗨,对话框中,

一个问题:
如果使用一个精确XTAL32,我们做的,不会给更准确的时间,然后使用XTAL32的好处是什么而不是内部RCX ?

最好的问候,
Ciano霜

MT_dialog
离线
最后看到:1年4个月前
工作人员
加入:2015-06-08 34
嗨ciano,

嗨ciano,

XTAL32是强制性的只有在提高配置自RCX不能够正常工作,您只能使用RCX在巴克因此可以ommited XTAL32(如数据表所示)。使用XTAL32的原因不是为了保持更精确的时间(这将改善结果及时保持,RCX,但我不认为整个系统是足够准确的RTC原因我以前我在文章中提到过)。使用XTAL32提高模式的原因是因为当设备进入睡眠模式RCX从碱性电池和动力不是来自DCDC变换器,所以不同电压对LP时钟,这将导致漂移。

由于MT_dialog

ciano
离线
最后看到:2个月2周前
加入:2014-10-03 08:13
嗨,对话框中,

嗨,对话框中,

我没有测试你的建议,与阅读BLE_BASETIEMCNT_REG通过lldevt_time_get()在我5分钟计时器。
我计算以来经过的秒开始,并打印结果。
的代码是这样的

uint32_t app_too_old_timer_cnt [NUM_SAFETY_CPY] __attribute__ (((“retention_mem_area0”)部分,zero_init));/ / @RETENTION记忆;
uint32_t app_ble_basetimecnt_reg_old [NUM_SAFETY_CPY] __attribute__ (((“retention_mem_area0”)部分,zero_init));/ / @RETENTION记忆;

. .

5分钟内回电话

uint32_t ble_basetimecnt_reg;
uint32_t time_since_last_cb_in_seconds;

/ /计算时间解析自去年回调,增加总计数器在几秒钟内。
ble_basetimecnt_reg = lld_evt_time_get ();/ /得到625我们蜱虫
time_since_last_cb_in_seconds = (ble_basetimecnt_reg - app_ble_basetimecnt_reg_old [0]) * 0.000625;
app_too_old_timer_cnt [0] + = time_since_last_cb_in_seconds;
/ /更新basetimecnt副本
app_ble_basetimecnt_reg_old [0] = ble_basetimecnt_reg;

arch_printf(“我% \ r \ n”, app_too_old_timer_cnt [0]);

这给我打印后,我注意到2大跳跃时间:
82823年[16/10/16 - 15:09:15:366]
83122年[16/10/16 - 15:14:15:355]
83421年[16/10/16 - 15:19:15:345]
* * * * * *
2684189 [16/10/16 - 15:24:15:344]
2684488 [16/10/16 - 15:29:15:333]

2767311 [17/10/16 - 14:34:12:500]
2767610 [17/10/16 - 14:39:12:499]
* * * * * * * *
5368378 [17/10/16 - 14:44:12:489]
5368677 [17/10/16 - 14:49:12:488]

为了解决这个pusle,我需要知道这两个跳跃的原因。
你有任何解释为什么会发生?

最好的问候,
Ciano霜
丹麦

MT_dialog
离线
最后看到:1年4个月前
工作人员
加入:2015-06-08 34
嗨ciano,

嗨ciano,

我已经注意到,“跳”前的83421年值对应于((83421/60)/ 60)= 23日1725小时(您已经运行这个测试一段时间不到一天,对吗?)这是approximatelly BASETIMECNT的大小是27位计数寄存器(在接下来的5分钟,从83421年的价值是印刷,柜台会运行从发出召唤,开始计数)。当定时器达到最大值点会展期因此,当ke_timer击中ble_basetimecnt_reg变量的当前值将小于前一个值相同的变量,因此,减法将导致一个负数存储在一个32位无符号变量类型,然后将值添加到之前的计算值,我想这是看到这种跳跃的原因在您打印的值。

由于MT_dialog