2017年6月25日日曜日

POTx16 PizzaBox MDFで木枠を作った。

ダイソーで売っている6mm厚のMDFで木枠を作ってみた。


いきなり切り出しで失敗




MDFはやわらかいのでカッターで軽く溝を掘ってノコギリで切断したが、ずれてしまって切断面がガッタガタ。


使ったノコギリは細工用というやつで、薄刃で細かい作業に便利だが、刃渡りが12cmしかなくて切り出しはかなり疲れた。翌日あちこちが筋肉痛になってしまった(@@;

板材があまっているので新たに切り出そうかと思ったが、ミスったところは組み上げたときに外からあまりわからない感じで使うことにした。←疲れてやる気がでない(^q^;

接着



木工用ボンドで接着して、木ねじで固定。ついでにパンツのゴム(ダイソー)で(かなり弱いが)圧をかけた。


しばらく放置して補強用に隅に三角材(これもダイソーで売ってた)を接着してさらに丸一日放置。

組み立て



底板はクリップボードを切り出したプラ板。新しいのがもう売ってなかったので使いまわしです。

見栄えを良くするために別に側板を作って、木ネジで固定。


6mm厚のMDFに2.1mmの木ネジを使ってみたが木端(?)だと板がわれてしまいました。

もう少し厚ければ大丈夫なんだろうか。この辺は経験を積むしかなさそう。


見栄えを良くするために、前面に天板と同じプラ板を切り出して両面テープで貼り付けてみた。最初は考えていなかったので、側板とずれていてイマイチ。

とはいえ、ダンボール枠より外観、強度は良くなったと思う。

Nucleo用テストプログラム
https://developer.mbed.org/users/ryood/code/Nucleo_MCP3008_Ticker_Test/ Revision3

メモ:


ベースマシンの筐体用の木枠も作ってみたい。

加工しやすいMDFでも手作業でノコギリで精度良く切断するのは難しい&かなりの重労働。

もう少し切り出しやすいサイズのノコギリを買ってみる?いっそのこと電動ノコとか。

ホムセンの切断サービスを利用する?

平ネジ用のザグリの入れ方ももう少し考える。太めのドリルでザグってるが、収まりが悪い。太さを2~3段階に分けて円錐状になるようにしてみる?

2017年6月23日金曜日

Nucleo F303K8(mbed)の内蔵DACとSPI DACのMCP4922の速度を比較する

サイズの小さいNucleo F303K8でも内蔵DACとMCP4922の処理時間を比較してみた。

ブレッドボード配線図


プログラムはNucleoF446REの場合と同じです。

SPIクロックに16MHzを指定した場合



ch1:D2 ch2:SPI_SCK

MCP4922に出力完了するまで、21.04usかかっている。


ch1:SPI_MOSI ch2:SPI_SCK

SPIクロックに16MHz指定した場合、SCKの周波数は表示では15.98MHzとなっているが測定誤差で16MHzだと思う。

SPIクロックの指定を変えて測定


SPIクロック設定値 SPIクロック実測値 D2(MCP4922の処理時間) D3(内蔵DACの処理時間)
1MHz 1.0MHz 34.8us 2.8us
2MHz 2.0MHz 27.3us 2.8us
4MHz 4.0MHz 23.5us 2.8us
8MHz 8.0MHz 21.04us 2.8us
16MHz 16.0MHz 21.04us 2.8us
32MHz 32.0MHz 19.8us 2.8us
64MHz 32.0MHz 19.8us 2.8us

32MHzまでは設定値通りのSPIクロックが出力される。やはりNucleo F303は64MHz駆動で、SPIクロックはマスタークロックの1/2まで設定できるんだと思う。

MCP4922の仕様ではSPIクロックは20MHzまでだが、32MHzでも動作した。

NucleoF446REと比べると、SPIクロックを上げてもSPI通信の処理時間はあまり短縮されない。

2017年6月22日木曜日

Nucleo F446RE(mbed)の内蔵DACとSPI DACのMCP4922の速度を比較する

結論から言うと、内蔵DACの方が圧倒的に速かった。

mbedでプログラムを書いて、SPI DACのMCP4922とNucleo F446RE内蔵DACの処理時間を比較してみた。

どちらも12bit。

/*
 * 内蔵DACとMCP4922に出力するテスト
 *
 * 2017.06.21
 *
 */

#include "mbed.h"
#include "rtos.h"

#define SPI_CLOCK   (24000000)

SPI SpiM(SPI_MOSI, SPI_MISO, SPI_SCK);  // mosi, miso, sclk
DigitalOut Cs(D10, 1);

AnalogOut InternalDac(PA_4);

DigitalOut CheckPinD2(D2);
DigitalOut CheckPinD3(D3);

// v: 0..0x0fff
void OutMCP4922(uint16_t v)
{
    //v &= 0x0fff;

    // Channel A
    Cs = 0;
    SpiM.write(v >> 8 | 0x30);    // 0x30: DAC_A(0) | Vref Unbuffered(0) | Vout 1x(1) | !SHDN(1)
    SpiM.write(v & 0xff);
    Cs = 1;
}


// v: 0..0xffff
void OutInternalDac(uint16_t v)
{
    InternalDac.write_u16(v);
}

int main()
{
    SpiM.format(8, 0);
    SpiM.frequency(SPI_CLOCK);

    uint16_t count = 0;
    for (;;) {
        uint16_t v12 = count >> 4;
        uint16_t v16 = count;
        
        CheckPinD2 = 1;
        OutMCP4922(v12);
        CheckPinD2 = 0;

        CheckPinD3 = 1;
        OutInternalDac(v16);
        CheckPinD3 = 0;
        
        count += 0x100;

        Thread::wait(1);
    }
}

Nucleoをmbedで使って、SPIの周波数設定をするとちょうどの周波数にはならない。おそらくマスタークロックの分周比なのだと思う。

こういうハードウェア寄りの使い勝手はmbedの弱点ではあります。

SPI::frequency()でSPIクロックの周波数を変えて測定してみた。

ブレッドボード配線図


MCP4922にはLDAC pinがあって、これをH→LするとA ChannelとB Channelが同期して
同時に電圧が出力されるが、LDACをL(GND)に落としておくと、CSのアクティブ/インアクティブで制御できるようだ。配線や処理時間のコストがシビアな場合は役に立つと思う。(A Channelだけしか試してないです)

1MHz

ch1:MCP4922 ch2:内蔵DAC

MCP4922から出力すると、27.3usかかる。一方内蔵DACは700ns(0.7us)で済む。


ch1:MCP4922 ch2:SPI_SCK

1MHzを設定した場合はMCP4922との通信に使っているSPIのクロック周波数は643kHz

24MHz

ch1:MCP4922 ch2:内蔵DAC

SPIのクロック周波数を上げるとMCP4922でも6.8us(≒147kHz)で済む。


ch1:MCP4922 ch2:SPI_SCK

SPIのクロック周波数は22.44MHz。クロックが高周波数になるとダンピング抵抗を入れていても波形が怪しくなる。

MCP4922の最大周波数は20MHzなので仕様外だが、VOUTAから波形は出力される。

Zoom Out

ch1:MCP4922 ch2:SPI_SCK

高クロックになると、8bitずつのSPI通信の間隔が開くようだ。

<追記:2017.06.25>
間隔が開くと言うより、SPI::write()のオーバーヘッドが2~3us程度ある?
</追記>

設定値と出力周波数


設定値 SPIクロック 処理時間
1MHz 643.8kHz 27.3us
2MHz 1.154MHz 16.76us
4MHz 2.810MHz 11.32us
6MHz 5.762MHz 8.76us
12MHz 11.29MHz 7.36us
24MHz 22.44MHz 6.74us