本方案是一个基于FPGA的二进制时钟,使用GPS作为时间参考。
历史上准确测量时间提出了许多挑战。只有约翰哈里森设计了一个可靠的时钟,它可以在格林威治子午线保持参考时间,从而能够在1700年代进行准确的导航以及绘制尚未开发的海洋和陆地的图表。
今天,我们生活在日益互联的世界中,准确的时间参考同样重要。如果没有一个共同的时间参考,当我们从一个信号塔传递到另一个信号塔时,信号塔就无法轻松同步代码和切换呼叫。同样,没有共同时间参考的时间戳业务和银行交易也可能具有挑战性,并成为事件顺序的仲裁噩梦。
当然,可用的最准确的时钟是原子钟,但遗憾的是,它们也是最昂贵的,这限制了机构使用它们的能力。
然而,有一个时间参考精确到+/-10ns,可以从空中免费提取,这就是全球导航卫星系统提供的时间参考。当然,其中最著名的是全球定位系统(GPS),尽管有几个,例如GLONASS和Galileo。
所有这些卫星都包含原子钟,这使我们能够实现跨系统的高度准确的时间参考。
在这个项目中,我们将使用GPS接收器Pmod接收GPS信号并对其进行处理,以便我们可以在二进制时钟上显示时间。
为此,我们将使用Vivado和SDK,这将是我们使用SDK的最后一个项目,因为Vitis可用。
维瓦多设计
要开始设计,我们需要做的第一件事是安装Digilent库,使我们能够配置PmodGPS/
该库支持在Vivado和SDK的硬件和软件开发中使用Pmod。
为此,请在我们的Vivado项目中选择、项目选项并选择IP并导航到新的IP存储库。
我们还需要一些东西来驱动NeoPixel显示器,同样对于之前的项目,我在这里将一个neopixelIP模块推送到我的github
然后我们就可以创建一个Vivado项目,该项目将利用这些IP模块与PmodGPS通信。
在新的Vivado项目中,我们需要以下IP
ZynqPS-为最小化配置
PmodGPS-将在软件控制下与PmodGPS通信
AXIBRAM控制器-使ZynqPS能够在PL中读取和写入BRAM
BRAM-双端口BRAM包含Neo像素值
NeoPixelIP-驱动NeoPixel驱动信号
处理器重置块-为系统提供重置
AXI互连-使多个AXI从设备能够连接到单个PS主设备
需要配置PS才能提供
50MHz时的结构时钟
20MHz的结构时钟-用于为NeoPixelIP提供时钟
GPMasterAXI接口
已启用结构中断
这应该会产生如下所示的框图
在生成和导出位流之前,我们还需要设置引脚的IO位置。
我将在PmodGPS的Minized上使用Pmod2,在NeoPixel驱动器上使用Pmod1我们在XDC文件中执行此操作,如下所示。
这样我们就可以实现设计并将硬件设计导出到SDK以生成所需的软件。
软件设计
在SDK中,我们需要根据刚刚从Vivado导出的硬件设计创建一个新的应用程序和BSP。
一旦在BSP中创建了它,我们应该会在BSPMSS文件中看到Pmod驱动程序。
对于更改,我们的软件应用程序将是中断驱动的。
我们的软件解决方案将遵循的架构是
配置和初始化PmodGPS
配置和初始化BRAM控制器
配置中断控制器并启用来自PmodGPSUART的中断。
等待PmodGPS锁定信号
从PmodGPS读取位置和时间数据
将时间转换为二进制元素进行显示
更新NeoPixel显示
为了使用PmodGPS和AXIBRAM控制器,我们可以使用PmodGPS.h和xbram.h中提供的API
虽然可以使用xscugic.h提供的API配置中断控制器
intSetupInterruptSystem(PmodGPS*InstancePtr,u32interruptDeviceID,u32interruptID){
intResult;
u16Options;
INTC*IntcInstancePtr=&intc;
XScuGic_Config*IntcConfig;
IntcConfig=XScuGic_LookupConfig(interruptDeviceID);
if(NULL==IntcConfig){
returnXST_FAILURE;
}
Result=XScuGic_CfgInitialize(IntcInstancePtr,IntcConfig,
IntcConfig-》CpuBaseAddress);
if(Result!=XST_SUCCESS){
returnXST_FAILURE;
}
XScuGic_SetPriorityTriggerType(IntcInstancePtr,interruptID,0xA0,0x3);
Result=XScuGic_Connect(IntcInstancePtr,interruptID,
(Xil_ExceptionHandler)XUartNs550_InterruptHandler,
&InstancePtr-》GPSUart);
if(Result!=XST_SUCCESS){
returnResult;
}
XScuGic_Enable(IntcInstancePtr,interruptID);
XUartNs550_SetHandler(&InstancePtr-》GPSUart,(void*)GPS_intHandler,
InstancePtr);
Xil_ExceptionInit();
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
(Xil_ExceptionHandler)INTC_HANDLER,IntcInstancePtr);
Xil_ExceptionEnable();
Options=XUN_OPTION_DATA_INTR|XUN_OPTION_FIFOS_ENABLE;
XUartNs550_SetOptions(&InstancePtr-》GPSUart,Options);
returnXST_SUCCESS;
}
我想做的第一件事是确保PmodGPS能够锁定信号并为我提供准确的位置。
当此代码在Pmod2连接到PmodGPS的Minized上执行时,我们会在终端上看到以下输出,为我提供了一个位置。
为了检查这是正确的位置,将它输入到谷歌地图中可以以合理的精度提供我办公室的位置。
由于能够锁定GPS信号,因此更新了代码以提供时间。这个时间被称为协调世界时或简称UTC,UTC参考格林威治标准时间,目前也恰好与英国的时间相同。
时间作为浮点数从PmodGPS输出,如下面的终端输出所示。
为了能够创建一个二进制时钟,我们需要将其分解为以下内容
小时几十
小时单位
分十
分钟单位
秒十
秒单位
这将使我们能够使用NeoPixelArray绘制时间。
二进制时钟显示时间如下
在NeoPixel上,我将在阵列中间使用6x4LED阵列。
但首先我们需要将UTC时间转换为所需的格式,我们可以使用以下方法将时间(例如153400)拆分为正确的小时、分钟和秒分组。
然后我们可以根据二进制时间显示的需要将每个元素分成十位和单位。
一旦我们分离了数字,我们就需要将值转换为二进制值,为此我创建了一个简单的子例程
这个函数返回一个代表二进制数的四位向量,对于这个例子,我们不需要超过4位。
由于NeoPixel阵列被视为一个长64NeoPixel元素,因此对于每个计数位置,我们只需要更改LED偏移位置。
根据该位是否已设置,LED的颜色是否会发生变化,设置的位为绿色,否则为蓝色。
我使用下面的代码来确定设置LED的值,因为二进制转换函数返回一个指针。
当我把所有这些放在一起时,一旦PmodGPS锁定信号,二进制时钟就会按预期运行。
确认
对于许多人来说,读取二进制时钟可能与传统时钟不同。因此,通过终端查看NeoPixel显示和UTC时间输出,我们可以验证显示是否正确。
解码后的时间看起来是正确的。
结论
该项目演示了我们如何轻松快速地将GPS用于导航以外的系统,并创建一个有趣的示例,该示例可用作显示器等。
这里还没有内容,您有什么问题吗?
电子电路资源推荐
- OP放大电路设计
来源:下载中心
- Multisim应用教程 138页 16.1M.pdf
来源:下载中心
- 小功率 DC-DC 换流器设计常用技巧
来源:大学堂
- 运算放大器噪声计算
来源:大学堂
- 电路的基本物理量:电流,电压,电位,电动势,电功率
来源:电路图
- 戴维宁定理:概念介绍及其求解过程
来源:电路图
推荐帖子 最新更新时间:2024-09-20 15:28
- 【每日一片】Cortex-M4 指令集兼容性
- 基于 Cortex-M3 的当前应用如果需要更强的计算能力,Cortex-M4 的引进将会扩展 Cortex-Mx 核心在这方面的应用。各大半导体原厂早已计划将 Cortex-M3 继续升级到 Cortex-M4 ,包括 TI、NXP、ST,ARM 可以继续在 32 位
- Study_Stellaris微控制器 MCU
- nRF52832 keil 中ROM 和 RAM配置
- nRF52832 ROM的布局如下图所示: Usage Memory range nRF52832 (S132 v5.0.x) Memory range nRF52840 (S140 v5.0.x) Bootloader settings 0x0007 F000 - 0
- chunming.tianARM技术
- 新手求助,关于Error initializing emulator: No USB FET was found的解决方法
- 新手求助,mac机下载ccs8.1 板子是msp430G2553。程序编译没有问题,烧录到板子上时总是显示Error initializing emulator: No USB FET was found(7.4 8.0版本都试过,也不行), 求助各位大神看能不能帮诊断下 。
- 一纸w荒年模拟电子
- 基于Arduino的气体探测器
- 想做个廉价的气体探测器吗?用Arduino便可以实现,前提是计算量不复杂的话。所以PM2.5估计是测不了,一是传感器成本可能会高,ADC器件性能也不够,至于计算能力就不知道了。详细链接请点击: http://www.instructables.com/id/How-To-Sme
- 凯哥创意市集
- 终端通过路由入网,入网请求是谁处理的?路由器还是协调器?
- 如题。或者说,终端的入网请求是只跟父节点有关,还是说入网请求最终是由路由器转发给协调器处理的? 终端通过路由入网,入网请求是谁处理的?路由器还是协调器? 还是要看用什么开发啊。是zigbee,还是wifi。 一般只是由协调器来处理的。不会再上传了。 怪我没写明。。。 我在
- 喵星人の马甲无线连接
- 谁用过这颗TI的LP8862-Q1芯片??
- 我看了这个芯片的官方资料,但只看了简价,没有完整的资料,谁有给一份!!! 谁用过这颗TI的LP8862-Q1芯片?? 如需完整数据表或其他设计资源,需要申请 Allow approximately 1-2+ business days for processing 允许大约1-
- yupc123TI技术论坛
- 【TI毫米波雷达测评】+SDK开发环境
- BBB内核读取错误
- TMS320F2812的SPI外设使用时的CS使能管脚
- 【iMOTION2go套件】3. MCEDesigner工具使用
- STM32学习笔记之—RTC
- STM32F1接额定5伏旋转编码器可以实现中断吗?【萌新求助】
- ADAS(高级辅助驾驶系统)-奥尼-网载转发
- 请问如何把PWM信号反向,然后给MOS 管?
- 编译错误的问题
- 求助:GPRS-DTU,换省不能收发数据
- 想和高手交流吗?
- 驯服ADC的几个小窍门
- 嵌入式amr 清华大学培训教程
- 嵌入式 Linux驱动培训
- 电赛芯片VCA822
- MSP430F149中断TA1的问题
- TMS320F2812最小系统原理图
- FPGA精华学习资源推荐(十)--数字信号处理的FPGA实现
- linux学习步骤讨论
- 锂电池供电的M0单片机,静太功耗5uA,有个引脚的连线有些奇怪,当手指靠近时功耗增大
- OP484FSZ 具有限流功能的低压差稳压器的典型应用
- 徐帆 1810300129 AD9059
- LT6656BIS6-4.096、4.096V 扩展电源范围电压基准的典型应用
- W806主控的电流表
- EVAL-AD5383EB,使用 AD5383、40 通道、12 位数模转换器的评估板
- LT1086IM-3.3 用于远程传感的低压差正稳压器的典型应用
- LTC3871HLXE 高效 12V、60A 4 相电源的典型应用电路
- LTC2992CDE-1 -48V 冗余馈电的典型应用,具有高达 200V 的瞬态保护(1.5kHz I2C 接口)
- SG3846电流模式PWM控制器典型应用电路
- 【专业版】V2.43-2.9寸SD墨水屏阅读器