概要
内蔵のRC発振器でも十分なんですが、ちょっと欲を出してRTC用外付け発振器を使って見ました。 今回はこれを使ってみました。 【10個入】クリスタル 32.768kHz(水晶発振子)
回路
ESP32を使って下記の様に配線しました。
- 必要部品
部品 詳細 個数 抵抗 5MΩ 1個 発振器 32KHz(RTC用) 1個 コンデンサ 12pF 2個 - ESP32 の GPIO32,33 に配線します。(これらのピンは固定です。変更出来ません)
サンプルスケッチ
sample.ino
arduino
#include "Arduino.h"
#include "soc/rtc.h"
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("\n--- External Crystal (32.768kHz) Test ---");
// 以前のRC発振器から切り替えます
rtc_clk_32k_enable(true);
Serial.println("Waiting for crystal to stabilize...");
// 水晶が安定するまで1秒待つ。安定しない場合は配線やコンデンサに問題がある可能性があります
bool crystal_ok = false;
for (int i = 0; i < 10; i++) {
if (rtc_clk_32k_enabled()) {
crystal_ok = true;
break;
}
delay(100);
Serial.print(".");
}
if (crystal_ok) {
Serial.println("\n[SUCCESS] External 32kHz Crystal is working!");
// 内部回路が「安定した」と判断するまでのチェック
rtc_clk_32k_bootstrap(5);
// RTCのソースを外部クリスタルに固定
rtc_clk_slow_freq_set(RTC_SLOW_FREQ_32K_XTAL);
} else {
Serial.println("\n[ERROR] External Crystal NOT detected. Check wiring on GPIO 32/33.");
}
}
void loop() {
// 動作中、1秒ごとに現在の時刻(RTCカウント)を表示
// 外部クリスタルが正確なら、このカウントも正確になります
unsigned long now_ms = millis();
Serial.printf("System running... Time: %lu ms\n", now_ms);
delay(1000);
}
- 外部発振器に切り替え、1秒に1回時間を表示するスケッチ
- rtc_clk_32k_enable(true); 外部発振器の管理
- 引数
- true: 発信開始
- false: 発信停止
- 無し: 発信の状態を返す。 true: OK / false: NG
- 引数
- rtc_clk_32k_bootstrap(5); 再確認
- 引数
- 確認の回数。5回が推奨値。
- 引数
- rtc_clk_slow_freq_set(RTC_SLOW_FREQ_32K_XTAL); ここで発振器を切り替える。
- 引数
- RTC_SLOW_FREQ_RTC: 内蔵RC発振器
- RTC_SLOW_FREQ_32K_XTAL: 外部水晶発振子
- RTC_SLOW_FREQ_8MD256: 内蔵8MHzを256分周したもの
- 引数
実行結果
コンパイルし実行すると下記の様に問題無く動きました。
115200 baud
ets Jul 29 2019 12:21:46
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:4980
load:0x40078000,len:16612
load:0x40080400,len:3480
entry 0x400805b4
--- External Crystal (32.768kHz) Test ---
Waiting for crystal to stabilize...
[SUCCESS] External 32kHz Crystal is working!
System running... Time: 1026 ms
System running... Time: 2037 ms
System running... Time: 3037 ms
System running... Time: 4037 ms
System running... Time: 5037 ms
System running... Time: 6037 ms
System running... Time: 7037 ms
System running... Time: 8037 ms
System running... Time: 9037 ms
注意
この外部発振器、ESP32の revision が v3.xx 以上で無いと発信が安定しない様です。注意して下さい。 revision はコンパイル後の出力画面に下記の様に表示されます。
最大1310720バイトのフラッシュメモリのうち、スケッチが1029175バイト(78%)を使っています。
最大327680バイトのRAMのうち、グローバル変数が48284バイト(14%)を使っていて、ローカル変数で279396バイト使うことができます。
esptool v5.1.0
Serial port /dev/ttyUSB0:
Connecting....
Connected to ESP32 on /dev/ttyUSB0:
Chip type: ESP32-D0WD-V3 (revision v3.1)
Features: Wi-Fi, BT, Dual Core + LP Core, 240MHz, Vref calibration in eFuse, Coding Scheme None
Crystal frequency: 40MHz
MAC: 88:13:bf:04:03:70
最後に
外付けのRTC(I2C等で繋ぐやつ)を使う方法も有りますが、こちらの方が値段的に安価になると思います。 ESPの revision に気を付けて使えば簡単に動きます。