google-site-verification: google3bd66dd162ef54c7.html

ESP-WROOM-02の処理速度と時間精度

 格安WifiモジュールのESP-WROOM-02 (以下単にESP) の使い方をいろいろ調べています。その続きで、今回は実行時間を調べてみました。

 使い慣れたArduino UNOのCPUは8ビットでクロックは16MHz。一方で、ESPのCPUは32ビットでクロックは80MHz。ということで処理能力としてはESPの方がかなり上です。この性能の差は処理速度に現われるはずなので、実際にどうなっているのか測定で確認してみました。やったのはおなじみのLチカです。

▼回路図
ESPでLチカの回路図
 簡単な話でも出来るだけ回路図で説明するのが私の流儀です。IO13にLEDを接続しておいて、IO13の波形をオシロで測定します。

◆Delay無しでLチカ
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
}
 普通はdelayを入れますが、最高速度で動かすためにdelay無しで走らせます。

 波形
20160504R0023640.jpg
 Highの期間は0.5μsくらいですぐにLowになっており、周期は5.9μsというところでしょうか。プログラムの5行目でポートがHighになり、次の6行目でLowになり、loop()をぐるっと廻って再び5行目に戻るまでLowになっています。

 単純なプログラムなのでもっとループが速く回ってもよさそうなものですが、Arduinoのloop()関数は裏で特別な処理をやっているので遅くなっているのだと思います。ちなみに、Arduino UNOで同じことをやると、Highが4μs、Lowが6μsくらいで回っていたと思います。

 クロック周波数から考えると、ESPは5倍くらい速くなると思っていたのですが、実際は2倍くらいしか速くなっていませんでした。なお、digitalWrite()を使わないでポートを直接操作すればUNOでも0.15μsくらいの速度でポートのトグルが可能です。

 この結果ではちょっと寂しいので、loop()の内側でループさせてみました。for(;;)で無限ループに入れています。

void setup() {
pinMode(13, OUTPUT);
}
void loop() {
for(;;){
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
}
}
 波形
loopの内側でループ
 かなり速くなり、0.9μsでループを回るようになりました。

 でも、これで喜んでいると別の問題が発生しました。というのは3.2秒毎にウォッチドッグタイマー割り込みが発生して処理が中断(リセット)されてしまいます。うーん、なかなか一筋縄ではいきません、WDT割り込みが発生しないような対策が必要です。loop()の処理を回る時にはWDTがリセットされていたんでしょうね。

 ポートの操作速度の話はこれくらいにして、ついでにタイマー割り込みの精度について調べておきました。ESPではTickerという機能でタイマー割り込みを使うようです。

◆タイマー割り込みで1秒周期でLEDを点滅するプログラム
#include <Ticker.h>

Ticker ticker1;

void setup() {
pinMode(13, OUTPUT);
ticker1.attach_ms(500, your_loop1); // 0.5秒間隔で割り込み
}

void loop() {
}

void your_loop1() {
static boolean flag = true;
digitalWrite(13, flag);
flag = !flag;
}
 周期の測定結果(100回平均)
1秒割り込みの100回平均
 パルスの周期は1秒に対して0.6μs短い結果。つまり誤差は0.6ppmと優秀な結果。

 とは言ってもこれは100回平均したので良く見えてるだけで、パルス一発毎だと、

▼パルス一発毎だと結構ばらついています
一発の誤差は大きい

 意地悪して、割り込みを1ms間隔に設定して波形をオシロで見ます。

▼1ms周期で割り込み掛けた波形
1msのON/OFFはジッタはジッタが目立つ
  平均的には1ms周期でトグルしていますが、すさまじいジッタがあります。(波形が左右にブレています)

 ということで面白いのでESP-WROOM-02をいろいろといじってみました。

 でも、そろそろ意味のある使い方の検討に入ろうかと思います。ただ具体的に何を作るか考えると結構悩ましいです。WiFiがあるのでこれを使う物でないと意味が無いですが、そのためには通信する相手も立ち上げないといけません。つまり、UNOのように単体でチャチャっとやっつける訳にはいきません。まあ複雑になっただけ、それをいじる過程を楽しめ、ということなんでしょうね。

 それと、ESP関係のプログラムを見て感じるのは、コーディングの作法がArduinoとはいろいろ違っていることです。例えば変数の宣言はintでは無く int16_t などと書かないといけません。まあ世の中はこれが当たり前なので、Arduino村の文化にどっぷりと浸かっていた体を鍛えるのによい機会かも知れません。

メモ(独り言):
ボードにESP8266を指定してArduino IDEで変数型に int を使うと、16ビットでは無く32ビットとして扱われる。16ビットとして扱う必要がある場合は int16_tと宣言しないといけない。
関連記事

コメントの投稿

管理者にだけ表示を許可する

No title

>簡単な話でも出来るだけ回路図で説明するのが私の流儀です。
さすがですね。

edyさん、今晩は

筆が滑って、なんだかかっこよく書きすぎてました。
カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード