「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 )




http://mantan-web.jp/2016/09/03/20160903dog00m200014000c.html

なんと!!!
こち亀が、連載終了になってしまうのか。残念だな。
ずっと、ずっと続くものとばかり思っていたけど、
始まりがあればいつか終わりがくるのか…。


https://twitter.com/anzainobuyuki/status/771984706384433152?ref_src=twsrc%5Etfw

日暮刑事、今回のオリンピックが最後になってしまった
のかな?それとも、次回はスポットで出てきたりする
のかな?






mbedで、FFTライブラリ使って、実際にアナログ信号を
FFT掛けてみることに。

といっても、ファンクションジェネレータを出すのが
面倒だったりしたので、3.3V版Arduinoで、適当に
100Hzの矩形波を作って、入力してみた。

アナログ入力ピンから信号を入力するタイミングは、
Tikerでタイマ割り込みすることにした。

どのくらいの間隔までアナログ入力が動くのか分んない
ので、とりあえず1000spsとしてみた。



入力データがこんな。



矩形波。(こっちのグラフに表示されてる単位は無視
してください。時間じゃなく、下のグラフと同じく
周波数が表示されちゃってるので)


1000spsで、64点FFTなので、左から右までが64m秒ほど。
大体こんな波形になるはずだろう。多分合ってそう。

結果がこんな。



窓関数を掛けてないので、DC付近にでっかいノイズが
乗ってるけど、とりあえずこれは無視するとして、
100Hz付近にちゃんとピークがある。
(グラフの一番左のピークがDCで、その右隣が100Hz付近)

で、矩形波なので、奇数倍音でピークが出るので、300Hz
付近でもデータが出てる。

まんなかより右側は、いわゆる負の周波数なので、ここでは
ひとまず無視。



というわけで、矩形波を入れると、ちゃんとその周波数と、
奇数倍音のところに、ピコンとピークが出てくる。
とってもよいかんじ。

どのくらいの周波数までアナログ入力が反応できるのか
が問題だな。まずは10Kspsは行って欲しいところ。できれば
20Kspsを超えてくれるとナイスなんだけどな。

ひとまず、現時点のプログラム。
#include "mbed.h"
#include "fft4g.h"
#define NN 64
#define NSQ 8 /* sqrt(NN) = 16 */
#define interval 1000.0  /* 1000 sps */
#define freq_unit (interval / NN)
#define max_freq (freq_unit * (NN / 2))


Serial pc(P0_19, P0_18); // tx, rx
AnalogIn ain(P0_11); // input via P0_11

Ticker tmr;
volatile int cnt;

float sample[NN];  // stock adc data



DigitalOut myled(LED1);

void dataout(float *d, char *s) {
    pc.printf("FFT test (%s)\r\n", s);
    for (int i = 0; i float f = (freq_unit * i);
        if (f > max_freq) {
            f = f - (2 * max_freq);
        }
        pc.printf("%f , %f , %f\r\n", f, d[i*2], d[i*2+1]);
    }
    pc.printf("");
}



void datain() {
    sample[cnt] = ain.read();
    cnt ++;
}


void sampling() {
    cnt = 0;
    
    tmr.attach(&datain, (1.0 / interval));
    while (cnt detach();
}


int main() {
    float data[NN * 2];  // real + imaginal
    int ip[NSQ + 2];  // bit reversal table ( + 2 pointers for sin/cos)
    float w[NN * 2 / 2];  // twiddle factor (real + imaginal)
    
    sampling();  // input data from adc
    for (int i = 0; i // convert to float
        data[i*2] = sample[i]; // real
        data[i*2 + 1] = 0.0;          // imaginal
    }
    
    ip[0] = 0; // first time only ( for initialize )
    
    dataout(data, "input data"); 
    pc.printf("-- start fft --\r\n");

    cdft(NN * 2, 1, data, ip, w);  // exec FFT

    pc.printf("-- end fft --\r\n");
    dataout(data, "output data"); 
    
    pc.printf("freqency unit = %f Hz\r\n", freq_unit);
    pc.printf("max freqency  = %f Hz\r\n", max_freq);

    while(1) {
    }
}


アナログ入力が、Arduinoのようなint値じゃなく、
0.0~1.0の間のfloat型なのを知らずに、さいしょ、
int型の配列に入れちゃって、波形が拾えずに四苦八苦。
(コメント文とかながめると、まだその名残がある)

とりあえず、動くところまで分ったので、今日はここまで。





https://twitter.com/RetroComPeople/status/771682874705580033

すごい。33年越しのバグ解明。
それにしても、FDD4ドライブって、なんとブルジョアな!






https://twitter.com/otoyanblog/status/770664977413713920

なぜこれをプラモに…






https://twitter.com/Nabe_RMC/status/770954202277216257

日産は、安く買い叩いたつもりで、けっこう高すぎる
買い物しちゃったんじゃないかな。





https://twitter.com/izayoi_0512/status/416523648153821184

かぐや姫。





http://jbpress.ismedia.jp/articles/-/47762

あぁ。こういうタイプ、いるんだよな。処理能力は
確かにあるのかも知れないけど、その人の周囲から、
どんどん人材が流出しちゃうパターン。






https://twitter.com/kmoriyama/status/771379143892054016

ロボットがまだ要介護レベル。わかる気がする。





https://twitter.com/longjie0723/status/771888062158647296

三権分立を習わなかったか、理解できてない人たち
の集まりだからな。トップの例の発言もあったしな。

そのうち、詭弁使って、
  「立法、行政、司法を集約・融合して、
   より効率的な政治に!!」
なんていいだすんじゃね?



コメント ( 0 )