【中国BPC电波钟】详解+STM32驱动代码


通过STM32的输入捕获,获取高电平时间,计算BPC电波授时编码,并进行解码与校验,获取时间。

  资料下载:待更新。。。。

安卓APP模拟电波发射测试用途:https://www.liqucn.com/rj/701595.shtml


1、BPC介绍

  BPC电波钟是一种利用中国国家授时中心发射的BPC(Binary Phase-Shift Coding)低频时码信号进行时间校准的高科技计时设备。其主要特点和技术参数如下:

信号来源与频率

  BPC电波钟接收的是中国国家授时中心位于河南商丘的低频时码发播台发射的信号,频率为68.5kHz,属于中长波信号。该信号每天广播21小时,覆盖范围包括地波半径1000公里和天波半径3000公里,基本覆盖中国大部分地区。

信号编码与解码

  BPC信号采用方波脉冲秒编码,每分钟发送3帧数据,每帧包含19个有效位,用于表示秒、分、时、星期、日期、月份、年份等信息。解码时,通过检测脉冲宽度和间隔来获取时间信息。脉冲频率为1hz,高电平占0.1s,0.2s,0.3s,0.4s时,对应信息分别为0,1,2,3(也就是采用4进制编码模式,跟PWM舵机有点像,占空比大小,对应角度),通过计算高电平时间可以精确解码出时间。
以下为BPC编码
在这里插入图片描述
在这里插入图片描述
  P0设在每分钟0,20, 40秒,以缺少秒脉冲使帧与帧隔开,同时作为帧起始预告。
  P2为预留位。用于需要要扩充信息
  P3是校验位,与“午前”,“午后”标志复用。0和2表示“P1”,“P2”,“时”,“分”,“星期”各位码的值转换成二进制表达式后,其“1”的个数为偶数,1和3表示“P1”,“P2”“时”,“分”,“星期”各位码的什转换成二进制表达式后,其“1”的个数为奇数,0和1同时表示午前,2和3同时表示午后。
  P4是校验位与“年”的最高位利用,0和2表示“日”“月”“年”的低三位码的值转换成二进制表达式后,其“1”的个数为日奇数,0和1同时表示“年”的最高位的值为0,2和3同时表示“年”的最高位的值为1 。
  图中帧状态的时间编码为:0021033021021030101 。表示的时间信息为:2004年3月9日,星期二,午前09时15分。该帧起始时间为:15分01秒

  写代码时首先实现获取脉冲低电平时间的功能,用于检测P0,也就是帧间隔,程序里更容易实现起始帧检测。然后就是根据上面的编码方式进行解码,以及纠错和校验
  电波超长距离传输很容易受到干扰,所以纠错以及校验是很有必要的


2、硬件

BPC模块STM32
V3.3V
GGND
TPA0
PGND,低电平工作

实物
在这里插入图片描述

3、代码

   STM32代码采用C语言,标准库编写,软件是keil5,关键代码有中文注释,看不懂可以VX问我

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "timer.h"
#include "usart.h"
#include "lcd.h"

extern u8  TIM2CH1_CAPTURE_STA;		//输入捕获状态		    				
extern u16	TIM2CH1_CAPTURE_VAL;	//输入捕获值
char xiaoshi=0,fenzon=0,xinqi=0,ri=0,yue=0,nian=0,wu=0,miao=0;
int P1;
int i=0;
u8 a[19];
 int main(void)
 {	
	 
	double temp=0; 
	int dat;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
	delay_init();	    	 //延时函数初始化	
	uart_init(9600);	 			//9600	 
	LED_Init();		  	//初始化与LED连接的硬件接口 
	LCD_Init();
 	TIM2_Cap_Init(0XFFFF,72-1);		//以1Mhz的频率计数 
	POINT_COLOR=RED;
	LCD_ShowString(50,130,200,16,16,"    -  -     ");	   
	LCD_ShowString(60,80,200,24,24,"  :  :    ");
	
   	while(1) 
	{
 		delay_us(10);	 
		if(TIM2CH1_CAPTURE_STA&0X80)//成功捕获到了一次高电平
		{
			miao=miao+1;
			if(miao==60) miao=0;
			temp=TIM2CH1_CAPTURE_STA&0X3F;
			temp*=65536;					//溢出时间总和
			temp+=TIM2CH1_CAPTURE_VAL;			//得到总的高电平时间
			temp=(double)temp/1000; //ms
			if((temp>=850)&&(temp<950)) dat=0; 
			else if((temp>=750)&&(temp<850)) dat=1;
			else if((temp>=650)&&(temp<750)) dat=2;
			else if((temp>=550)&&(temp<650)) dat=3;
			if(temp>1200)
			{
				printf("\r\n");
				i=0;
				miao++;
				LCD_ShowNum(128,80,miao,2,24);
			}
			a[i]=dat;
			i++;
			if(i==19)
			{
			xiaoshi=((a[3])*4)+(a[4]);
			fenzon=(((a[5])*16)+((a[6])*4)+(a[7]));
			xinqi=((a[8])*4)+(a[9]);
			ri=((a[11])*16)+((a[12])*4)+a[13];           // 换算方式
			yue=((a[14])*4)+a[15];
			nian=((a[16])*16)+((a[17])*4)+a[18];
			wu=a[10];            //0和1表示上午 2和3表示下午
			P1=a[1];          // 0表示1秒 1表示21秒 2表示41秒
			if(P1==0)
			{    
			  miao=19;
			}
			if(P1==1)
			{
			  miao=39;
			}
			if(P1==2)
			{
			  miao=59;
			}
			if(wu>1)
			{
			  xiaoshi=xiaoshi+12;      //时间处理
			}
			}
			
 			TIM2CH1_CAPTURE_STA=0;			//开启下一次捕获
			printf("%d ",dat);
			
			LCD_ShowNum(50,130,nian,4,16);									  
			LCD_ShowNum(90,130,yue,2,16);									  
			LCD_ShowNum(114,130,ri,2,16);	 
			switch(xinqi)
			{
				case 0:
					LCD_ShowString(160,130,200,16,16,"Sunday   ");
					break;
				case 1:
					LCD_ShowString(160,130,200,16,16,"Monday   ");
					break;
				case 2:
					LCD_ShowString(160,130,200,16,16,"Tuesday ");
					break;
				case 3:
					LCD_ShowString(160,130,200,16,16,"Wednesday");
					break;
				case 4:
					LCD_ShowString(160,130,200,16,16,"Thursday ");
					break;
				case 5:
					LCD_ShowString(160,130,200,16,16,"Friday   ");
					break;
				case 6:
					LCD_ShowString(160,130,200,16,16,"Saturday ");
					break;  
			}
		
			LCD_ShowNum(60,80,xiaoshi,2,24);									  
			LCD_ShowNum(94,80,fenzon,2,24);									  
			LCD_ShowNum(128,80,miao,2,24);
			POINT_COLOR=GBLUE;
			LCD_ShowxNum(10,10,dat,10,24,0);
			POINT_COLOR=RED;
		
		}
	}
}

BPC电波授时编码 一种电波授时编码。其特征在于:帧周期为20秒,每分钟包含三帧;以秒脉冲宽度表示四进制数的0,1,2,3,以四进制数表示相应的“分”, “时”,“日”,“月”,“年”,“星期”等时间信息;以帧标志表示帧所在的时间段,以缺少秒脉冲作为帧间隔和帧预告标志;采用码位复用技术。本发明克服 了现有的时间编码帧周期过长的缺陷,接收一帧时间信息所用的最少时间由1分钟减少到20秒,提高了接收机效率,降低了对抗干扰的要求。 名词术语解释: 时间编码:以数字脉冲信号的方式对“分”,“时”,“日”,“月”,“年”,“星期”等时间信息进行编码。 方波秒脉冲:数字脉冲信号的波形为方波,其周期为1秒。 帧(即时间信息帧):一组包含“分”,“时”,“日”,“月”,“年”,“星期”等时间信息和必要的校验标志位的编码(或代码)。 帧周期:一帧的起始到下一帧的起始所用的时间。 背景技术: 电波授时是将高精度原子钟导出的精确时间信息用时间编码方式,通过无线电发射装置以低频(20KHz—100KHz)无线电波进行传播,用户端利用无线电接 收机接收信号并解调以恢复时间编码,再经过微处理器对编码进行一定的处理(解码)得到精确时间信息。目前在德国,美国,英国,日本等国家,电波授时已广泛 应用于电力,通信,民航,铁路以及个人计时器等各个领域。 电波授时所采用的时间编码是影响时间信息传播准确性和可靠性以及发射,接收装置制造难易程序的重要因素。现有时间编码包括DCF(德国),MDF(英 国),WWVB(美国),JJY/JG2AS(日本)等,这些时间编码的共同特征是:以方波秒脉冲形成时间编码;以脉冲前沿标志1秒的起始,以不同的脉冲 宽度(即方波脉冲信号持续时间)表示二进制数的1或0,以二进制数表示“分”,“时”,“日”,“月”,“年”,“星期”等时间信息,1分钟一帧,即周期为1分钟。由于无线电波传播过程中不可避免地要受到各种干扰,因此信息失真,错码,漏码等就成为可能。虽然现有时间编码中设置了必要的校验位用于判断所接收信息的正解 性,但这种简单的校验方式的误判率仍然较高。有效的做法也是目前被广泛采用的方法是:在接收信号时先利用校验码对每组编码进行初步校验,然后对连续接收到 的二到三帧信息进行比较后作出最终判断。因此,要接收到一组完整准确的时间编码信息至少要二到三分钟时间。这不公使接收机的效率低,而且当干扰比较严重 时,尤其是在远距离发射地,信号微弱或信号有时无的情况下,使得接收信号非常困难甚至不可能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值