深入解析 Adafruit DS3231 精密 RTC 模塊:從特性到應(yīng)用
在電子設(shè)計(jì)領(lǐng)域,精確的時(shí)間記錄至關(guān)重要。無(wú)論是數(shù)據(jù)記錄器、時(shí)鐘設(shè)備,還是需要精確時(shí)間戳的應(yīng)用場(chǎng)景,一個(gè)可靠的實(shí)時(shí)時(shí)鐘(RTC)都是不可或缺的。今天,我們就來(lái)深入探討一下 Adafruit 公司推出的 DS3231 精密 RTC 模塊,看看它有哪些獨(dú)特之處,以及如何在實(shí)際項(xiàng)目中使用它。
文件下載:3013.pdf
一、DS3231 簡(jiǎn)介
DS3231 是一款 “Extremely Accurate I2C Integrated RTC/TCXO/Crystal”(極其精確的 I2C 集成實(shí)時(shí)時(shí)鐘/溫補(bǔ)晶體振蕩器/晶體)芯片。它的最大亮點(diǎn)在于將晶體集成在芯片內(nèi)部,同時(shí)配備了溫度傳感器。一般的 RTC 大多使用外部 32kHz 定時(shí)晶體,雖然這種晶體能以低電流消耗來(lái)保持時(shí)間,但在溫度變化時(shí)會(huì)有輕微的漂移。而 DS3231 的溫度傳感器可以通過(guò)增加或減少時(shí)鐘脈沖來(lái)補(bǔ)償頻率變化,從而保證時(shí)間的精確記錄。
Adafruit 為這款芯片打造了一款小巧的、適合面包板使用的開(kāi)發(fā)板,并且配備了支持即插即用的 STEMMA QT 連接器,大大降低了使用難度。此外,該模塊支持 2.3V 至 5.5V 的電源輸入,可以兼容 3.3V(如 Feather/Raspberry Pi)或 5V(如 Arduino/Metro328)的邏輯電平。只要在背面插入一枚硬幣電池,即使主電源丟失,也能實(shí)現(xiàn)數(shù)年的精確時(shí)間記錄。
二、引腳定義
電源引腳
- Vin:電源輸入引腳。由于 RTC 可以在 2.3V 至 5.5V 的電源下工作,因此對(duì)于 3.3V 或 5V 的邏輯/電源,無(wú)需額外的穩(wěn)壓器或電平轉(zhuǎn)換器。為開(kāi)發(fā)板供電時(shí),應(yīng)提供與微控制器邏輯電平相同的電源,例如對(duì)于 5V 的 Arduino 微控制器,應(yīng)使用 5V 電源。
- GND:電源和邏輯的公共接地端。
I2C 邏輯引腳
- SCL:I2C 時(shí)鐘引腳,連接到微控制器的 I2C 時(shí)鐘線。該引腳具有一個(gè) 10K 上拉電阻連接到 Vin。
- SDA:I2C 數(shù)據(jù)引腳,連接到微控制器的 I2C 數(shù)據(jù)線。同樣,該引腳也具有一個(gè) 10K 上拉電阻連接到 Vin。
- STEMMA QT:僅適用于 STEMMA QT 版本的開(kāi)發(fā)板。這些連接器允許您連接到具有 STEMMA QT 連接器的開(kāi)發(fā)板,或者通過(guò)各種相關(guān)配件連接到其他設(shè)備。
其他引腳
- BAT:與電池的正極焊盤(pán)相連。如果需要從硬幣電池為其他設(shè)備供電,或者使用不同的獨(dú)立電池提供備用電源,可以使用該引腳。VBat 電壓范圍為 2.3V 至 5.5V,當(dāng)主電源 Vin 丟失時(shí),DS3231 會(huì)自動(dòng)切換到備用電源。
- 32K:32KHz 振蕩器輸出。為開(kāi)漏輸出,若要從微控制器引腳讀取該信號(hào),需要外接上拉電阻。
- SQW:可選的方波或中斷輸出。同樣是開(kāi)漏輸出,讀取信號(hào)時(shí)需要外接上拉電阻。
- RST:與大多數(shù)復(fù)位引腳不同,它不僅是一個(gè)輸入引腳,還可用于復(fù)位外部設(shè)備或指示主電源丟失。為開(kāi)漏輸出,但內(nèi)部有一個(gè) 50K 上拉電阻。只要 Vin 存在,上拉電阻會(huì)使該引腳電壓保持為高電平;當(dāng) Vin 下降且芯片切換到電池備用狀態(tài)時(shí),該引腳變?yōu)榈碗娖健?/li>
三、組裝步驟
準(zhǔn)備排針
如果需要,將排針裁剪至合適的長(zhǎng)度。為了便于焊接,可以將排針插入面包板,長(zhǎng)引腳朝下。
安裝開(kāi)發(fā)板
將開(kāi)發(fā)板放置在排針上,使短引腳穿過(guò)開(kāi)發(fā)板的焊盤(pán)。
焊接
確保焊接所有引腳,以實(shí)現(xiàn)可靠的電氣連接。如果您對(duì)焊接操作不太熟悉,可以參考 Adafruit 的《優(yōu)秀焊接指南》(https://adafru.it/aTk)。焊接完成后,目視檢查焊點(diǎn),并繼續(xù)后續(xù)步驟。同時(shí),不要忘記為實(shí)時(shí)時(shí)鐘安裝電池備用電源,將 CR1220 尺寸的電池安裝在開(kāi)發(fā)板背面,安裝時(shí)確保電池上的 “+” 號(hào)可見(jiàn)。
四、Arduino 使用方法
硬件連接
將開(kāi)發(fā)板輕松連接到任何具有 I2C 接口的微控制器,這里以 Arduino 為例:
- 將 Vin(紅色線)連接到 3 - 5V 的電源,使用與微控制器邏輯電平相同的電壓。對(duì)于大多數(shù) Arduino 來(lái)說(shuō),通常是 5V。
- 將 GND(黑色線)連接到公共電源/數(shù)據(jù)接地端。
- 將 SCL(黃色線)引腳連接到 Arduino 的 I2C 時(shí)鐘 SCL 引腳。對(duì)于基于 UNO 和 '328 的 Arduino,該引腳也稱為 A5;對(duì)于 Mega,為數(shù)字引腳 21;對(duì)于 Leonardo/Micro,為數(shù)字引腳 3。
- 將 SDA(藍(lán)色線)引腳連接到 Arduino 的 I2C 數(shù)據(jù) SDA 引腳。對(duì)于基于 UNO 和 '328 的 Arduino,該引腳也稱為 A4;對(duì)于 Mega,為數(shù)字引腳 20;對(duì)于 Leonardo/Micro,為數(shù)字引腳 2。需要注意的是,DS3231 的默認(rèn) I2C 地址為 0x68,且不可更改。
下載 RTCLib 庫(kù)
我們將使用 JeeLab 的優(yōu)秀 RTC 庫(kù) RTClib 的一個(gè)分支(https://adafru.it/aX2),這是一個(gè)用于從 RTC 獲取和設(shè)置時(shí)間的庫(kù)。從 Arduino 庫(kù)管理器中搜索并安裝 Adafruit 的 RTCLib 庫(kù)。如果您對(duì) Arduino 庫(kù)的安裝不太熟悉,可以參考 Adafruit 的教程:http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use(https://adafru.it/aYM)。
首次 RTC 測(cè)試
在 Arduino 未通電或未連接 USB 的情況下,從電池座中取出電池,等待 3 秒鐘后再將電池放回,這將重置 RTC 芯片。
加載示例代碼
打開(kāi)文件 -> 示例 -> RTClib -> ds3231,將代碼上傳到連接了 RTC 的 Arduino 上。上傳完成后,在串口監(jiān)視器中以 9600 波特率查看輸出。幾秒鐘后,您將看到 Arduino 檢測(cè)到 DS3231 首次上電,并根據(jù) Arduino 代碼設(shè)置時(shí)間。之后,斷開(kāi) Arduino 和 RTC 幾秒鐘(或幾分鐘、幾小時(shí)、幾周),然后再重新連接。下次運(yùn)行時(shí),您將不會(huì)再看到 “RTC lost power” 消息,而是會(huì)立即獲取到正確的時(shí)間。
讀取時(shí)間
通過(guò)調(diào)用 RTClib 庫(kù)中的 now() 函數(shù)來(lái)獲取時(shí)間,該函數(shù)返回一個(gè) DateTime 對(duì)象,其中包含了年、月、日、時(shí)、分、秒等信息。與一些 RTC 庫(kù)中分別調(diào)用 RTC.year() 和 RTC.hour() 等函數(shù)來(lái)獲取當(dāng)前時(shí)間的方法不同,now() 函數(shù)可以一次性獲取時(shí)間的 “快照”,避免了在時(shí)間切換瞬間可能出現(xiàn)的時(shí)間不準(zhǔn)確問(wèn)題。此外,還可以通過(guò)調(diào)用 unixtime() 函數(shù)從 DateTime 對(duì)象中獲取自 1970 年 1 月 1 日午夜以來(lái)的秒數(shù)(不包括閏秒),這對(duì)于計(jì)算時(shí)間間隔非常方便。
五、CircuitPython 使用方法
硬件連接
將 DS3231 按照前面 Arduino 部分所述的方式連接到您的開(kāi)發(fā)板,即 Vin 連接到開(kāi)發(fā)板的 3.3V 或 5V 輸出,GND 連接到開(kāi)發(fā)板的接地端,SCL 連接到開(kāi)發(fā)板的 I2C SCL / 時(shí)鐘線,SDA 連接到開(kāi)發(fā)板的 I2C SDA / 數(shù)據(jù)線。
安裝 CircuitPython 庫(kù)
首先,確保您的開(kāi)發(fā)板運(yùn)行的是最新版本的 Adafruit CircuitPython 固件(https://adafru.it/tBa)。然后,從 Adafruit 的 CircuitPython 庫(kù)捆綁包(https://adafru.it/zdx)中找到并安裝必要的庫(kù)。對(duì)于非 Express 板,如 Trinket M0、Gemma M0 和 Feather/Metro M0 basic,需要手動(dòng)從捆綁包中安裝以下庫(kù):adafruit_ds3231.mpy、adafruit_bus_device 和 adafruit_register。在繼續(xù)之前,請(qǐng)確保開(kāi)發(fā)板的 lib 文件夾或根文件系統(tǒng)中已經(jīng)復(fù)制了這些文件和文件夾。
代碼示例與使用
連接到開(kāi)發(fā)板的串行 REPL(https://adafru.it/pMf),在 CircuitPython 的 >>> 提示符下進(jìn)行操作。首先,導(dǎo)入必要的 board 模塊來(lái)初始化 I2C 總線:
import board
i2c = board.I2C()
對(duì)于一些沒(méi)有硬件 I2C 接口的開(kāi)發(fā)板,如 ESP8266,可能需要導(dǎo)入并使用 bitbangio 模塊:
import board
import bitbangio
i2c = bitbangio.I2C(board.SCL, board.SDA)
接下來(lái),導(dǎo)入 DS3231 模塊并創(chuàng)建一個(gè) DS3231 類(lèi)的實(shí)例:
import adafruit_ds3231
ds3231 = adafruit_ds3231.DS3231(i2c)
此時(shí),您就可以讀取和設(shè)置時(shí)鐘的時(shí)間了。通過(guò)訪問(wèn) DS3231 實(shí)例的 datetime 屬性來(lái)實(shí)現(xiàn)這一功能。例如,讀取時(shí)間可以使用以下代碼:
print(ds3231.datetime)
時(shí)間將以特殊的 Python 時(shí)間結(jié)構(gòu)(https://adafru.it/C4x)返回,該結(jié)構(gòu)具有 tm_year、tm_mon、tm_mday 等屬性。如果時(shí)間尚未設(shè)置,默認(rèn)值為 2000 年 1 月 1 日。要設(shè)置時(shí)間,可以使用以下代碼:
import time
ds3231.datetime = time.struct_time((2017, 1, 1, 0, 0, 0, 6, 1, -1))
最后,這里提供一個(gè)完整的示例程序,將其保存為 main.py 并上傳到開(kāi)發(fā)板,您將看到時(shí)間和日期每秒打印一次到 REPL:
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
#
# SPDX-License-Identifier: MIT
# Change the if False to if True below to set the time, otherwise it will just
# Simple demo of reading and writing the time for the DS3231 real-time clock.
# print the current date and time every second. Notice also comments to adjust
# for working with hardware vs. software I2C.
import time
import board
import adafruit_ds3231
i2c = board.I2C() # uses board.SCL and board.SDA
rtc = adafruit_ds3231.DS3231(i2c)
# Lookup table for names of days (nicer printing).
days = ("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
"Saturday")
# pylint: disable-msg=using-constant-test
if False: # change to True if you want to set the time!
# year, mon, date, hour, min, sec, wday, yday, isdst
t = time.struct_time((2017, 10, 29, 15, 14, 15, 0, -1, -1))
# you must set year, mon, date, hour, min, sec and weekday
# yearday is not supported, isdst can be set but we don't do anything with it
at this time
print("Setting time to:", t) # uncomment for debugging
rtc.datetime = t
# pylint: enable-msg=using-constant-test
print()
# Main loop:
while True:
t = rtc.datetime
print(
"The date is {} {}/{}/{}".format(
days[int(t.tm_wday)], t.tm_mday, t.tm_mon, t.tm_year
)
)
print("The time is {}:{:02}:{:02}".format(t.tm_hour, t.tm_min, t.tm_sec))
time.sleep(1) # wait a second
六、資料下載
在進(jìn)行開(kāi)發(fā)過(guò)程中,您可能需要以下相關(guān)資料:
- 數(shù)據(jù)手冊(cè)和相關(guān)文檔:
- Maxim 公司的 DS3231 產(chǎn)品頁(yè)面:https://adafru.it/ldy
- DS3231 數(shù)據(jù)手冊(cè):https://adafru.it/ldA
- GitHub 上的 EagleCAD PCB 文件:https://adafru.it/ohE
- Adafruit Fritzing 庫(kù)中的 Fritzing 對(duì)象:https://adafru.it/aP3
- 原理圖和制造文件:
- STEMMA QT 版本的原理圖和制造文件
- 原始版本的原理圖和制造文件
綜上所述,Adafruit DS3231 精密 RTC 模塊以其高精度、低功耗和易于使用的特點(diǎn),成為電子工程師在時(shí)間記錄相關(guān)項(xiàng)目中的理想選擇。無(wú)論是初學(xué)者還是有經(jīng)驗(yàn)的工程師,都可以通過(guò)簡(jiǎn)單的連接和編程,輕松實(shí)現(xiàn)精確的時(shí)間記錄功能。您在使用 DS3231 模塊的過(guò)程中遇到過(guò)哪些問(wèn)題呢?歡迎在評(píng)論區(qū)分享您的經(jīng)驗(yàn)和心得。
-
RTC模塊
+關(guān)注
關(guān)注
0文章
15瀏覽量
1658
發(fā)布評(píng)論請(qǐng)先 登錄
深入解析 Adafruit DS3231 精密 RTC 模塊:從特性到應(yīng)用
評(píng)論