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.

[参考译文] MSP430F1611:时钟漂移补偿。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/655031/msp430f1611-clock-drift-compensation

部件号:MSP430F1611
主题:CC2420中讨论的其他部件

尊敬的各位:

我正在使用与CC2420一起安装的TelosB进行无线电通信。

这里我尝试实现TelosB与网络时钟之间的时钟同步。

到目前为止,我已经设法检索到了网络的时钟。

系统的工作方式如下:

  1. 标记开始其自身的计数器,增量为7.25ms
  2. (counter * 7.25 的值)/(10^-6)将值转换为微秒。
  3. 仅当数据包类型正确时,标记才会接收。
  4. 网络的时钟值也乘以7.25ms,以与标签的计数器进行比较。
  5. 将对这些值进行比较,如果两个值之间的差异大于15us,则必须同步。 但是,仍有一些出错的情况会随着时间的推移而增加(TelosB的时钟漂移)。
  6. 要纠正此错误,需要跟踪过去网络的时钟和接收时的内部计数器值,并计算相对于TelosB和网络的已用时间的比率。 此数值是漂移系数,用于校正增量。
  1.  app_vars.compensatedtime =((app_vars.current_time - app_vars.capture_previous_time)/app_vars.alpha)+app_vars.capture_time; whre alpha is
  2. app_vars.localdelta = app_vars.current_time - app_vars.previous_time;
  3. app_vars.networkdelta = app_vars.capture_time - app_vars.capture_previous_time;
  4. app_vars.alpha = app_vars.localdelta/app_vars.networkdelta;


这样,我就能得到一个小于15 us的相对误差,而我不能。 我认为我在守则中可能犯了一个错误。

此代码随附在本文件中,非常感谢您提供任何帮助。

谢谢你

e2e.ti.com/.../8880.01bsp_5F00_radio_5F00_rx.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不确定这里是否使用了一致的装置。 根据我的理解,1个计时器嘀嗒声表示7.25 ms (毫秒)。

    > app_vars.capture_time =(app_vars.ASN * 7.25)/10万;//在我们中,来自经理的值
    > app_vars.current_time =(app_vars.num_asn*TelosB)/10万;//在我们中,7.25 内的计数器

    乘以7.25 得到毫秒后,您可以(a)除以1000得到(浮点)秒,或(b)乘以1000得到(整数) usec (微秒),但这似乎都不能。 随后与"15"值的比较似乎是预期的(b)。

    > IF (app_vars.current_time - app_vars.capture_time > 15 || app_vars.capture_time - app_vars.current_time > 15)

    稍后,
    > app_vars.num_asn =(app_vars.compensatedtime*100万)/7.25 ;

    这似乎是预期的(浮点)秒数,但乘以100万得到usec后,它应该除以(7.25 *1000) usec得到计时器tick。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的Bruce:

    感谢您的回复。

    你说的没错,我在数学方面犯了一个愚蠢的错误。

    这里是它的修改代码,

    app_vars.ASN =(uint64_t)app_vars.UART_txFrame[0]+((uint64_t)app_vars.UART_txFrame[1]<8)+((uint64_t)app_vars.UARS.UART_XFrame[2]+(((utx64_t)app_vars[32_intars)uars)3<_头 帧
    app_vars.current_network_time =(app_vars.ASN * 7.25)*100万;   // 以获取我们的值
    app_vars.current_local_time =((app_vars.num_ASN * 7.25)*100万); // 以获取我们的值


    //--- 在计算新的alpha和材料之前,如果错误太大,您将切换LED
    app_vars.compensated_time =(app_vars.current_local_time - app_vars.previous_local_time)*alpha + app_vars.previous_network_time;

    如果(ABS (app_vars.current_network_time - app_vars.compensatedtime)> 15){
    LEDs_all_on();
    }其他{
    LEDs_all_off();
    }

    //--- 计算新的alpha
    APP_vars.local_delta = APP_vars.current_local_time - APP_vars.previous_local_time;
    app_vars.network_delta = app_vars.current_network_time - app_vars.previous_network_time;

    如果(app_vars.previous_local_time == 0){//当previous_local和previous_network仍初始化为0时,您不想计算alpha
    app_vars.alpha = 1 //它应该初始化为1,我在这里重做只是为了确保
    }其他{
    app_vars.alpha = app_vars.local_delta / app_vars.network_delta;  
    }

    app_vars.previous_local_time = app_vars.current_local_time;
    app_vars.previous_network_time = app_vars.current_network_time;

    app_vars.num_asn =(app_vars.compensated_time/(100万*7.25); //将我们转换为获取计时器tick

     


    这对我来说似乎没问题,但我不太确定我的代码是否与我尝试实施的代码正确编写

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果此代码满足您的需求,这很好,但它(仍然)与您的描述不匹配。

    如果ASN以7.25 毫秒为单位,则current_network_time以纳秒为单位。 稍后带有competed_time的算术可以正确反转此值,但与"15"的比较是以纳秒而不是微秒为单位。