7

RTC 電子時鐘失準問題研究

 2 years ago
source link: https://blog.darkthread.net/blog/arduino-rtc-accuracy/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

RTC 電子時鐘失準問題研究

2021-10-03 09:17 AM 0 297

之前用 ESP8266 做了一支浴室專用定期炸彈造型時鐘,第一個版本有點耗電,兩顆 18650 鋰電池大約只能撐 50-70 小時,之前改版加上光敏電阻改為浴室有開燈才顯示時間,32x8 LED 矩陣原本 24 小時顯示,縮短成一天只亮三到五小時,原本預期會省下不少電,但事實不然,電池續航力只延長大約半天。

推敲無線網路一直開啟可能是耗電的主要來源,故打算停用網路功能試試。但原本靠網路對時,現在得找替代方案,有種裝 CR2032 鈕扣電池的 RTC 模組,沒接電源也能繼續走,基本上久久設一次時間就好。網路上便宜的 RTC 模組有兩種: DS1302 跟 DS1307,前者是 SPI 介面,後者是 I2C 介面(延伸閱讀:Coding4Fun - OLED 顯示器 I2C vs SPI 效能評測),DS1307 再多了方波輸出功能。我的零件箱有一塊陳年 DS1302 剛好可以用,但測試階段時好時壞,時鐘常停掉不走,重裝電池會好,但依據經驗已屬迴光返照,果然,沒多久就死透了。

網購買了一塊 DS1307,順利組裝完成。不過結果有點讓人失望,停掉網路改接 RTC 後反而更耗電,電池續航力只剩一天半,而且 DS1307 時間很不準,一天快 4 ~ 5 秒,比我預期差很多。RTC 不是用晶體振盪嗎?我原本想像要像石英錶、原子鐘一樣準,其實不然,趁此機會做了研究,補充新知識。

下圖左邊是 DS1307 模組,右邊是 DS1302,箭頭指的金屬圓筒就是石英晶體振盪器(Crystal Oscillator),DS1307 的尺寸較大(直徑 3mm 高 6mm),DS1302 比較小(直徑 2mm 高 6mm),旁邊標示 32,768Hz (哦,是魔法數字耶!) 便是 RTC 時鐘振盪器最常用的頻率。

32,768Hz 的意思是一秒固定振盪 32768 次,若用 16 位二進位記錄振盪次數,第 16 位 0, 1 改變時剛好是一秒,RTC 便是用這種方法決定一秒的長度。

DS1307 模組有提供方波輸出,用示波器還真觀察到接近 32,768Hz 的頻率數字:(數字是約略值,示波器自身也有誤差,更何況我這台是玩具等級)

不過,每秒固定 32,768 次是理想值,在真實世界總有誤差,誤差大小跟晶體振盪器品質有關,像是 DS1302 與 DS1307 振盪器的大小品牌不同,規格可能也。晶體振盪器誤差的單位是 ppm (Parts Per Million,百萬分之一),以一天快 5 秒為例,誤差為 5 / (24 * 60 * 60) = 0.00005787 ,57.87ppm。而查廠商規格,直徑 2mm/3mm 高 6mm 金屬筒狀晶體振盪器的誤差約為 ±20ppm。參考

另外,晶體振盪器頻率也會受溫度影響,出廠時調校成 25°C 32,768Hz 0ppm,當溫度過高或過低時會變慢,例如:當溫度上升到 58°C,誤差約 -43ppm。(資料與圖表來源:STMicroelectronics 研究報告 - Using the typical temperature characteristics of 32 KHz crystal to compensate the M41T83 and the M41T93 serial real-time clocks)

要克服溫度影響,有種溫度補償晶體振盪器(TCXO)可透過測量溫度並調整電壓進行補償,即使溫度變化穩定度也會維持在 ±0.5ppm 至 ±5ppm。參考:選擇晶體振盪器必須考慮的5件事…

由以上研究,若晶體振盪器的誤差為 ±20ppm,我的時鐘運作環境就算在浴室可能因洗澡室溫上升到 40 度好了,溫度誤差約為 -8.9ppm,而且會變慢而非變快,仍無法解釋為什麼一天會快 5 秒。

查了一些文章,對於 DS1307/DS1302 這類低階 RTC,不少 Arduino 玩家都遇到時鐘不準偏快的案例,有一說法是某些便宜的晶體振盪器誤差比想像大,有可能高到 60 或 80 ppm 參考,若是如此,則一天快上 5 ~ 6 秒就合理了。許多人推薦內建溫度補償精準度號稱 2ppm 但價格貴三倍的 DS3231,貴三倍是多貴呢?其實一百塊錢有找(Yes,DS1307 只要 35 塊一片還附電池) ,玩 Arduino/ESP 花費不多樂趣無窮呀。總之我已經下單了,過陣子再報告研究心得。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK