別シリーズ「お手軽ツールで今更学ぶアナログ」にてSPI接続のDACを使ってみました。「マイコンで制御する方がお楽」と思ったので、さっそくやってみます。第48回でSPI接続のADCでアナログデータの読み込みをやりましたが、そのちょうど逆となります。前回使用のプログラムを流用いたしましたが、微妙に違うところは違うと。
※「モダンOSのお砂場」投稿順Indexはこちら
12ビット nanoDAC(R) AD5626
AD5626は、5V単電源動作可能なSPI接続のDACです。内部にリファレンス電源を持っているので、5V電源接続すれば、4.095VフルスケールのDA出力が得られます。
別件記事では「お手軽ツール」のデジタル出力(3.3V)で制御してみました。5V電源ですが、VIHのMIN 2.4Vなので、3.3VのIO端子でも制御はOKみたいです。
今回は、ST社のNucleo F446REボード(STM32F401RE、Arm Cortex-M4F搭載)を使って三角波を出力させてみたいと思います。開発環境は、Arm社のWeb開発環境、Keil Studio Clouldです。
Nucleo F446REボードへのAD5626の接続
第48回でADCをSPI接続したときには、データは入力の一方だったのでMISO信号(スレーブからマイコン方向のデータ線)のみつかって、MOSI(マイコンからスレーブ方向のデータ線)は使いませんでした。今回は逆です。MOSIのみ接続、MISOはノンコネです。
※2022年10月15日追記、以下の回路図の結線間違っていました。大変申し訳ありません。図の赤の部分です。
また、SPIによるデータ転送とは別に、DAデータのロード信号(LDAC#)があるのでこれをD8端子(Arduino式の呼び方)で制御しています。DAデータのクリア信号CLR#もあるので、一応端子を接続しましたが、今回は使用していないです。
ブレッドボード上で接続したところが以下に。アナログ出力とデジタル入力の観察のために Digilent Analog Discovery2を接続してあるので、配線が込み入ってます。
実験に使用したソースコード
第48回のコードを流用しましたが、逆方向なので違う部分もあります。Mbed OS6の SPI のAPIのページは以下に。
// AD5626 12bit DA, connection test. // SPI1 // CS: PB_6(D10) // MISO: PA_6(D12) // MOSI: PA_7(D11) // SCLK: PA_5(D13) // LDAC: PA_8(D7) // CLR: PA_9(D8) // SPI MODE2: CPOL=1(active low), CPHA=0(Rising Edge shift, Falling Edge sample) #include "mbed.h" #include <cstdint> SPI spi(PA_7, PA_6, PA_5); // mosi miso sclk DigitalOut cs(PB_6); DigitalOut clr(PA_9); DigitalOut ldac(PA_8); int main() { char txBuf[2]; char rxBuf[2]; int dat = 0; int step = 1; clr = 1; ldac = 1; cs = 1; spi.format(12, 2); // 12bit, SPI MODE2 spi.frequency(1000000); // 1MHz while (true) { dat += step; if (dat == 0) { step = 1; } else if (dat == 4095) { step = -1; } txBuf[0] = (char)((dat>>8) & 0xFF); txBuf[1] = (char)((dat) & 0xFF); ldac = 1; wait_us(1); cs = 0; spi.write(txBuf, 2, rxBuf, 2); cs = 1; wait_us(20); ldac = 0; wait_us(4); } }
実験結果
まずデジタル制御入力(SPI関係)の様子が以下に。
spi_format() APIで、ビット幅は12ビットと指定しているのですが、write() APIでの転送指定はバイト単位なので、2バイトを指定しています。SCLK自体は上記のように16発でているので、どうみても2バイトで制御されております。AD5626自体は、シフトインされてきたデータの末尾の12ビットをLDADで変換するみたいなので、成り行きで送っておけばOKみたいっす。釈然としないデス。
だいたい60マイクロ秒毎に1データがおくられ、DAされていきます。三角波の上りに4096回、下りに4096回のデータを送っているので、約491.5ミリ秒で1周期となるはず。
実際のアナログ出力の様子が以下に。
周波数の測定結果みると、だいたい60マイクロ秒という部分が少し短かったみたいっす。また、電圧はだいたい20mVくらい低い方にシフトしている感じです。DAのせいなのか、お手軽ツールのせいなのか、不明といって踏みつぶしてしまいます。いいのかそんなことで。
まあ、「モダンOS」の記事だし、プログラムは動いた、OKっと。