Contents
タイマIC555を使ったESP32のWDT回路の設計(LT Spice検証含)
1.概要
マイコンESP32を使ったセンサのデータを読み出すIoTシステムを構築している際に、ESP32からデータが送られてこなくなることがあります。原因として(1) センサの何らかの異常、(2)ESP32の異常の2つが考えられます。その対策として、WDT(Watch Dog Timer)を使って、センサとESP32の動作を監視する方法があります。
WDTは、センサやESP32の定期的な動作が行われているかを監視し、暴走や停止などの異常により定期的な動作が行われなくなった場合に、ESP32のセンサやESP32にリセットをかけます。
ここでは、ESP32の異常を監視するWDTを、タイマIC555を使って設計します。設計の検証は、無料のSpice回路シミュレータLT Spiceを使って行います。XD555はVDD=3.0V~15Vで動作するタイマICデバイスです。LT SpiceではNE555を使ってシミュレーションを行います。
2.タイマIC555を使ったWDT回路
タイマIC555を使ったWDT回路は、タイマIC555のMissing-Pulse Detector(パルス停止検出器)の機能を使います。Missing-Pulse Detectorの応用回路を図1に示します。図2にタイミング図を示します。Input電圧が“H”の場合、容量CにRAを介して充電され、Capacitor電圧が上昇します。Input電圧が“L”になるとPNP Trが通電(ON)し、容量Cから電荷が放電され、Capacitor電圧が下がります。定期的な“L”パルスが来ている場合には、Capacitor電圧はTHRES電圧(2/3VDD)を超えることは無く、Output電圧は“H”のままです。しかし、パルスが来なくなるとCapacitor電圧が、放電されずにTHRES電圧(2/3VDD)を超え、Output電圧が“L”になります。Output電圧の“L”は、Input電圧が“L”になるまで継続します。
この機能を使って、ESP32のWDT回路を構成します。具体的な回路を、図3に示します。
ESP32の13番pinは、通常“H”で“L”のパルスを定期的に出力します。これにより、容量Cの電荷が定期的に放電され、EN端子が“L”になることはありません。
しかし、ESP32の動作が何らかの原因でおかしくなり、このパルスが途切れると容量Cの電荷が放電されず、THRESのレベルが上がり、タイマIC555のOUT端子が“L”になります。すると、ESP32のEN端子が“L”になり、ESP32にリセットがかかります。
3.タイマIC555を使ったWDT回路の設計
タイマIC555を使ったWDT回路で設計しないといけないのが、リセットがかかるためのパルスが入らない期間を決め、それに応じたRAとCを決める必要があります。
NE555の仕様書に記載されているRAとCとパルス“H”幅twの関係は、tw=1.1RACです。また、図4のパルス“H”持続期間と容量の関係図から、10秒間“L”パルスが入らない場合にOUT端子が“L”になるようにするために、RA=100kΩ、C=100uFとします。計算式からは、tw=11秒となります。
また、PNP Trは一般的なPNP Trである2SA1015を使用します。
設計結果を図5に示します。
4.SpiceシミュレータLT Spiceでの動作確認
4-1.SpiceシミュレータLT Spiceの概要
LT Spiceは、ANALOG DEVICES社が提供するフリーのスパイスシミュレータです。こちらのLT SpiceのHPからダウンロードできます。
種々のデバイスが回路として登録されていますし、登録されていないデバイスもSpice情報をインターネット上に見つけることもできます。
Spiceシミュレータは、アナログ回路のシミュレータです。
動作点をシミュレートするDC解析、周波数特性をシミュレートするAC解析、時間軸での動作をシミュレートする過渡解析を行うことができます。
使用方法は、上記ダウロードのHPにチュートリアルもありますし、インターネット上で検索することで見つけることができます。
・ LTspiceを使ってみよう!
・初心者のためのLTspice入門の入門(1)
4-2.WDTの動作シミュレーション:回路図入力
ここでは、タイマICNE555とRA、CとPNP Tr 2SA1015を使って、過渡解析を行います。ESP32からのパルスは、電源のPulse関数として与えます。
LT Spiceで入力したWDTの回路を図6に示します。
・ NE555は、[Edit]-[Component]-[Misc]の下にあります。
・ 2SA1015は、[Edit]-[Component]-[pnp]でpnpトランジスタを配置後、トランジスタを[右クリック]-[Pick New Transister]で選択します。
・ 電源V1は、3.3V電源です。
・ 電源V2は、ESP32からのパルスを模擬するPULSE波形を出力します。H期間:500ms、周期:600ms
・ .ic V(cout)=0は、Cout端子の初期値を0Vに設定しています(【LTspice】初期値を設定する『.icコマンド』の使い方)。
・ .tran 25s で25秒間の過渡解析を指定しています。
・ NE555の電源範囲=5.0~15.0Vですが、実際にはXD555(3.0V~15.0V)を使用するので3.3Vにしています。
4-3.WDTの動作シミュレーション:正常時
正常動作時の過渡解析(Tran解析)結果結果を示します。
上段は、ESP32からのパルス入力です。
下段は、CoutとOutputの出力です。
・ Coutは初期値0Vから0.7Vくらいに充電され、その後、パルスの“L”期間に放電され、一定値を保ちます。
・ outputは、“H”レベルのままです(Cout<2/3・Vccのため)
4-4.WDTの動作シミュレーション:パルス異常時
パルス異常時の過渡解析(Tran解析)結果結果を示します。
上段は、ESP32からのパルス入力です(PULSE 0 3.3 0 1m 1m 11.5 12)。11.5秒間“H”で、0.5秒間“L”の12秒周期のパルスです。
下段は、CoutとOutputの出力です。
・ Coutは初期値0Vから2.2Vまで充電され、“L”に落ちます(11秒間“H”)。その後、ESP32から信号が“L”レベルになり、“H”に戻った時点から充電が再開されます。
・ outputは、Coutが2/3・Vcc(=2.2V)レベルとなった時点で“L”レベルになります。その後ESP32からの信号が“L”になった時点で“H”に戻ります。
・ 設計通り、11秒でoutputが“L”になることが確認できました。
5.実機での動作確認
ESP32とXD555を使って、実機での波形をオシロスコープで確認します。
5-1.正常動作時
1) ESP32のプログラム
loopの中で、trg_pin=13pinを変化させます。
500msのH期間が終わったら、trg_pin=LOW 設定
100msのL期間が終わったら、trg_pin=HIGH 設定
void loop()
{ ・・・ 途中略 ・・・
//送信処理
mqttClient.publish(topic,payload);
delay(500);
//CMOSタイマーリセット
digitalWrite(trg_pin,LOW);
delay(100);
digitalWrite(trg_pin,HIGH);
・・・ 以降略 ・・・
}
■ 充電が始まり、13pinが接続されているので充放電を繰返し始める。
上段:ESP32 13Pin 下段:Coutの電圧
5-2.異常動作時(ESP13pinを外し、オープンループ動作)
■ Coutが11秒充電し、2.2Vになったら、Lレベルに落ちる ⇒ 設計通り