初探电波钟(A Brief Introduction Of Radio Controlled Clock AND Its Appliciations)
文档标识符:Radio_Controlled_Clock_T-D-P11
作者:DLHC
最后修改日期:2020.10.12
本文链接:https://www.cnblogs.com/DLHC-TECH/p/Radio_Controlled_Clock_T-D-P11.html
前言
如何获取准确的时间?古人通过观察太阳在天空的方位获取当前的时间,这种方法所获取的时间很粗略,但是它仍然被许多求生者使用。现代社会对时间的准确性、同步性要求很高。比如说你9月10日去坐火车,但是由于你手机的时间慢了20分钟,你成功地错过了火车(但现在这很少发生)。有没有一种方法可以使"时间"以光速传播?
无线电在20世纪初开始得到应用,最初用于军事、船舶导航和通信,那么无线电与时间有什么关系?我们知道无线电可以传播信息,如果有一些机构拥有准确的时间,那么他们就可以将编码了时间的信息调制到一定频率的无线电波上,并且发射出去,使一定区域内的用户可以捕获此信号并解码出当前准确的时间,这一过程的误差为发射到解码的时间差。目前所广泛使用的授时方法有:卫星授时、网络授时、无线电广播授时和电波钟。本文所讨论的就是一种基于无线电低频时码授时的方法----电波钟(Radio Controlled Clock或简称RCC)。
在我国,电波钟的知名度似乎不太高(火腿除外),但是它的应用却非常广泛:BPC挂钟、手表自动更新时间等。中国在河南商丘修建了100kW中国商丘低频时码信号发播台(以下简称BPC)[1],发射频率为68.5KHz[1],发播时间:9:00—17:00,21:00—5:00[1],其覆盖范围见图0.0,中国大部分地区以及周边邻国可以接收到该信号。为什么要使用68.5KHz的频率?68.5KHz位于长波[2]波段,长波可以通过天波----即电离层[3]反射,的方式传播,其传播范围很广。
除中国外(中国不是第一个应用此项技术的国家),也有其他国家使用电波钟授时,包括:德国、英国、日本和美国,详细见表0.0。
图0.0-中国商丘低频时码信号发射台覆盖范围示意图
国家/地区 | 坐标 | 发射站名称 | 发射频率(KHz) | 发射功率(KW) | 发射时间 |
中国/商丘 | 33° 43'N, 114° 49'E | BPC | 68.5K | 100KW | 09-17&21-05 |
德国/Mainflingen | 50° 01'N, 09° 00'E | DCF 77 | 77.5K | 50KW | 全天 |
瑞士/Prangins | 46° 24'N, 06° 15'E | HBG | 75K | 20KW | 全天 |
英国/Rugby | 52° 22'N, 01° 11'W | MSF[9] | 60K | 50KW | 全天(部分时间有短暂中断) |
美国/Fort Collins/Colorado | 40° 40'N, 105° 03' W | WWVB | 60K | 50KW | 全天 |
日本/福岛县 | 37° 22'N, 140° 51'E | JJY40 | 40K | 50KW | 全天 |
日本/福岗, 佐贺县 | 33° 28'N, 130° 11'E | JJY60 | 60K | 50KW | 全天 |
表0.0-世界各国电波钟一览[4]
三个接收并解码BPC的方法
方法一:通过SDR和调谐到68.5KHz的天线即可完成接收和解码,最简单。
方法二:DIY接收部分的电路和天线以及单片机解码系统,最复杂,可以参考这里。
方法三:使用集成电路模块(CME6005)和调谐到68.5KHz的天线以及单片机解码,比方法二简单,并且可以探索BPC编码方式,本文将采用此方法。
图1.0-CME6005模块(正)
图1.1-CME6005模块(反)(反面的丝印竟然也是反的?!)
BPC编码机制
BPC的编码方法相当简单:每1分钟发送3帧数据,每1帧数据由20个片段组成(只有19个片段包涵了有效信息),每1个片段由长为1s的脉冲构成[6]。
每一帧数据包含了“秒” “时” “分” “星期” “上下午” “日” “月” “年”以及“校验位”,相邻的帧之间使用1个空白的片段间隔[6],理论上1分钟可以解码出3次时间。
信息编码在这些1s的脉冲中,脉宽0.1s、0.2s、0.3s、0.4s分别对应四进制0、1、2、3。采用四进制编码可以很方便地将信息进行拓展为二进制,这种方法叫做码位复用,详见表1.0[6]。注意不同的位有不同的权值,见图2.0。
具体编码机制:以帧为单位进行分析,同时分析1分钟内3帧的差别,详见表1.1与图1.0。理论上,1分钟内的3帧只有“帧号”和“校验位”不同,其他位均相同。
四进制 | 二进制 |
0 | 00 |
1 | 01 |
2 | 10 |
3 | 11 |
表1.0-四进制与二进制的转换关系
序号 | 名称 | 四进制位数 | 等效二进制位数 | 表示范围(DEC) | 说明 | 备注 |
1 | 帧号 | 1 | 2 | 无意义 |
0表示第1秒,1表示第21秒,2表示第41秒 |
通过这一位可以判断当前时间的秒位 |
2 | 保留 | 1 | 2 | 无意义 | 未使用位,暂无意义(目前恒为四进制"0") | 为未来升级BPC编码预留 |
3 | 小时 | 2 | 4 | 0~11 | 转换为十进制表示当前时间的小时位 | 有效数据 |
4 | 分钟 | 3 | 6 | 0~59 | 转换为十进制表示当前时间的分钟位 | 有效数据 |
5 | 星期 | 2 | 4 | 1~7 | 转换为十进制表示当前时间的星期位 | 有效数据 |
6 | 午别&校验 | 1 | 2 | 无意义 | 将此位四进制数转换为两位二进制数,高位表示上下午,0表示上午,1表示下午;低位为帧的第0位至第8位的校验(帧的第一位记为0)----将其转换为二进制后,有奇数个1为1,有偶数个1为0 | 指示上下午,并对此帧前半部分的数据进行校验 |
7 | 日 | 3 | 6 | 1~31 | 转换为十进制表示当前时间的日期位 | 有效数据 |
8 | 月 | 2 | 4 | 1~12 | 转换为十进制表示当前时间的月份位 | 有效数据 |
9 | 年(低6位(Bin)) | 3 | 6 | 0~63 | 加上年的最高位(此时表示范围拓宽到0~127)并转换为十进制后加上2000即表示当前时间的年份位,按照这样编码,BPC最久可以用到2127年末 | 有效数据 |
10 | 保留&校验 | 1 | 2 | 无意义 | 将此位四进制数转换为两位二进制数,高位表示年的最高位(目前恒为四进制"0");低位为帧的第10位至第17位的校验(帧的第一位记为0)--有奇数个1为1,有偶数个1为0 | 拓宽年份的表示范围,并对此帧后半部分的数据进行校验 |
11 | 帧起始预告位 | 1 | 2 | 无意义 | 未使用位(缺少脉冲,NTCO引脚输出1s的低电平) | 分隔相邻的帧 |
表1.1-BPC帧格式[6][7][8]
图2.0-BPC帧格式图解[8]
图2.1-一个BPC编解码实例[7]
实际上应该如何解码BPC
最简单的解码方法莫过于使用微控制器,通过对微控制器进行编程,使其检测BPC发送信号的脉宽(实际上,CME6005模块从天线接收BPC信号,并将解调后的信号交给微控制器解码),从而识别出每段片段对应的码值。接收完一帧数据后,就可以解码出相应的时间。
但是,实际情况并没有这么简单。无线电在传播过程中会有一定程度的衰减,加上环境中的电磁干扰,以及地理位置和天线等诸多因素,你所接收到的BPC信号可能会存在一定的误差,这时候我们就需要使用校验位对数据帧进行校验。
综上,对解码提出以下要求:
1.实现对时、分、年、月、日、星期的解码。
2.实现秒指示。
3.实现数据纠错。
听一听电波钟的声音
将CME6005模块反相输出的解调后的BPC信号经过音频功率放大,驱动无源蜂鸣器发声。
CME6005模块包含了CME6005电波钟集成电路、调谐到68.5KHz的磁棒天线以及外围分立元件。模块引出了电源、地、PON和NTCO四个引脚。PON为工作模式选择引脚,NTCO为解调后的信号的反向输出引脚,CME6005框图如图3.0所示。模块工作电压1.2v~~5.5v,休眠电流0.03uA,最大工作电流120uA[4]。
以下是原文对CME6005集成电路的描述:CME6005 是一款高度集成的 BI-CMOS 低频接收解码芯片。 这一款高灵敏度,低功耗的芯片能解调多国电波信号包括美国 (WWVB)、 德国(DCF77)、 日本(JJY40 和 JJY60)、 英国(MSF)和瑞士(HBG)。 CME6005 内含了一个独特的双频晶体补偿功能、 单/双频电波接收功能、 AGC锁定功能、使 CME6005 成为一个极理想的无线电波方案。[4]
功放采用TBA820M,乙类功放,供电电压3v~~16v,最大输出功率为2w。引脚定义和典型电路如图3.1和图3.2所示。
实际测试中,会出现两种情况。第一种,蜂鸣器持续发出噼~噼~啪~啪的声音,并且时而密集,时而稀疏,可以想象成一大串鞭炮爆炸的场景。这种情况是无效的,没有有效的电波钟数据输出。第二种,蜂鸣器发出的声音呈现特定规律,例如:噼~噼~噼~安静| 噼~噼~安静| 噼~噼~噼~噼~安静,并且周期为1s。此时接收到的是有效的电波钟原始数据,解码该数据就可以获得当前时间。
实际测试中,户外可以接收到有效数据,室内偶尔也可以接收到有效数据,但是接收到无效数据(上述第一种情况)的几率似乎更大(测试地点:四川)
图3.0-CME6005框图[4]
图3.1-TBA820M引脚定义[10]
图3.2-TBA820M典型电路[10]
图3.3-实验电路(正)
图3.4-实验电路(反)
简单地看一下电波钟的波形
如果没有逻辑分析仪,可以使用单片机读取NTCO引脚电平状态并通过串口发回。如果每20ms采样一次,通信的波特率为500bps(8位数据位-1位起始位-1位停止位),使用51单片机就可以实现。如果20ms采样一次,每秒可以采样50次,NTCO的最短高电平时间为100ms,理论上可以实现波形的复现而不失真。下图即为一次调试过程中获得的波形数据。
图4.0-串口发回的时长为20s的波形
获取BPC有效数据并解码
单片机每10ms对NTCO引脚采样一次,为了获取一帧有效数据,需要完成以下步骤:
1.检测帧起始标志位,即:长达1s的低电平(实际上NTCO引脚存在由外界干扰所产生的噪声,所以应该设立一个阈值,超过该阈值则判定其为帧起始标志位)。
2.检测到帧起始标志位后,通过定时采样NTCO引脚以获取有效数据(为了消除噪声带来的影响,应该设立一个阈值,以判断有效数据的四进制状态)。
3.校验获取的数据,并将其按照一定格式转换为时间。
以图5.0最后一组数据为例,详细介绍如何将获取到的有效数据转换为时间。
最后一组数据为“0 0 1 3 1 1 1 1 0 3 0 2 0 2 2 1 1 0 1”,下面演示如何解码原始数据。
0:第1秒
0:保留位,恒为0
13:时,4+3+12=19
111:分,16+4+1=21
10:星期,4+0=4
3:高位为1,表示下午;低位为1,表示奇检验。
020:日,0+8+0=8
22:月,8+2=10
110:年,16+4+0+2000=2020
1:高位为0,即年的最高位为0;低位为1,表示奇校验。
具体的程序见github。
图5.0-实际获取的有效数据
图5.1-解码出的时间
github
程序和部分参考资料见github:https://github.com/HaochuanDeng/Radio-Controlled-Clock_BPC-China
Acknowledgment
[1]XNY Electronic(淘宝店铺,老板热心地提供了模块资料)
Reference
[1]电波钟;https://baike.baidu.com/item/%E7%94%B5%E6%B3%A2%E9%92%9F/1809735?fr=aladdin
[2]长波;https://baike.baidu.com/item/%E9%95%BF%E6%B3%A2
[3]电离层;https://baike.baidu.com/item/%E7%94%B5%E7%A6%BB%E5%B1%82#10
[4]世界各国电波钟详情;CME6005-A11_datasheet
[5]BPC;https://baike.baidu.com/item/bpc
[6]BPC授时编码专利;
[7]BPC电波授时编码详细格式;
[8]电波钟;周胜锋
[9]Time from NPL (MSF);https://en.wikipedia.org/wiki/Time_from_NPL_(MSF)
[10]TBA820M_datasheet;SGS-THOMSON
声明
本文未经DLHC允许,禁止转载。DLHC保留所有权利。
初探电波钟(A Brief Introduction Of Radio Controlled Clock AND Its Appliciations)的更多相关文章
- how to generate an analog output from a in-built pwm of Atmega 32AVR microcontrloller?
how to generate an analog output from a in-built pwm of Atmega 32AVR microcontrloller? you need a re ...
- PWM DAC Low Pass Filtering
[TI博客大赛][原创]LM3S811之基于PWM的DAC http://bbs.ednchina.com/BLOG_ARTICLE_3005301.HTM http://www.fpga4fun.c ...
- linux时钟管理
ref https://access.redhat.com/solutions/18627 在el5中 如何查看系统现在使用的clock source是什么? 答: 方式1:需要说明的是不能保证这个两 ...
- An iOS zero-click radio proximity exploit odyssey
NOTE: This specific issue was fixed before the launch of Privacy-Preserving Contact Tracing in iOS 1 ...
- React Native初探
前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...
- React 初探
React 简单介绍 先说 React 与 React Native 他们是真的亲戚,可不像 Java 和 Javascript 一样. 其实第一次看到 React 的语法我是拒绝的,因为这么丑的写法 ...
- Spring入门(9)-AOP初探
Spring入门(9)-AOP初探 0. 目录 什么是面向切面编程 AOP常见术语 AOP实例 参考资料 1. 什么是面向切面编程 Aspect Oriented Programming(AOP),即 ...
- An Introduction To The SQLite C/C++ Interface
1. Summary The following two objects and eight methods comprise the essential elements of the SQLite ...
- [转帖]Introduction to text manipulation on UNIX-based systems
Introduction to text manipulation on UNIX-based systems https://www.ibm.com/developerworks/aix/libra ...
随机推荐
- Rng(求逆元)
Problem Description Avin is studying how to synthesize data. Given an integer n, he constructs an in ...
- Pandoanload涅槃重生,小白羊重出江湖?
Pandoanload涅槃重生,小白羊重出江湖? 科技是把双刃剑,一方面能够砸烂愚昧和落后,另一方面也可能带给人类无尽的灾难. 原子物理理论的发展是的人类掌握了核能技术但是也带来了广岛和长崎的核灾难, ...
- 当前PageOffice需要获取更高版本的授权才能正常运行。(Error:0x0005)
说明当前程序的是pagoeffice3说明当前程序的是pagoeffice3.0的程序,而序列号用的是2.0的序列号,或者说是当前程序是4.0的程序,而序列号用的是3.0的序列号.即当前用的是高版 ...
- Kubernetes K8S在IPVS代理模式下Service服务的ClusterIP类型访问失败处理
Kubernetes K8S使用IPVS代理模式,当Service的类型为ClusterIP时,如何处理访问service却不能访问后端pod的情况. 背景现象 Kubernetes K8S使用IPV ...
- 部署一套完整的Kubernetes高可用集群(二进制,最新版v1.18)下
七.高可用架构(扩容多Master架构) Kubernetes作为容器集群系统,通过健康检查+重启策略实现了Pod故障自我修复能力,通过调度算法实现将Pod分布式部署,并保持预期副本数,根据Node失 ...
- C++11中一个使用for+auto时容易发生的bug
C++11中一个使用for+auto时容易发生的bug 一个小坑,那就是忘记在for循环中使用auto时加引用. 例如: for(auto num : nums){ // do some thing ...
- web测试——弱网测试、暂停页面执行
1.弱网测试: 2.暂停页面执行 1.js代码:可以直接在页面上打断点 缺点:需要看懂前端的代码 2.点击暂停按钮,如下图,再次点击,可继续运行
- 15个随机图片API
15个随机图片API 妈妈再也不用担心我网站没图用了呜 请不要重复刷新此页面 ! 找了很久的说,你难道不想收藏一下吗 其中有些 API 速度并不太好,可能会拖慢贵站的速度 我也不能保证这些 API 能 ...
- JZOJ1496 页
Description 战神阿瑞斯听说2008年在中华大地上,将举行一届规模盛大的奥林匹克运动会,心中顿觉异常兴奋,他想让天马在广阔的天空上,举行一场精彩的天马队列变换表演.首先,战神安排n头高度不同 ...
- Unity3D获得服务器时间/网络时间/后端时间/ServerTime,适合单机游戏使用
说明 一些游戏开发者在做单机游戏功能时(例如:每日奖励.签到等),可能会需要获得服务端标准时间,用于游戏功能的逻辑处理. 问题分析 1.自己如果有服务器:自定义一个后端API,客户端按需请求就行了: ...