任务介绍
本次任务的核心目标是开发一款尺寸严格限制在40mm×40mm以内的紧凑且功能全面的实时时钟模块。该模块需具备精确的实时时钟功能,能够记录当前时间信息,并集成日历功能。在接口设计上,采用I2C通信协议,该协议以硬件连接简洁、数据传输高效及低功耗著称。关键组件的选择需确保在DigiKey官网有货且正常售卖,以保障器件的可获得性和质量。实时时钟模块为独立的模块。
模块介绍
设计思路
本次设计的实时时钟模块是一个单独模块的要求,需要再固定尺寸内实现,实际上主要限制的内容就是接口和备电座,芯片的体积是完全没有问题的,这个单独的模块实际上也是一个功能的拓展板,通过2.54的排针进行控制接口连接。
功能介绍
本次设计实时时钟模块的主要功能:
输出日历信息;
2.54mm接口;
支持备电。
硬件介绍
本次选择的是TI的BQ32000,bq32000具备自动切换备用电源功能,可通过I2C接口支持最高400kHz的串行时钟通信。支持使用电容或不可充电电池作为后备电源,确保断电时仍能持续计时。该芯片采用32.768kHz晶体振荡器,提供-63ppm至+126ppm的可编程精度调整,并集成振荡器故障检测功能,能通过OF标志位实时反馈时钟状态,同时支持通过STOP位远程关闭振荡器。其8引脚SOIC封装设计适合紧凑空间,工作温度范围覆盖-40℃至85℃,适用于消费电子、智能设备等场景。芯片内部时间寄存器每秒同步更新,所有数据同步写入以避免时间误差,并自带闰年自动补偿功能,确保长期计时的准确性。
设计框图
原理图和PCB介绍
原理图
PCB
芯片的引脚分布还是挺合理的,将可以控制的引脚都引出来了,焊接后的实物图如下:
软件调试
本次设计的模块是一个实时时钟功能模块,用于精确时间获取的,我们可以通过一个主控单元进行IIC通信控制,这里我们选择的事Arduino Nano板子,功能模块的接口线序如下:
管脚属性 | 管脚名 | 管脚编号 |
P | 3.3V | 1 |
P | GND | 2 |
I/O | IRQ | 3 |
I/O | SCL | 4 |
I/O | SDA | 5 |
这里我们对Arduino Nano功能板进行了一下扩展,根据功能需求连接如下:
在arduinoIDE中不能搜索到相关的驱动库,我们可以到github上去看一看,还是有很多的可用驱动,注意我们要手动添加库文件,主要驱动代码介绍:
#include <Wire.h>
#include <RTClib.h>
RTC_BQ32000 RTC;
void setup () {
Serial.begin(115200);
Wire.begin();
RTC.begin();
RTC.setIRQ(0); // IRQ square wave disabled
RTC.setIRQLevel(HIGH);
RTC.setCalibration(0);
RTC.setCharger(0); // Disabled
}
void loop () {
DateTime now = RTC.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.print(" since 2000 = ");
Serial.print(now.get());
Serial.print("s = ");
Serial.print(now.get() / 86400L);
Serial.println("d");
// calculate a date which is 7 days and 30 seconds into the future
DateTime future (now.get() + 7 * 86400L + 30);
Serial.print(" now + 7d + 30s: ");
Serial.print(future.year(), DEC);
Serial.print('/');
Serial.print(future.month(), DEC);
Serial.print('/');
Serial.print(future.day(), DEC);
Serial.print(' ');
Serial.print(future.hour(), DEC);
Serial.print(':');
Serial.print(future.minute(), DEC);
Serial.print(':');
Serial.print(future.second(), DEC);
Serial.println();
Serial.println();
delay(3000);
}
模块调试效果图
心得体会
本次我们选择了一个实时时钟模块的设计,选择的芯片也是比较容易焊接的,毕竟手动焊接能力是有限的,所有外设还是挺全面的,引脚添加丝印指示有助于我们进行快速的连接。后续我们要继续秉承着模块设计的思想完成后续任务,再接再厉。