goo blog サービス終了のお知らせ 
「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



https://www.kohgakusha.co.jp/books/detail/978-4-7775-1967-5

123D Design本の改訂版がでました。

Ver2.1(現時点最新版)を元に再構成しています。
新たに付け加わった機能の解説と、日本語メニューの
対応を盛り込んでます。(大筋は変わりません)






mbedで、アナログ入力(ADC)からデータ入力して、FFT
を掛けるところまで出来たので、その続き。

ひとまず、1000spsで動かすことは出来たので、さらに
高速なアナログ入力を行った場合に、どこまで追従
出来るのかを、ちょっと調べてみることに。


https://developer.mbed.org/users/EndoTsunenobu/notebook/adc%E3%81%AE%E6%89%B1%E3%81%84/

どうやら、「.read_u16()」メソッドを使うと、整数型
で読み出せるみたい。float型への変換が不要な分、
こっちのほうが速いはずなので、「.read_u16()」を
使ってみることに。



mbedは、対応機種がいっぱい増えてしまったせいで、
具体的にいくつまで、っていう情報が無いので、
境目を見つけつつ、多少の余裕値を見込んで、
設定可能なレートを探るためのプログラムを書いて
みた。seeeduino archで実験。
#include "mbed.h"

#define sample_rate 35000.0


AnalogIn ain(P0_11);
DigitalOut led(LED1);
Serial pc(P0_19, P0_18); // tx, rx

Ticker tmr;
volatile int cnt1 = 0;


void adc_trg() {
    cnt1++;
}


int main() {
    int cnt2 = 0;
    int old_cnt1 = 0;
    int a;
    
    /* start timer */
    led = 1;
    tmr.attach(&adc_trg, (1.0 / sample_rate));
    
    for (int i = 0; i while (old_cnt1 == cnt1) {
        }
        old_cnt1 = cnt1;
        cnt2++;
        a = ain.read_u16();
    }
    
    /* stop timer */
    tmr.detach();
    led = 0;
    
    pc.printf("----  sample rate = %d  ----\r\n", (int)sample_rate);
    pc.printf(" number of sampled data : %d\r\n", cnt2);
    pc.printf(" number of interrupt    : %d\r\n", old_cnt1);
}

ある程度のアタリをつけてみてから、割り込みレート
を、毎秒10000、20000、30000、40000、50000、35000
と試してみた。


Tickerの割り込みが発生時に変数cnt1を1アップしつつ、
カウンタが変更になっていたら、アナログ入力して変数
cnt2を1アップする、という流れで処理。10000回の
サンプリングを行う。

レートを上げて、アナログ入力の処理が追いつかなく
なると、1回のアナログ入力の間に、割り込みが
2回以上発生するようになって、アナログ入力の回数
が10000回に対して、割り込みでカウントしたcnt1の
値が10000より大きくなる。
で、間に合わなくなったことがわかる仕組み。

(ちなみに、コンパイルすると、変数「a」が参照
されてないっていうウォーニングが出るんだけど、
ちょっと実験してみたところ、最適化でアナログ入力
の代入処理が省略されちゃうことは無い模様)


やってみた結果がこれ。(画像クリックで拡大)



このプログラムだと、境目は毎秒35000sps~40000spsの
間に境目があるみたいなんだけど、これをちょっと弄って、
if文や代入文を2個ほど入れただけで、35000spsでも
間に合わなくなるようなので、seeeduino archでは
30000sps以下で使うのがよさそう。

実際は、もう少し余裕を見て、20000spsくらいなら安全
かな。10kHzまでの音声信号には対応できそう。
もうちょっといけると良かったんだけどな。

多分、LPC1114をmbedで使った場合も、これと同じくらい
になるかと。

http://brown.ap.teacup.com/nekosan0/2277.html

前から遅々として進んでないArduinoオシロの実験では、
16Mhz(5V、mega328)のArduinoを、アナログ入力の
精度を少し落として実験してみたときが、20000spsまで
対応できたので、(精度はともかく)大体同じくらいの
スペック。



ほかの機種だと、どのくらいまで追従するんだろう?
ADCの回路次第であって、CPUのクロック自体はあまり
関係ないから(ADCの1サンプル完了する時間にあわせて
ウェイト入っているはず)、機種ごとの違いって、
あまりないんじゃないかな?って気がするけど。

いずれにしても、これより速くサンプリングする
ためには、外付けの高速ADCが要りそう。





FFTライブラリ、アナログ入力あたりについては、
それなりに使えるようになった。
あとは、LCDライブラリの移植かな。そうすれば、
Arduinoとか、Arduino基板型のmbed互換機を、
簡単にオシロに変えちゃうシールドできそう。
UI周りを、自分の好みに合わせて勝手に直せる
オシロっていう風にしたいんだよな。



そうすると、電源回路、ノイズ対策あたりが
またあたまをもたげるんだけど、まぁ可能な範囲
でいいや。

それと、対応するLCDをどうするかだな。とりあえず、
5110はどこのご家庭にも10個はあると思うので、
当然対応するとして、それ以外のSPI接続LCDって、
端子の並びがまちまちだから、適当にジャンパーで
配線を好きなように設定できるっていうのがいいかな。





http://netgeek.biz/archives/82282

すごいな、PCデポ。現場の人たちはちゃんとしてる
けど、上が完全に真っ黒で、改善の見込みは全然
みえないな。



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする



« アナログ信号... mbedに5110のL... »
 
コメント(10/1 コメント投稿終了予定)
 
コメントはありません。
コメントを投稿する
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。