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デポ。現場の人たちはちゃんとしてる
けど、上が完全に真っ黒で、改善の見込みは全然
みえないな。