ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

arduinoコミュの質問:周波数カウンタについて

  • mixiチェック
  • このエントリーをはてなブックマークに追加
質問:周波数カウンタを作りたいのですが、・・・

「なんでも作っちゃう、かも」というブログの「Arduinoで遊ぼう - 周波数カウンタ」
http://arms22.blog91.fc2.com/blog-entry-244.html を、参考(ほぼコピー)に、周波数カウンターを作ろうとしていますが動いてくれません。
どなたか詳しい方、ご教授願いたく、お願い致します。

 サイン波発信器+ブログに乗っているトランジスタ1石のアンプ+arduino という構成で、
発信器からアンプに入り0V−5Vの矩形波(波形はなまり気味)に変換されていることをポケットオシロで確認しました。写真参照願います。
サイン波は200Hz〜5KHz程度の可聴範囲の周波数です。

疑問点1

> 使い方
> 1.上記のページからFreq Counterライブラリをダウンロード
> 2.ライブラリを解凍し、arduino-0016/hardware/librariesにコピー
> 3.新しいスケッチを開いて、Sketch->Import Library->FreqCounterを選択

 ブログに載っている上記の作業ではライブラリのリストに載ってこなかったので、
 arduino/libraries に FreqCounterのライブラリをフォルダ毎コピーしました。
 これで、「Sketch->Import Library->FreqCounterを選択」が可能となりました。

 この作業は、これで正しいのでしょうか? (IDEのバージョンは0018です)


疑問点2 (疑問点1が正しかったとして)

(サンプルスケッチ)============================================
#include <FreqCounter.h>

void setup() {
Serial.begin(9600); // connect to the serial port
Serial.println("Frequency Counter");
}

long int frq;
void loop() {
FreqCounter::f_comp = 8; // Set compensation to 12
FreqCounter::start(100); // Start counting with gatetime of 100ms
FreqCounter::f_ready;
while (FreqCounter::f_ready == 0); // wait until counter ready
frq = FreqCounter::f_freq; // read result
Serial.println(frq); // print result
delay(80);
}
==================================================================

> Serial.println("Frequency Counter"); ここまではシリアルモニタに表示されます。


(1)上記のスケッチで、確認のために
> while (FreqCounter::f_ready == 0); // wait until counter ready
 の前後に Serial.println("before"); と Serial.println("after"); を書き加えてシリアルモニタに表示させたところ、"before"は表示され、"after" は表示されませんでした。

(2) FreqCounter::f_ready の値をシリアルモニタに表示させたところ「0」が表示されると思っていたのですが、何も表示されませんでした。 ライブラリの初期化が上手くいっていないのでしょうか?


次に何を調べれば解決に近づくのかご存じの方、アドバイスを頂戴いたしたく、よろしくお願いします。

コメント(6)

FreqCounter.cppのFreqCounter::start()の実装が、
#if defined (__AVR_ATmega168__)
#endif
で囲まれています。
上記の2つをカットで……ATmega328でも動作するかと思われますが…タイミングが正しいのかは不明です。

お使いのArduinoがATmega328のものだとFreqCounter::start()の中身は何もない…という状態になってしまいます。
そうなると…割り込みも何も動作しない…ということになるかと。
グローバル変数なのでFreqCounter::f_readyが0のまま、誰も変更してくれません。

>FreqCounter::f_ready の値をシリアルモニタに表示させたところ「0」が表示されると思っていたのですが、何も表示されませんでした。

何も表示されない…というのが不明ではありますが…。
ドコに記述したのでしょう?
FreqCounter::start(100); // Start counting with gatetime of 100ms
とあるので、100ミリ秒間(0.1秒間)のカウントをしているんじゃないでしょうか?
なので、1秒間のカウントに直すには、得た値を10倍すればよいですね。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

arduino 更新情報

arduinoのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング