IRIG-B解码模块是专门用于对IRIG-B码进行解码的模块,能解码出同步秒脉冲,同时通过串口或IO接口可以获取同步时间,用于对设备进行校时。
模块具有处理速度快,输出精度高的特点,秒脉冲误差在10ns左右,能满足设备对时间的高精度要求。模块使用简单,输入TTL电平的B码,就能自动解码出同步秒脉冲和时间,对单片机性能没有任何要求。
从模块获取时间有两种方式:1)通过串口接收,模块每秒钟会发送一次;2)通过IO口模拟串行时序获取时间,这种方式不占用串口,适合串口资源不够的应用。
解码模块体积很小,可以直接通过邮票孔焊接到主板上。
引脚号 | 名称 | 方向 | 功能 |
1 | IO2 | -- | 预留,不连接 |
2 | IO1 | -- | 预留,不连接 |
3 | IO0 | -- | 预留,不连接 |
4 | LED_UART | out | 串口发送指示灯,当串口输出时间时闪烁,低电平有效 |
5 | LED_SPI | out | 串行通信指示灯,当串行通信时闪烁,低电平有效 |
6 | LED_B | out | B码接收指示灯,接收到B码后闪烁,低电平有效 |
7 | GND * | in | 电源负 |
8 | 3V3 * | in | 电源正,输入3.3V |
9 | RST_N * | in | 模块复位信号,低有效。可以连接复位芯片,也可以用RC设计一个简单的自复位电路 |
10 | B_IN * | in | IRIG-B码输入引脚,TTL电平 |
11 | PPS_INT | out | 秒中断信号,当解码出B码同步沿后输出方波,上升沿有效,脉宽7.5ms,精度10ns左右 |
12 | LED_PPS | out | 秒脉冲指示灯,当解码出B码同步沿后闪烁,脉宽107.5ms ,低电平有效 |
13 | UART_TX | out | 串口发送引脚,波特率9600 |
14 | IO_CS | in | IO串行通信片选,低有效 |
15 | IO_SDA | out | IO串行通信数据 |
16 | IO_SCK | in | IO串行通信时钟,上升沿出数据 |
(*表示必须使用的引脚,其它引脚根据需要选择使用)
名称 | 描述 | 最小值 | 最大值 |
VCC | 电源电压 | 2.5V | 3.44V |
VIO | IO引脚电压 | 2.5V | 3.44V |
Ambient Temperature | 工作环境温度(工业级) | -40℃ | +85℃ |
名称 | 描述 | 典型值 |
PPS_INT Time Delay | PPS_INT秒中断脉冲相对B码同步脉冲时延 | 10ns (从B码同步沿70%位置开始计算) |
LED_PPS Time Delay | LED_PPS秒脉冲相对B码同步脉冲时延 | 10ns (从B码同步沿70%位置开始计算) |
IO_SCK Speed | IO_SCK最大时钟 | 50Mhz |
UART Baudrate | 串口波特率 | 9600bps |
Frequency Tolerance(25℃) | 频率稳定度(25℃) | ±10ppm |
- B码同步沿与PPS_INT
黄色为PPS_INT,蓝色为B码。PPS_INT滞后B码同步沿约10ns(从B码同步沿70%位置开始计算)。
2.B码同步沿与LED_PPS
黄色为LED_PPS,蓝色为B码。LED_PPS滞后B码同步沿约10ns(从B码同步沿70%开始计算)。
串口波特率9600bps,1位起始位,1位停止位,无校验。数据一共12个字节,96bit。当模块的秒脉冲发出后,100us以内就会发送串口数据。
输出格式:
字节 | 说明 |
[7:0] | 报文头0x5A |
[ 9: 8 ] | bit8为刷新标志,刷新一次会反转一次; bit9:保留 |
[ 16: 10 ] | 秒,为BCD码,低4位为个位,高3位为十位 |
[ 23: 17 ] | 分,为BCD码,低4位为个位,高3位为十位 |
[ 29: 24 ] | 时,为BCD码,低4位为个位,高2位为十位 |
[ 39: 30 ] | 一年中的天数,低4位为个位,中4位为十位,高2位为百位 |
[ 47: 40 ] | 年的十位和个位,低4位为个位,高4位为十位 |
[ 64: 48 ] | 一天中的秒数,17位,为16进制 |
[79: 65] | B码标志位,一般情况下不需要使用 bit65:闰秒预告 bit66:闰秒标志 bit67:夏时制预告 bit68:夏时制标志 bit69:时间偏移符号位 bit73:70:时间偏移 bit74:时间偏移0.5h bit78:75:时间质量 bit79:校验位 |
[ 87: 80 ] | 异或校验位,bit8-bit79,9个字节,按字节异或 |
[ 95:88 ] | 结束符0xA5 |
IO时序
详细电路请参考IRIG-B评估板原理图。
为了简化用户编程,我们提供了相关驱动文件IRIG_B_CORE.c和IRIG_B_CORE.h。驱动使用C语言编写,开发板提供STM32F107的例程。
驱动通过宏定义选择使用串口或IO口通信,如果注释掉宏定义即为IO口通信。
#define USE_UART //使用串口通信
- 使用串口方式与B码模块通信
这种方式最简单,只需要调用一个解析函数就可以得到精确时间。
首先需要在IRIG_B_CORE.h 中定义 #define USE_UART 。然后调用解析函数,解析串口接收到的数据。解析函数如下:
err_code Irig_Parse(unsigned char *val, sTime *time)
*val:串口接收到的数据指针,大小为12字节;
*time:解析后输出的时间结构体指针;
err_code:解析结果,为枚举类型;
注:如果想提高授时精度,可以把模块输出的PPS_INT连接到单片机的外中断引脚,当中断触发后,将系统时钟的毫秒清0。
- 使用IO串行时序与B码模块通信
当单片机串口不够用时,可以使用这种方式,实现对时。驱动会使用到3个IO,所以需要根据不同的硬件适配单片机的IO口。
- 注释掉宏定义:
//#define USE_UART
- 通过宏定义,适配IO口
修改IRIG_B_CORE.h,红色部分需要根据不同的单片机进行修改;
#define IO_CS_L GPIO_ResetBits(GPIOD,GPIO_Pin_15) //CS=0
#define IO_CS_H GPIO_SetBits(GPIOD,GPIO_Pin_15) //CS=1
#define IO_SCK_L GPIO_ResetBits(GPIOD,GPIO_Pin_14) //SCK=0
#define IO_SCK_H GPIO_SetBits(GPIOD,GPIO_Pin_14) //SCK=1
#define IO_SDA GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_13) //SDA输入
- 调用初始化函数Irig_Init( ),设置IO的初始化状态
- 调用IO串行读取函数,获取数据,
可以周期性调用读取,也可以在收到PPS_INT中断后读取,推荐后者。
void Get_Irig _Data(unsigned char *val)
*val:接收数组指针,数组大小为12字节
- 调用B码解析函数,获取时间
err_code Irig_Parse(unsigned char *val, sTime *time)
*val:串口接收到的数据指针,大小为12字节;
*time:解析后输出的时间结构体指针;
err_code:解析结果,为枚举类型;
注:如果想提高授时精度,可以把模块输出的PPS_INT连接到单片机的外中断引脚,当中断触发后,将系统时钟的毫秒清0。
更详细的资料可以搜一下云智优创的网站。