精密计时器。

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

你好,

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

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

我的问题:
当我的超时以月为单位时,我应该做什么来获得最好的计时器精度?

先谢谢你
Ciano霜
丹麦

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

嗨ciano,

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

由于MT_dialog

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

嗨,对话框中,

谢谢你的提示。我将轮询BLE_BASETIMECNT_REG并测试它。

最好的问候,
Ciano霜
丹麦

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

嗨,对话框中,

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

最好的问候,
Ciano霜

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

嗨ciano,

XTAL32是强制的只有在boost配置,因为RCX不能正常工作,你只能使用RCX超过buck,因此XTAL32可以被省略(如数据表所示)。使用XTAL32的原因不是为了保持更精确的时间(这将改善结果及时保持,RCX,但我不认为整个系统是足够准确的RTC原因我以前我在文章中提到过)。在boost模式下使用XTAL32的原因是,当设备进入睡眠模式时,RCX从碱性电池而不是DCDC转换器供电,因此LP时钟上的电压不同,这将导致漂移。

由于MT_dialog

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

嗨,对话框中,

我没有测试你的建议,并通过lldevt_time_get()在我的5分钟计时器读取BLE_BASETIEMCNT_REG。
我计算从时间开始经过的秒数,并打印结果。
代码如下所示

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;

//计算自上次回调以来解析的时间,并以秒为单位增加total计数器。
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:45]
* * * * * *
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]

为了解决这个问题,我需要知道这两个跳跃的原因。
你能解释为什么会发生这种事吗?

最好的问候,
Ciano霜
丹麦

MT_dialog
离线
最后看到:1个月3天前
工作人员
加入: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