google-site-verification: google3bd66dd162ef54c7.html

Arduinoの外部割込み限界周波数を調べた

 edyさんが2端子温度センサLMT01を試す(4)Arduinoにつなぐという記事で面白い温度センサーを紹介されています。

 この素子はたった2端子のセンサーですが、自分の電源の電流をパルス変調します。そのパルスには温度の情報が入っているので、これを検出することで温度が判るという仕掛けになっています。そうかその手があったか!と思う面白い仕掛けになっています。

 edyさんはArduinoのピン割り込みを使ってさくっとパルス数をカウントされています。このパルスの周波数は88kHzですが、これはカウント出来る限界に近い気がします。ならば、どれくらいマージンがあるか測定で確認してみることにしました。

 測定方法としては、ファンクションジェネレーターで、100msインターバルでバーストパルスを発生させ、これをArduinoの外部ピン割込みで検出して、そのパルス数を液晶に表示させる仕組みを作ります。正常にカウントされていたら、ファンクションジェネレーターに設定したパルス数と液晶の表示は一致するはずです。この状態でバーストパルスの周波数を上げていけば、どこかでミスカウントが始まるはずなので、その周波数が外部割込み処理の限界周波数ということになります。

▼ファンクションジェネレータ HP3315A
ファンクションジェネレーター HP3314A
 久しぶりに出番が回ってきましたが、やっぱりファンクションジェネレーター (FG) があると便利です。

 これを使ってバーストパルスを発生させます。1500という表示はパルス数1500という意味です。なお、信号レベルは0-5Vを発生させています。

▼回路図
回路図
 回路図にするほどの内容ではありませんが、一応載せておきます。このFGは50Ωで終端することを前提にレベルが設定されているので、末端に51Ωを入れてあります。電源や液晶シールドの部分は省略しています。

 なお、最初はトランジスタのバッファとポートのプルアップ抵抗を使ったインターフェイスを試しました。しかしこれをやると、立ち上がり時間などがあいまいになってしまって測定の再現性が悪くなるので中止しました。

▼測定に使ったスケッチ
// INT0(Pin2)割込みテスト
// Pin2にバーストパルスを入力し、そのパルス数を液晶に表示
// バーストパルス周波数は88kHz、インターバルは100ms程度を想定
// 2016/02/12 ラジオペンチ http://radiopench.blog96.fc2.com/

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // KeyPad液晶シールド(標準LCDシールドはPin2を使っているので使えない)

volatile unsigned int count = 0; // カウンタ
unsigned int LASTcount = 0; // 前回カウンタ値

void setup() {
lcd.begin(16, 2);
lcd.print("Start");
count = 0;
attachInterrupt(0,extIRQ,FALLING); // Pin2割込みを指定
}

void loop() {
if (count != 0) { // カウンタがゼロではない場合、つまりカウント中なら
while (count != LASTcount) { // もし数値が変わっていたらまだ測定中なので以下を繰り返す
LASTcount = count; // 次回の比較用に値を保存
delay(2); // ちょっと待つ
}
lcd.setCursor(0, 0);
lcd.print(count); // 値を液晶に表示
lcd.print(" "); // ゴミ消し
count = 0; // 次回のためにカウンターをリセット
}
} // loop

void extIRQ() { // ピン割込み処理
count++;
}
 大雑把な動きとしては、割り込み処理(32行目)ではcountの値をインクリメントするだけ。メインのルーチンではcountの値を読んで、値が変化していたら止まるまで待つことでパルスの終わりを検出しています。値がゼロだったらカウントが始まっていないので、開始まで待ちます。メインのルーチンと割込みは非同期に動いているところがミソです。

 コメントに書いておきましたが、標準的な液晶シールドはDigitalの2Pinを使っているのでこのスケッチは動きません。私はKeyPad液晶を使いました。また割込み処理ルーチンではcount++; とやっているだけです。ここにあれこれと処理を追加すると、限界周波数は下がってくるはずです。

▼実行結果
受信したパルス数
 ちゃんとFGに設定したパルス数が検出されています。なお、全く写っていませんが液晶基板の下にArduinoの基板があります。

 この状態でパルスの周波数を上げていくと、カウントが追いつかなくなって数値が小さくなります。その境界は、

▼限界周波数
正常に動く限界周波数は142kHz
 142kHzなので周期は7.04μs。 これが知りたかった値です。LMT01からのバースト信号は88kHz、つまり11μs周期で出てくるので余裕は4μsということになります。この余裕が大きいかどうかはプログラムの書き方で変わってくると思います。

 なお、この結果はこのスケッチで確認したもので、プログラムが変われば値は違ってくるはずです。それと、一番重要な情報が最後になりました。この実験は Arduino UNO R3 (ATmega328P 16MHz) で行いました。
関連記事

コメントの投稿

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

No title

実験ありがとうございます。
LMT01の88KHzはぎりぎりだったのですね。
ということは割り込みルーチンであれ以上のことは出来ないんですね。
それと、パルス終了の検出方法を教えていただきありがとうございます。
実はATmega内臓のコンパレータ割り込みを使えば外付けのコンパレータを一つ減らせるのではないかと考えてはいるのですが、パルス終了検出用のコンパレータを無くす方法を思いつきませんでした。

もう少し、あれこれいじってみます。

edyさん、今晩は

Arduinoでもメモリ間の演算であれば結構高速に処理されていたと思うので、割込みルーチンにもう少しコードを追加出来そうな気がしてます。

それと、そちらの新しい記事拝見しました。Arduinoでコンパレーターを使ったことが無いので興味深く拝見してます。

では。
カレンダー
04 | 2017/05 | 06
- 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 31 - - -
プロフィール

ラジオペンチ

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

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