当你购买了一个DS3231MZ+时钟模块,但是呢,因为连接线、电压、温度、PCB电路板供电滤波等等外部因素会影响芯片输出时钟精准程度,我们怎么来判断这个模块性能如何呢? 于是有了本代码...

【前言】
因为RetroMagic即将量产几乎是市场上最小的DS3231MZ+ RTC I2C迷你时钟模块,但是这个东西品质如何?
不是颜值,不是体积,也不是用料如何,而是我们就看他准不准对吧...
所以目前再最终量产前做的一些样品我们会需要检查他的精度如何,同时,也是大家自己购买RTC模块之后的疑问
比如你拿来做一个闹钟或者时钟,若是RTC模块不准,做出来的东西就会产生偏差...
所以我们用RP2040 LCD/GPS集成开发板做了个免费共享的测试软件给大家。
当然若是没有RetroMagic出品的 RP2040 LCD/GPS集成开发板,也可以自己用官方树莓派PICO RP2040来自己手搓一个
我们需要用到的材料是:
RetroMagic RP2040 LCD/GPS集成开发板 x1
若无,则自备:
树莓派RP2040主板x1
TFT 1.9寸 170x320 ST7789 LCD模块x1 以及如下接线顺序
GND = GND
VCC = 3.3V
SCL = GP2 (SPI0 SCK)
SDA = GP3 (SPI0 TX)
RES = GP4
DC = GP5
CS = GP6
BLK = GP7 (PWM控制背光)
然后需要UART通信的GPS模块x1(测试代码用的SR25M10DI)以及如下接线顺序
TX = PICO GPIO 1
RX = PICO GPIO 0
SDA = PICO GPIO 18(电子罗盘 可不接)
SCL = PICO GPIO 19(电子罗盘 可不接)
然后就是I2C接口的DS3231MZ+时钟模块 x1 如下接线顺序
3.3V = 3.3V
GND = GND
SDA = GP26
SCL = GP27
软件部分则是RP2040支持的MicroPython编辑器 MuEditor或Thonny都行。
然后下载链接:请点击这里(稍后上传)
【使用方法】
用MuEditor或Thonny 加载主代码,别慌运行...
先把压缩包中的 chinese_font_16x16_new.bin 和 ST7789_170x320_Right90_Chinese.py 文件复制到RP2040 FLASH中;
然后运行主代码main.py即可...
若是要脱离PC运行,直接吧main.py也复制到RP2040的FLASH中即可,这样子通电就会自动开始运行;
【代码主要实现的原理和说明】
这个RTC精度测试工具采用GPS卫星时间,这比用蓝牙或者WIFI或者有线网络获取时间更精准...
无线or有线链接会天生自带网络传输延迟(不可控/不一定/不可预估),轻则几ms重则几百上千ms,精准度比GPS纳秒(ns)在这种即时动态比较中差很多!
科普一下 1ms = 1,000,000ns (也就是纳秒)...
杠精肯定要说了,你那个卫星未必空间传播不要时间? 对,要!但是GPS系统它不仅给你发时间信号,还告诉了你它在哪(星历)...
并且所有GPS接收器输出时都会根据信号算出自己和卫星的距离,从而精确地计算出这个信号“飞了多久”...
GPS接收器会自动减掉这个“信号飞行用了多少时间”,所以你得到的(修正后的)时间,几乎就是原子钟的实时时间。
所以这是为啥本方案用GPS模块来作为时间参考基础的原因。当然为了GPS能获得更多时间发送信号,请把设备拿到窗口或者室外!
1、获得误差结果的逻辑
软件策略默认是15分钟时间+数据记录点(RTC和GPS时间对比过1次就叫1个数据点)大于等于150就会计算误差
若是GPS信号不好导致记录点不够,但是时间大于15分钟,则会等待直到记录点大于等于150开始计算误差
每批次150个数据都是RTC和GPS时间对比值,通过计算就可以知道RTC大概的漂移方向和误差数字(快还是慢)然后在LCD屏幕显示
我们无需每分钟记录太多比较点,而是需要延长时间来获得误差...
所以目前大概是每分钟收集10个对比点,150个对比点生成后整体计算偏差,所以平均误差值就相对更可靠;
后期我们更新代码采用了动态判断软件延迟作为补偿,这样子清晰知道I2C和UART单元通信所花费的时间(DEBUG信息会输出)...
然后多批次计算完成后做了一个类似加权平均算法,会得到更精确的每小时和每天误差,每天误差就是大家所关心的,这个RTC模块品质如何的重点观测对象;
所以这个测试工具运行时间越长,得到的误差结果会越精准。另外就是没必要浪费太多内存,所以计算结果是精度0.1秒;
一般快速判断1小时就OK,精确判断建议至少4~8小时,24小时以上则是终极结果了...
2、测试软件对I2C接口RTC模块的兼容性
另外,需要注意的是P哥的RTC I2C模块是 DS3231MZ+ ,但是代码依旧兼容 DS3231、DS3231M、DS3231MZ 等等老款型号;
3、LCD屏幕显示
目前LCD显示有:GPS时间、RTC时间、DS3231MZ+自带温度计温度、批次计算的误差统计,以及这是第几批数据 数据多少个;
详细信息请参考PC端DEBUG信息,若是没兴趣或者离线加载到RP2040运行,你直接看LCD也可以知道结果;
GPS:2025-11-12 04:52:51
RTC:2025-11-12 04:52:51
误差: 0/H 0/D (注:这是每小时 每天误差秒数 只有当至少第一批数据计算完成才会显示 下一批计算会更新)
温度:21.3 (注:DS3231MZ+有温度传感器 这里会显示)
状态:01 932(注:前面是计算批次 后面是当前RTC和GPS对比过多少次)
而MuEditor或Thonny编程端的COM口会回馈更详细的状态给你,比如:
=== 批次 1 完成 ===
数据点数量: 160
时间跨度: 15.9分钟
延迟: RTC:1.7ms GPS:7.9ms 总:9.6ms 补偿:0.009s
本批漂移率: 0.108345 s/h (2.600290 s/d)
误差统计 → 平均=-0.366479s, 最大=0.000000s, 最小=-1.007812s
更新内容:
2025-11-18 插入代码获取命令->RTC/GPS数据内部延迟判断,自动补偿代码延迟参数,结果更精准;
2025-10-27 初版完成,正在购买其他非RetroMagic出品的DS3231 RTC模块来测试;
最后的说明:
本代码在RetroMagic RP2040 LCD/GPS集成开发板 以及原厂PICO RP2040开发板测试通过,不保证没有说明的硬件到底如何。
本代码没有收费项目存在,若是你花钱购买了,请你找购买方申请退款。
代码和驱动部分属于OpenSource没有任何版权开源免费提供,所以不保证有没有什么BUG,你也可以随意自己更改,包括打上你自己的标签都行。
字库来源于网络,若非自己使用而是商业用途,请你自己注意版权就行。