`《无线网络时间同步算法框架的初步搭建》
作者:佛山黄飞鸿,电子发烧友网用户jf_92883559
摘要:WSN网络在传输数据时,用户数据接入,一种方式是基于CSMA/CD协议,另一种方式是基于TDMA的方式,或者二者的混合使用。CSMA/CD接入机制,当用户较多的时候,开销较大;TDMA的方式开销紧凑,但是需要较为精确的时间同步。本研究基于NTP协议,研究无线网络的时间同步算法。本研究刚刚起步,因为时间的关系,本报告只是此研究算法的一个初步框架搭建。
关键词:NTP协议 32位MCU Keil51 EFM32tiny Gecko 帧结构
1、前言
WSN这一类的无线网络在传输数据时,用户数据接入,一种方式是基于CSMA/CD协议,另一种方式是基于TDMA思想的同步时隙的方式,或者二者的混合使用。CSMA/CD接入机制,当用户较多的时候,开销较大;TDMA的方式开销紧凑,但是需要较为精确的时间同步。有了较为精确的同步时钟,那么采用TDMA的思想,对于无线网络中的接入单元,按照时隙进行划分,各接入单元在分配给自己的时隙上发送数据,从而避免CSMA/CD接入机制带来的额外开销。这个思想,在802.15.4e这个协议中得到较为充分的体现;在WSN领域,TPSN,也是这一思想的直接体现。
时间信息的有效交换,是实现精确同步的基础;时钟信息交换的基本思想,在NTP协议中有表述得比较详细,这里不做重复的论述。通过无线网络时间标签的交换,所得到的校正时间差,实际上存在波动。本研究试着做一些较为深入的探讨,来提高时间同步的精度。
因为时间的关系,本文只是交流一下本研究的硬件平台的搭建,以及初步的一些结果。
2、硬件平台硬件平台由
1:USB转TTL转换模块 ;2:EFM32 Tiny Gecko测试板 ;3:HC32L136K8TA 应用板;4:笔记本电脑。以及杜邦线组成,如图1和图2所示。
图1:应用系统
图2:整个测试系统
华大的单片机的应用系统,是在拿到EFM32 Tiny Gecko之前就做了的一个应用板,使用了一段时间。它也是一个32位的MCU。拿到EFM32 Tiny Gecko后,试着把代码移到这个平台上,发现不是很容易,而任务是有进度的,所以最后放弃了这个想法,继续在这个应用平台上继续做工作。
在试着使用EFM32 Tiny Gecko的过程中,发现,这个开发板可以当JLink调试器使用。而配置非常方便,在simplicity中做简单的配置,就可以使用。
HC32L136K8TA 要用到的资源如下:
1:显示控制器
2:RTC实时计数器
3:UART
4:若干GPIO。
3、软件平台和主要软件功能
1:Keil5开发工具
2:matlab2018
下位机HC32L136K8TA上的软件完成下面的功能:
1:接收上位机传过来的数据帧,并解析数据帧;
2:执行相应的帧命令,a:根据上位机传递过来的时间信息,计算同本地时间的误差,并修正本地时钟,通过HC32L136K8TA应用板上的显示屏显示出来;b:回传本地时间信息给上位机。从而完成一次完整的时间校正过程。
上位机为笔记本电脑,上位机软件为基于Matlab2018的主控代码,完成的功能为:
1:产生不同的数据帧和命令帧,并根据实际的需要下发;
2:接收下位机传过来的数据帧,并做相应的处理。
HC32L136K8TA上的主要代码函数:
1:协议解析代码
2:接收中断代码
- void Uart1_IRQHandler(void)
- {
-
- //uint8_t temp_rcv;
- // Uart_SendDataPoll(M0P_UART1,0XDD);
- //数据接收中断
- if(Uart_GetStatus(M0P_UART1, UartRC))
- {
- //Uart_SendDataPoll(M0P_UART1,rcv_count);
- Uart_ClrStatus(M0P_UART1, UartRC);
- temp_rcv= Uart_ReceiveData(M0P_UART1);
- Frame_Token[rcv_count]=temp_rcv;
- if (rcv_count>=1)
- {
- rcv_count=0;
- }
- else
- {
- rcv_count=rcv_count+1;
- }
-
- //Uart_SendDataPoll(M0P_UART1,rcv_count);
-
- if ((Frame_rcv_status==1)&&((Frame_is_Head!=1)||(Frame_TAG!=1)))
- {
- rx_data[Frame_data_count]=temp_rcv;
- Frame_data_count=Frame_data_count+1;
- }
-
- if ((Frame_Token[0]==255)&&(Frame_Token[1]==255))
- {
- //Uart_SendDataPoll(M0P_UART1,rcv_count);
- Frame_Token[0]=0;
- Frame_Token[1]=0;
- rcv_count=0;
- Frame_rcv_status=1;
- Frame_is_Head=1;
- Frame_data_count=0;
- Frame_flag=0;
- //Uart_SendDataPoll(M0P_UART1,temp_rcv);
- //rx_data[Frame_data_count]=temp_rcv;
- rcv_count=0;
- }
-
- if ((Frame_Token[0]==254)&&(Frame_Token[1]==254))
- {
- //Uart_SendDataPoll(M0P_UART1,2);
- Frame_Token[0]=0;
- Frame_Token[1]=0;
- Frame_TAG=1;
- rcv_count=0;
- Frame_rcv_status=0;
- Frame_data_count=Frame_data_count+1;
- //rx_data[Frame_data_count]=temp_rcv;
- Frame_flag=1;
- rcv_count=0;
- }
-
- if(Frame_flag==1)
- {
- for(i=0;i
- protocol_data[i]=rx_data[i];
- }
-
- // THE END OF THE RECEIVING INTERRUPT PRPCESSING
- }
- // The end of the TRX interrupt processing
- }
复制代码
matlab
Matlab上的主要代码函数:
1:串口配置函数
- function g=UART_config(FrameSize)
- delete(instrfindall);
- g=serial('com5');
- g.InputBufferSIZE=1024;
- g.OutputBufferSIZE=1024;
- g.timeout=0.6;
- g.BaudRate=9600;
- g.Parity='even';
- g.StopBits=1;
- g.Terminator='';
- g.FlowControl='none';
- g.BytesAvailableFcnCount = (FrameSize+3);
- g.BytesAvailableFcnMode = 'byte';
- g.BytesAvailableFcn = @instrcallback;
- fopen(g);
- end
复制代码
2:时间帧数据组帧函数
- function clock_data=Clock_Data_Frame_Sending(address,data)
- syn_head=255;
- syn_tag=254;
- slave_command=hex2dec('AC');
- clock_current=fix(clock);
- year=clock_current(1);month=clock_current(2);date=clock_current(3);hour=clock_current(4);
- minutes=clock_current(5);second=clock_current(6);
- year=num2str(year)
- year_high=str2num([year(1) year(2)]);year_low=str2num([year(3) year(4)]);
- data=[address,slave_command,year_high,year_low,month,date,hour,minutes,second];
- data=uint8(data);
- table_crc8=uint8(create_crc_table());
- crc8_int=cal_crc_table(data,length(data),table_crc8);
- clock_data=uint8([syn_head,syn_head,data,crc8_int,syn_tag,syn_tag]);
-
- end
复制代码
4、测试结果
图3:同步前MCU和本地计算机的本地时间
图4:同步后MCU和本地的时间
比较上面的结果,可以看出,MCU上的时间同本机的时间同步上了。
5、结果分析
1:同步精度的问题
从结果可以看出,同步精度在秒这个级别。这其中的原因是计算机没有显示到毫秒级别。32位单片机提供的RTC函数,也没有到毫秒级,这个问题可以进一步研究。这需要自己编写毫秒级的读取函数。精确到0.01毫秒,这对于无线通信来说,是非常重要的。
2:无线信道的问题
现在是用有县信道(RS232)代替的无线信道,这也会给时间同步的精度带来一定的影响。进一步的研究,是进一步寻求无线通信模块,来运行这个算法。
3:数据的波动
实际上,误差数据的波动,会给同步精度带来一定的影响。如图5所示。
图5:连续10次等间隔读下位机时间的所得的值
图6:连续10次等间隔读下位机时间的所得的值区域放大
从图5和图6可以看出,在秒这个时间单元上,返回的值,并不是等间隔。如果是无线信道,可以预见,这个数据会在一定的区间内摆动,因而,需要滤波算法,对其进行滤波,使得时间修正值能准确地跟踪主机和从机之间的时钟漂移。
6、总结
本研究刚刚启动,写得比较粗糙,见谅。
`
|