之前用 ESP8266 做了一支浴室專用定期炸彈造型時鐘,第一個版本有點耗電,兩顆 18650 鋰電池大約只能撐 50-60 小時,之前改版加上光敏電阻改為浴室有開燈才顯示時間,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 花費不多樂趣無窮呀。總之我已經下單了,過陣子再報告研究心得。


Comments

# by Slash

路過... 1. 建議更換成高精度石英震盪器,可解決許多問題。 2. 若考慮走AC供電,那麼你會多一個60HZ的頻率參考方案。

Post a comment


78 - 21 =